diff --git a/README.en.md b/README.en.md index 74883c04b..fb79ea7d0 100644 --- a/README.en.md +++ b/README.en.md @@ -10,6 +10,19 @@ This is a [vue-vben-admin](https://github.com/anncwb/vue-vben-admin) -based Abp [![Build](https://github.com/colinin/abp-next-admin/actions/workflows/build.yml/badge.svg)](https://github.com/colinin/abp-next-admin/actions/workflows/build.yml) +## Deployment Options + +### Monolithic Service Deployment + +If you don't need a microservices architecture, you can choose the monolithic service deployment option. Monolithic services are characterized by simple deployment and easy maintenance. + +- [Monolithic Service Startup Guide](./docs/startup-aio-readme.en.md) +- [单体服务启动说明](./docs/startup-aio-readme.md) + +### Microservices Deployment + +If you need higher scalability and a more flexible service architecture, you can choose the microservices deployment option. + ## Quick Start ### 0、Configurate hosts diff --git a/README.md b/README.md index 9f0c91c39..dbcc172d0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - [English](./README.en.md) | 简体中文 [更新说明](./RELEASE.md) 更新说明 @@ -11,6 +10,18 @@ [![Build](https://github.com/colinin/abp-next-admin/actions/workflows/build.yml/badge.svg)](https://github.com/colinin/abp-next-admin/actions/workflows/build.yml) +## 部署方案 + +### 单体服务部署 + +如果您不需要微服务架构,可以选择单体服务部署方案。单体服务具有部署简单、维护方便的特点。 + +- [单体服务启动说明](./docs/startup-aio-readme.md) +- [Monolithic Service Startup Guide](./docs/startup-aio-readme.en.md) + +### 微服务部署 + +如果您需要更高的可扩展性和更灵活的服务架构,可以选择微服务部署方案。 ## 快速搭建微服务启动项目 diff --git a/aspnet-core/LINGYUN.MicroService.SingleProject.sln b/aspnet-core/LINGYUN.MicroService.SingleProject.sln index 52d53f15c..13ef7de93 100644 --- a/aspnet-core/LINGYUN.MicroService.SingleProject.sln +++ b/aspnet-core/LINGYUN.MicroService.SingleProject.sln @@ -1,1899 +1,1934 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0B58AA48-665A-443F-A6A8-751FB9629DAF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosts", "hosts", "{B4247B78-34BC-4A3F-91A4-661F7DCD6E10}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{DE48451F-D4CB-4C9F-B300-4CA0B8ED9E1C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{37E2CAFE-0024-452E-BF81-E15F937E08EF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{99B7CBDE-A251-4738-97F0-DB1DB484BEE1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "realtime", "realtime", "{42F31C68-B8B2-4BE0-9AD0-A7DFA6092629}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "framework\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Core", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Core\LINGYUN.Abp.Notifications.Core.csproj", "{4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Common", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Common\LINGYUN.Abp.Notifications.Common.csproj", "{14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Emailing", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Emailing\LINGYUN.Abp.Notifications.Emailing.csproj", "{4995C481-7465-4A36-8416-0D0D14F64B10}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\realtime-notifications\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\realtime-message\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{3B6F4C72-975B-44A4-9F72-A217E53E05C1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\realtime-message\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{95909DDC-66A1-410A-9AB1-CD62EA33CFA0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdGenerator", "framework\common\LINGYUN.Abp.IdGenerator\LINGYUN.Abp.IdGenerator.csproj", "{1AFDF87C-220D-44EC-B5DA-99B0510AE561}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "feature", "feature", "{7F7FB560-7005-438B-8D95-4FA781B5F1F3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "framework\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{7F831848-A1C1-49FE-B81A-499AB6E17286}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "framework\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{9C2A3557-31E4-4D06-A08E-138E31412AD4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Data.DbMigrator", "framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj", "{8064607C-BDB9-454D-8E76-2B21023CD071}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exception", "exception", "{3E2388B0-2870-47DB-87E9-32F295E32D05}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "framework\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{A3BF5605-8684-4713-885D-CC498CC37686}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{D1399D41-0273-45FA-969F-FA9C77432A06}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\realtime-notifications\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{E790A9A3-3C24-4478-A547-0FE13F7F6963}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "alibaba-cloud", "alibaba-cloud", "{192A028F-23AD-44A2-A7B2-8397FEA30B08}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "framework\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{56F007F7-23A8-4F13-B45F-57D4EB35AB2C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "framework\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "framework\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{7259B767-9528-4EF9-8F81-20344879F1CD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencent-cloud", "tencent-cloud", "{FDE379A6-8285-4001-818A-DDEA928DE702}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "framework\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{ED7E70B9-8FEE-48DF-9962-AD1062769342}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent.QQ", "framework\cloud-tencent\LINGYUN.Abp.Tencent.QQ\LINGYUN.Abp.Tencent.QQ.csproj", "{BAD28D5B-8A14-43DF-A236-E313FD97E799}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Tencent", "framework\cloud-tencent\LINGYUN.Abp.Sms.Tencent\LINGYUN.Abp.Sms.Tencent.csproj", "{DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Tencent", "framework\cloud-tencent\LINGYUN.Abp.BlobStoring.Tencent\LINGYUN.Abp.BlobStoring.Tencent.csproj", "{60C97165-7CAB-467A-857E-9343B239F8EF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent.SettingManagement", "framework\cloud-tencent\LINGYUN.Abp.Tencent.SettingManagement\LINGYUN.Abp.Tencent.SettingManagement.csproj", "{C18979C7-EBD1-437D-A877-4A97B68761A5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "authentication", "authentication", "{0AD78B12-EDC5-48E2-8FA3-309E731945EB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authentication.QQ", "framework\authentication\LINGYUN.Abp.Authentication.QQ\LINGYUN.Abp.Authentication.QQ.csproj", "{DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authentication.WeChat", "framework\authentication\LINGYUN.Abp.Authentication.WeChat\LINGYUN.Abp.Authentication.WeChat.csproj", "{D2AB9E95-A074-498A-A475-2298D0F1973E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "authorization", "authorization", "{AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authorization.OrganizationUnits", "framework\authorization\LINGYUN.Abp.Authorization.OrganizationUnits\LINGYUN.Abp.Authorization.OrganizationUnits.csproj", "{DA8FB07D-1347-4E5A-B84C-8AB955A652AD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.OrganizaztionUnits", "modules\identity\LINGYUN.Abp.Identity.OrganizaztionUnits\LINGYUN.Abp.Identity.OrganizaztionUnits.csproj", "{2D66E202-B34D-4998-BD80-5411C8087695}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{C22741F9-FC56-4AE3-B543-9F15C779D345}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging", "framework\auditing\LINGYUN.Abp.AuditLogging\LINGYUN.Abp.AuditLogging.csproj", "{4EC45855-A09A-4B77-99A8-DA00E2D702E8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging.EntityFrameworkCore", "framework\auditing\LINGYUN.Abp.AuditLogging.EntityFrameworkCore\LINGYUN.Abp.AuditLogging.EntityFrameworkCore.csproj", "{42439E6A-0084-48A9-9620-0B9EAB4182C4}" -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", "{F1290A8A-3BBE-4647-90D9-4AD537432AB5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{FAF2D4A3-7A7F-4848-9817-66D164D03F0F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{9E728961-7C0B-4C2B-92E4-8965B45ADB19}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "caching", "caching", "{C186173C-7725-41A6-B5E3-F46219B03C5F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Domain", "modules\caching-management\LINGYUN.Abp.CachingManagement.Domain\LINGYUN.Abp.CachingManagement.Domain.csproj", "{79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Application.Contracts", "modules\caching-management\LINGYUN.Abp.CachingManagement.Application.Contracts\LINGYUN.Abp.CachingManagement.Application.Contracts.csproj", "{45E954A6-5F29-48B3-B518-513F6837EE27}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Application", "modules\caching-management\LINGYUN.Abp.CachingManagement.Application\LINGYUN.Abp.CachingManagement.Application.csproj", "{D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.HttpApi", "modules\caching-management\LINGYUN.Abp.CachingManagement.HttpApi\LINGYUN.Abp.CachingManagement.HttpApi.csproj", "{2DAE26C2-BB2C-49CE-B52D-D53383ADE560}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.StackExchangeRedis", "modules\caching-management\LINGYUN.Abp.CachingManagement.StackExchangeRedis\LINGYUN.Abp.CachingManagement.StackExchangeRedis.csproj", "{92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dynamic-queryable", "dynamic-queryable", "{622B90DB-1665-4822-82EF-7DDAC5629834}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Linq.Dynamic.Queryable", "framework\dynamic-queryable\LINGYUN.Linq.Dynamic.Queryable\LINGYUN.Linq.Dynamic.Queryable.csproj", "{0FCB18BE-6D50-4567-8CBD-80B0336D9685}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.Application.Contracts", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.Application.Contracts\LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj", "{9B4C9894-D295-4D16-AC90-F98563B37722}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.Application", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.Application\LINGYUN.Abp.Dynamic.Queryable.Application.csproj", "{E7EFE38E-1214-4D7D-A9DA-F753D613F956}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.HttpApi", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.HttpApi\LINGYUN.Abp.Dynamic.Queryable.HttpApi.csproj", "{BC3E9C3B-EA51-4CC8-AD94-7F0285239907}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa", "elsa", "{07DFEB1E-ED92-4E97-A801-FAB2D70F4F35}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa", "modules\elsa\LINGYUN.Abp.Elsa\LINGYUN.Abp.Elsa.csproj", "{33D6A170-D609-430C-B110-E1A8F3322C06}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.BlobStoring", "modules\elsa\LINGYUN.Abp.Elsa.Activities.BlobStoring\LINGYUN.Abp.Elsa.Activities.BlobStoring.csproj", "{E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Emailing", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Emailing\LINGYUN.Abp.Elsa.Activities.Emailing.csproj", "{3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.IM", "modules\elsa\LINGYUN.Abp.Elsa.Activities.IM\LINGYUN.Abp.Elsa.Activities.IM.csproj", "{19CD928F-D16F-4A91-BA0C-2459F5055565}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Notifications", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Notifications\LINGYUN.Abp.Elsa.Activities.Notifications.csproj", "{86993E17-8793-45ED-B636-C921BB1165D7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Sms", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Sms\LINGYUN.Abp.Elsa.Activities.Sms.csproj", "{158AFAD1-39AE-4135-81EE-55F905802A8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Webhooks", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Webhooks\LINGYUN.Abp.Elsa.Activities.Webhooks.csproj", "{2BE2CFE9-26E7-4791-B9DE-109B465B701C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "webhooks", "webhooks", "{C326B106-8818-42FC-9A2F-C58201EE796C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities", "modules\elsa\LINGYUN.Abp.Elsa.Activities\LINGYUN.Abp.Elsa.Activities.csproj", "{BF943CF0-2732-41D3-BFE3-9B843564D807}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.EntityFrameworkCore", "modules\elsa\LINGYUN.Abp.Elsa.EntityFrameworkCore\LINGYUN.Abp.Elsa.EntityFrameworkCore.csproj", "{B93528E2-55EA-4847-950D-8B95B1CC2909}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql", "modules\elsa\LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql\LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql.csproj", "{2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Server", "modules\elsa\LINGYUN.Abp.Elsa.Server\LINGYUN.Abp.Elsa.Server.csproj", "{BCF85E69-4D97-4DD3-8526-B33C76BD17CA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks", "modules\webhooks\LINGYUN.Abp.Webhooks\LINGYUN.Abp.Webhooks.csproj", "{2B1B759E-670A-4837-854A-4748C67BB15B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Core", "modules\webhooks\LINGYUN.Abp.Webhooks.Core\LINGYUN.Abp.Webhooks.Core.csproj", "{9ACB83F6-C911-4473-973D-A3BECFB5F1E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.EventBus", "modules\webhooks\LINGYUN.Abp.Webhooks.EventBus\LINGYUN.Abp.Webhooks.EventBus.csproj", "{97064B96-B5AC-461D-BBBF-97A864F373E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Identity", "modules\webhooks\LINGYUN.Abp.Webhooks.Identity\LINGYUN.Abp.Webhooks.Identity.csproj", "{617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Saas", "modules\webhooks\LINGYUN.Abp.Webhooks.Saas\LINGYUN.Abp.Webhooks.Saas.csproj", "{DB4498D8-E45B-4A5A-9BF2-830039B2D38D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Domain.Shared", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Domain.Shared\LINGYUN.Abp.WebhooksManagement.Domain.Shared.csproj", "{412BAB54-282E-4A01-AF72-E76F3AF31AE7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Domain", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Domain\LINGYUN.Abp.WebhooksManagement.Domain.csproj", "{EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Application.Contracts", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Application.Contracts\LINGYUN.Abp.WebhooksManagement.Application.Contracts.csproj", "{21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Application", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Application\LINGYUN.Abp.WebhooksManagement.Application.csproj", "{7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore\LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore.csproj", "{DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.HttpApi", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.HttpApi\LINGYUN.Abp.WebhooksManagement.HttpApi.csproj", "{DA053CAE-EBA4-4532-93B5-3347589CB174}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflow", "workflow", "{8F690C33-40BF-4EF8-A96A-D7FB56F163AC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencent-wechat", "tencent-wechat", "{91867618-0D86-4410-91C6-B1166A9ACDF9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "framework\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{76810110-6683-4777-9157-8030F9205FBF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "framework\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{80DDA32B-2BDA-4704-9458-6D680B08B74C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "framework\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "framework\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.WeChat", "framework\wechat\LINGYUN.Abp.Identity.WeChat\LINGYUN.Abp.Identity.WeChat.csproj", "{ED7AADAF-72D8-4C04-96CE-B46B21C9C343}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\realtime-notifications\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{6518F1B5-63EA-46A2-87ED-FD90366594EC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "text-templating", "text-templating", "{C46E03DE-FFFA-4659-97AE-77BDA46C3FCA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Domain.Shared", "modules\text-templating\LINGYUN.Abp.TextTemplating.Domain.Shared\LINGYUN.Abp.TextTemplating.Domain.Shared.csproj", "{AB79F7C4-9AE1-4921-B18A-F64074B1DC69}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Domain", "modules\text-templating\LINGYUN.Abp.TextTemplating.Domain\LINGYUN.Abp.TextTemplating.Domain.csproj", "{DCF463DE-50CA-4585-BA9F-83F7101B5ED7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Application.Contracts", "modules\text-templating\LINGYUN.Abp.TextTemplating.Application.Contracts\LINGYUN.Abp.TextTemplating.Application.Contracts.csproj", "{A2E248DB-B2DD-4916-82A6-5D296C1298B5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Application", "modules\text-templating\LINGYUN.Abp.TextTemplating.Application\LINGYUN.Abp.TextTemplating.Application.csproj", "{293C7A2B-46D2-49B6-A8C6-294500ED5AE5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.EntityFrameworkCore", "modules\text-templating\LINGYUN.Abp.TextTemplating.EntityFrameworkCore\LINGYUN.Abp.TextTemplating.EntityFrameworkCore.csproj", "{21691099-AF37-4706-84AE-C19C72DC09B6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.HttpApi", "modules\text-templating\LINGYUN.Abp.TextTemplating.HttpApi\LINGYUN.Abp.TextTemplating.HttpApi.csproj", "{C31A17E0-AE56-419C-A6D1-3FCBB68005E2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "task-management", "task-management", "{D9C65C9D-8591-46DA-A3EE-419393E607AB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Abstractions", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Abstractions\LINGYUN.Abp.BackgroundTasks.Abstractions.csproj", "{974D842A-9739-40E4-96E8-039552E28D8B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks", "modules\task-management\LINGYUN.Abp.BackgroundTasks\LINGYUN.Abp.BackgroundTasks.csproj", "{7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Activities", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Activities\LINGYUN.Abp.BackgroundTasks.Activities.csproj", "{F3064272-5A6F-4CB9-B79F-8D37A2392CC1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.DistributedLocking", "modules\task-management\LINGYUN.Abp.BackgroundTasks.DistributedLocking\LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj", "{1DD17D3E-F8EC-44AA-8437-3AF541CD3988}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.EventBus", "modules\task-management\LINGYUN.Abp.BackgroundTasks.EventBus\LINGYUN.Abp.BackgroundTasks.EventBus.csproj", "{F42FAF67-D10F-487A-A74C-E6D8EA90831C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.ExceptionHandling", "modules\task-management\LINGYUN.Abp.BackgroundTasks.ExceptionHandling\LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj", "{81B74E08-06CD-4134-A02D-B4B837945E2B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Jobs", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Jobs\LINGYUN.Abp.BackgroundTasks.Jobs.csproj", "{78635E6D-2C35-437C-96CD-29DAEAFE0076}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Notifications", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Notifications\LINGYUN.Abp.BackgroundTasks.Notifications.csproj", "{F8CBD522-6668-4A5F-B62D-9E37E7DC1279}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Quartz", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Quartz\LINGYUN.Abp.BackgroundTasks.Quartz.csproj", "{33FC6389-3931-4BD2-A619-36C4A8F5C7B0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Domain.Shared", "modules\task-management\LINGYUN.Abp.TaskManagement.Domain.Shared\LINGYUN.Abp.TaskManagement.Domain.Shared.csproj", "{58A4954C-4901-4172-BEE7-5584ABB0DF45}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Domain", "modules\task-management\LINGYUN.Abp.TaskManagement.Domain\LINGYUN.Abp.TaskManagement.Domain.csproj", "{D4BC55C7-1991-4866-A7BA-66653DACF945}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "background-tasks", "background-tasks", "{91EE5D5B-B6DF-43F1-BC09-1A982719A34B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Application.Contracts", "modules\task-management\LINGYUN.Abp.TaskManagement.Application.Contracts\LINGYUN.Abp.TaskManagement.Application.Contracts.csproj", "{C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Application", "modules\task-management\LINGYUN.Abp.TaskManagement.Application\LINGYUN.Abp.TaskManagement.Application.csproj", "{CF1F1193-FECE-4E98-A4FC-643A86F30429}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.EntityFrameworkCore", "modules\task-management\LINGYUN.Abp.TaskManagement.EntityFrameworkCore\LINGYUN.Abp.TaskManagement.EntityFrameworkCore.csproj", "{46C57140-EE02-4785-9777-F2264EC88135}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.HttpApi", "modules\task-management\LINGYUN.Abp.TaskManagement.HttpApi\LINGYUN.Abp.TaskManagement.HttpApi.csproj", "{3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{3AD66E47-B667-40D1-AE61-F5EC186241F7}" - ProjectSection(SolutionItems) = preProject - modules\oss-management\README.md = modules\oss-management\README.md - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{AD3E63A3-3422-4A1A-AC89-B20786A5323E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{CA2975D9-5477-4281-8D84-F0909F22DFF3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{34C9609F-556B-44D7-B3DE-5637FEB0BFEC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{A69E6742-39A6-4C0D-A098-E16A653331AC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{6AC4C18F-2BB5-47F9-99F5-5585E1D22111}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{4D738A46-2B08-4A88-8787-668A4AD5AE5F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "open-api", "open-api", "{3A74FBEF-AE1F-420D-9B08-E09E03C740D5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenApi", "framework\open-api\LINGYUN.Abp.OpenApi\LINGYUN.Abp.OpenApi.csproj", "{0B9E97DE-0265-4192-9FAF-B5AF65AC6611}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenApi.Authorization", "framework\open-api\LINGYUN.Abp.OpenApi.Authorization\LINGYUN.Abp.OpenApi.Authorization.csproj", "{C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "notifications", "notifications", "{96BA4536-5E1E-476D-9368-BAF6FC939D25}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Domain.Shared", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Domain.Shared\LINGYUN.Abp.Notifications.Domain.Shared.csproj", "{EA56194E-B0EF-42B1-BC35-9A677D7D66BB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Domain", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Domain\LINGYUN.Abp.Notifications.Domain.csproj", "{56C00F97-6769-44B2-8004-341D5286E31F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Application.Contracts", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Application.Contracts\LINGYUN.Abp.Notifications.Application.Contracts.csproj", "{DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Application", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Application\LINGYUN.Abp.Notifications.Application.csproj", "{6C774F10-5FAC-4177-9BFA-28486747DF3D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.EntityFrameworkCore", "modules\realtime-notifications\LINGYUN.Abp.Notifications.EntityFrameworkCore\LINGYUN.Abp.Notifications.EntityFrameworkCore.csproj", "{91BD29B8-FD39-4429-A8FF-C5A1E511C632}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.HttpApi", "modules\realtime-notifications\LINGYUN.Abp.Notifications.HttpApi\LINGYUN.Abp.Notifications.HttpApi.csproj", "{DB29E904-C164-46B3-A12C-3A908FCA6DB9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "messages", "messages", "{E17C1E4A-9BD2-42DC-99E4-B6E104D3789A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\realtime-message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{6F5CD33F-ACD9-4BF3-99DE-33A24116A672}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\realtime-message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{1EA3971F-E854-4198-AC8D-BC3C4F804B25}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\realtime-message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{A5CA092D-E294-4BF6-92AF-CCF136A643D1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\realtime-message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{9CDC9B6C-C69E-483F-B881-5D065FA064C9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\realtime-message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{A74A9B50-0E40-44AD-9360-5BF96696B405}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\realtime-message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{A243383E-7025-4893-9611-EE75DA055301}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{936C5D74-B90F-4932-87C3-C1A0A29083B9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Persistence", "framework\localization\LINGYUN.Abp.Localization.Persistence\LINGYUN.Abp.Localization.Persistence.csproj", "{3192C227-A18D-48A1-A2E8-C414981E9C5A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.CultureMap", "framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj", "{86ED8028-5533-4B5D-8594-C09929F2A553}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{C056C11F-EC74-4720-ACEA-D4C57DC4736F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Localization", "framework\localization\LINGYUN.Abp.AspNetCore.Mvc.Localization\LINGYUN.Abp.AspNetCore.Mvc.Localization.csproj", "{A09032AD-D895-4D83-8D3D-67FF3285F7A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{59A3A2B8-7992-4321-A481-8C2CD08D0835}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{F9D10E1C-38DC-423D-8B79-BE4673C75B50}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{53479279-0E9C-4921-BEB1-46FDB553C8E2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{8472D376-D2DB-40C3-AAF9-9ACDF1731919}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{1D7770AA-1669-45CE-88D9-3009C6A48AEE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{F4ED4FC9-74D5-4379-9787-1F7756B56201}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "logging", "logging", "{FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Logging", "framework\logging\LINGYUN.Abp.Logging\LINGYUN.Abp.Logging.csproj", "{F87CA546-1ED2-409A-AD87-62E133BD3EF9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Serilog.Enrichers.Application", "framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj", "{2BB68CBB-2220-466B-B24E-6916819DFB79}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Serilog.Enrichers.UniqueId", "framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj", "{ACEFA4C4-4CA8-4358-9B75-3806DF228517}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{D94D6AFE-20BD-4F21-8708-03F5E34F49FC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{AF2F208F-43D6-4296-9826-677681BEC6D4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}" -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", "{7B26E45A-99B1-47EA-9015-7DD78CAFC423}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{F826B05A-2736-4361-ADE5-04B1CF171ED4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{0E84E1E4-82F8-412B-94F2-E06FF1320B1D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity-server", "identity-server", "{A3B6DFC3-5D27-496E-9AD6-C1035213F1DC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{C9202B23-45E9-4167-BFAC-89651AF554EB}" -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", "{16666C1F-09C1-4829-9AFC-77FB22439A59}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{DAFCBF4F-8174-4934-929E-374FBDCE854D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.LinkUser", "modules\identityServer\LINGYUN.Abp.IdentityServer.LinkUser\LINGYUN.Abp.IdentityServer.LinkUser.csproj", "{CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "saas", "saas", "{0DF5AD76-AEEA-4052-A6CA-A44C24879F11}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "saas", "saas", "{ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.Editions", "framework\tenants\LINGYUN.Abp.MultiTenancy.Editions\LINGYUN.Abp.MultiTenancy.Editions.csproj", "{1C3BCC38-D583-402F-B922-5562F19EA12C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Domain.Shared", "modules\saas\LINGYUN.Abp.Saas.Domain.Shared\LINGYUN.Abp.Saas.Domain.Shared.csproj", "{00A6598E-8913-47C4-97F7-0E784EA9D55F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Domain", "modules\saas\LINGYUN.Abp.Saas.Domain\LINGYUN.Abp.Saas.Domain.csproj", "{A8A8A180-C40F-43C7-B6B2-622344CE276B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Application.Contracts", "modules\saas\LINGYUN.Abp.Saas.Application.Contracts\LINGYUN.Abp.Saas.Application.Contracts.csproj", "{232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Application", "modules\saas\LINGYUN.Abp.Saas.Application\LINGYUN.Abp.Saas.Application.csproj", "{5960FE7B-EC00-4C8D-A522-8FFEC184694D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.EntityFrameworkCore", "modules\saas\LINGYUN.Abp.Saas.EntityFrameworkCore\LINGYUN.Abp.Saas.EntityFrameworkCore.csproj", "{07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.HttpApi", "modules\saas\LINGYUN.Abp.Saas.HttpApi\LINGYUN.Abp.Saas.HttpApi.csproj", "{6A79337A-879F-4A9F-8328-5578E40177B5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{65CF5AD9-7D2A-4E31-B695-390B2D4A70D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "framework\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{233C2407-3ED3-4322-B28D-0F93CF4C6E33}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{118D91CE-091B-4C65-8979-2F5363C56CDC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{3EF74657-9EBC-46FD-B2CA-40959D0EE692}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{A788317B-1649-4D26-AB6C-6AA5B35767DA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation.VueVbenAdmin", "modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin\LINGYUN.Abp.UI.Navigation.VueVbenAdmin.csproj", "{C027362E-9B72-4058-91DF-D7F0FDD162AA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{0E0683C3-5169-4965-A886-D960811E1807}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Settings.VueVbenAdmin", "modules\platform\LINGYUN.Platform.Settings.VueVbenAdmin\LINGYUN.Platform.Settings.VueVbenAdmin.csproj", "{8011A4C4-F08C-463D-A376-F33A7F780F57}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Theme.VueVbenAdmin", "modules\platform\LINGYUN.Platform.Theme.VueVbenAdmin\LINGYUN.Platform.Theme.VueVbenAdmin.csproj", "{78767BC5-FE68-4919-BC1B-DE7FF71F294B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation", "framework\navigation\LINGYUN.Abp.UI.Navigation\LINGYUN.Abp.UI.Navigation.csproj", "{8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "openIddict", "openIddict", "{7C714185-D3D9-4D94-B5CB-D857A0091F04}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Application.Contracts", "modules\openIddict\LINGYUN.Abp.OpenIddict.Application.Contracts\LINGYUN.Abp.OpenIddict.Application.Contracts.csproj", "{9697AB9A-2ACA-42E5-877E-EEF371166898}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Application", "modules\openIddict\LINGYUN.Abp.OpenIddict.Application\LINGYUN.Abp.OpenIddict.Application.csproj", "{76A4D1FD-479A-4C57-96E0-BBFCCBADB683}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.HttpApi", "modules\openIddict\LINGYUN.Abp.OpenIddict.HttpApi\LINGYUN.Abp.OpenIddict.HttpApi.csproj", "{E4C02147-34FA-43D1-B03C-00D539CF18BC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.LinkUser", "modules\openIddict\LINGYUN.Abp.OpenIddict.LinkUser\LINGYUN.Abp.OpenIddict.LinkUser.csproj", "{AABB5ABC-790E-48D1-B654-72143227FA64}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Sms", "modules\openIddict\LINGYUN.Abp.OpenIddict.Sms\LINGYUN.Abp.OpenIddict.Sms.csproj", "{CA5E2785-511D-4A14-8883-2544C869B2DF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.WeChat", "modules\openIddict\LINGYUN.Abp.OpenIddict.WeChat\LINGYUN.Abp.OpenIddict.WeChat.csproj", "{AB897095-EA92-4AD9-829C-66FEE1878A5D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wrapper", "wrapper", "{40A9F0DB-66AA-42A8-8670-9DD6DA992103}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Wrapper", "framework\common\LINGYUN.Abp.Wrapper\LINGYUN.Abp.Wrapper.csproj", "{1FA05CCA-0584-4320-B278-D5AA1234BA02}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Wrapper", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj", "{7B6A98B3-90C1-49F2-8A17-C70FED500627}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{4F837B81-EA7D-472A-8482-3D5A730DF810}" -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", "{1F404E43-FA13-485D-B922-7D8848EBCE0F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{2230E355-50F7-424F-929F-532B0A5DABE0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{FBCDC571-F747-46AB-AFCB-38D191DCFFB6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Templates", "modules\account\LINGYUN.Abp.Account.Templates\LINGYUN.Abp.Account.Templates.csproj", "{F94E77C1-61E0-4FE8-9ECD-10A0102342E9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single", "services\LY.MicroService.Applications.Single\LY.MicroService.Applications.Single.csproj", "{83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D1A85853-3504-45A8-A745-5091E9240682}" - ProjectSection(SolutionItems) = preProject - ..\common.props = ..\common.props - ..\common.secrets.props = ..\common.secrets.props - ..\configureawait.props = ..\configureawait.props - ..\Directory.Build.props = ..\Directory.Build.props - ..\Directory.Packages.props = ..\Directory.Packages.props - ..\NuGet.Config = ..\NuGet.Config - ..\README.en.md = ..\README.en.md - ..\README.md = ..\README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dapr", "dapr", "{FD9F5933-FDE5-4504-99BF-9050E0435C6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr", "framework\dapr\LINGYUN.Abp.Dapr\LINGYUN.Abp.Dapr.csproj", "{CAEF3248-527D-48B7-9C98-929AC573C381}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr.Client", "framework\dapr\LINGYUN.Abp.Dapr.Client\LINGYUN.Abp.Dapr.Client.csproj", "{209E7129-4B39-4768-A0D6-797F796E4FCE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{D67EBE62-C541-45E4-957E-D1D11BE74F68}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "single-project", "single-project", "{0D69B63D-F082-4D57-9FF0-355642C56993}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single.EntityFrameworkCore", "migrations\LY.MicroService.Applications.Single.EntityFrameworkCore\LY.MicroService.Applications.Single.EntityFrameworkCore.csproj", "{7623D363-F0BD-400C-B8AB-3FD9699D92D9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single.DbMigrator", "migrations\LY.MicroService.Applications.Single.DbMigrator\LY.MicroService.Applications.Single.DbMigrator.csproj", "{E2BA59EA-769B-4D5B-8032-CB9682D0D73A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\realtime-notifications\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{5F0926F3-463D-445B-9746-0A037DC431F9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.MicroService.Internal.ApiGateway", "..\gateways\internal\LINGYUN.MicroService.Internal.ApiGateway\src\LINGYUN.MicroService.Internal.ApiGateway\LINGYUN.MicroService.Internal.ApiGateway.csproj", "{21878B72-9801-41CE-88CD-7195714AE9BA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "feature-management", "feature-management", "{97C36EF3-805E-4B93-9AF6-C1E22AA583B1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permissions-management", "permissions-management", "{99CB6AD9-92E8-4B9B-99E3-28404AA41655}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Application.Contracts", "modules\feature-management\LINGYUN.Abp.FeatureManagement.Application.Contracts\LINGYUN.Abp.FeatureManagement.Application.Contracts.csproj", "{2263600B-30CB-4188-925D-92F12F904163}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Application", "modules\feature-management\LINGYUN.Abp.FeatureManagement.Application\LINGYUN.Abp.FeatureManagement.Application.csproj", "{2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.HttpApi", "modules\feature-management\LINGYUN.Abp.FeatureManagement.HttpApi\LINGYUN.Abp.FeatureManagement.HttpApi.csproj", "{C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Application.Contracts", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Application.Contracts\LINGYUN.Abp.PermissionManagement.Application.Contracts.csproj", "{FAD86432-6A95-47DE-8E3A-FC2101753C52}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Application", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Application\LINGYUN.Abp.PermissionManagement.Application.csproj", "{5F278E32-3A2A-4654-BD3C-B183301382FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.HttpApi", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.HttpApi\LINGYUN.Abp.PermissionManagement.HttpApi.csproj", "{1DB57C74-1C40-4414-B968-937C3C1C157E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits\LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits.csproj", "{F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "framework\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{C4D3B4CA-6631-4447-9D89-A535305E581A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{18FCB763-1EFF-47DF-ACED-98B7F994FD10}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Logging.Serilog.Elasticsearch", "framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj", "{3B5EB3D6-08FD-490C-BC70-805B199A0333}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Http.Client.Wrapper", "framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj", "{28422FE4-8D58-4D8A-8363-7A9D569A5695}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work", "framework\wechat\LINGYUN.Abp.WeChat.Work\LINGYUN.Abp.WeChat.Work.csproj", "{B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Application.Contracts", "framework\wechat\LINGYUN.Abp.WeChat.Work.Application.Contracts\LINGYUN.Abp.WeChat.Work.Application.Contracts.csproj", "{90C71347-89E2-4546-9A64-FE56F6A48E13}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Application", "framework\wechat\LINGYUN.Abp.WeChat.Work.Application\LINGYUN.Abp.WeChat.Work.Application.csproj", "{93B1913D-41B8-4FAB-8472-4BE03F4DC03C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.HttpApi", "framework\wechat\LINGYUN.Abp.WeChat.Work.HttpApi\LINGYUN.Abp.WeChat.Work.HttpApi.csproj", "{6FA91938-03AB-41B0-9A80-14AE550D745E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.Work", "modules\realtime-notifications\LINGYUN.Abp.Notifications.WeChat.Work\LINGYUN.Abp.Notifications.WeChat.Work.csproj", "{838A6EB6-BCD4-498E-A729-6875F4A6EDF1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Portal", "modules\openIddict\LINGYUN.Abp.OpenIddict.Portal\LINGYUN.Abp.OpenIddict.Portal.csproj", "{EA9F69A2-ACCF-477B-9519-257CF47DC0F4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.WeChat.Work", "modules\openIddict\LINGYUN.Abp.OpenIddict.WeChat.Work\LINGYUN.Abp.OpenIddict.WeChat.Work.csproj", "{7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{78DDE8A1-6501-4213-9BB5-CE6A11341F7D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "idempotent", "idempotent", "{5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Idempotent", "framework\common\LINGYUN.Abp.Idempotent\LINGYUN.Abp.Idempotent.csproj", "{3DFAECE7-496B-4E86-A23F-5F9A597D1119}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Idempotent", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Idempotent\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.csproj", "{3690518A-D6C3-42CC-AEC2-6D48C6987F68}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper.csproj", "{0D34162C-0CE3-4D7B-B19A-4786C616D0B3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Wrapper", "framework\common\LINGYUN.Abp.AspNetCore.Wrapper\LINGYUN.Abp.AspNetCore.Wrapper.csproj", "{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.AspNetCore", "modules\openIddict\LINGYUN.Abp.OpenIddict.AspNetCore\LINGYUN.Abp.OpenIddict.AspNetCore.csproj", "{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application.Contracts", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application.Contracts\LINGYUN.Abp.WeChat.Official.Application.Contracts.csproj", "{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application\LINGYUN.Abp.WeChat.Official.Application.csproj", "{E957DB2E-589D-4310-9576-92F108A67CE7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.HttpApi", "framework\wechat\LINGYUN.Abp.WeChat.Official.HttpApi\LINGYUN.Abp.WeChat.Official.HttpApi.csproj", "{4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Common", "framework\wechat\LINGYUN.Abp.WeChat.Common\LINGYUN.Abp.WeChat.Common.csproj", "{C4690A20-8628-4A39-8E71-2D09800D0E72}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Common", "framework\wechat\LINGYUN.Abp.WeChat.Work.Common\LINGYUN.Abp.WeChat.Work.Common.csproj", "{8233A44F-4DFC-4701-9C04-834FD3C97060}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging.Elasticsearch", "framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj", "{66A6E78D-E547-4DD7-9844-087FAB3D03C2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.TaskManagement", "modules\task-management\LINGYUN.Abp.BackgroundTasks.TaskManagement\LINGYUN.Abp.BackgroundTasks.TaskManagement.csproj", "{A99F5406-37DC-4677-9166-9BDE90C26CA6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Jobs", "modules\saas\LINGYUN.Abp.Saas.Jobs\LINGYUN.Abp.Saas.Jobs.csproj", "{8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Portal", "modules\identityServer\LINGYUN.Abp.IdentityServer.Portal\LINGYUN.Abp.IdentityServer.Portal.csproj", "{986B92F6-A758-4D1F-8BC7-BFD13FF38591}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat.Work", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat.Work\LINGYUN.Abp.IdentityServer.WeChat.Work.csproj", "{62D72C3E-5C57-439D-B7F7-5C55CC384A7A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Session", "modules\identity\LINGYUN.Abp.Identity.Session\LINGYUN.Abp.Identity.Session.csproj", "{74156CFF-C236-4DED-B810-FAD8948F51CA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Session.AspNetCore", "modules\identity\LINGYUN.Abp.Identity.Session.AspNetCore\LINGYUN.Abp.Identity.Session.AspNetCore.csproj", "{63D08153-B43C-4884-8818-4AB42E1FEE75}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.AspNetCore.Session", "modules\identity\LINGYUN.Abp.Identity.AspNetCore.Session\LINGYUN.Abp.Identity.AspNetCore.Session.csproj", "{AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Session", "modules\identityServer\LINGYUN.Abp.IdentityServer.Session\LINGYUN.Abp.IdentityServer.Session.csproj", "{F7459720-873C-4741-A991-A671CF03A6AF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.AspNetCore.Session", "modules\openIddict\LINGYUN.Abp.OpenIddict.AspNetCore.Session\LINGYUN.Abp.OpenIddict.AspNetCore.Session.csproj", "{382CAC43-EE1F-4DA3-B433-E23C3F58F44A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Notifications", "modules\identity\LINGYUN.Abp.Identity.Notifications\LINGYUN.Abp.Identity.Notifications.csproj", "{4634B421-36E6-4169-AA1A-11050902495F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Handlers", "framework\wechat\LINGYUN.Abp.WeChat.Official.Handlers\LINGYUN.Abp.WeChat.Official.Handlers.csproj", "{BB2DF96A-6ED8-4F47-948C-230EA2065C4C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Handlers", "framework\wechat\LINGYUN.Abp.WeChat.Work.Handlers\LINGYUN.Abp.WeChat.Work.Handlers.csproj", "{DB80C55F-8B70-4840-942A-ED021ED88BD6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.Saas", "modules\saas\LINGYUN.Abp.MultiTenancy.Saas\LINGYUN.Abp.MultiTenancy.Saas.csproj", "{E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IP2Region", "framework\common\LINGYUN.Abp.IP2Region\LINGYUN.Abp.IP2Region.csproj", "{DA54E88E-C43E-4E31-92D0-08A753F2C08D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{A7417E7F-DB97-48DB-B849-AFC15854A6E7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{8DDE4291-BC57-4C56-9871-B982462F4C3D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IP2Region.Tests", "tests\LINGYUN.Abp.IP2Region.Tests\LINGYUN.Abp.IP2Region.Tests.csproj", "{C5D64A2B-7E7E-4509-9F31-425D59712E6F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data-protection", "data-protection", "{07C2FB08-985C-42FE-85AF-38E40A301668}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.Abstractions", "framework\data-protection\LINGYUN.Abp.DataProtection.Abstractions\LINGYUN.Abp.DataProtection.Abstractions.csproj", "{A52C54FB-C96D-4032-8588-AFC2CD158D23}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection", "framework\data-protection\LINGYUN.Abp.DataProtection\LINGYUN.Abp.DataProtection.csproj", "{B05ED61E-9A36-4E90-B876-F48559E018A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.EntityFrameworkCore", "framework\data-protection\LINGYUN.Abp.DataProtection.EntityFrameworkCore\LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj", "{1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data-protection", "data-protection", "{4FCD7337-4320-412D-9BC8-A0B243BC27B3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Domain.Shared", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Domain.Shared\LINGYUN.Abp.DataProtectionManagement.Domain.Shared.csproj", "{9D2C789C-8241-4F53-AFEF-F2AB15BAA823}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Domain", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Domain\LINGYUN.Abp.DataProtectionManagement.Domain.csproj", "{36AEA095-E34D-43F5-8000-9FA3A696C312}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Application.Contracts", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Application.Contracts\LINGYUN.Abp.DataProtectionManagement.Application.Contracts.csproj", "{2D5A9AB0-9F32-4784-8972-814F86C0239D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Application", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Application\LINGYUN.Abp.DataProtectionManagement.Application.csproj", "{A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore\LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore.csproj", "{AF15C829-9288-4D7F-95A0-4EA8DF909929}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.HttpApi", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.HttpApi\LINGYUN.Abp.DataProtectionManagement.HttpApi.csproj", "{616652A5-A420-475C-AC9F-FC687E3C768B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{E29EC2A4-A2DE-442F-8616-DAFD69F128B8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Domain.Shared", "modules\demo\LINGYUN.Abp.Demo.Domain.Shared\LINGYUN.Abp.Demo.Domain.Shared.csproj", "{D736C433-C230-46B7-9D43-17D0282EBBDF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Domain", "modules\demo\LINGYUN.Abp.Demo.Domain\LINGYUN.Abp.Demo.Domain.csproj", "{FA525A71-C0BF-49FB-BAB7-547944618587}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Application.Contracts", "modules\demo\LINGYUN.Abp.Demo.Application.Contracts\LINGYUN.Abp.Demo.Application.Contracts.csproj", "{532D5703-0090-4F2E-B725-5786D53506C9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Application", "modules\demo\LINGYUN.Abp.Demo.Application\LINGYUN.Abp.Demo.Application.csproj", "{E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.EntityFrameworkCore", "modules\demo\LINGYUN.Abp.Demo.EntityFrameworkCore\LINGYUN.Abp.Demo.EntityFrameworkCore.csproj", "{71CF0E82-FA07-472A-B32A-AC25EDA82BB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.HttpApi", "modules\demo\LINGYUN.Abp.Demo.HttpApi\LINGYUN.Abp.Demo.HttpApi.csproj", "{77965572-373C-4319-9EF9-73D6E660044B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exporter", "exporter", "{4A2CF141-F32D-45A0-8665-B3705667A6D2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Application.Contracts", "framework\exporter\LINGYUN.Abp.Exporter.Application.Contracts\LINGYUN.Abp.Exporter.Application.Contracts.csproj", "{A3924A79-1ADC-458D-8764-3958297BDEB0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Application", "framework\exporter\LINGYUN.Abp.Exporter.Application\LINGYUN.Abp.Exporter.Application.csproj", "{38A933EB-82F1-42A6-ABF3-F55975B4078E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Core", "framework\exporter\LINGYUN.Abp.Exporter.Core\LINGYUN.Abp.Exporter.Core.csproj", "{03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.MiniExcel", "framework\exporter\LINGYUN.Abp.Exporter.MiniExcel\LINGYUN.Abp.Exporter.MiniExcel.csproj", "{CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.MagicodesIE.Excel", "framework\exporter\LINGYUN.Abp.Exporter.MagicodesIE.Excel\LINGYUN.Abp.Exporter.MagicodesIE.Excel.csproj", "{319428B9-CE7F-4027-92FA-6311C4CE95FB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Minio", "modules\oss-management\LINGYUN.Abp.OssManagement.Minio\LINGYUN.Abp.OssManagement.Minio.csproj", "{9AE3E97E-8846-4315-9546-FF97E97FD49F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Imaging", "modules\oss-management\LINGYUN.Abp.OssManagement.Imaging\LINGYUN.Abp.OssManagement.Imaging.csproj", "{BC7A8662-4313-4F1D-B267-9B1B69444CD3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cap", "cap", "{7C35101B-EA29-4B3D-B424-FAD625977E4D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.EventBus.CAP", "framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{4539FCDB-7192-442C-BD9B-0AC71E882F4F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.AuditLogging.IP2Region", "framework\auditing\LINGYUN.Abp.AuditLogging.IP2Region\LINGYUN.Abp.AuditLogging.IP2Region.csproj", "{DFDF367D-EDE1-4365-90F9-32F529117B60}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Release|Any CPU.Build.0 = Release|Any CPU - {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Release|Any CPU.Build.0 = Release|Any CPU - {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Debug|Any CPU.Build.0 = Debug|Any CPU - {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Release|Any CPU.ActiveCfg = Release|Any CPU - {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Release|Any CPU.Build.0 = Release|Any CPU - {4995C481-7465-4A36-8416-0D0D14F64B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4995C481-7465-4A36-8416-0D0D14F64B10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4995C481-7465-4A36-8416-0D0D14F64B10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4995C481-7465-4A36-8416-0D0D14F64B10}.Release|Any CPU.Build.0 = Release|Any CPU - {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Release|Any CPU.Build.0 = Release|Any CPU - {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Release|Any CPU.Build.0 = Release|Any CPU - {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Release|Any CPU.Build.0 = Release|Any CPU - {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Release|Any CPU.Build.0 = Release|Any CPU - {7F831848-A1C1-49FE-B81A-499AB6E17286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7F831848-A1C1-49FE-B81A-499AB6E17286}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7F831848-A1C1-49FE-B81A-499AB6E17286}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7F831848-A1C1-49FE-B81A-499AB6E17286}.Release|Any CPU.Build.0 = Release|Any CPU - {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Release|Any CPU.Build.0 = Release|Any CPU - {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Release|Any CPU.Build.0 = Release|Any CPU - {8064607C-BDB9-454D-8E76-2B21023CD071}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8064607C-BDB9-454D-8E76-2B21023CD071}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8064607C-BDB9-454D-8E76-2B21023CD071}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8064607C-BDB9-454D-8E76-2B21023CD071}.Release|Any CPU.Build.0 = Release|Any CPU - {A3BF5605-8684-4713-885D-CC498CC37686}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A3BF5605-8684-4713-885D-CC498CC37686}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A3BF5605-8684-4713-885D-CC498CC37686}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A3BF5605-8684-4713-885D-CC498CC37686}.Release|Any CPU.Build.0 = Release|Any CPU - {D1399D41-0273-45FA-969F-FA9C77432A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D1399D41-0273-45FA-969F-FA9C77432A06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D1399D41-0273-45FA-969F-FA9C77432A06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D1399D41-0273-45FA-969F-FA9C77432A06}.Release|Any CPU.Build.0 = Release|Any CPU - {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Release|Any CPU.Build.0 = Release|Any CPU - {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Release|Any CPU.Build.0 = Release|Any CPU - {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Release|Any CPU.Build.0 = Release|Any CPU - {7259B767-9528-4EF9-8F81-20344879F1CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7259B767-9528-4EF9-8F81-20344879F1CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7259B767-9528-4EF9-8F81-20344879F1CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7259B767-9528-4EF9-8F81-20344879F1CD}.Release|Any CPU.Build.0 = Release|Any CPU - {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Release|Any CPU.Build.0 = Release|Any CPU - {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Release|Any CPU.Build.0 = Release|Any CPU - {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Release|Any CPU.Build.0 = Release|Any CPU - {60C97165-7CAB-467A-857E-9343B239F8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {60C97165-7CAB-467A-857E-9343B239F8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {60C97165-7CAB-467A-857E-9343B239F8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {60C97165-7CAB-467A-857E-9343B239F8EF}.Release|Any CPU.Build.0 = Release|Any CPU - {C18979C7-EBD1-437D-A877-4A97B68761A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C18979C7-EBD1-437D-A877-4A97B68761A5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C18979C7-EBD1-437D-A877-4A97B68761A5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C18979C7-EBD1-437D-A877-4A97B68761A5}.Release|Any CPU.Build.0 = Release|Any CPU - {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Release|Any CPU.Build.0 = Release|Any CPU - {D2AB9E95-A074-498A-A475-2298D0F1973E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2AB9E95-A074-498A-A475-2298D0F1973E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2AB9E95-A074-498A-A475-2298D0F1973E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2AB9E95-A074-498A-A475-2298D0F1973E}.Release|Any CPU.Build.0 = Release|Any CPU - {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Release|Any CPU.Build.0 = Release|Any CPU - {2D66E202-B34D-4998-BD80-5411C8087695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D66E202-B34D-4998-BD80-5411C8087695}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D66E202-B34D-4998-BD80-5411C8087695}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D66E202-B34D-4998-BD80-5411C8087695}.Release|Any CPU.Build.0 = Release|Any CPU - {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Release|Any CPU.Build.0 = Release|Any CPU - {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Release|Any CPU.Build.0 = Release|Any CPU - {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Release|Any CPU.Build.0 = Release|Any CPU - {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Release|Any CPU.Build.0 = Release|Any CPU - {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Release|Any CPU.Build.0 = Release|Any CPU - {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Release|Any CPU.Build.0 = Release|Any CPU - {45E954A6-5F29-48B3-B518-513F6837EE27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45E954A6-5F29-48B3-B518-513F6837EE27}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45E954A6-5F29-48B3-B518-513F6837EE27}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45E954A6-5F29-48B3-B518-513F6837EE27}.Release|Any CPU.Build.0 = Release|Any CPU - {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Release|Any CPU.Build.0 = Release|Any CPU - {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Release|Any CPU.Build.0 = Release|Any CPU - {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Release|Any CPU.Build.0 = Release|Any CPU - {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Release|Any CPU.Build.0 = Release|Any CPU - {9B4C9894-D295-4D16-AC90-F98563B37722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9B4C9894-D295-4D16-AC90-F98563B37722}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B4C9894-D295-4D16-AC90-F98563B37722}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9B4C9894-D295-4D16-AC90-F98563B37722}.Release|Any CPU.Build.0 = Release|Any CPU - {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Release|Any CPU.Build.0 = Release|Any CPU - {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Release|Any CPU.Build.0 = Release|Any CPU - {33D6A170-D609-430C-B110-E1A8F3322C06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33D6A170-D609-430C-B110-E1A8F3322C06}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33D6A170-D609-430C-B110-E1A8F3322C06}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33D6A170-D609-430C-B110-E1A8F3322C06}.Release|Any CPU.Build.0 = Release|Any CPU - {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Release|Any CPU.Build.0 = Release|Any CPU - {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Release|Any CPU.Build.0 = Release|Any CPU - {19CD928F-D16F-4A91-BA0C-2459F5055565}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {19CD928F-D16F-4A91-BA0C-2459F5055565}.Debug|Any CPU.Build.0 = Debug|Any CPU - {19CD928F-D16F-4A91-BA0C-2459F5055565}.Release|Any CPU.ActiveCfg = Release|Any CPU - {19CD928F-D16F-4A91-BA0C-2459F5055565}.Release|Any CPU.Build.0 = Release|Any CPU - {86993E17-8793-45ED-B636-C921BB1165D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86993E17-8793-45ED-B636-C921BB1165D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86993E17-8793-45ED-B636-C921BB1165D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86993E17-8793-45ED-B636-C921BB1165D7}.Release|Any CPU.Build.0 = Release|Any CPU - {158AFAD1-39AE-4135-81EE-55F905802A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {158AFAD1-39AE-4135-81EE-55F905802A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {158AFAD1-39AE-4135-81EE-55F905802A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {158AFAD1-39AE-4135-81EE-55F905802A8B}.Release|Any CPU.Build.0 = Release|Any CPU - {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Release|Any CPU.Build.0 = Release|Any CPU - {BF943CF0-2732-41D3-BFE3-9B843564D807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF943CF0-2732-41D3-BFE3-9B843564D807}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF943CF0-2732-41D3-BFE3-9B843564D807}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF943CF0-2732-41D3-BFE3-9B843564D807}.Release|Any CPU.Build.0 = Release|Any CPU - {B93528E2-55EA-4847-950D-8B95B1CC2909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B93528E2-55EA-4847-950D-8B95B1CC2909}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B93528E2-55EA-4847-950D-8B95B1CC2909}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B93528E2-55EA-4847-950D-8B95B1CC2909}.Release|Any CPU.Build.0 = Release|Any CPU - {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Release|Any CPU.Build.0 = Release|Any CPU - {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Release|Any CPU.Build.0 = Release|Any CPU - {2B1B759E-670A-4837-854A-4748C67BB15B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2B1B759E-670A-4837-854A-4748C67BB15B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2B1B759E-670A-4837-854A-4748C67BB15B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2B1B759E-670A-4837-854A-4748C67BB15B}.Release|Any CPU.Build.0 = Release|Any CPU - {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Release|Any CPU.Build.0 = Release|Any CPU - {97064B96-B5AC-461D-BBBF-97A864F373E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97064B96-B5AC-461D-BBBF-97A864F373E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97064B96-B5AC-461D-BBBF-97A864F373E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97064B96-B5AC-461D-BBBF-97A864F373E6}.Release|Any CPU.Build.0 = Release|Any CPU - {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Release|Any CPU.Build.0 = Release|Any CPU - {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Release|Any CPU.Build.0 = Release|Any CPU - {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Release|Any CPU.Build.0 = Release|Any CPU - {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Release|Any CPU.Build.0 = Release|Any CPU - {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Release|Any CPU.Build.0 = Release|Any CPU - {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Release|Any CPU.Build.0 = Release|Any CPU - {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Release|Any CPU.Build.0 = Release|Any CPU - {DA053CAE-EBA4-4532-93B5-3347589CB174}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA053CAE-EBA4-4532-93B5-3347589CB174}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA053CAE-EBA4-4532-93B5-3347589CB174}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA053CAE-EBA4-4532-93B5-3347589CB174}.Release|Any CPU.Build.0 = Release|Any CPU - {76810110-6683-4777-9157-8030F9205FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76810110-6683-4777-9157-8030F9205FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76810110-6683-4777-9157-8030F9205FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76810110-6683-4777-9157-8030F9205FBF}.Release|Any CPU.Build.0 = Release|Any CPU - {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Release|Any CPU.Build.0 = Release|Any CPU - {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Release|Any CPU.Build.0 = Release|Any CPU - {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Release|Any CPU.Build.0 = Release|Any CPU - {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Release|Any CPU.Build.0 = Release|Any CPU - {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Release|Any CPU.Build.0 = Release|Any CPU - {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Release|Any CPU.Build.0 = Release|Any CPU - {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Release|Any CPU.Build.0 = Release|Any CPU - {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Release|Any CPU.Build.0 = Release|Any CPU - {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Release|Any CPU.Build.0 = Release|Any CPU - {21691099-AF37-4706-84AE-C19C72DC09B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21691099-AF37-4706-84AE-C19C72DC09B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21691099-AF37-4706-84AE-C19C72DC09B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21691099-AF37-4706-84AE-C19C72DC09B6}.Release|Any CPU.Build.0 = Release|Any CPU - {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Release|Any CPU.Build.0 = Release|Any CPU - {974D842A-9739-40E4-96E8-039552E28D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {974D842A-9739-40E4-96E8-039552E28D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {974D842A-9739-40E4-96E8-039552E28D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {974D842A-9739-40E4-96E8-039552E28D8B}.Release|Any CPU.Build.0 = Release|Any CPU - {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Release|Any CPU.Build.0 = Release|Any CPU - {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Release|Any CPU.Build.0 = Release|Any CPU - {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Release|Any CPU.Build.0 = Release|Any CPU - {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Release|Any CPU.Build.0 = Release|Any CPU - {81B74E08-06CD-4134-A02D-B4B837945E2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81B74E08-06CD-4134-A02D-B4B837945E2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81B74E08-06CD-4134-A02D-B4B837945E2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81B74E08-06CD-4134-A02D-B4B837945E2B}.Release|Any CPU.Build.0 = Release|Any CPU - {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Release|Any CPU.Build.0 = Release|Any CPU - {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Release|Any CPU.Build.0 = Release|Any CPU - {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Release|Any CPU.Build.0 = Release|Any CPU - {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Release|Any CPU.Build.0 = Release|Any CPU - {D4BC55C7-1991-4866-A7BA-66653DACF945}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D4BC55C7-1991-4866-A7BA-66653DACF945}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D4BC55C7-1991-4866-A7BA-66653DACF945}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D4BC55C7-1991-4866-A7BA-66653DACF945}.Release|Any CPU.Build.0 = Release|Any CPU - {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Release|Any CPU.Build.0 = Release|Any CPU - {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Release|Any CPU.Build.0 = Release|Any CPU - {46C57140-EE02-4785-9777-F2264EC88135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46C57140-EE02-4785-9777-F2264EC88135}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46C57140-EE02-4785-9777-F2264EC88135}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46C57140-EE02-4785-9777-F2264EC88135}.Release|Any CPU.Build.0 = Release|Any CPU - {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Release|Any CPU.Build.0 = Release|Any CPU - {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Release|Any CPU.Build.0 = Release|Any CPU - {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Release|Any CPU.Build.0 = Release|Any CPU - {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Release|Any CPU.Build.0 = Release|Any CPU - {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Release|Any CPU.Build.0 = Release|Any CPU - {A69E6742-39A6-4C0D-A098-E16A653331AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A69E6742-39A6-4C0D-A098-E16A653331AC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A69E6742-39A6-4C0D-A098-E16A653331AC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A69E6742-39A6-4C0D-A098-E16A653331AC}.Release|Any CPU.Build.0 = Release|Any CPU - {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Release|Any CPU.Build.0 = Release|Any CPU - {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Release|Any CPU.Build.0 = Release|Any CPU - {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Release|Any CPU.Build.0 = Release|Any CPU - {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Release|Any CPU.Build.0 = Release|Any CPU - {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Release|Any CPU.Build.0 = Release|Any CPU - {56C00F97-6769-44B2-8004-341D5286E31F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56C00F97-6769-44B2-8004-341D5286E31F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56C00F97-6769-44B2-8004-341D5286E31F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56C00F97-6769-44B2-8004-341D5286E31F}.Release|Any CPU.Build.0 = Release|Any CPU - {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Release|Any CPU.Build.0 = Release|Any CPU - {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Release|Any CPU.Build.0 = Release|Any CPU - {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Release|Any CPU.Build.0 = Release|Any CPU - {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Release|Any CPU.Build.0 = Release|Any CPU - {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Release|Any CPU.Build.0 = Release|Any CPU - {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Release|Any CPU.Build.0 = Release|Any CPU - {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Release|Any CPU.Build.0 = Release|Any CPU - {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Release|Any CPU.Build.0 = Release|Any CPU - {A74A9B50-0E40-44AD-9360-5BF96696B405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A74A9B50-0E40-44AD-9360-5BF96696B405}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A74A9B50-0E40-44AD-9360-5BF96696B405}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A74A9B50-0E40-44AD-9360-5BF96696B405}.Release|Any CPU.Build.0 = Release|Any CPU - {A243383E-7025-4893-9611-EE75DA055301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A243383E-7025-4893-9611-EE75DA055301}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A243383E-7025-4893-9611-EE75DA055301}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A243383E-7025-4893-9611-EE75DA055301}.Release|Any CPU.Build.0 = Release|Any CPU - {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Release|Any CPU.Build.0 = Release|Any CPU - {86ED8028-5533-4B5D-8594-C09929F2A553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86ED8028-5533-4B5D-8594-C09929F2A553}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86ED8028-5533-4B5D-8594-C09929F2A553}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86ED8028-5533-4B5D-8594-C09929F2A553}.Release|Any CPU.Build.0 = Release|Any CPU - {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Release|Any CPU.Build.0 = Release|Any CPU - {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Release|Any CPU.Build.0 = Release|Any CPU - {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Release|Any CPU.Build.0 = Release|Any CPU - {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Release|Any CPU.Build.0 = Release|Any CPU - {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Release|Any CPU.Build.0 = Release|Any CPU - {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Release|Any CPU.Build.0 = Release|Any CPU - {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Release|Any CPU.Build.0 = Release|Any CPU - {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Release|Any CPU.Build.0 = Release|Any CPU - {2BB68CBB-2220-466B-B24E-6916819DFB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2BB68CBB-2220-466B-B24E-6916819DFB79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2BB68CBB-2220-466B-B24E-6916819DFB79}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BB68CBB-2220-466B-B24E-6916819DFB79}.Release|Any CPU.Build.0 = Release|Any CPU - {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Release|Any CPU.Build.0 = Release|Any CPU - {AF2F208F-43D6-4296-9826-677681BEC6D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF2F208F-43D6-4296-9826-677681BEC6D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF2F208F-43D6-4296-9826-677681BEC6D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF2F208F-43D6-4296-9826-677681BEC6D4}.Release|Any CPU.Build.0 = Release|Any CPU - {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Release|Any CPU.Build.0 = Release|Any CPU - {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Release|Any CPU.Build.0 = Release|Any CPU - {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Release|Any CPU.Build.0 = Release|Any CPU - {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Release|Any CPU.Build.0 = Release|Any CPU - {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Release|Any CPU.Build.0 = Release|Any CPU - {C9202B23-45E9-4167-BFAC-89651AF554EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9202B23-45E9-4167-BFAC-89651AF554EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9202B23-45E9-4167-BFAC-89651AF554EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9202B23-45E9-4167-BFAC-89651AF554EB}.Release|Any CPU.Build.0 = Release|Any CPU - {16666C1F-09C1-4829-9AFC-77FB22439A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16666C1F-09C1-4829-9AFC-77FB22439A59}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16666C1F-09C1-4829-9AFC-77FB22439A59}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16666C1F-09C1-4829-9AFC-77FB22439A59}.Release|Any CPU.Build.0 = Release|Any CPU - {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Release|Any CPU.Build.0 = Release|Any CPU - {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Release|Any CPU.Build.0 = Release|Any CPU - {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Release|Any CPU.Build.0 = Release|Any CPU - {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Release|Any CPU.Build.0 = Release|Any CPU - {1C3BCC38-D583-402F-B922-5562F19EA12C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1C3BCC38-D583-402F-B922-5562F19EA12C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1C3BCC38-D583-402F-B922-5562F19EA12C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1C3BCC38-D583-402F-B922-5562F19EA12C}.Release|Any CPU.Build.0 = Release|Any CPU - {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Release|Any CPU.Build.0 = Release|Any CPU - {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Release|Any CPU.Build.0 = Release|Any CPU - {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Release|Any CPU.Build.0 = Release|Any CPU - {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Release|Any CPU.Build.0 = Release|Any CPU - {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Release|Any CPU.Build.0 = Release|Any CPU - {6A79337A-879F-4A9F-8328-5578E40177B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A79337A-879F-4A9F-8328-5578E40177B5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A79337A-879F-4A9F-8328-5578E40177B5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A79337A-879F-4A9F-8328-5578E40177B5}.Release|Any CPU.Build.0 = Release|Any CPU - {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Debug|Any CPU.Build.0 = Debug|Any CPU - {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Release|Any CPU.ActiveCfg = Release|Any CPU - {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Release|Any CPU.Build.0 = Release|Any CPU - {118D91CE-091B-4C65-8979-2F5363C56CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {118D91CE-091B-4C65-8979-2F5363C56CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {118D91CE-091B-4C65-8979-2F5363C56CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {118D91CE-091B-4C65-8979-2F5363C56CDC}.Release|Any CPU.Build.0 = Release|Any CPU - {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Release|Any CPU.Build.0 = Release|Any CPU - {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Release|Any CPU.Build.0 = Release|Any CPU - {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Release|Any CPU.Build.0 = Release|Any CPU - {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Release|Any CPU.Build.0 = Release|Any CPU - {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Release|Any CPU.Build.0 = Release|Any CPU - {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Release|Any CPU.Build.0 = Release|Any CPU - {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Release|Any CPU.Build.0 = Release|Any CPU - {0E0683C3-5169-4965-A886-D960811E1807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E0683C3-5169-4965-A886-D960811E1807}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E0683C3-5169-4965-A886-D960811E1807}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E0683C3-5169-4965-A886-D960811E1807}.Release|Any CPU.Build.0 = Release|Any CPU - {8011A4C4-F08C-463D-A376-F33A7F780F57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8011A4C4-F08C-463D-A376-F33A7F780F57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8011A4C4-F08C-463D-A376-F33A7F780F57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8011A4C4-F08C-463D-A376-F33A7F780F57}.Release|Any CPU.Build.0 = Release|Any CPU - {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Release|Any CPU.Build.0 = Release|Any CPU - {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Release|Any CPU.Build.0 = Release|Any CPU - {9697AB9A-2ACA-42E5-877E-EEF371166898}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9697AB9A-2ACA-42E5-877E-EEF371166898}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9697AB9A-2ACA-42E5-877E-EEF371166898}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9697AB9A-2ACA-42E5-877E-EEF371166898}.Release|Any CPU.Build.0 = Release|Any CPU - {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Debug|Any CPU.Build.0 = Debug|Any CPU - {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Release|Any CPU.ActiveCfg = Release|Any CPU - {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Release|Any CPU.Build.0 = Release|Any CPU - {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Release|Any CPU.Build.0 = Release|Any CPU - {AABB5ABC-790E-48D1-B654-72143227FA64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AABB5ABC-790E-48D1-B654-72143227FA64}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AABB5ABC-790E-48D1-B654-72143227FA64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AABB5ABC-790E-48D1-B654-72143227FA64}.Release|Any CPU.Build.0 = Release|Any CPU - {CA5E2785-511D-4A14-8883-2544C869B2DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CA5E2785-511D-4A14-8883-2544C869B2DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CA5E2785-511D-4A14-8883-2544C869B2DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CA5E2785-511D-4A14-8883-2544C869B2DF}.Release|Any CPU.Build.0 = Release|Any CPU - {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Release|Any CPU.Build.0 = Release|Any CPU - {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Release|Any CPU.Build.0 = Release|Any CPU - {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Release|Any CPU.Build.0 = Release|Any CPU - {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Release|Any CPU.Build.0 = Release|Any CPU - {2230E355-50F7-424F-929F-532B0A5DABE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2230E355-50F7-424F-929F-532B0A5DABE0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2230E355-50F7-424F-929F-532B0A5DABE0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2230E355-50F7-424F-929F-532B0A5DABE0}.Release|Any CPU.Build.0 = Release|Any CPU - {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Release|Any CPU.Build.0 = Release|Any CPU - {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Release|Any CPU.Build.0 = Release|Any CPU - {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Release|Any CPU.Build.0 = Release|Any CPU - {CAEF3248-527D-48B7-9C98-929AC573C381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CAEF3248-527D-48B7-9C98-929AC573C381}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CAEF3248-527D-48B7-9C98-929AC573C381}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CAEF3248-527D-48B7-9C98-929AC573C381}.Release|Any CPU.Build.0 = Release|Any CPU - {209E7129-4B39-4768-A0D6-797F796E4FCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {209E7129-4B39-4768-A0D6-797F796E4FCE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {209E7129-4B39-4768-A0D6-797F796E4FCE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {209E7129-4B39-4768-A0D6-797F796E4FCE}.Release|Any CPU.Build.0 = Release|Any CPU - {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Release|Any CPU.Build.0 = Release|Any CPU - {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Release|Any CPU.Build.0 = Release|Any CPU - {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Release|Any CPU.Build.0 = Release|Any CPU - {5F0926F3-463D-445B-9746-0A037DC431F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F0926F3-463D-445B-9746-0A037DC431F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F0926F3-463D-445B-9746-0A037DC431F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F0926F3-463D-445B-9746-0A037DC431F9}.Release|Any CPU.Build.0 = Release|Any CPU - {21878B72-9801-41CE-88CD-7195714AE9BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21878B72-9801-41CE-88CD-7195714AE9BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21878B72-9801-41CE-88CD-7195714AE9BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21878B72-9801-41CE-88CD-7195714AE9BA}.Release|Any CPU.Build.0 = Release|Any CPU - {2263600B-30CB-4188-925D-92F12F904163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2263600B-30CB-4188-925D-92F12F904163}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2263600B-30CB-4188-925D-92F12F904163}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2263600B-30CB-4188-925D-92F12F904163}.Release|Any CPU.Build.0 = Release|Any CPU - {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Release|Any CPU.Build.0 = Release|Any CPU - {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Release|Any CPU.Build.0 = Release|Any CPU - {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Release|Any CPU.Build.0 = Release|Any CPU - {5F278E32-3A2A-4654-BD3C-B183301382FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F278E32-3A2A-4654-BD3C-B183301382FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F278E32-3A2A-4654-BD3C-B183301382FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F278E32-3A2A-4654-BD3C-B183301382FB}.Release|Any CPU.Build.0 = Release|Any CPU - {1DB57C74-1C40-4414-B968-937C3C1C157E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DB57C74-1C40-4414-B968-937C3C1C157E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DB57C74-1C40-4414-B968-937C3C1C157E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DB57C74-1C40-4414-B968-937C3C1C157E}.Release|Any CPU.Build.0 = Release|Any CPU - {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Release|Any CPU.Build.0 = Release|Any CPU - {C4D3B4CA-6631-4447-9D89-A535305E581A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4D3B4CA-6631-4447-9D89-A535305E581A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4D3B4CA-6631-4447-9D89-A535305E581A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4D3B4CA-6631-4447-9D89-A535305E581A}.Release|Any CPU.Build.0 = Release|Any CPU - {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Release|Any CPU.Build.0 = Release|Any CPU - {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Release|Any CPU.Build.0 = Release|Any CPU - {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Release|Any CPU.Build.0 = Release|Any CPU - {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Release|Any CPU.Build.0 = Release|Any CPU - {90C71347-89E2-4546-9A64-FE56F6A48E13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {90C71347-89E2-4546-9A64-FE56F6A48E13}.Debug|Any CPU.Build.0 = Debug|Any CPU - {90C71347-89E2-4546-9A64-FE56F6A48E13}.Release|Any CPU.ActiveCfg = Release|Any CPU - {90C71347-89E2-4546-9A64-FE56F6A48E13}.Release|Any CPU.Build.0 = Release|Any CPU - {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Release|Any CPU.Build.0 = Release|Any CPU - {6FA91938-03AB-41B0-9A80-14AE550D745E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6FA91938-03AB-41B0-9A80-14AE550D745E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6FA91938-03AB-41B0-9A80-14AE550D745E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6FA91938-03AB-41B0-9A80-14AE550D745E}.Release|Any CPU.Build.0 = Release|Any CPU - {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Release|Any CPU.Build.0 = Release|Any CPU - {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Release|Any CPU.Build.0 = Release|Any CPU - {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Release|Any CPU.Build.0 = Release|Any CPU - {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Release|Any CPU.Build.0 = Release|Any CPU - {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Release|Any CPU.Build.0 = Release|Any CPU - {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Release|Any CPU.Build.0 = Release|Any CPU - {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.Build.0 = Release|Any CPU - {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.Build.0 = Release|Any CPU - {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Release|Any CPU.Build.0 = Release|Any CPU - {E957DB2E-589D-4310-9576-92F108A67CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E957DB2E-589D-4310-9576-92F108A67CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E957DB2E-589D-4310-9576-92F108A67CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E957DB2E-589D-4310-9576-92F108A67CE7}.Release|Any CPU.Build.0 = Release|Any CPU - {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Release|Any CPU.Build.0 = Release|Any CPU - {C4690A20-8628-4A39-8E71-2D09800D0E72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4690A20-8628-4A39-8E71-2D09800D0E72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4690A20-8628-4A39-8E71-2D09800D0E72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4690A20-8628-4A39-8E71-2D09800D0E72}.Release|Any CPU.Build.0 = Release|Any CPU - {8233A44F-4DFC-4701-9C04-834FD3C97060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8233A44F-4DFC-4701-9C04-834FD3C97060}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8233A44F-4DFC-4701-9C04-834FD3C97060}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8233A44F-4DFC-4701-9C04-834FD3C97060}.Release|Any CPU.Build.0 = Release|Any CPU - {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Release|Any CPU.Build.0 = Release|Any CPU - {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Release|Any CPU.Build.0 = Release|Any CPU - {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Release|Any CPU.Build.0 = Release|Any CPU - {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Release|Any CPU.Build.0 = Release|Any CPU - {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Debug|Any CPU.Build.0 = Debug|Any CPU - {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Release|Any CPU.ActiveCfg = Release|Any CPU - {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Release|Any CPU.Build.0 = Release|Any CPU - {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Release|Any CPU.Build.0 = Release|Any CPU - {74156CFF-C236-4DED-B810-FAD8948F51CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {74156CFF-C236-4DED-B810-FAD8948F51CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {74156CFF-C236-4DED-B810-FAD8948F51CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {74156CFF-C236-4DED-B810-FAD8948F51CA}.Release|Any CPU.Build.0 = Release|Any CPU - {63D08153-B43C-4884-8818-4AB42E1FEE75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {63D08153-B43C-4884-8818-4AB42E1FEE75}.Debug|Any CPU.Build.0 = Debug|Any CPU - {63D08153-B43C-4884-8818-4AB42E1FEE75}.Release|Any CPU.ActiveCfg = Release|Any CPU - {63D08153-B43C-4884-8818-4AB42E1FEE75}.Release|Any CPU.Build.0 = Release|Any CPU - {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Release|Any CPU.Build.0 = Release|Any CPU - {F7459720-873C-4741-A991-A671CF03A6AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7459720-873C-4741-A991-A671CF03A6AF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7459720-873C-4741-A991-A671CF03A6AF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7459720-873C-4741-A991-A671CF03A6AF}.Release|Any CPU.Build.0 = Release|Any CPU - {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Release|Any CPU.Build.0 = Release|Any CPU - {4634B421-36E6-4169-AA1A-11050902495F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4634B421-36E6-4169-AA1A-11050902495F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4634B421-36E6-4169-AA1A-11050902495F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4634B421-36E6-4169-AA1A-11050902495F}.Release|Any CPU.Build.0 = Release|Any CPU - {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Release|Any CPU.Build.0 = Release|Any CPU - {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Release|Any CPU.Build.0 = Release|Any CPU - {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Release|Any CPU.Build.0 = Release|Any CPU - {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Release|Any CPU.Build.0 = Release|Any CPU - {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Release|Any CPU.Build.0 = Release|Any CPU - {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Release|Any CPU.Build.0 = Release|Any CPU - {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Release|Any CPU.Build.0 = Release|Any CPU - {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Release|Any CPU.Build.0 = Release|Any CPU - {B05ED61E-9A36-4E90-B876-F48559E018A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B05ED61E-9A36-4E90-B876-F48559E018A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B05ED61E-9A36-4E90-B876-F48559E018A6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B05ED61E-9A36-4E90-B876-F48559E018A6}.Release|Any CPU.Build.0 = Release|Any CPU - {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Release|Any CPU.Build.0 = Release|Any CPU - {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Release|Any CPU.Build.0 = Release|Any CPU - {36AEA095-E34D-43F5-8000-9FA3A696C312}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36AEA095-E34D-43F5-8000-9FA3A696C312}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36AEA095-E34D-43F5-8000-9FA3A696C312}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36AEA095-E34D-43F5-8000-9FA3A696C312}.Release|Any CPU.Build.0 = Release|Any CPU - {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Release|Any CPU.Build.0 = Release|Any CPU - {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Release|Any CPU.Build.0 = Release|Any CPU - {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Release|Any CPU.Build.0 = Release|Any CPU - {616652A5-A420-475C-AC9F-FC687E3C768B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {616652A5-A420-475C-AC9F-FC687E3C768B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {616652A5-A420-475C-AC9F-FC687E3C768B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {616652A5-A420-475C-AC9F-FC687E3C768B}.Release|Any CPU.Build.0 = Release|Any CPU - {D736C433-C230-46B7-9D43-17D0282EBBDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D736C433-C230-46B7-9D43-17D0282EBBDF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D736C433-C230-46B7-9D43-17D0282EBBDF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D736C433-C230-46B7-9D43-17D0282EBBDF}.Release|Any CPU.Build.0 = Release|Any CPU - {FA525A71-C0BF-49FB-BAB7-547944618587}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FA525A71-C0BF-49FB-BAB7-547944618587}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FA525A71-C0BF-49FB-BAB7-547944618587}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FA525A71-C0BF-49FB-BAB7-547944618587}.Release|Any CPU.Build.0 = Release|Any CPU - {532D5703-0090-4F2E-B725-5786D53506C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {532D5703-0090-4F2E-B725-5786D53506C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {532D5703-0090-4F2E-B725-5786D53506C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {532D5703-0090-4F2E-B725-5786D53506C9}.Release|Any CPU.Build.0 = Release|Any CPU - {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Release|Any CPU.Build.0 = Release|Any CPU - {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Release|Any CPU.Build.0 = Release|Any CPU - {77965572-373C-4319-9EF9-73D6E660044B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77965572-373C-4319-9EF9-73D6E660044B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77965572-373C-4319-9EF9-73D6E660044B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77965572-373C-4319-9EF9-73D6E660044B}.Release|Any CPU.Build.0 = Release|Any CPU - {A3924A79-1ADC-458D-8764-3958297BDEB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A3924A79-1ADC-458D-8764-3958297BDEB0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A3924A79-1ADC-458D-8764-3958297BDEB0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A3924A79-1ADC-458D-8764-3958297BDEB0}.Release|Any CPU.Build.0 = Release|Any CPU - {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Release|Any CPU.Build.0 = Release|Any CPU - {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Release|Any CPU.Build.0 = Release|Any CPU - {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Release|Any CPU.Build.0 = Release|Any CPU - {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Release|Any CPU.Build.0 = Release|Any CPU - {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Release|Any CPU.Build.0 = Release|Any CPU - {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Release|Any CPU.Build.0 = Release|Any CPU - {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Release|Any CPU.Build.0 = Release|Any CPU - {DFDF367D-EDE1-4365-90F9-32F529117B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DFDF367D-EDE1-4365-90F9-32F529117B60}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DFDF367D-EDE1-4365-90F9-32F529117B60}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DFDF367D-EDE1-4365-90F9-32F529117B60}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {4995C481-7465-4A36-8416-0D0D14F64B10} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {3B6F4C72-975B-44A4-9F72-A217E53E05C1} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {95909DDC-66A1-410A-9AB1-CD62EA33CFA0} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {1AFDF87C-220D-44EC-B5DA-99B0510AE561} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {7F7FB560-7005-438B-8D95-4FA781B5F1F3} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {7F831848-A1C1-49FE-B81A-499AB6E17286} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} - {9C2A3557-31E4-4D06-A08E-138E31412AD4} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} - {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} - {8064607C-BDB9-454D-8E76-2B21023CD071} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {3E2388B0-2870-47DB-87E9-32F295E32D05} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {A3BF5605-8684-4713-885D-CC498CC37686} = {3E2388B0-2870-47DB-87E9-32F295E32D05} - {D1399D41-0273-45FA-969F-FA9C77432A06} = {3E2388B0-2870-47DB-87E9-32F295E32D05} - {E790A9A3-3C24-4478-A547-0FE13F7F6963} = {3E2388B0-2870-47DB-87E9-32F295E32D05} - {192A028F-23AD-44A2-A7B2-8397FEA30B08} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {56F007F7-23A8-4F13-B45F-57D4EB35AB2C} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} - {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} - {7259B767-9528-4EF9-8F81-20344879F1CD} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} - {FDE379A6-8285-4001-818A-DDEA928DE702} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {ED7E70B9-8FEE-48DF-9962-AD1062769342} = {FDE379A6-8285-4001-818A-DDEA928DE702} - {BAD28D5B-8A14-43DF-A236-E313FD97E799} = {FDE379A6-8285-4001-818A-DDEA928DE702} - {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8} = {FDE379A6-8285-4001-818A-DDEA928DE702} - {60C97165-7CAB-467A-857E-9343B239F8EF} = {FDE379A6-8285-4001-818A-DDEA928DE702} - {C18979C7-EBD1-437D-A877-4A97B68761A5} = {FDE379A6-8285-4001-818A-DDEA928DE702} - {0AD78B12-EDC5-48E2-8FA3-309E731945EB} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F} = {0AD78B12-EDC5-48E2-8FA3-309E731945EB} - {D2AB9E95-A074-498A-A475-2298D0F1973E} = {0AD78B12-EDC5-48E2-8FA3-309E731945EB} - {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {DA8FB07D-1347-4E5A-B84C-8AB955A652AD} = {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} - {2D66E202-B34D-4998-BD80-5411C8087695} = {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} - {C22741F9-FC56-4AE3-B543-9F15C779D345} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {4EC45855-A09A-4B77-99A8-DA00E2D702E8} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {42439E6A-0084-48A9-9620-0B9EAB4182C4} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {F1290A8A-3BBE-4647-90D9-4AD537432AB5} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {FAF2D4A3-7A7F-4848-9817-66D164D03F0F} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {9E728961-7C0B-4C2B-92E4-8965B45ADB19} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {C186173C-7725-41A6-B5E3-F46219B03C5F} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A} = {C186173C-7725-41A6-B5E3-F46219B03C5F} - {45E954A6-5F29-48B3-B518-513F6837EE27} = {C186173C-7725-41A6-B5E3-F46219B03C5F} - {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94} = {C186173C-7725-41A6-B5E3-F46219B03C5F} - {2DAE26C2-BB2C-49CE-B52D-D53383ADE560} = {C186173C-7725-41A6-B5E3-F46219B03C5F} - {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E} = {C186173C-7725-41A6-B5E3-F46219B03C5F} - {622B90DB-1665-4822-82EF-7DDAC5629834} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {0FCB18BE-6D50-4567-8CBD-80B0336D9685} = {622B90DB-1665-4822-82EF-7DDAC5629834} - {9B4C9894-D295-4D16-AC90-F98563B37722} = {622B90DB-1665-4822-82EF-7DDAC5629834} - {E7EFE38E-1214-4D7D-A9DA-F753D613F956} = {622B90DB-1665-4822-82EF-7DDAC5629834} - {BC3E9C3B-EA51-4CC8-AD94-7F0285239907} = {622B90DB-1665-4822-82EF-7DDAC5629834} - {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} = {8F690C33-40BF-4EF8-A96A-D7FB56F163AC} - {33D6A170-D609-430C-B110-E1A8F3322C06} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {19CD928F-D16F-4A91-BA0C-2459F5055565} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {86993E17-8793-45ED-B636-C921BB1165D7} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {158AFAD1-39AE-4135-81EE-55F905802A8B} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {2BE2CFE9-26E7-4791-B9DE-109B465B701C} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {C326B106-8818-42FC-9A2F-C58201EE796C} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {BF943CF0-2732-41D3-BFE3-9B843564D807} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {B93528E2-55EA-4847-950D-8B95B1CC2909} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {BCF85E69-4D97-4DD3-8526-B33C76BD17CA} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} - {2B1B759E-670A-4837-854A-4748C67BB15B} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {9ACB83F6-C911-4473-973D-A3BECFB5F1E6} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {97064B96-B5AC-461D-BBBF-97A864F373E6} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {DB4498D8-E45B-4A5A-9BF2-830039B2D38D} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {412BAB54-282E-4A01-AF72-E76F3AF31AE7} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {DA053CAE-EBA4-4532-93B5-3347589CB174} = {C326B106-8818-42FC-9A2F-C58201EE796C} - {8F690C33-40BF-4EF8-A96A-D7FB56F163AC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {91867618-0D86-4410-91C6-B1166A9ACDF9} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {76810110-6683-4777-9157-8030F9205FBF} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {80DDA32B-2BDA-4704-9458-6D680B08B74C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {ED7AADAF-72D8-4C04-96CE-B46B21C9C343} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {6518F1B5-63EA-46A2-87ED-FD90366594EC} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {AB79F7C4-9AE1-4921-B18A-F64074B1DC69} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {DCF463DE-50CA-4585-BA9F-83F7101B5ED7} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {A2E248DB-B2DD-4916-82A6-5D296C1298B5} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {293C7A2B-46D2-49B6-A8C6-294500ED5AE5} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {21691099-AF37-4706-84AE-C19C72DC09B6} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {C31A17E0-AE56-419C-A6D1-3FCBB68005E2} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} - {D9C65C9D-8591-46DA-A3EE-419393E607AB} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {974D842A-9739-40E4-96E8-039552E28D8B} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {F3064272-5A6F-4CB9-B79F-8D37A2392CC1} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {1DD17D3E-F8EC-44AA-8437-3AF541CD3988} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {F42FAF67-D10F-487A-A74C-E6D8EA90831C} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {81B74E08-06CD-4134-A02D-B4B837945E2B} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {78635E6D-2C35-437C-96CD-29DAEAFE0076} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {F8CBD522-6668-4A5F-B62D-9E37E7DC1279} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {33FC6389-3931-4BD2-A619-36C4A8F5C7B0} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} - {58A4954C-4901-4172-BEE7-5584ABB0DF45} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {D4BC55C7-1991-4866-A7BA-66653DACF945} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {CF1F1193-FECE-4E98-A4FC-643A86F30429} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {46C57140-EE02-4785-9777-F2264EC88135} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {3AD66E47-B667-40D1-AE61-F5EC186241F7} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {AD3E63A3-3422-4A1A-AC89-B20786A5323E} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {CA2975D9-5477-4281-8D84-F0909F22DFF3} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {34C9609F-556B-44D7-B3DE-5637FEB0BFEC} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {A69E6742-39A6-4C0D-A098-E16A653331AC} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {6AC4C18F-2BB5-47F9-99F5-5585E1D22111} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {4D738A46-2B08-4A88-8787-668A4AD5AE5F} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {0B9E97DE-0265-4192-9FAF-B5AF65AC6611} = {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} - {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2} = {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} - {96BA4536-5E1E-476D-9368-BAF6FC939D25} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {EA56194E-B0EF-42B1-BC35-9A677D7D66BB} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {56C00F97-6769-44B2-8004-341D5286E31F} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {6C774F10-5FAC-4177-9BFA-28486747DF3D} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {91BD29B8-FD39-4429-A8FF-C5A1E511C632} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {DB29E904-C164-46B3-A12C-3A908FCA6DB9} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} - {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {6F5CD33F-ACD9-4BF3-99DE-33A24116A672} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {1EA3971F-E854-4198-AC8D-BC3C4F804B25} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {A5CA092D-E294-4BF6-92AF-CCF136A643D1} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {9CDC9B6C-C69E-483F-B881-5D065FA064C9} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {A74A9B50-0E40-44AD-9360-5BF96696B405} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {A243383E-7025-4893-9611-EE75DA055301} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} - {936C5D74-B90F-4932-87C3-C1A0A29083B9} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {3192C227-A18D-48A1-A2E8-C414981E9C5A} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} - {86ED8028-5533-4B5D-8594-C09929F2A553} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} - {C056C11F-EC74-4720-ACEA-D4C57DC4736F} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {A09032AD-D895-4D83-8D3D-67FF3285F7A6} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} - {59A3A2B8-7992-4321-A481-8C2CD08D0835} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {F9D10E1C-38DC-423D-8B79-BE4673C75B50} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {53479279-0E9C-4921-BEB1-46FDB553C8E2} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {8472D376-D2DB-40C3-AAF9-9ACDF1731919} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {1D7770AA-1669-45CE-88D9-3009C6A48AEE} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {F4ED4FC9-74D5-4379-9787-1F7756B56201} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} - {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {F87CA546-1ED2-409A-AD87-62E133BD3EF9} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} - {2BB68CBB-2220-466B-B24E-6916819DFB79} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} - {ACEFA4C4-4CA8-4358-9B75-3806DF228517} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} - {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {AF2F208F-43D6-4296-9826-677681BEC6D4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {7B26E45A-99B1-47EA-9015-7DD78CAFC423} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {F826B05A-2736-4361-ADE5-04B1CF171ED4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {0E84E1E4-82F8-412B-94F2-E06FF1320B1D} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {C9202B23-45E9-4167-BFAC-89651AF554EB} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {16666C1F-09C1-4829-9AFC-77FB22439A59} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {DAFCBF4F-8174-4934-929E-374FBDCE854D} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {1C3BCC38-D583-402F-B922-5562F19EA12C} = {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} - {00A6598E-8913-47C4-97F7-0E784EA9D55F} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {A8A8A180-C40F-43C7-B6B2-622344CE276B} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {5960FE7B-EC00-4C8D-A522-8FFEC184694D} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {6A79337A-879F-4A9F-8328-5578E40177B5} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {65CF5AD9-7D2A-4E31-B695-390B2D4A70D0} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {233C2407-3ED3-4322-B28D-0F93CF4C6E33} = {65CF5AD9-7D2A-4E31-B695-390B2D4A70D0} - {118D91CE-091B-4C65-8979-2F5363C56CDC} = {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} - {3EF74657-9EBC-46FD-B2CA-40959D0EE692} = {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} - {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {A788317B-1649-4D26-AB6C-6AA5B35767DA} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {C027362E-9B72-4058-91DF-D7F0FDD162AA} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {0E0683C3-5169-4965-A886-D960811E1807} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {8011A4C4-F08C-463D-A376-F33A7F780F57} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {78767BC5-FE68-4919-BC1B-DE7FF71F294B} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} - {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {7C714185-D3D9-4D94-B5CB-D857A0091F04} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {9697AB9A-2ACA-42E5-877E-EEF371166898} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {76A4D1FD-479A-4C57-96E0-BBFCCBADB683} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {E4C02147-34FA-43D1-B03C-00D539CF18BC} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {AABB5ABC-790E-48D1-B654-72143227FA64} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {CA5E2785-511D-4A14-8883-2544C869B2DF} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {AB897095-EA92-4AD9-829C-66FEE1878A5D} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {40A9F0DB-66AA-42A8-8670-9DD6DA992103} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {1FA05CCA-0584-4320-B278-D5AA1234BA02} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} - {7B6A98B3-90C1-49F2-8A17-C70FED500627} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} - {4F837B81-EA7D-472A-8482-3D5A730DF810} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {1F404E43-FA13-485D-B922-7D8848EBCE0F} = {4F837B81-EA7D-472A-8482-3D5A730DF810} - {2230E355-50F7-424F-929F-532B0A5DABE0} = {4F837B81-EA7D-472A-8482-3D5A730DF810} - {FBCDC571-F747-46AB-AFCB-38D191DCFFB6} = {4F837B81-EA7D-472A-8482-3D5A730DF810} - {F94E77C1-61E0-4FE8-9ECD-10A0102342E9} = {4F837B81-EA7D-472A-8482-3D5A730DF810} - {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C} = {B4247B78-34BC-4A3F-91A4-661F7DCD6E10} - {FD9F5933-FDE5-4504-99BF-9050E0435C6D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {CAEF3248-527D-48B7-9C98-929AC573C381} = {FD9F5933-FDE5-4504-99BF-9050E0435C6D} - {209E7129-4B39-4768-A0D6-797F796E4FCE} = {FD9F5933-FDE5-4504-99BF-9050E0435C6D} - {D67EBE62-C541-45E4-957E-D1D11BE74F68} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {0D69B63D-F082-4D57-9FF0-355642C56993} = {DE48451F-D4CB-4C9F-B300-4CA0B8ED9E1C} - {7623D363-F0BD-400C-B8AB-3FD9699D92D9} = {0D69B63D-F082-4D57-9FF0-355642C56993} - {E2BA59EA-769B-4D5B-8032-CB9682D0D73A} = {0D69B63D-F082-4D57-9FF0-355642C56993} - {5F0926F3-463D-445B-9746-0A037DC431F9} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} - {21878B72-9801-41CE-88CD-7195714AE9BA} = {B4247B78-34BC-4A3F-91A4-661F7DCD6E10} - {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {99CB6AD9-92E8-4B9B-99E3-28404AA41655} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {2263600B-30CB-4188-925D-92F12F904163} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} - {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} - {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} - {FAD86432-6A95-47DE-8E3A-FC2101753C52} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} - {5F278E32-3A2A-4654-BD3C-B183301382FB} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} - {1DB57C74-1C40-4414-B968-937C3C1C157E} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} - {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} - {C4D3B4CA-6631-4447-9D89-A535305E581A} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} - {18FCB763-1EFF-47DF-ACED-98B7F994FD10} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} - {3B5EB3D6-08FD-490C-BC70-805B199A0333} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} - {28422FE4-8D58-4D8A-8363-7A9D569A5695} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} - {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {90C71347-89E2-4546-9A64-FE56F6A48E13} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {93B1913D-41B8-4FAB-8472-4BE03F4DC03C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {6FA91938-03AB-41B0-9A80-14AE550D745E} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {838A6EB6-BCD4-498E-A729-6875F4A6EDF1} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {EA9F69A2-ACCF-477B-9519-257CF47DC0F4} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {3DFAECE7-496B-4E86-A23F-5F9A597D1119} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} - {3690518A-D6C3-42CC-AEC2-6D48C6987F68} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} - {0D34162C-0CE3-4D7B-B19A-4786C616D0B3} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} - {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} - {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {E957DB2E-589D-4310-9576-92F108A67CE7} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {C4690A20-8628-4A39-8E71-2D09800D0E72} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {8233A44F-4DFC-4701-9C04-834FD3C97060} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {66A6E78D-E547-4DD7-9844-087FAB3D03C2} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - {A99F5406-37DC-4677-9166-9BDE90C26CA6} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} - {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} - {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {986B92F6-A758-4D1F-8BC7-BFD13FF38591} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {62D72C3E-5C57-439D-B7F7-5C55CC384A7A} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {74156CFF-C236-4DED-B810-FAD8948F51CA} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {63D08153-B43C-4884-8818-4AB42E1FEE75} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {F7459720-873C-4741-A991-A671CF03A6AF} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} - {382CAC43-EE1F-4DA3-B433-E23C3F58F44A} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} - {4634B421-36E6-4169-AA1A-11050902495F} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} - {BB2DF96A-6ED8-4F47-948C-230EA2065C4C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {DB80C55F-8B70-4840-942A-ED021ED88BD6} = {91867618-0D86-4410-91C6-B1166A9ACDF9} - {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26} = {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} - {DA54E88E-C43E-4E31-92D0-08A753F2C08D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {A7417E7F-DB97-48DB-B849-AFC15854A6E7} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} - {8DDE4291-BC57-4C56-9871-B982462F4C3D} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} - {C5D64A2B-7E7E-4509-9F31-425D59712E6F} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} - {07C2FB08-985C-42FE-85AF-38E40A301668} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {A52C54FB-C96D-4032-8588-AFC2CD158D23} = {07C2FB08-985C-42FE-85AF-38E40A301668} - {B05ED61E-9A36-4E90-B876-F48559E018A6} = {07C2FB08-985C-42FE-85AF-38E40A301668} - {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7} = {07C2FB08-985C-42FE-85AF-38E40A301668} - {4FCD7337-4320-412D-9BC8-A0B243BC27B3} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {9D2C789C-8241-4F53-AFEF-F2AB15BAA823} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {36AEA095-E34D-43F5-8000-9FA3A696C312} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {2D5A9AB0-9F32-4784-8972-814F86C0239D} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {AF15C829-9288-4D7F-95A0-4EA8DF909929} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {616652A5-A420-475C-AC9F-FC687E3C768B} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} - {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} - {D736C433-C230-46B7-9D43-17D0282EBBDF} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {FA525A71-C0BF-49FB-BAB7-547944618587} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {532D5703-0090-4F2E-B725-5786D53506C9} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {71CF0E82-FA07-472A-B32A-AC25EDA82BB0} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {77965572-373C-4319-9EF9-73D6E660044B} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} - {4A2CF141-F32D-45A0-8665-B3705667A6D2} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {A3924A79-1ADC-458D-8764-3958297BDEB0} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} - {38A933EB-82F1-42A6-ABF3-F55975B4078E} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} - {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} - {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} - {319428B9-CE7F-4027-92FA-6311C4CE95FB} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} - {9AE3E97E-8846-4315-9546-FF97E97FD49F} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {BC7A8662-4313-4F1D-B267-9B1B69444CD3} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} - {7C35101B-EA29-4B3D-B424-FAD625977E4D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} - {4539FCDB-7192-442C-BD9B-0AC71E882F4F} = {7C35101B-EA29-4B3D-B424-FAD625977E4D} - {DFDF367D-EDE1-4365-90F9-32F529117B60} = {C22741F9-FC56-4AE3-B543-9F15C779D345} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {711A43C0-A2F8-4E5C-9B9F-F2551E4B3FF1} - EndGlobalSection -EndGlobal +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0B58AA48-665A-443F-A6A8-751FB9629DAF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosts", "hosts", "{B4247B78-34BC-4A3F-91A4-661F7DCD6E10}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{DE48451F-D4CB-4C9F-B300-4CA0B8ED9E1C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{37E2CAFE-0024-452E-BF81-E15F937E08EF}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{99B7CBDE-A251-4738-97F0-DB1DB484BEE1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "realtime", "realtime", "{42F31C68-B8B2-4BE0-9AD0-A7DFA6092629}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.RealTime", "framework\common\LINGYUN.Abp.RealTime\LINGYUN.Abp.RealTime.csproj", "{AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Core", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Core\LINGYUN.Abp.Notifications.Core.csproj", "{4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Common", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Common\LINGYUN.Abp.Notifications.Common.csproj", "{14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Emailing", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Emailing\LINGYUN.Abp.Notifications.Emailing.csproj", "{4995C481-7465-4A36-8416-0D0D14F64B10}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.SignalR", "modules\realtime-notifications\LINGYUN.Abp.Notifications.SignalR\LINGYUN.Abp.Notifications.SignalR.csproj", "{9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM", "modules\realtime-message\LINGYUN.Abp.IM\LINGYUN.Abp.IM.csproj", "{3B6F4C72-975B-44A4-9F72-A217E53E05C1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IM.SignalR", "modules\realtime-message\LINGYUN.Abp.IM.SignalR\LINGYUN.Abp.IM.SignalR.csproj", "{95909DDC-66A1-410A-9AB1-CD62EA33CFA0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdGenerator", "framework\common\LINGYUN.Abp.IdGenerator\LINGYUN.Abp.IdGenerator.csproj", "{1AFDF87C-220D-44EC-B5DA-99B0510AE561}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "feature", "feature", "{7F7FB560-7005-438B-8D95-4FA781B5F1F3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation", "framework\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj", "{7F831848-A1C1-49FE-B81A-499AB6E17286}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis", "framework\common\LINGYUN.Abp.Features.LimitValidation.Redis\LINGYUN.Abp.Features.LimitValidation.Redis.csproj", "{9C2A3557-31E4-4D06-A08E-138E31412AD4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.LimitValidation.Redis.Client", "framework\common\LINGYUN.Abp.Features.LimitValidation.Redis.Client\LINGYUN.Abp.Features.LimitValidation.Redis.Client.csproj", "{7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Data.DbMigrator", "framework\common\LINGYUN.Abp.Data.DbMigrator\LINGYUN.Abp.Data.DbMigrator.csproj", "{8064607C-BDB9-454D-8E76-2B21023CD071}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exception", "exception", "{3E2388B0-2870-47DB-87E9-32F295E32D05}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling", "framework\common\LINGYUN.Abp.ExceptionHandling\LINGYUN.Abp.ExceptionHandling.csproj", "{A3BF5605-8684-4713-885D-CC498CC37686}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Emailing", "framework\common\LINGYUN.Abp.ExceptionHandling.Emailing\LINGYUN.Abp.ExceptionHandling.Emailing.csproj", "{D1399D41-0273-45FA-969F-FA9C77432A06}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.ExceptionHandling.Notifications", "modules\realtime-notifications\LINGYUN.Abp.ExceptionHandling.Notifications\LINGYUN.Abp.ExceptionHandling.Notifications.csproj", "{E790A9A3-3C24-4478-A547-0FE13F7F6963}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "alibaba-cloud", "alibaba-cloud", "{192A028F-23AD-44A2-A7B2-8397FEA30B08}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun", "framework\cloud-aliyun\LINGYUN.Abp.Aliyun\LINGYUN.Abp.Aliyun.csproj", "{56F007F7-23A8-4F13-B45F-57D4EB35AB2C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.SettingManagement", "framework\cloud-aliyun\LINGYUN.Abp.Aliyun.SettingManagement\LINGYUN.Abp.Aliyun.SettingManagement.csproj", "{7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Aliyun", "framework\common\LINGYUN.Abp.Sms.Aliyun\LINGYUN.Abp.Sms.Aliyun.csproj", "{7259B767-9528-4EF9-8F81-20344879F1CD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencent-cloud", "tencent-cloud", "{FDE379A6-8285-4001-818A-DDEA928DE702}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent", "framework\cloud-tencent\LINGYUN.Abp.Tencent\LINGYUN.Abp.Tencent.csproj", "{ED7E70B9-8FEE-48DF-9962-AD1062769342}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent.QQ", "framework\cloud-tencent\LINGYUN.Abp.Tencent.QQ\LINGYUN.Abp.Tencent.QQ.csproj", "{BAD28D5B-8A14-43DF-A236-E313FD97E799}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Sms.Tencent", "framework\cloud-tencent\LINGYUN.Abp.Sms.Tencent\LINGYUN.Abp.Sms.Tencent.csproj", "{DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BlobStoring.Tencent", "framework\cloud-tencent\LINGYUN.Abp.BlobStoring.Tencent\LINGYUN.Abp.BlobStoring.Tencent.csproj", "{60C97165-7CAB-467A-857E-9343B239F8EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Tencent.SettingManagement", "framework\cloud-tencent\LINGYUN.Abp.Tencent.SettingManagement\LINGYUN.Abp.Tencent.SettingManagement.csproj", "{C18979C7-EBD1-437D-A877-4A97B68761A5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "authentication", "authentication", "{0AD78B12-EDC5-48E2-8FA3-309E731945EB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authentication.QQ", "framework\authentication\LINGYUN.Abp.Authentication.QQ\LINGYUN.Abp.Authentication.QQ.csproj", "{DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authentication.WeChat", "framework\authentication\LINGYUN.Abp.Authentication.WeChat\LINGYUN.Abp.Authentication.WeChat.csproj", "{D2AB9E95-A074-498A-A475-2298D0F1973E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "authorization", "authorization", "{AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Authorization.OrganizationUnits", "framework\authorization\LINGYUN.Abp.Authorization.OrganizationUnits\LINGYUN.Abp.Authorization.OrganizationUnits.csproj", "{DA8FB07D-1347-4E5A-B84C-8AB955A652AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.OrganizaztionUnits", "modules\identity\LINGYUN.Abp.Identity.OrganizaztionUnits\LINGYUN.Abp.Identity.OrganizaztionUnits.csproj", "{2D66E202-B34D-4998-BD80-5411C8087695}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "auditing", "auditing", "{C22741F9-FC56-4AE3-B543-9F15C779D345}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging", "framework\auditing\LINGYUN.Abp.AuditLogging\LINGYUN.Abp.AuditLogging.csproj", "{4EC45855-A09A-4B77-99A8-DA00E2D702E8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging.EntityFrameworkCore", "framework\auditing\LINGYUN.Abp.AuditLogging.EntityFrameworkCore\LINGYUN.Abp.AuditLogging.EntityFrameworkCore.csproj", "{42439E6A-0084-48A9-9620-0B9EAB4182C4}" +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", "{F1290A8A-3BBE-4647-90D9-4AD537432AB5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.Application", "modules\auditing\LINGYUN.Abp.Auditing.Application\LINGYUN.Abp.Auditing.Application.csproj", "{FAF2D4A3-7A7F-4848-9817-66D164D03F0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Auditing.HttpApi", "modules\auditing\LINGYUN.Abp.Auditing.HttpApi\LINGYUN.Abp.Auditing.HttpApi.csproj", "{9E728961-7C0B-4C2B-92E4-8965B45ADB19}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "caching", "caching", "{C186173C-7725-41A6-B5E3-F46219B03C5F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Domain", "modules\caching-management\LINGYUN.Abp.CachingManagement.Domain\LINGYUN.Abp.CachingManagement.Domain.csproj", "{79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Application.Contracts", "modules\caching-management\LINGYUN.Abp.CachingManagement.Application.Contracts\LINGYUN.Abp.CachingManagement.Application.Contracts.csproj", "{45E954A6-5F29-48B3-B518-513F6837EE27}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.Application", "modules\caching-management\LINGYUN.Abp.CachingManagement.Application\LINGYUN.Abp.CachingManagement.Application.csproj", "{D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.HttpApi", "modules\caching-management\LINGYUN.Abp.CachingManagement.HttpApi\LINGYUN.Abp.CachingManagement.HttpApi.csproj", "{2DAE26C2-BB2C-49CE-B52D-D53383ADE560}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.CachingManagement.StackExchangeRedis", "modules\caching-management\LINGYUN.Abp.CachingManagement.StackExchangeRedis\LINGYUN.Abp.CachingManagement.StackExchangeRedis.csproj", "{92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dynamic-queryable", "dynamic-queryable", "{622B90DB-1665-4822-82EF-7DDAC5629834}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Linq.Dynamic.Queryable", "framework\dynamic-queryable\LINGYUN.Linq.Dynamic.Queryable\LINGYUN.Linq.Dynamic.Queryable.csproj", "{0FCB18BE-6D50-4567-8CBD-80B0336D9685}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.Application.Contracts", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.Application.Contracts\LINGYUN.Abp.Dynamic.Queryable.Application.Contracts.csproj", "{9B4C9894-D295-4D16-AC90-F98563B37722}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.Application", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.Application\LINGYUN.Abp.Dynamic.Queryable.Application.csproj", "{E7EFE38E-1214-4D7D-A9DA-F753D613F956}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dynamic.Queryable.HttpApi", "framework\dynamic-queryable\LINGYUN.Abp.Dynamic.Queryable.HttpApi\LINGYUN.Abp.Dynamic.Queryable.HttpApi.csproj", "{BC3E9C3B-EA51-4CC8-AD94-7F0285239907}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "elsa", "elsa", "{07DFEB1E-ED92-4E97-A801-FAB2D70F4F35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa", "modules\elsa\LINGYUN.Abp.Elsa\LINGYUN.Abp.Elsa.csproj", "{33D6A170-D609-430C-B110-E1A8F3322C06}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.BlobStoring", "modules\elsa\LINGYUN.Abp.Elsa.Activities.BlobStoring\LINGYUN.Abp.Elsa.Activities.BlobStoring.csproj", "{E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Emailing", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Emailing\LINGYUN.Abp.Elsa.Activities.Emailing.csproj", "{3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.IM", "modules\elsa\LINGYUN.Abp.Elsa.Activities.IM\LINGYUN.Abp.Elsa.Activities.IM.csproj", "{19CD928F-D16F-4A91-BA0C-2459F5055565}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Notifications", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Notifications\LINGYUN.Abp.Elsa.Activities.Notifications.csproj", "{86993E17-8793-45ED-B636-C921BB1165D7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Sms", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Sms\LINGYUN.Abp.Elsa.Activities.Sms.csproj", "{158AFAD1-39AE-4135-81EE-55F905802A8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities.Webhooks", "modules\elsa\LINGYUN.Abp.Elsa.Activities.Webhooks\LINGYUN.Abp.Elsa.Activities.Webhooks.csproj", "{2BE2CFE9-26E7-4791-B9DE-109B465B701C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "webhooks", "webhooks", "{C326B106-8818-42FC-9A2F-C58201EE796C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Activities", "modules\elsa\LINGYUN.Abp.Elsa.Activities\LINGYUN.Abp.Elsa.Activities.csproj", "{BF943CF0-2732-41D3-BFE3-9B843564D807}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.EntityFrameworkCore", "modules\elsa\LINGYUN.Abp.Elsa.EntityFrameworkCore\LINGYUN.Abp.Elsa.EntityFrameworkCore.csproj", "{B93528E2-55EA-4847-950D-8B95B1CC2909}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql", "modules\elsa\LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql\LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql.csproj", "{2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Elsa.Server", "modules\elsa\LINGYUN.Abp.Elsa.Server\LINGYUN.Abp.Elsa.Server.csproj", "{BCF85E69-4D97-4DD3-8526-B33C76BD17CA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks", "modules\webhooks\LINGYUN.Abp.Webhooks\LINGYUN.Abp.Webhooks.csproj", "{2B1B759E-670A-4837-854A-4748C67BB15B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Core", "modules\webhooks\LINGYUN.Abp.Webhooks.Core\LINGYUN.Abp.Webhooks.Core.csproj", "{9ACB83F6-C911-4473-973D-A3BECFB5F1E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.EventBus", "modules\webhooks\LINGYUN.Abp.Webhooks.EventBus\LINGYUN.Abp.Webhooks.EventBus.csproj", "{97064B96-B5AC-461D-BBBF-97A864F373E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Identity", "modules\webhooks\LINGYUN.Abp.Webhooks.Identity\LINGYUN.Abp.Webhooks.Identity.csproj", "{617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Webhooks.Saas", "modules\webhooks\LINGYUN.Abp.Webhooks.Saas\LINGYUN.Abp.Webhooks.Saas.csproj", "{DB4498D8-E45B-4A5A-9BF2-830039B2D38D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Domain.Shared", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Domain.Shared\LINGYUN.Abp.WebhooksManagement.Domain.Shared.csproj", "{412BAB54-282E-4A01-AF72-E76F3AF31AE7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Domain", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Domain\LINGYUN.Abp.WebhooksManagement.Domain.csproj", "{EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Application.Contracts", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Application.Contracts\LINGYUN.Abp.WebhooksManagement.Application.Contracts.csproj", "{21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.Application", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.Application\LINGYUN.Abp.WebhooksManagement.Application.csproj", "{7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore\LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore.csproj", "{DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WebhooksManagement.HttpApi", "modules\webhooks\LINGYUN.Abp.WebhooksManagement.HttpApi\LINGYUN.Abp.WebhooksManagement.HttpApi.csproj", "{DA053CAE-EBA4-4532-93B5-3347589CB174}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflow", "workflow", "{8F690C33-40BF-4EF8-A96A-D7FB56F163AC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tencent-wechat", "tencent-wechat", "{91867618-0D86-4410-91C6-B1166A9ACDF9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat", "framework\wechat\LINGYUN.Abp.WeChat\LINGYUN.Abp.WeChat.csproj", "{76810110-6683-4777-9157-8030F9205FBF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.MiniProgram", "framework\wechat\LINGYUN.Abp.WeChat.MiniProgram\LINGYUN.Abp.WeChat.MiniProgram.csproj", "{80DDA32B-2BDA-4704-9458-6D680B08B74C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official", "framework\wechat\LINGYUN.Abp.WeChat.Official\LINGYUN.Abp.WeChat.Official.csproj", "{29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.SettingManagement", "framework\wechat\LINGYUN.Abp.WeChat.SettingManagement\LINGYUN.Abp.WeChat.SettingManagement.csproj", "{FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.WeChat", "framework\wechat\LINGYUN.Abp.Identity.WeChat\LINGYUN.Abp.Identity.WeChat.csproj", "{ED7AADAF-72D8-4C04-96CE-B46B21C9C343}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.MiniProgram", "modules\realtime-notifications\LINGYUN.Abp.Notifications.WeChat.MiniProgram\LINGYUN.Abp.Notifications.WeChat.MiniProgram.csproj", "{6518F1B5-63EA-46A2-87ED-FD90366594EC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "text-templating", "text-templating", "{C46E03DE-FFFA-4659-97AE-77BDA46C3FCA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Domain.Shared", "modules\text-templating\LINGYUN.Abp.TextTemplating.Domain.Shared\LINGYUN.Abp.TextTemplating.Domain.Shared.csproj", "{AB79F7C4-9AE1-4921-B18A-F64074B1DC69}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Domain", "modules\text-templating\LINGYUN.Abp.TextTemplating.Domain\LINGYUN.Abp.TextTemplating.Domain.csproj", "{DCF463DE-50CA-4585-BA9F-83F7101B5ED7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Application.Contracts", "modules\text-templating\LINGYUN.Abp.TextTemplating.Application.Contracts\LINGYUN.Abp.TextTemplating.Application.Contracts.csproj", "{A2E248DB-B2DD-4916-82A6-5D296C1298B5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.Application", "modules\text-templating\LINGYUN.Abp.TextTemplating.Application\LINGYUN.Abp.TextTemplating.Application.csproj", "{293C7A2B-46D2-49B6-A8C6-294500ED5AE5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.EntityFrameworkCore", "modules\text-templating\LINGYUN.Abp.TextTemplating.EntityFrameworkCore\LINGYUN.Abp.TextTemplating.EntityFrameworkCore.csproj", "{21691099-AF37-4706-84AE-C19C72DC09B6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TextTemplating.HttpApi", "modules\text-templating\LINGYUN.Abp.TextTemplating.HttpApi\LINGYUN.Abp.TextTemplating.HttpApi.csproj", "{C31A17E0-AE56-419C-A6D1-3FCBB68005E2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "task-management", "task-management", "{D9C65C9D-8591-46DA-A3EE-419393E607AB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Abstractions", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Abstractions\LINGYUN.Abp.BackgroundTasks.Abstractions.csproj", "{974D842A-9739-40E4-96E8-039552E28D8B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks", "modules\task-management\LINGYUN.Abp.BackgroundTasks\LINGYUN.Abp.BackgroundTasks.csproj", "{7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Activities", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Activities\LINGYUN.Abp.BackgroundTasks.Activities.csproj", "{F3064272-5A6F-4CB9-B79F-8D37A2392CC1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.DistributedLocking", "modules\task-management\LINGYUN.Abp.BackgroundTasks.DistributedLocking\LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj", "{1DD17D3E-F8EC-44AA-8437-3AF541CD3988}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.EventBus", "modules\task-management\LINGYUN.Abp.BackgroundTasks.EventBus\LINGYUN.Abp.BackgroundTasks.EventBus.csproj", "{F42FAF67-D10F-487A-A74C-E6D8EA90831C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.ExceptionHandling", "modules\task-management\LINGYUN.Abp.BackgroundTasks.ExceptionHandling\LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj", "{81B74E08-06CD-4134-A02D-B4B837945E2B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Jobs", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Jobs\LINGYUN.Abp.BackgroundTasks.Jobs.csproj", "{78635E6D-2C35-437C-96CD-29DAEAFE0076}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Notifications", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Notifications\LINGYUN.Abp.BackgroundTasks.Notifications.csproj", "{F8CBD522-6668-4A5F-B62D-9E37E7DC1279}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Quartz", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Quartz\LINGYUN.Abp.BackgroundTasks.Quartz.csproj", "{33FC6389-3931-4BD2-A619-36C4A8F5C7B0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Domain.Shared", "modules\task-management\LINGYUN.Abp.TaskManagement.Domain.Shared\LINGYUN.Abp.TaskManagement.Domain.Shared.csproj", "{58A4954C-4901-4172-BEE7-5584ABB0DF45}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Domain", "modules\task-management\LINGYUN.Abp.TaskManagement.Domain\LINGYUN.Abp.TaskManagement.Domain.csproj", "{D4BC55C7-1991-4866-A7BA-66653DACF945}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "background-tasks", "background-tasks", "{91EE5D5B-B6DF-43F1-BC09-1A982719A34B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Application.Contracts", "modules\task-management\LINGYUN.Abp.TaskManagement.Application.Contracts\LINGYUN.Abp.TaskManagement.Application.Contracts.csproj", "{C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.Application", "modules\task-management\LINGYUN.Abp.TaskManagement.Application\LINGYUN.Abp.TaskManagement.Application.csproj", "{CF1F1193-FECE-4E98-A4FC-643A86F30429}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.EntityFrameworkCore", "modules\task-management\LINGYUN.Abp.TaskManagement.EntityFrameworkCore\LINGYUN.Abp.TaskManagement.EntityFrameworkCore.csproj", "{46C57140-EE02-4785-9777-F2264EC88135}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement.HttpApi", "modules\task-management\LINGYUN.Abp.TaskManagement.HttpApi\LINGYUN.Abp.TaskManagement.HttpApi.csproj", "{3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oss-management", "oss-management", "{3AD66E47-B667-40D1-AE61-F5EC186241F7}" + ProjectSection(SolutionItems) = preProject + modules\oss-management\README.md = modules\oss-management\README.md + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain.Shared", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain.Shared\LINGYUN.Abp.OssManagement.Domain.Shared.csproj", "{AD3E63A3-3422-4A1A-AC89-B20786A5323E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Domain", "modules\oss-management\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj", "{CA2975D9-5477-4281-8D84-F0909F22DFF3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.FileSystem", "modules\oss-management\LINGYUN.Abp.OssManagement.FileSystem\LINGYUN.Abp.OssManagement.FileSystem.csproj", "{90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.HttpApi", "modules\oss-management\LINGYUN.Abp.OssManagement.HttpApi\LINGYUN.Abp.OssManagement.HttpApi.csproj", "{34C9609F-556B-44D7-B3DE-5637FEB0BFEC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application.Contracts", "modules\oss-management\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj", "{A69E6742-39A6-4C0D-A098-E16A653331AC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Application", "modules\oss-management\LINGYUN.Abp.OssManagement.Application\LINGYUN.Abp.OssManagement.Application.csproj", "{6AC4C18F-2BB5-47F9-99F5-5585E1D22111}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.SettingManagement", "modules\oss-management\LINGYUN.Abp.OssManagement.SettingManagement\LINGYUN.Abp.OssManagement.SettingManagement.csproj", "{4D738A46-2B08-4A88-8787-668A4AD5AE5F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "open-api", "open-api", "{3A74FBEF-AE1F-420D-9B08-E09E03C740D5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenApi", "framework\open-api\LINGYUN.Abp.OpenApi\LINGYUN.Abp.OpenApi.csproj", "{0B9E97DE-0265-4192-9FAF-B5AF65AC6611}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenApi.Authorization", "framework\open-api\LINGYUN.Abp.OpenApi.Authorization\LINGYUN.Abp.OpenApi.Authorization.csproj", "{C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "notifications", "notifications", "{96BA4536-5E1E-476D-9368-BAF6FC939D25}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Domain.Shared", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Domain.Shared\LINGYUN.Abp.Notifications.Domain.Shared.csproj", "{EA56194E-B0EF-42B1-BC35-9A677D7D66BB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Domain", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Domain\LINGYUN.Abp.Notifications.Domain.csproj", "{56C00F97-6769-44B2-8004-341D5286E31F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Application.Contracts", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Application.Contracts\LINGYUN.Abp.Notifications.Application.Contracts.csproj", "{DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.Application", "modules\realtime-notifications\LINGYUN.Abp.Notifications.Application\LINGYUN.Abp.Notifications.Application.csproj", "{6C774F10-5FAC-4177-9BFA-28486747DF3D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.EntityFrameworkCore", "modules\realtime-notifications\LINGYUN.Abp.Notifications.EntityFrameworkCore\LINGYUN.Abp.Notifications.EntityFrameworkCore.csproj", "{91BD29B8-FD39-4429-A8FF-C5A1E511C632}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.HttpApi", "modules\realtime-notifications\LINGYUN.Abp.Notifications.HttpApi\LINGYUN.Abp.Notifications.HttpApi.csproj", "{DB29E904-C164-46B3-A12C-3A908FCA6DB9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "messages", "messages", "{E17C1E4A-9BD2-42DC-99E4-B6E104D3789A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain.Shared", "modules\realtime-message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj", "{6F5CD33F-ACD9-4BF3-99DE-33A24116A672}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Domain", "modules\realtime-message\LINGYUN.Abp.MessageService.Domain\LINGYUN.Abp.MessageService.Domain.csproj", "{1EA3971F-E854-4198-AC8D-BC3C4F804B25}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application.Contracts", "modules\realtime-message\LINGYUN.Abp.MessageService.Application.Contracts\LINGYUN.Abp.MessageService.Application.Contracts.csproj", "{A5CA092D-E294-4BF6-92AF-CCF136A643D1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.Application", "modules\realtime-message\LINGYUN.Abp.MessageService.Application\LINGYUN.Abp.MessageService.Application.csproj", "{9CDC9B6C-C69E-483F-B881-5D065FA064C9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.EntityFrameworkCore", "modules\realtime-message\LINGYUN.Abp.MessageService.EntityFrameworkCore\LINGYUN.Abp.MessageService.EntityFrameworkCore.csproj", "{A74A9B50-0E40-44AD-9360-5BF96696B405}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MessageService.HttpApi", "modules\realtime-message\LINGYUN.Abp.MessageService.HttpApi\LINGYUN.Abp.MessageService.HttpApi.csproj", "{A243383E-7025-4893-9611-EE75DA055301}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization", "localization", "{936C5D74-B90F-4932-87C3-C1A0A29083B9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.Persistence", "framework\localization\LINGYUN.Abp.Localization.Persistence\LINGYUN.Abp.Localization.Persistence.csproj", "{3192C227-A18D-48A1-A2E8-C414981E9C5A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Localization.CultureMap", "framework\localization\LINGYUN.Abp.Localization.CultureMap\LINGYUN.Abp.Localization.CultureMap.csproj", "{86ED8028-5533-4B5D-8594-C09929F2A553}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localization-management", "localization-management", "{C056C11F-EC74-4720-ACEA-D4C57DC4736F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Localization", "framework\localization\LINGYUN.Abp.AspNetCore.Mvc.Localization\LINGYUN.Abp.AspNetCore.Mvc.Localization.csproj", "{A09032AD-D895-4D83-8D3D-67FF3285F7A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain.Shared", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Domain.Shared\LINGYUN.Abp.LocalizationManagement.Domain.Shared.csproj", "{59A3A2B8-7992-4321-A481-8C2CD08D0835}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Domain", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Domain\LINGYUN.Abp.LocalizationManagement.Domain.csproj", "{F9D10E1C-38DC-423D-8B79-BE4673C75B50}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application.Contracts", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Application.Contracts\LINGYUN.Abp.LocalizationManagement.Application.Contracts.csproj", "{53479279-0E9C-4921-BEB1-46FDB553C8E2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.Application", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.Application\LINGYUN.Abp.LocalizationManagement.Application.csproj", "{8472D376-D2DB-40C3-AAF9-9ACDF1731919}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore\LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore.csproj", "{1D7770AA-1669-45CE-88D9-3009C6A48AEE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.LocalizationManagement.HttpApi", "modules\localization-management\LINGYUN.Abp.LocalizationManagement.HttpApi\LINGYUN.Abp.LocalizationManagement.HttpApi.csproj", "{F4ED4FC9-74D5-4379-9787-1F7756B56201}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "logging", "logging", "{FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Logging", "framework\logging\LINGYUN.Abp.Logging\LINGYUN.Abp.Logging.csproj", "{F87CA546-1ED2-409A-AD87-62E133BD3EF9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Serilog.Enrichers.Application", "framework\logging\LINGYUN.Abp.Serilog.Enrichers.Application\LINGYUN.Abp.Serilog.Enrichers.Application.csproj", "{2BB68CBB-2220-466B-B24E-6916819DFB79}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Serilog.Enrichers.UniqueId", "framework\logging\LINGYUN.Abp.Serilog.Enrichers.UniqueId\LINGYUN.Abp.Serilog.Enrichers.UniqueId.csproj", "{ACEFA4C4-4CA8-4358-9B75-3806DF228517}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{D94D6AFE-20BD-4F21-8708-03F5E34F49FC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain.Shared", "modules\identity\LINGYUN.Abp.Identity.Domain.Shared\LINGYUN.Abp.Identity.Domain.Shared.csproj", "{AF2F208F-43D6-4296-9826-677681BEC6D4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Domain", "modules\identity\LINGYUN.Abp.Identity.Domain\LINGYUN.Abp.Identity.Domain.csproj", "{B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}" +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", "{7B26E45A-99B1-47EA-9015-7DD78CAFC423}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Application", "modules\identity\LINGYUN.Abp.Identity.Application\LINGYUN.Abp.Identity.Application.csproj", "{F826B05A-2736-4361-ADE5-04B1CF171ED4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.EntityFrameworkCore", "modules\identity\LINGYUN.Abp.Identity.EntityFrameworkCore\LINGYUN.Abp.Identity.EntityFrameworkCore.csproj", "{CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.HttpApi", "modules\identity\LINGYUN.Abp.Identity.HttpApi\LINGYUN.Abp.Identity.HttpApi.csproj", "{0E84E1E4-82F8-412B-94F2-E06FF1320B1D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity-server", "identity-server", "{A3B6DFC3-5D27-496E-9AD6-C1035213F1DC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Domain", "modules\identityServer\LINGYUN.Abp.IdentityServer.Domain\LINGYUN.Abp.IdentityServer.Domain.csproj", "{C9202B23-45E9-4167-BFAC-89651AF554EB}" +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", "{16666C1F-09C1-4829-9AFC-77FB22439A59}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Application", "modules\identityServer\LINGYUN.Abp.IdentityServer.Application\LINGYUN.Abp.IdentityServer.Application.csproj", "{152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.EntityFrameworkCore", "modules\identityServer\LINGYUN.Abp.IdentityServer.EntityFrameworkCore\LINGYUN.Abp.IdentityServer.EntityFrameworkCore.csproj", "{1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.HttpApi", "modules\identityServer\LINGYUN.Abp.IdentityServer.HttpApi\LINGYUN.Abp.IdentityServer.HttpApi.csproj", "{DAFCBF4F-8174-4934-929E-374FBDCE854D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.LinkUser", "modules\identityServer\LINGYUN.Abp.IdentityServer.LinkUser\LINGYUN.Abp.IdentityServer.LinkUser.csproj", "{CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "saas", "saas", "{0DF5AD76-AEEA-4052-A6CA-A44C24879F11}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "saas", "saas", "{ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.Editions", "framework\tenants\LINGYUN.Abp.MultiTenancy.Editions\LINGYUN.Abp.MultiTenancy.Editions.csproj", "{1C3BCC38-D583-402F-B922-5562F19EA12C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Domain.Shared", "modules\saas\LINGYUN.Abp.Saas.Domain.Shared\LINGYUN.Abp.Saas.Domain.Shared.csproj", "{00A6598E-8913-47C4-97F7-0E784EA9D55F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Domain", "modules\saas\LINGYUN.Abp.Saas.Domain\LINGYUN.Abp.Saas.Domain.csproj", "{A8A8A180-C40F-43C7-B6B2-622344CE276B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Application.Contracts", "modules\saas\LINGYUN.Abp.Saas.Application.Contracts\LINGYUN.Abp.Saas.Application.Contracts.csproj", "{232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Application", "modules\saas\LINGYUN.Abp.Saas.Application\LINGYUN.Abp.Saas.Application.csproj", "{5960FE7B-EC00-4C8D-A522-8FFEC184694D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.EntityFrameworkCore", "modules\saas\LINGYUN.Abp.Saas.EntityFrameworkCore\LINGYUN.Abp.Saas.EntityFrameworkCore.csproj", "{07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.HttpApi", "modules\saas\LINGYUN.Abp.Saas.HttpApi\LINGYUN.Abp.Saas.HttpApi.csproj", "{6A79337A-879F-4A9F-8328-5578E40177B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{65CF5AD9-7D2A-4E31-B695-390B2D4A70D0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application.Contracts", "framework\settings\LINGYUN.Abp.SettingManagement.Application.Contracts\LINGYUN.Abp.SettingManagement.Application.Contracts.csproj", "{233C2407-3ED3-4322-B28D-0F93CF4C6E33}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.Application", "modules\settings\LINGYUN.Abp.SettingManagement.Application\LINGYUN.Abp.SettingManagement.Application.csproj", "{118D91CE-091B-4C65-8979-2F5363C56CDC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.SettingManagement.HttpApi", "modules\settings\LINGYUN.Abp.SettingManagement.HttpApi\LINGYUN.Abp.SettingManagement.HttpApi.csproj", "{3EF74657-9EBC-46FD-B2CA-40959D0EE692}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "platform", "platform", "{F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain.Shared", "modules\platform\LINGYUN.Platform.Domain.Shared\LINGYUN.Platform.Domain.Shared.csproj", "{03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Domain", "modules\platform\LINGYUN.Platform.Domain\LINGYUN.Platform.Domain.csproj", "{A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application.Contracts", "modules\platform\LINGYUN.Platform.Application.Contracts\LINGYUN.Platform.Application.Contracts.csproj", "{A788317B-1649-4D26-AB6C-6AA5B35767DA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Application", "modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj", "{BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation.VueVbenAdmin", "modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin\LINGYUN.Abp.UI.Navigation.VueVbenAdmin.csproj", "{C027362E-9B72-4058-91DF-D7F0FDD162AA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.HttpApi", "modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj", "{4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.EntityFrameworkCore", "modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj", "{0E0683C3-5169-4965-A886-D960811E1807}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Settings.VueVbenAdmin", "modules\platform\LINGYUN.Platform.Settings.VueVbenAdmin\LINGYUN.Platform.Settings.VueVbenAdmin.csproj", "{8011A4C4-F08C-463D-A376-F33A7F780F57}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Platform.Theme.VueVbenAdmin", "modules\platform\LINGYUN.Platform.Theme.VueVbenAdmin\LINGYUN.Platform.Theme.VueVbenAdmin.csproj", "{78767BC5-FE68-4919-BC1B-DE7FF71F294B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.UI.Navigation", "framework\navigation\LINGYUN.Abp.UI.Navigation\LINGYUN.Abp.UI.Navigation.csproj", "{8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "openIddict", "openIddict", "{7C714185-D3D9-4D94-B5CB-D857A0091F04}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Application.Contracts", "modules\openIddict\LINGYUN.Abp.OpenIddict.Application.Contracts\LINGYUN.Abp.OpenIddict.Application.Contracts.csproj", "{9697AB9A-2ACA-42E5-877E-EEF371166898}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Application", "modules\openIddict\LINGYUN.Abp.OpenIddict.Application\LINGYUN.Abp.OpenIddict.Application.csproj", "{76A4D1FD-479A-4C57-96E0-BBFCCBADB683}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.HttpApi", "modules\openIddict\LINGYUN.Abp.OpenIddict.HttpApi\LINGYUN.Abp.OpenIddict.HttpApi.csproj", "{E4C02147-34FA-43D1-B03C-00D539CF18BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.LinkUser", "modules\openIddict\LINGYUN.Abp.OpenIddict.LinkUser\LINGYUN.Abp.OpenIddict.LinkUser.csproj", "{AABB5ABC-790E-48D1-B654-72143227FA64}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Sms", "modules\openIddict\LINGYUN.Abp.OpenIddict.Sms\LINGYUN.Abp.OpenIddict.Sms.csproj", "{CA5E2785-511D-4A14-8883-2544C869B2DF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.WeChat", "modules\openIddict\LINGYUN.Abp.OpenIddict.WeChat\LINGYUN.Abp.OpenIddict.WeChat.csproj", "{AB897095-EA92-4AD9-829C-66FEE1878A5D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wrapper", "wrapper", "{40A9F0DB-66AA-42A8-8670-9DD6DA992103}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Wrapper", "framework\common\LINGYUN.Abp.Wrapper\LINGYUN.Abp.Wrapper.csproj", "{1FA05CCA-0584-4320-B278-D5AA1234BA02}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Wrapper", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Wrapper.csproj", "{7B6A98B3-90C1-49F2-8A17-C70FED500627}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "account", "account", "{4F837B81-EA7D-472A-8482-3D5A730DF810}" +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", "{1F404E43-FA13-485D-B922-7D8848EBCE0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Application", "modules\account\LINGYUN.Abp.Account.Application\LINGYUN.Abp.Account.Application.csproj", "{2230E355-50F7-424F-929F-532B0A5DABE0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.HttpApi", "modules\account\LINGYUN.Abp.Account.HttpApi\LINGYUN.Abp.Account.HttpApi.csproj", "{FBCDC571-F747-46AB-AFCB-38D191DCFFB6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Account.Templates", "modules\account\LINGYUN.Abp.Account.Templates\LINGYUN.Abp.Account.Templates.csproj", "{F94E77C1-61E0-4FE8-9ECD-10A0102342E9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single", "services\LY.MicroService.Applications.Single\LY.MicroService.Applications.Single.csproj", "{83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D1A85853-3504-45A8-A745-5091E9240682}" + ProjectSection(SolutionItems) = preProject + ..\common.props = ..\common.props + ..\common.secrets.props = ..\common.secrets.props + ..\configureawait.props = ..\configureawait.props + ..\Directory.Build.props = ..\Directory.Build.props + ..\Directory.Packages.props = ..\Directory.Packages.props + ..\NuGet.Config = ..\NuGet.Config + ..\README.en.md = ..\README.en.md + ..\README.md = ..\README.md + ..\docs\startup-aio-readme.md = ..\docs\startup-aio-readme.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dapr", "dapr", "{FD9F5933-FDE5-4504-99BF-9050E0435C6D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr", "framework\dapr\LINGYUN.Abp.Dapr\LINGYUN.Abp.Dapr.csproj", "{CAEF3248-527D-48B7-9C98-929AC573C381}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Dapr.Client", "framework\dapr\LINGYUN.Abp.Dapr.Client\LINGYUN.Abp.Dapr.Client.csproj", "{209E7129-4B39-4768-A0D6-797F796E4FCE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.HttpOverrides", "framework\common\LINGYUN.Abp.AspNetCore.HttpOverrides\LINGYUN.Abp.AspNetCore.HttpOverrides.csproj", "{D67EBE62-C541-45E4-957E-D1D11BE74F68}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "single-project", "single-project", "{0D69B63D-F082-4D57-9FF0-355642C56993}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single.EntityFrameworkCore", "migrations\LY.MicroService.Applications.Single.EntityFrameworkCore\LY.MicroService.Applications.Single.EntityFrameworkCore.csproj", "{7623D363-F0BD-400C-B8AB-3FD9699D92D9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LY.MicroService.Applications.Single.DbMigrator", "migrations\LY.MicroService.Applications.Single.DbMigrator\LY.MicroService.Applications.Single.DbMigrator.csproj", "{E2BA59EA-769B-4D5B-8032-CB9682D0D73A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications", "modules\realtime-notifications\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj", "{5F0926F3-463D-445B-9746-0A037DC431F9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.MicroService.Internal.ApiGateway", "..\gateways\internal\LINGYUN.MicroService.Internal.ApiGateway\src\LINGYUN.MicroService.Internal.ApiGateway\LINGYUN.MicroService.Internal.ApiGateway.csproj", "{21878B72-9801-41CE-88CD-7195714AE9BA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "feature-management", "feature-management", "{97C36EF3-805E-4B93-9AF6-C1E22AA583B1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "permissions-management", "permissions-management", "{99CB6AD9-92E8-4B9B-99E3-28404AA41655}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Application.Contracts", "modules\feature-management\LINGYUN.Abp.FeatureManagement.Application.Contracts\LINGYUN.Abp.FeatureManagement.Application.Contracts.csproj", "{2263600B-30CB-4188-925D-92F12F904163}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Application", "modules\feature-management\LINGYUN.Abp.FeatureManagement.Application\LINGYUN.Abp.FeatureManagement.Application.csproj", "{2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.HttpApi", "modules\feature-management\LINGYUN.Abp.FeatureManagement.HttpApi\LINGYUN.Abp.FeatureManagement.HttpApi.csproj", "{C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Application.Contracts", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Application.Contracts\LINGYUN.Abp.PermissionManagement.Application.Contracts.csproj", "{FAD86432-6A95-47DE-8E3A-FC2101753C52}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Application", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Application\LINGYUN.Abp.PermissionManagement.Application.csproj", "{5F278E32-3A2A-4654-BD3C-B183301382FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.HttpApi", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.HttpApi\LINGYUN.Abp.PermissionManagement.HttpApi.csproj", "{1DB57C74-1C40-4414-B968-937C3C1C157E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits", "modules\permissions-management\LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits\LINGYUN.Abp.PermissionManagement.Domain.OrganizationUnits.csproj", "{F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Features.Client", "framework\features\LINGYUN.Abp.Features.Client\LINGYUN.Abp.Features.Client.csproj", "{C4D3B4CA-6631-4447-9D89-A535305E581A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.FeatureManagement.Client", "framework\features\LINGYUN.Abp.FeatureManagement.Client\LINGYUN.Abp.FeatureManagement.Client.csproj", "{18FCB763-1EFF-47DF-ACED-98B7F994FD10}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Logging.Serilog.Elasticsearch", "framework\logging\LINGYUN.Abp.Logging.Serilog.Elasticsearch\LINGYUN.Abp.Logging.Serilog.Elasticsearch.csproj", "{3B5EB3D6-08FD-490C-BC70-805B199A0333}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Http.Client.Wrapper", "framework\common\LINGYUN.Abp.Http.Client.Wrapper\LINGYUN.Abp.Http.Client.Wrapper.csproj", "{28422FE4-8D58-4D8A-8363-7A9D569A5695}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work", "framework\wechat\LINGYUN.Abp.WeChat.Work\LINGYUN.Abp.WeChat.Work.csproj", "{B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Application.Contracts", "framework\wechat\LINGYUN.Abp.WeChat.Work.Application.Contracts\LINGYUN.Abp.WeChat.Work.Application.Contracts.csproj", "{90C71347-89E2-4546-9A64-FE56F6A48E13}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Application", "framework\wechat\LINGYUN.Abp.WeChat.Work.Application\LINGYUN.Abp.WeChat.Work.Application.csproj", "{93B1913D-41B8-4FAB-8472-4BE03F4DC03C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.HttpApi", "framework\wechat\LINGYUN.Abp.WeChat.Work.HttpApi\LINGYUN.Abp.WeChat.Work.HttpApi.csproj", "{6FA91938-03AB-41B0-9A80-14AE550D745E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Notifications.WeChat.Work", "modules\realtime-notifications\LINGYUN.Abp.Notifications.WeChat.Work\LINGYUN.Abp.Notifications.WeChat.Work.csproj", "{838A6EB6-BCD4-498E-A729-6875F4A6EDF1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.Portal", "modules\openIddict\LINGYUN.Abp.OpenIddict.Portal\LINGYUN.Abp.OpenIddict.Portal.csproj", "{EA9F69A2-ACCF-477B-9519-257CF47DC0F4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.WeChat.Work", "modules\openIddict\LINGYUN.Abp.OpenIddict.WeChat.Work\LINGYUN.Abp.OpenIddict.WeChat.Work.csproj", "{7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "settings", "settings", "{78DDE8A1-6501-4213-9BB5-CE6A11341F7D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "idempotent", "idempotent", "{5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Idempotent", "framework\common\LINGYUN.Abp.Idempotent\LINGYUN.Abp.Idempotent.csproj", "{3DFAECE7-496B-4E86-A23F-5F9A597D1119}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Idempotent", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Idempotent\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.csproj", "{3690518A-D6C3-42CC-AEC2-6D48C6987F68}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper", "framework\mvc\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper\LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper.csproj", "{0D34162C-0CE3-4D7B-B19A-4786C616D0B3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Wrapper", "framework\common\LINGYUN.Abp.AspNetCore.Wrapper\LINGYUN.Abp.AspNetCore.Wrapper.csproj", "{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.AspNetCore", "modules\openIddict\LINGYUN.Abp.OpenIddict.AspNetCore\LINGYUN.Abp.OpenIddict.AspNetCore.csproj", "{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application.Contracts", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application.Contracts\LINGYUN.Abp.WeChat.Official.Application.Contracts.csproj", "{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application\LINGYUN.Abp.WeChat.Official.Application.csproj", "{E957DB2E-589D-4310-9576-92F108A67CE7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.HttpApi", "framework\wechat\LINGYUN.Abp.WeChat.Official.HttpApi\LINGYUN.Abp.WeChat.Official.HttpApi.csproj", "{4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Common", "framework\wechat\LINGYUN.Abp.WeChat.Common\LINGYUN.Abp.WeChat.Common.csproj", "{C4690A20-8628-4A39-8E71-2D09800D0E72}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Common", "framework\wechat\LINGYUN.Abp.WeChat.Work.Common\LINGYUN.Abp.WeChat.Work.Common.csproj", "{8233A44F-4DFC-4701-9C04-834FD3C97060}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AuditLogging.Elasticsearch", "framework\auditing\LINGYUN.Abp.AuditLogging.Elasticsearch\LINGYUN.Abp.AuditLogging.Elasticsearch.csproj", "{66A6E78D-E547-4DD7-9844-087FAB3D03C2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.TaskManagement", "modules\task-management\LINGYUN.Abp.BackgroundTasks.TaskManagement\LINGYUN.Abp.BackgroundTasks.TaskManagement.csproj", "{A99F5406-37DC-4677-9166-9BDE90C26CA6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Saas.Jobs", "modules\saas\LINGYUN.Abp.Saas.Jobs\LINGYUN.Abp.Saas.Jobs.csproj", "{8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.SmsValidator", "modules\identityServer\LINGYUN.Abp.IdentityServer.SmsValidator\LINGYUN.Abp.IdentityServer.SmsValidator.csproj", "{7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Portal", "modules\identityServer\LINGYUN.Abp.IdentityServer.Portal\LINGYUN.Abp.IdentityServer.Portal.csproj", "{986B92F6-A758-4D1F-8BC7-BFD13FF38591}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.WeChat.Work", "modules\identityServer\LINGYUN.Abp.IdentityServer.WeChat.Work\LINGYUN.Abp.IdentityServer.WeChat.Work.csproj", "{62D72C3E-5C57-439D-B7F7-5C55CC384A7A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Session", "modules\identity\LINGYUN.Abp.Identity.Session\LINGYUN.Abp.Identity.Session.csproj", "{74156CFF-C236-4DED-B810-FAD8948F51CA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Session.AspNetCore", "modules\identity\LINGYUN.Abp.Identity.Session.AspNetCore\LINGYUN.Abp.Identity.Session.AspNetCore.csproj", "{63D08153-B43C-4884-8818-4AB42E1FEE75}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.AspNetCore.Session", "modules\identity\LINGYUN.Abp.Identity.AspNetCore.Session\LINGYUN.Abp.Identity.AspNetCore.Session.csproj", "{AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IdentityServer.Session", "modules\identityServer\LINGYUN.Abp.IdentityServer.Session\LINGYUN.Abp.IdentityServer.Session.csproj", "{F7459720-873C-4741-A991-A671CF03A6AF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.AspNetCore.Session", "modules\openIddict\LINGYUN.Abp.OpenIddict.AspNetCore.Session\LINGYUN.Abp.OpenIddict.AspNetCore.Session.csproj", "{382CAC43-EE1F-4DA3-B433-E23C3F58F44A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Identity.Notifications", "modules\identity\LINGYUN.Abp.Identity.Notifications\LINGYUN.Abp.Identity.Notifications.csproj", "{4634B421-36E6-4169-AA1A-11050902495F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Handlers", "framework\wechat\LINGYUN.Abp.WeChat.Official.Handlers\LINGYUN.Abp.WeChat.Official.Handlers.csproj", "{BB2DF96A-6ED8-4F47-948C-230EA2065C4C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Work.Handlers", "framework\wechat\LINGYUN.Abp.WeChat.Work.Handlers\LINGYUN.Abp.WeChat.Work.Handlers.csproj", "{DB80C55F-8B70-4840-942A-ED021ED88BD6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.MultiTenancy.Saas", "modules\saas\LINGYUN.Abp.MultiTenancy.Saas\LINGYUN.Abp.MultiTenancy.Saas.csproj", "{E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IP2Region", "framework\common\LINGYUN.Abp.IP2Region\LINGYUN.Abp.IP2Region.csproj", "{DA54E88E-C43E-4E31-92D0-08A753F2C08D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TestsBase", "tests\LINGYUN.Abp.TestBase\LINGYUN.Abp.TestsBase.csproj", "{A7417E7F-DB97-48DB-B849-AFC15854A6E7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Aliyun.Tests", "tests\LINGYUN.Abp.Aliyun.Tests\LINGYUN.Abp.Aliyun.Tests.csproj", "{8DDE4291-BC57-4C56-9871-B982462F4C3D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.IP2Region.Tests", "tests\LINGYUN.Abp.IP2Region.Tests\LINGYUN.Abp.IP2Region.Tests.csproj", "{C5D64A2B-7E7E-4509-9F31-425D59712E6F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data-protection", "data-protection", "{07C2FB08-985C-42FE-85AF-38E40A301668}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.Abstractions", "framework\data-protection\LINGYUN.Abp.DataProtection.Abstractions\LINGYUN.Abp.DataProtection.Abstractions.csproj", "{A52C54FB-C96D-4032-8588-AFC2CD158D23}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection", "framework\data-protection\LINGYUN.Abp.DataProtection\LINGYUN.Abp.DataProtection.csproj", "{B05ED61E-9A36-4E90-B876-F48559E018A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtection.EntityFrameworkCore", "framework\data-protection\LINGYUN.Abp.DataProtection.EntityFrameworkCore\LINGYUN.Abp.DataProtection.EntityFrameworkCore.csproj", "{1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data-protection", "data-protection", "{4FCD7337-4320-412D-9BC8-A0B243BC27B3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Domain.Shared", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Domain.Shared\LINGYUN.Abp.DataProtectionManagement.Domain.Shared.csproj", "{9D2C789C-8241-4F53-AFEF-F2AB15BAA823}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Domain", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Domain\LINGYUN.Abp.DataProtectionManagement.Domain.csproj", "{36AEA095-E34D-43F5-8000-9FA3A696C312}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Application.Contracts", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Application.Contracts\LINGYUN.Abp.DataProtectionManagement.Application.Contracts.csproj", "{2D5A9AB0-9F32-4784-8972-814F86C0239D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.Application", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.Application\LINGYUN.Abp.DataProtectionManagement.Application.csproj", "{A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore\LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore.csproj", "{AF15C829-9288-4D7F-95A0-4EA8DF909929}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.DataProtectionManagement.HttpApi", "modules\data-protection\LINGYUN.Abp.DataProtectionManagement.HttpApi\LINGYUN.Abp.DataProtectionManagement.HttpApi.csproj", "{616652A5-A420-475C-AC9F-FC687E3C768B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "demo", "demo", "{E29EC2A4-A2DE-442F-8616-DAFD69F128B8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Domain.Shared", "modules\demo\LINGYUN.Abp.Demo.Domain.Shared\LINGYUN.Abp.Demo.Domain.Shared.csproj", "{D736C433-C230-46B7-9D43-17D0282EBBDF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Domain", "modules\demo\LINGYUN.Abp.Demo.Domain\LINGYUN.Abp.Demo.Domain.csproj", "{FA525A71-C0BF-49FB-BAB7-547944618587}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Application.Contracts", "modules\demo\LINGYUN.Abp.Demo.Application.Contracts\LINGYUN.Abp.Demo.Application.Contracts.csproj", "{532D5703-0090-4F2E-B725-5786D53506C9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.Application", "modules\demo\LINGYUN.Abp.Demo.Application\LINGYUN.Abp.Demo.Application.csproj", "{E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.EntityFrameworkCore", "modules\demo\LINGYUN.Abp.Demo.EntityFrameworkCore\LINGYUN.Abp.Demo.EntityFrameworkCore.csproj", "{71CF0E82-FA07-472A-B32A-AC25EDA82BB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Demo.HttpApi", "modules\demo\LINGYUN.Abp.Demo.HttpApi\LINGYUN.Abp.Demo.HttpApi.csproj", "{77965572-373C-4319-9EF9-73D6E660044B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exporter", "exporter", "{4A2CF141-F32D-45A0-8665-B3705667A6D2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Application.Contracts", "framework\exporter\LINGYUN.Abp.Exporter.Application.Contracts\LINGYUN.Abp.Exporter.Application.Contracts.csproj", "{A3924A79-1ADC-458D-8764-3958297BDEB0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Application", "framework\exporter\LINGYUN.Abp.Exporter.Application\LINGYUN.Abp.Exporter.Application.csproj", "{38A933EB-82F1-42A6-ABF3-F55975B4078E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.Core", "framework\exporter\LINGYUN.Abp.Exporter.Core\LINGYUN.Abp.Exporter.Core.csproj", "{03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.MiniExcel", "framework\exporter\LINGYUN.Abp.Exporter.MiniExcel\LINGYUN.Abp.Exporter.MiniExcel.csproj", "{CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.Exporter.MagicodesIE.Excel", "framework\exporter\LINGYUN.Abp.Exporter.MagicodesIE.Excel\LINGYUN.Abp.Exporter.MagicodesIE.Excel.csproj", "{319428B9-CE7F-4027-92FA-6311C4CE95FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Minio", "modules\oss-management\LINGYUN.Abp.OssManagement.Minio\LINGYUN.Abp.OssManagement.Minio.csproj", "{9AE3E97E-8846-4315-9546-FF97E97FD49F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OssManagement.Imaging", "modules\oss-management\LINGYUN.Abp.OssManagement.Imaging\LINGYUN.Abp.OssManagement.Imaging.csproj", "{BC7A8662-4313-4F1D-B267-9B1B69444CD3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cap", "cap", "{7C35101B-EA29-4B3D-B424-FAD625977E4D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.EventBus.CAP", "framework\common\LINGYUN.Abp.EventBus.CAP\LINGYUN.Abp.EventBus.CAP.csproj", "{4539FCDB-7192-442C-BD9B-0AC71E882F4F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.AuditLogging.IP2Region", "framework\auditing\LINGYUN.Abp.AuditLogging.IP2Region\LINGYUN.Abp.AuditLogging.IP2Region.csproj", "{DFDF367D-EDE1-4365-90F9-32F529117B60}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer", "migrations\LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer\LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer.csproj", "{30EEF879-CFF7-4661-89CB-9CB68328D008}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LY.AIO.Applications.Single", "services\LY.AIO.Applications.Single\LY.AIO.Applications.Single.csproj", "{37740138-D088-46F5-83A8-8A8180FE65D8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003}.Release|Any CPU.Build.0 = Release|Any CPU + {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20}.Release|Any CPU.Build.0 = Release|Any CPU + {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555}.Release|Any CPU.Build.0 = Release|Any CPU + {4995C481-7465-4A36-8416-0D0D14F64B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4995C481-7465-4A36-8416-0D0D14F64B10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4995C481-7465-4A36-8416-0D0D14F64B10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4995C481-7465-4A36-8416-0D0D14F64B10}.Release|Any CPU.Build.0 = Release|Any CPU + {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1}.Release|Any CPU.Build.0 = Release|Any CPU + {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B6F4C72-975B-44A4-9F72-A217E53E05C1}.Release|Any CPU.Build.0 = Release|Any CPU + {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95909DDC-66A1-410A-9AB1-CD62EA33CFA0}.Release|Any CPU.Build.0 = Release|Any CPU + {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1AFDF87C-220D-44EC-B5DA-99B0510AE561}.Release|Any CPU.Build.0 = Release|Any CPU + {7F831848-A1C1-49FE-B81A-499AB6E17286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F831848-A1C1-49FE-B81A-499AB6E17286}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F831848-A1C1-49FE-B81A-499AB6E17286}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F831848-A1C1-49FE-B81A-499AB6E17286}.Release|Any CPU.Build.0 = Release|Any CPU + {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C2A3557-31E4-4D06-A08E-138E31412AD4}.Release|Any CPU.Build.0 = Release|Any CPU + {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6}.Release|Any CPU.Build.0 = Release|Any CPU + {8064607C-BDB9-454D-8E76-2B21023CD071}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8064607C-BDB9-454D-8E76-2B21023CD071}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8064607C-BDB9-454D-8E76-2B21023CD071}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8064607C-BDB9-454D-8E76-2B21023CD071}.Release|Any CPU.Build.0 = Release|Any CPU + {A3BF5605-8684-4713-885D-CC498CC37686}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3BF5605-8684-4713-885D-CC498CC37686}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3BF5605-8684-4713-885D-CC498CC37686}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3BF5605-8684-4713-885D-CC498CC37686}.Release|Any CPU.Build.0 = Release|Any CPU + {D1399D41-0273-45FA-969F-FA9C77432A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D1399D41-0273-45FA-969F-FA9C77432A06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1399D41-0273-45FA-969F-FA9C77432A06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D1399D41-0273-45FA-969F-FA9C77432A06}.Release|Any CPU.Build.0 = Release|Any CPU + {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E790A9A3-3C24-4478-A547-0FE13F7F6963}.Release|Any CPU.Build.0 = Release|Any CPU + {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56F007F7-23A8-4F13-B45F-57D4EB35AB2C}.Release|Any CPU.Build.0 = Release|Any CPU + {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8}.Release|Any CPU.Build.0 = Release|Any CPU + {7259B767-9528-4EF9-8F81-20344879F1CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7259B767-9528-4EF9-8F81-20344879F1CD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7259B767-9528-4EF9-8F81-20344879F1CD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7259B767-9528-4EF9-8F81-20344879F1CD}.Release|Any CPU.Build.0 = Release|Any CPU + {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED7E70B9-8FEE-48DF-9962-AD1062769342}.Release|Any CPU.Build.0 = Release|Any CPU + {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAD28D5B-8A14-43DF-A236-E313FD97E799}.Release|Any CPU.Build.0 = Release|Any CPU + {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8}.Release|Any CPU.Build.0 = Release|Any CPU + {60C97165-7CAB-467A-857E-9343B239F8EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60C97165-7CAB-467A-857E-9343B239F8EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60C97165-7CAB-467A-857E-9343B239F8EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60C97165-7CAB-467A-857E-9343B239F8EF}.Release|Any CPU.Build.0 = Release|Any CPU + {C18979C7-EBD1-437D-A877-4A97B68761A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C18979C7-EBD1-437D-A877-4A97B68761A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C18979C7-EBD1-437D-A877-4A97B68761A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C18979C7-EBD1-437D-A877-4A97B68761A5}.Release|Any CPU.Build.0 = Release|Any CPU + {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F}.Release|Any CPU.Build.0 = Release|Any CPU + {D2AB9E95-A074-498A-A475-2298D0F1973E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2AB9E95-A074-498A-A475-2298D0F1973E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2AB9E95-A074-498A-A475-2298D0F1973E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2AB9E95-A074-498A-A475-2298D0F1973E}.Release|Any CPU.Build.0 = Release|Any CPU + {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA8FB07D-1347-4E5A-B84C-8AB955A652AD}.Release|Any CPU.Build.0 = Release|Any CPU + {2D66E202-B34D-4998-BD80-5411C8087695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D66E202-B34D-4998-BD80-5411C8087695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D66E202-B34D-4998-BD80-5411C8087695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D66E202-B34D-4998-BD80-5411C8087695}.Release|Any CPU.Build.0 = Release|Any CPU + {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EC45855-A09A-4B77-99A8-DA00E2D702E8}.Release|Any CPU.Build.0 = Release|Any CPU + {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42439E6A-0084-48A9-9620-0B9EAB4182C4}.Release|Any CPU.Build.0 = Release|Any CPU + {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1290A8A-3BBE-4647-90D9-4AD537432AB5}.Release|Any CPU.Build.0 = Release|Any CPU + {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAF2D4A3-7A7F-4848-9817-66D164D03F0F}.Release|Any CPU.Build.0 = Release|Any CPU + {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9E728961-7C0B-4C2B-92E4-8965B45ADB19}.Release|Any CPU.Build.0 = Release|Any CPU + {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A}.Release|Any CPU.Build.0 = Release|Any CPU + {45E954A6-5F29-48B3-B518-513F6837EE27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45E954A6-5F29-48B3-B518-513F6837EE27}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45E954A6-5F29-48B3-B518-513F6837EE27}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45E954A6-5F29-48B3-B518-513F6837EE27}.Release|Any CPU.Build.0 = Release|Any CPU + {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94}.Release|Any CPU.Build.0 = Release|Any CPU + {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DAE26C2-BB2C-49CE-B52D-D53383ADE560}.Release|Any CPU.Build.0 = Release|Any CPU + {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E}.Release|Any CPU.Build.0 = Release|Any CPU + {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FCB18BE-6D50-4567-8CBD-80B0336D9685}.Release|Any CPU.Build.0 = Release|Any CPU + {9B4C9894-D295-4D16-AC90-F98563B37722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B4C9894-D295-4D16-AC90-F98563B37722}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B4C9894-D295-4D16-AC90-F98563B37722}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B4C9894-D295-4D16-AC90-F98563B37722}.Release|Any CPU.Build.0 = Release|Any CPU + {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7EFE38E-1214-4D7D-A9DA-F753D613F956}.Release|Any CPU.Build.0 = Release|Any CPU + {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC3E9C3B-EA51-4CC8-AD94-7F0285239907}.Release|Any CPU.Build.0 = Release|Any CPU + {33D6A170-D609-430C-B110-E1A8F3322C06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33D6A170-D609-430C-B110-E1A8F3322C06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33D6A170-D609-430C-B110-E1A8F3322C06}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33D6A170-D609-430C-B110-E1A8F3322C06}.Release|Any CPU.Build.0 = Release|Any CPU + {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F}.Release|Any CPU.Build.0 = Release|Any CPU + {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A}.Release|Any CPU.Build.0 = Release|Any CPU + {19CD928F-D16F-4A91-BA0C-2459F5055565}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19CD928F-D16F-4A91-BA0C-2459F5055565}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19CD928F-D16F-4A91-BA0C-2459F5055565}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19CD928F-D16F-4A91-BA0C-2459F5055565}.Release|Any CPU.Build.0 = Release|Any CPU + {86993E17-8793-45ED-B636-C921BB1165D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86993E17-8793-45ED-B636-C921BB1165D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86993E17-8793-45ED-B636-C921BB1165D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86993E17-8793-45ED-B636-C921BB1165D7}.Release|Any CPU.Build.0 = Release|Any CPU + {158AFAD1-39AE-4135-81EE-55F905802A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {158AFAD1-39AE-4135-81EE-55F905802A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {158AFAD1-39AE-4135-81EE-55F905802A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {158AFAD1-39AE-4135-81EE-55F905802A8B}.Release|Any CPU.Build.0 = Release|Any CPU + {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BE2CFE9-26E7-4791-B9DE-109B465B701C}.Release|Any CPU.Build.0 = Release|Any CPU + {BF943CF0-2732-41D3-BFE3-9B843564D807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF943CF0-2732-41D3-BFE3-9B843564D807}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF943CF0-2732-41D3-BFE3-9B843564D807}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF943CF0-2732-41D3-BFE3-9B843564D807}.Release|Any CPU.Build.0 = Release|Any CPU + {B93528E2-55EA-4847-950D-8B95B1CC2909}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B93528E2-55EA-4847-950D-8B95B1CC2909}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B93528E2-55EA-4847-950D-8B95B1CC2909}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B93528E2-55EA-4847-950D-8B95B1CC2909}.Release|Any CPU.Build.0 = Release|Any CPU + {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCF85E69-4D97-4DD3-8526-B33C76BD17CA}.Release|Any CPU.Build.0 = Release|Any CPU + {2B1B759E-670A-4837-854A-4748C67BB15B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B1B759E-670A-4837-854A-4748C67BB15B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B1B759E-670A-4837-854A-4748C67BB15B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B1B759E-670A-4837-854A-4748C67BB15B}.Release|Any CPU.Build.0 = Release|Any CPU + {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9ACB83F6-C911-4473-973D-A3BECFB5F1E6}.Release|Any CPU.Build.0 = Release|Any CPU + {97064B96-B5AC-461D-BBBF-97A864F373E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97064B96-B5AC-461D-BBBF-97A864F373E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97064B96-B5AC-461D-BBBF-97A864F373E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97064B96-B5AC-461D-BBBF-97A864F373E6}.Release|Any CPU.Build.0 = Release|Any CPU + {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE}.Release|Any CPU.Build.0 = Release|Any CPU + {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB4498D8-E45B-4A5A-9BF2-830039B2D38D}.Release|Any CPU.Build.0 = Release|Any CPU + {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {412BAB54-282E-4A01-AF72-E76F3AF31AE7}.Release|Any CPU.Build.0 = Release|Any CPU + {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0}.Release|Any CPU.Build.0 = Release|Any CPU + {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E}.Release|Any CPU.Build.0 = Release|Any CPU + {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E}.Release|Any CPU.Build.0 = Release|Any CPU + {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C}.Release|Any CPU.Build.0 = Release|Any CPU + {DA053CAE-EBA4-4532-93B5-3347589CB174}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA053CAE-EBA4-4532-93B5-3347589CB174}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA053CAE-EBA4-4532-93B5-3347589CB174}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA053CAE-EBA4-4532-93B5-3347589CB174}.Release|Any CPU.Build.0 = Release|Any CPU + {76810110-6683-4777-9157-8030F9205FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76810110-6683-4777-9157-8030F9205FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76810110-6683-4777-9157-8030F9205FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76810110-6683-4777-9157-8030F9205FBF}.Release|Any CPU.Build.0 = Release|Any CPU + {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80DDA32B-2BDA-4704-9458-6D680B08B74C}.Release|Any CPU.Build.0 = Release|Any CPU + {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B}.Release|Any CPU.Build.0 = Release|Any CPU + {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51}.Release|Any CPU.Build.0 = Release|Any CPU + {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED7AADAF-72D8-4C04-96CE-B46B21C9C343}.Release|Any CPU.Build.0 = Release|Any CPU + {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6518F1B5-63EA-46A2-87ED-FD90366594EC}.Release|Any CPU.Build.0 = Release|Any CPU + {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB79F7C4-9AE1-4921-B18A-F64074B1DC69}.Release|Any CPU.Build.0 = Release|Any CPU + {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DCF463DE-50CA-4585-BA9F-83F7101B5ED7}.Release|Any CPU.Build.0 = Release|Any CPU + {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2E248DB-B2DD-4916-82A6-5D296C1298B5}.Release|Any CPU.Build.0 = Release|Any CPU + {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {293C7A2B-46D2-49B6-A8C6-294500ED5AE5}.Release|Any CPU.Build.0 = Release|Any CPU + {21691099-AF37-4706-84AE-C19C72DC09B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21691099-AF37-4706-84AE-C19C72DC09B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21691099-AF37-4706-84AE-C19C72DC09B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21691099-AF37-4706-84AE-C19C72DC09B6}.Release|Any CPU.Build.0 = Release|Any CPU + {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C31A17E0-AE56-419C-A6D1-3FCBB68005E2}.Release|Any CPU.Build.0 = Release|Any CPU + {974D842A-9739-40E4-96E8-039552E28D8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {974D842A-9739-40E4-96E8-039552E28D8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {974D842A-9739-40E4-96E8-039552E28D8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {974D842A-9739-40E4-96E8-039552E28D8B}.Release|Any CPU.Build.0 = Release|Any CPU + {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6}.Release|Any CPU.Build.0 = Release|Any CPU + {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3064272-5A6F-4CB9-B79F-8D37A2392CC1}.Release|Any CPU.Build.0 = Release|Any CPU + {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DD17D3E-F8EC-44AA-8437-3AF541CD3988}.Release|Any CPU.Build.0 = Release|Any CPU + {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F42FAF67-D10F-487A-A74C-E6D8EA90831C}.Release|Any CPU.Build.0 = Release|Any CPU + {81B74E08-06CD-4134-A02D-B4B837945E2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81B74E08-06CD-4134-A02D-B4B837945E2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81B74E08-06CD-4134-A02D-B4B837945E2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81B74E08-06CD-4134-A02D-B4B837945E2B}.Release|Any CPU.Build.0 = Release|Any CPU + {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78635E6D-2C35-437C-96CD-29DAEAFE0076}.Release|Any CPU.Build.0 = Release|Any CPU + {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8CBD522-6668-4A5F-B62D-9E37E7DC1279}.Release|Any CPU.Build.0 = Release|Any CPU + {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33FC6389-3931-4BD2-A619-36C4A8F5C7B0}.Release|Any CPU.Build.0 = Release|Any CPU + {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58A4954C-4901-4172-BEE7-5584ABB0DF45}.Release|Any CPU.Build.0 = Release|Any CPU + {D4BC55C7-1991-4866-A7BA-66653DACF945}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4BC55C7-1991-4866-A7BA-66653DACF945}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4BC55C7-1991-4866-A7BA-66653DACF945}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4BC55C7-1991-4866-A7BA-66653DACF945}.Release|Any CPU.Build.0 = Release|Any CPU + {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E}.Release|Any CPU.Build.0 = Release|Any CPU + {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF1F1193-FECE-4E98-A4FC-643A86F30429}.Release|Any CPU.Build.0 = Release|Any CPU + {46C57140-EE02-4785-9777-F2264EC88135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46C57140-EE02-4785-9777-F2264EC88135}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46C57140-EE02-4785-9777-F2264EC88135}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46C57140-EE02-4785-9777-F2264EC88135}.Release|Any CPU.Build.0 = Release|Any CPU + {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA}.Release|Any CPU.Build.0 = Release|Any CPU + {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD3E63A3-3422-4A1A-AC89-B20786A5323E}.Release|Any CPU.Build.0 = Release|Any CPU + {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA2975D9-5477-4281-8D84-F0909F22DFF3}.Release|Any CPU.Build.0 = Release|Any CPU + {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A}.Release|Any CPU.Build.0 = Release|Any CPU + {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34C9609F-556B-44D7-B3DE-5637FEB0BFEC}.Release|Any CPU.Build.0 = Release|Any CPU + {A69E6742-39A6-4C0D-A098-E16A653331AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A69E6742-39A6-4C0D-A098-E16A653331AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A69E6742-39A6-4C0D-A098-E16A653331AC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A69E6742-39A6-4C0D-A098-E16A653331AC}.Release|Any CPU.Build.0 = Release|Any CPU + {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AC4C18F-2BB5-47F9-99F5-5585E1D22111}.Release|Any CPU.Build.0 = Release|Any CPU + {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D738A46-2B08-4A88-8787-668A4AD5AE5F}.Release|Any CPU.Build.0 = Release|Any CPU + {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B9E97DE-0265-4192-9FAF-B5AF65AC6611}.Release|Any CPU.Build.0 = Release|Any CPU + {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2}.Release|Any CPU.Build.0 = Release|Any CPU + {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA56194E-B0EF-42B1-BC35-9A677D7D66BB}.Release|Any CPU.Build.0 = Release|Any CPU + {56C00F97-6769-44B2-8004-341D5286E31F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {56C00F97-6769-44B2-8004-341D5286E31F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {56C00F97-6769-44B2-8004-341D5286E31F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {56C00F97-6769-44B2-8004-341D5286E31F}.Release|Any CPU.Build.0 = Release|Any CPU + {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E}.Release|Any CPU.Build.0 = Release|Any CPU + {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C774F10-5FAC-4177-9BFA-28486747DF3D}.Release|Any CPU.Build.0 = Release|Any CPU + {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91BD29B8-FD39-4429-A8FF-C5A1E511C632}.Release|Any CPU.Build.0 = Release|Any CPU + {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB29E904-C164-46B3-A12C-3A908FCA6DB9}.Release|Any CPU.Build.0 = Release|Any CPU + {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F5CD33F-ACD9-4BF3-99DE-33A24116A672}.Release|Any CPU.Build.0 = Release|Any CPU + {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EA3971F-E854-4198-AC8D-BC3C4F804B25}.Release|Any CPU.Build.0 = Release|Any CPU + {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5CA092D-E294-4BF6-92AF-CCF136A643D1}.Release|Any CPU.Build.0 = Release|Any CPU + {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9CDC9B6C-C69E-483F-B881-5D065FA064C9}.Release|Any CPU.Build.0 = Release|Any CPU + {A74A9B50-0E40-44AD-9360-5BF96696B405}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A74A9B50-0E40-44AD-9360-5BF96696B405}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A74A9B50-0E40-44AD-9360-5BF96696B405}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A74A9B50-0E40-44AD-9360-5BF96696B405}.Release|Any CPU.Build.0 = Release|Any CPU + {A243383E-7025-4893-9611-EE75DA055301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A243383E-7025-4893-9611-EE75DA055301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A243383E-7025-4893-9611-EE75DA055301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A243383E-7025-4893-9611-EE75DA055301}.Release|Any CPU.Build.0 = Release|Any CPU + {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3192C227-A18D-48A1-A2E8-C414981E9C5A}.Release|Any CPU.Build.0 = Release|Any CPU + {86ED8028-5533-4B5D-8594-C09929F2A553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86ED8028-5533-4B5D-8594-C09929F2A553}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86ED8028-5533-4B5D-8594-C09929F2A553}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86ED8028-5533-4B5D-8594-C09929F2A553}.Release|Any CPU.Build.0 = Release|Any CPU + {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A09032AD-D895-4D83-8D3D-67FF3285F7A6}.Release|Any CPU.Build.0 = Release|Any CPU + {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59A3A2B8-7992-4321-A481-8C2CD08D0835}.Release|Any CPU.Build.0 = Release|Any CPU + {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F9D10E1C-38DC-423D-8B79-BE4673C75B50}.Release|Any CPU.Build.0 = Release|Any CPU + {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53479279-0E9C-4921-BEB1-46FDB553C8E2}.Release|Any CPU.Build.0 = Release|Any CPU + {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8472D376-D2DB-40C3-AAF9-9ACDF1731919}.Release|Any CPU.Build.0 = Release|Any CPU + {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D7770AA-1669-45CE-88D9-3009C6A48AEE}.Release|Any CPU.Build.0 = Release|Any CPU + {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4ED4FC9-74D5-4379-9787-1F7756B56201}.Release|Any CPU.Build.0 = Release|Any CPU + {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F87CA546-1ED2-409A-AD87-62E133BD3EF9}.Release|Any CPU.Build.0 = Release|Any CPU + {2BB68CBB-2220-466B-B24E-6916819DFB79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BB68CBB-2220-466B-B24E-6916819DFB79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BB68CBB-2220-466B-B24E-6916819DFB79}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BB68CBB-2220-466B-B24E-6916819DFB79}.Release|Any CPU.Build.0 = Release|Any CPU + {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACEFA4C4-4CA8-4358-9B75-3806DF228517}.Release|Any CPU.Build.0 = Release|Any CPU + {AF2F208F-43D6-4296-9826-677681BEC6D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF2F208F-43D6-4296-9826-677681BEC6D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF2F208F-43D6-4296-9826-677681BEC6D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF2F208F-43D6-4296-9826-677681BEC6D4}.Release|Any CPU.Build.0 = Release|Any CPU + {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4}.Release|Any CPU.Build.0 = Release|Any CPU + {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B26E45A-99B1-47EA-9015-7DD78CAFC423}.Release|Any CPU.Build.0 = Release|Any CPU + {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F826B05A-2736-4361-ADE5-04B1CF171ED4}.Release|Any CPU.Build.0 = Release|Any CPU + {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB}.Release|Any CPU.Build.0 = Release|Any CPU + {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E84E1E4-82F8-412B-94F2-E06FF1320B1D}.Release|Any CPU.Build.0 = Release|Any CPU + {C9202B23-45E9-4167-BFAC-89651AF554EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9202B23-45E9-4167-BFAC-89651AF554EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9202B23-45E9-4167-BFAC-89651AF554EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9202B23-45E9-4167-BFAC-89651AF554EB}.Release|Any CPU.Build.0 = Release|Any CPU + {16666C1F-09C1-4829-9AFC-77FB22439A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16666C1F-09C1-4829-9AFC-77FB22439A59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16666C1F-09C1-4829-9AFC-77FB22439A59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16666C1F-09C1-4829-9AFC-77FB22439A59}.Release|Any CPU.Build.0 = Release|Any CPU + {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E}.Release|Any CPU.Build.0 = Release|Any CPU + {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45}.Release|Any CPU.Build.0 = Release|Any CPU + {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DAFCBF4F-8174-4934-929E-374FBDCE854D}.Release|Any CPU.Build.0 = Release|Any CPU + {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA}.Release|Any CPU.Build.0 = Release|Any CPU + {1C3BCC38-D583-402F-B922-5562F19EA12C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C3BCC38-D583-402F-B922-5562F19EA12C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C3BCC38-D583-402F-B922-5562F19EA12C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C3BCC38-D583-402F-B922-5562F19EA12C}.Release|Any CPU.Build.0 = Release|Any CPU + {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {00A6598E-8913-47C4-97F7-0E784EA9D55F}.Release|Any CPU.Build.0 = Release|Any CPU + {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8A8A180-C40F-43C7-B6B2-622344CE276B}.Release|Any CPU.Build.0 = Release|Any CPU + {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7}.Release|Any CPU.Build.0 = Release|Any CPU + {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5960FE7B-EC00-4C8D-A522-8FFEC184694D}.Release|Any CPU.Build.0 = Release|Any CPU + {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A}.Release|Any CPU.Build.0 = Release|Any CPU + {6A79337A-879F-4A9F-8328-5578E40177B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A79337A-879F-4A9F-8328-5578E40177B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A79337A-879F-4A9F-8328-5578E40177B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A79337A-879F-4A9F-8328-5578E40177B5}.Release|Any CPU.Build.0 = Release|Any CPU + {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {233C2407-3ED3-4322-B28D-0F93CF4C6E33}.Release|Any CPU.Build.0 = Release|Any CPU + {118D91CE-091B-4C65-8979-2F5363C56CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {118D91CE-091B-4C65-8979-2F5363C56CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {118D91CE-091B-4C65-8979-2F5363C56CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {118D91CE-091B-4C65-8979-2F5363C56CDC}.Release|Any CPU.Build.0 = Release|Any CPU + {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EF74657-9EBC-46FD-B2CA-40959D0EE692}.Release|Any CPU.Build.0 = Release|Any CPU + {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD}.Release|Any CPU.Build.0 = Release|Any CPU + {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2}.Release|Any CPU.Build.0 = Release|Any CPU + {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A788317B-1649-4D26-AB6C-6AA5B35767DA}.Release|Any CPU.Build.0 = Release|Any CPU + {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2}.Release|Any CPU.Build.0 = Release|Any CPU + {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C027362E-9B72-4058-91DF-D7F0FDD162AA}.Release|Any CPU.Build.0 = Release|Any CPU + {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E}.Release|Any CPU.Build.0 = Release|Any CPU + {0E0683C3-5169-4965-A886-D960811E1807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E0683C3-5169-4965-A886-D960811E1807}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E0683C3-5169-4965-A886-D960811E1807}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E0683C3-5169-4965-A886-D960811E1807}.Release|Any CPU.Build.0 = Release|Any CPU + {8011A4C4-F08C-463D-A376-F33A7F780F57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8011A4C4-F08C-463D-A376-F33A7F780F57}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8011A4C4-F08C-463D-A376-F33A7F780F57}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8011A4C4-F08C-463D-A376-F33A7F780F57}.Release|Any CPU.Build.0 = Release|Any CPU + {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78767BC5-FE68-4919-BC1B-DE7FF71F294B}.Release|Any CPU.Build.0 = Release|Any CPU + {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E}.Release|Any CPU.Build.0 = Release|Any CPU + {9697AB9A-2ACA-42E5-877E-EEF371166898}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9697AB9A-2ACA-42E5-877E-EEF371166898}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9697AB9A-2ACA-42E5-877E-EEF371166898}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9697AB9A-2ACA-42E5-877E-EEF371166898}.Release|Any CPU.Build.0 = Release|Any CPU + {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76A4D1FD-479A-4C57-96E0-BBFCCBADB683}.Release|Any CPU.Build.0 = Release|Any CPU + {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4C02147-34FA-43D1-B03C-00D539CF18BC}.Release|Any CPU.Build.0 = Release|Any CPU + {AABB5ABC-790E-48D1-B654-72143227FA64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AABB5ABC-790E-48D1-B654-72143227FA64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AABB5ABC-790E-48D1-B654-72143227FA64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AABB5ABC-790E-48D1-B654-72143227FA64}.Release|Any CPU.Build.0 = Release|Any CPU + {CA5E2785-511D-4A14-8883-2544C869B2DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA5E2785-511D-4A14-8883-2544C869B2DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA5E2785-511D-4A14-8883-2544C869B2DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA5E2785-511D-4A14-8883-2544C869B2DF}.Release|Any CPU.Build.0 = Release|Any CPU + {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB897095-EA92-4AD9-829C-66FEE1878A5D}.Release|Any CPU.Build.0 = Release|Any CPU + {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FA05CCA-0584-4320-B278-D5AA1234BA02}.Release|Any CPU.Build.0 = Release|Any CPU + {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B6A98B3-90C1-49F2-8A17-C70FED500627}.Release|Any CPU.Build.0 = Release|Any CPU + {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1F404E43-FA13-485D-B922-7D8848EBCE0F}.Release|Any CPU.Build.0 = Release|Any CPU + {2230E355-50F7-424F-929F-532B0A5DABE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2230E355-50F7-424F-929F-532B0A5DABE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2230E355-50F7-424F-929F-532B0A5DABE0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2230E355-50F7-424F-929F-532B0A5DABE0}.Release|Any CPU.Build.0 = Release|Any CPU + {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBCDC571-F747-46AB-AFCB-38D191DCFFB6}.Release|Any CPU.Build.0 = Release|Any CPU + {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F94E77C1-61E0-4FE8-9ECD-10A0102342E9}.Release|Any CPU.Build.0 = Release|Any CPU + {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C}.Release|Any CPU.Build.0 = Release|Any CPU + {CAEF3248-527D-48B7-9C98-929AC573C381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAEF3248-527D-48B7-9C98-929AC573C381}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAEF3248-527D-48B7-9C98-929AC573C381}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAEF3248-527D-48B7-9C98-929AC573C381}.Release|Any CPU.Build.0 = Release|Any CPU + {209E7129-4B39-4768-A0D6-797F796E4FCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {209E7129-4B39-4768-A0D6-797F796E4FCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {209E7129-4B39-4768-A0D6-797F796E4FCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {209E7129-4B39-4768-A0D6-797F796E4FCE}.Release|Any CPU.Build.0 = Release|Any CPU + {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D67EBE62-C541-45E4-957E-D1D11BE74F68}.Release|Any CPU.Build.0 = Release|Any CPU + {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7623D363-F0BD-400C-B8AB-3FD9699D92D9}.Release|Any CPU.Build.0 = Release|Any CPU + {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2BA59EA-769B-4D5B-8032-CB9682D0D73A}.Release|Any CPU.Build.0 = Release|Any CPU + {5F0926F3-463D-445B-9746-0A037DC431F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F0926F3-463D-445B-9746-0A037DC431F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F0926F3-463D-445B-9746-0A037DC431F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F0926F3-463D-445B-9746-0A037DC431F9}.Release|Any CPU.Build.0 = Release|Any CPU + {21878B72-9801-41CE-88CD-7195714AE9BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21878B72-9801-41CE-88CD-7195714AE9BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21878B72-9801-41CE-88CD-7195714AE9BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21878B72-9801-41CE-88CD-7195714AE9BA}.Release|Any CPU.Build.0 = Release|Any CPU + {2263600B-30CB-4188-925D-92F12F904163}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2263600B-30CB-4188-925D-92F12F904163}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2263600B-30CB-4188-925D-92F12F904163}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2263600B-30CB-4188-925D-92F12F904163}.Release|Any CPU.Build.0 = Release|Any CPU + {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E}.Release|Any CPU.Build.0 = Release|Any CPU + {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8}.Release|Any CPU.Build.0 = Release|Any CPU + {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAD86432-6A95-47DE-8E3A-FC2101753C52}.Release|Any CPU.Build.0 = Release|Any CPU + {5F278E32-3A2A-4654-BD3C-B183301382FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5F278E32-3A2A-4654-BD3C-B183301382FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F278E32-3A2A-4654-BD3C-B183301382FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5F278E32-3A2A-4654-BD3C-B183301382FB}.Release|Any CPU.Build.0 = Release|Any CPU + {1DB57C74-1C40-4414-B968-937C3C1C157E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1DB57C74-1C40-4414-B968-937C3C1C157E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DB57C74-1C40-4414-B968-937C3C1C157E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1DB57C74-1C40-4414-B968-937C3C1C157E}.Release|Any CPU.Build.0 = Release|Any CPU + {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9}.Release|Any CPU.Build.0 = Release|Any CPU + {C4D3B4CA-6631-4447-9D89-A535305E581A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4D3B4CA-6631-4447-9D89-A535305E581A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4D3B4CA-6631-4447-9D89-A535305E581A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4D3B4CA-6631-4447-9D89-A535305E581A}.Release|Any CPU.Build.0 = Release|Any CPU + {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18FCB763-1EFF-47DF-ACED-98B7F994FD10}.Release|Any CPU.Build.0 = Release|Any CPU + {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B5EB3D6-08FD-490C-BC70-805B199A0333}.Release|Any CPU.Build.0 = Release|Any CPU + {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28422FE4-8D58-4D8A-8363-7A9D569A5695}.Release|Any CPU.Build.0 = Release|Any CPU + {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5}.Release|Any CPU.Build.0 = Release|Any CPU + {90C71347-89E2-4546-9A64-FE56F6A48E13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90C71347-89E2-4546-9A64-FE56F6A48E13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90C71347-89E2-4546-9A64-FE56F6A48E13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90C71347-89E2-4546-9A64-FE56F6A48E13}.Release|Any CPU.Build.0 = Release|Any CPU + {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93B1913D-41B8-4FAB-8472-4BE03F4DC03C}.Release|Any CPU.Build.0 = Release|Any CPU + {6FA91938-03AB-41B0-9A80-14AE550D745E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FA91938-03AB-41B0-9A80-14AE550D745E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FA91938-03AB-41B0-9A80-14AE550D745E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FA91938-03AB-41B0-9A80-14AE550D745E}.Release|Any CPU.Build.0 = Release|Any CPU + {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {838A6EB6-BCD4-498E-A729-6875F4A6EDF1}.Release|Any CPU.Build.0 = Release|Any CPU + {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA9F69A2-ACCF-477B-9519-257CF47DC0F4}.Release|Any CPU.Build.0 = Release|Any CPU + {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075}.Release|Any CPU.Build.0 = Release|Any CPU + {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DFAECE7-496B-4E86-A23F-5F9A597D1119}.Release|Any CPU.Build.0 = Release|Any CPU + {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3690518A-D6C3-42CC-AEC2-6D48C6987F68}.Release|Any CPU.Build.0 = Release|Any CPU + {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D34162C-0CE3-4D7B-B19A-4786C616D0B3}.Release|Any CPU.Build.0 = Release|Any CPU + {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.Build.0 = Release|Any CPU + {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.Build.0 = Release|Any CPU + {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Release|Any CPU.Build.0 = Release|Any CPU + {E957DB2E-589D-4310-9576-92F108A67CE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E957DB2E-589D-4310-9576-92F108A67CE7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E957DB2E-589D-4310-9576-92F108A67CE7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E957DB2E-589D-4310-9576-92F108A67CE7}.Release|Any CPU.Build.0 = Release|Any CPU + {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A}.Release|Any CPU.Build.0 = Release|Any CPU + {C4690A20-8628-4A39-8E71-2D09800D0E72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C4690A20-8628-4A39-8E71-2D09800D0E72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4690A20-8628-4A39-8E71-2D09800D0E72}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C4690A20-8628-4A39-8E71-2D09800D0E72}.Release|Any CPU.Build.0 = Release|Any CPU + {8233A44F-4DFC-4701-9C04-834FD3C97060}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8233A44F-4DFC-4701-9C04-834FD3C97060}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8233A44F-4DFC-4701-9C04-834FD3C97060}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8233A44F-4DFC-4701-9C04-834FD3C97060}.Release|Any CPU.Build.0 = Release|Any CPU + {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {66A6E78D-E547-4DD7-9844-087FAB3D03C2}.Release|Any CPU.Build.0 = Release|Any CPU + {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A99F5406-37DC-4677-9166-9BDE90C26CA6}.Release|Any CPU.Build.0 = Release|Any CPU + {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3}.Release|Any CPU.Build.0 = Release|Any CPU + {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F}.Release|Any CPU.Build.0 = Release|Any CPU + {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Debug|Any CPU.Build.0 = Debug|Any CPU + {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Release|Any CPU.ActiveCfg = Release|Any CPU + {986B92F6-A758-4D1F-8BC7-BFD13FF38591}.Release|Any CPU.Build.0 = Release|Any CPU + {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {62D72C3E-5C57-439D-B7F7-5C55CC384A7A}.Release|Any CPU.Build.0 = Release|Any CPU + {74156CFF-C236-4DED-B810-FAD8948F51CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74156CFF-C236-4DED-B810-FAD8948F51CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74156CFF-C236-4DED-B810-FAD8948F51CA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74156CFF-C236-4DED-B810-FAD8948F51CA}.Release|Any CPU.Build.0 = Release|Any CPU + {63D08153-B43C-4884-8818-4AB42E1FEE75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63D08153-B43C-4884-8818-4AB42E1FEE75}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63D08153-B43C-4884-8818-4AB42E1FEE75}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63D08153-B43C-4884-8818-4AB42E1FEE75}.Release|Any CPU.Build.0 = Release|Any CPU + {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE}.Release|Any CPU.Build.0 = Release|Any CPU + {F7459720-873C-4741-A991-A671CF03A6AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7459720-873C-4741-A991-A671CF03A6AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7459720-873C-4741-A991-A671CF03A6AF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7459720-873C-4741-A991-A671CF03A6AF}.Release|Any CPU.Build.0 = Release|Any CPU + {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {382CAC43-EE1F-4DA3-B433-E23C3F58F44A}.Release|Any CPU.Build.0 = Release|Any CPU + {4634B421-36E6-4169-AA1A-11050902495F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4634B421-36E6-4169-AA1A-11050902495F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4634B421-36E6-4169-AA1A-11050902495F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4634B421-36E6-4169-AA1A-11050902495F}.Release|Any CPU.Build.0 = Release|Any CPU + {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB2DF96A-6ED8-4F47-948C-230EA2065C4C}.Release|Any CPU.Build.0 = Release|Any CPU + {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB80C55F-8B70-4840-942A-ED021ED88BD6}.Release|Any CPU.Build.0 = Release|Any CPU + {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26}.Release|Any CPU.Build.0 = Release|Any CPU + {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DA54E88E-C43E-4E31-92D0-08A753F2C08D}.Release|Any CPU.Build.0 = Release|Any CPU + {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A7417E7F-DB97-48DB-B849-AFC15854A6E7}.Release|Any CPU.Build.0 = Release|Any CPU + {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8DDE4291-BC57-4C56-9871-B982462F4C3D}.Release|Any CPU.Build.0 = Release|Any CPU + {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5D64A2B-7E7E-4509-9F31-425D59712E6F}.Release|Any CPU.Build.0 = Release|Any CPU + {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A52C54FB-C96D-4032-8588-AFC2CD158D23}.Release|Any CPU.Build.0 = Release|Any CPU + {B05ED61E-9A36-4E90-B876-F48559E018A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B05ED61E-9A36-4E90-B876-F48559E018A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B05ED61E-9A36-4E90-B876-F48559E018A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B05ED61E-9A36-4E90-B876-F48559E018A6}.Release|Any CPU.Build.0 = Release|Any CPU + {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7}.Release|Any CPU.Build.0 = Release|Any CPU + {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D2C789C-8241-4F53-AFEF-F2AB15BAA823}.Release|Any CPU.Build.0 = Release|Any CPU + {36AEA095-E34D-43F5-8000-9FA3A696C312}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36AEA095-E34D-43F5-8000-9FA3A696C312}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36AEA095-E34D-43F5-8000-9FA3A696C312}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36AEA095-E34D-43F5-8000-9FA3A696C312}.Release|Any CPU.Build.0 = Release|Any CPU + {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D5A9AB0-9F32-4784-8972-814F86C0239D}.Release|Any CPU.Build.0 = Release|Any CPU + {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB}.Release|Any CPU.Build.0 = Release|Any CPU + {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF15C829-9288-4D7F-95A0-4EA8DF909929}.Release|Any CPU.Build.0 = Release|Any CPU + {616652A5-A420-475C-AC9F-FC687E3C768B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {616652A5-A420-475C-AC9F-FC687E3C768B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {616652A5-A420-475C-AC9F-FC687E3C768B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {616652A5-A420-475C-AC9F-FC687E3C768B}.Release|Any CPU.Build.0 = Release|Any CPU + {D736C433-C230-46B7-9D43-17D0282EBBDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D736C433-C230-46B7-9D43-17D0282EBBDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D736C433-C230-46B7-9D43-17D0282EBBDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D736C433-C230-46B7-9D43-17D0282EBBDF}.Release|Any CPU.Build.0 = Release|Any CPU + {FA525A71-C0BF-49FB-BAB7-547944618587}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA525A71-C0BF-49FB-BAB7-547944618587}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA525A71-C0BF-49FB-BAB7-547944618587}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA525A71-C0BF-49FB-BAB7-547944618587}.Release|Any CPU.Build.0 = Release|Any CPU + {532D5703-0090-4F2E-B725-5786D53506C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {532D5703-0090-4F2E-B725-5786D53506C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {532D5703-0090-4F2E-B725-5786D53506C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {532D5703-0090-4F2E-B725-5786D53506C9}.Release|Any CPU.Build.0 = Release|Any CPU + {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF}.Release|Any CPU.Build.0 = Release|Any CPU + {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71CF0E82-FA07-472A-B32A-AC25EDA82BB0}.Release|Any CPU.Build.0 = Release|Any CPU + {77965572-373C-4319-9EF9-73D6E660044B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77965572-373C-4319-9EF9-73D6E660044B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77965572-373C-4319-9EF9-73D6E660044B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77965572-373C-4319-9EF9-73D6E660044B}.Release|Any CPU.Build.0 = Release|Any CPU + {A3924A79-1ADC-458D-8764-3958297BDEB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3924A79-1ADC-458D-8764-3958297BDEB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3924A79-1ADC-458D-8764-3958297BDEB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3924A79-1ADC-458D-8764-3958297BDEB0}.Release|Any CPU.Build.0 = Release|Any CPU + {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {38A933EB-82F1-42A6-ABF3-F55975B4078E}.Release|Any CPU.Build.0 = Release|Any CPU + {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65}.Release|Any CPU.Build.0 = Release|Any CPU + {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69}.Release|Any CPU.Build.0 = Release|Any CPU + {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {319428B9-CE7F-4027-92FA-6311C4CE95FB}.Release|Any CPU.Build.0 = Release|Any CPU + {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9AE3E97E-8846-4315-9546-FF97E97FD49F}.Release|Any CPU.Build.0 = Release|Any CPU + {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BC7A8662-4313-4F1D-B267-9B1B69444CD3}.Release|Any CPU.Build.0 = Release|Any CPU + {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4539FCDB-7192-442C-BD9B-0AC71E882F4F}.Release|Any CPU.Build.0 = Release|Any CPU + {DFDF367D-EDE1-4365-90F9-32F529117B60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFDF367D-EDE1-4365-90F9-32F529117B60}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFDF367D-EDE1-4365-90F9-32F529117B60}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFDF367D-EDE1-4365-90F9-32F529117B60}.Release|Any CPU.Build.0 = Release|Any CPU + {8D0C8993-580A-4585-BE3B-87895C76FC89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D0C8993-580A-4585-BE3B-87895C76FC89}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D0C8993-580A-4585-BE3B-87895C76FC89}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D0C8993-580A-4585-BE3B-87895C76FC89}.Release|Any CPU.Build.0 = Release|Any CPU + {AA742577-63B0-4188-AA36-AC6E0ED99BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA742577-63B0-4188-AA36-AC6E0ED99BB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA742577-63B0-4188-AA36-AC6E0ED99BB6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA742577-63B0-4188-AA36-AC6E0ED99BB6}.Release|Any CPU.Build.0 = Release|Any CPU + {5A07FFDF-F979-44F9-BE24-81D6A25BEADB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A07FFDF-F979-44F9-BE24-81D6A25BEADB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A07FFDF-F979-44F9-BE24-81D6A25BEADB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A07FFDF-F979-44F9-BE24-81D6A25BEADB}.Release|Any CPU.Build.0 = Release|Any CPU + {2B167D92-2327-4679-9096-49F274FABE0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2B167D92-2327-4679-9096-49F274FABE0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B167D92-2327-4679-9096-49F274FABE0C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2B167D92-2327-4679-9096-49F274FABE0C}.Release|Any CPU.Build.0 = Release|Any CPU + {30EEF879-CFF7-4661-89CB-9CB68328D008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30EEF879-CFF7-4661-89CB-9CB68328D008}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30EEF879-CFF7-4661-89CB-9CB68328D008}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30EEF879-CFF7-4661-89CB-9CB68328D008}.Release|Any CPU.Build.0 = Release|Any CPU + {37740138-D088-46F5-83A8-8A8180FE65D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37740138-D088-46F5-83A8-8A8180FE65D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37740138-D088-46F5-83A8-8A8180FE65D8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37740138-D088-46F5-83A8-8A8180FE65D8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {AF6AFFEE-1A76-4ABD-BEF2-0CB497A99003} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {4A8296D9-E1B1-4F5C-8CC9-870F8DDD1E20} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {14DC8B87-82B5-4A76-BBAB-BBD76F7C3555} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {4995C481-7465-4A36-8416-0D0D14F64B10} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {9DB2C5DB-7FDB-47F4-AAE9-AA9641959AA1} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {3B6F4C72-975B-44A4-9F72-A217E53E05C1} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {95909DDC-66A1-410A-9AB1-CD62EA33CFA0} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {1AFDF87C-220D-44EC-B5DA-99B0510AE561} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {7F7FB560-7005-438B-8D95-4FA781B5F1F3} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {7F831848-A1C1-49FE-B81A-499AB6E17286} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} + {9C2A3557-31E4-4D06-A08E-138E31412AD4} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} + {7DB6FFDB-0D28-4BA0-85DD-EF7A5D754EB6} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} + {8064607C-BDB9-454D-8E76-2B21023CD071} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {3E2388B0-2870-47DB-87E9-32F295E32D05} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {A3BF5605-8684-4713-885D-CC498CC37686} = {3E2388B0-2870-47DB-87E9-32F295E32D05} + {D1399D41-0273-45FA-969F-FA9C77432A06} = {3E2388B0-2870-47DB-87E9-32F295E32D05} + {E790A9A3-3C24-4478-A547-0FE13F7F6963} = {3E2388B0-2870-47DB-87E9-32F295E32D05} + {192A028F-23AD-44A2-A7B2-8397FEA30B08} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {56F007F7-23A8-4F13-B45F-57D4EB35AB2C} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} + {7C5BEBF8-EEC6-4606-A6D4-0E73246F61A8} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} + {7259B767-9528-4EF9-8F81-20344879F1CD} = {192A028F-23AD-44A2-A7B2-8397FEA30B08} + {FDE379A6-8285-4001-818A-DDEA928DE702} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {ED7E70B9-8FEE-48DF-9962-AD1062769342} = {FDE379A6-8285-4001-818A-DDEA928DE702} + {BAD28D5B-8A14-43DF-A236-E313FD97E799} = {FDE379A6-8285-4001-818A-DDEA928DE702} + {DA0B9C1E-B69A-419F-8BB3-C2E308F5A2A8} = {FDE379A6-8285-4001-818A-DDEA928DE702} + {60C97165-7CAB-467A-857E-9343B239F8EF} = {FDE379A6-8285-4001-818A-DDEA928DE702} + {C18979C7-EBD1-437D-A877-4A97B68761A5} = {FDE379A6-8285-4001-818A-DDEA928DE702} + {0AD78B12-EDC5-48E2-8FA3-309E731945EB} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {DCB63198-F2E6-4F3D-ACDE-F02F184D3C9F} = {0AD78B12-EDC5-48E2-8FA3-309E731945EB} + {D2AB9E95-A074-498A-A475-2298D0F1973E} = {0AD78B12-EDC5-48E2-8FA3-309E731945EB} + {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {DA8FB07D-1347-4E5A-B84C-8AB955A652AD} = {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} + {2D66E202-B34D-4998-BD80-5411C8087695} = {AE5FF8DB-F3B2-4529-B9CE-7CFC98E0CC8C} + {C22741F9-FC56-4AE3-B543-9F15C779D345} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {4EC45855-A09A-4B77-99A8-DA00E2D702E8} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {42439E6A-0084-48A9-9620-0B9EAB4182C4} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {F1290A8A-3BBE-4647-90D9-4AD537432AB5} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {FAF2D4A3-7A7F-4848-9817-66D164D03F0F} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {9E728961-7C0B-4C2B-92E4-8965B45ADB19} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {C186173C-7725-41A6-B5E3-F46219B03C5F} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {79C92610-5F1B-4FA0-AC7A-BE2872AF6A5A} = {C186173C-7725-41A6-B5E3-F46219B03C5F} + {45E954A6-5F29-48B3-B518-513F6837EE27} = {C186173C-7725-41A6-B5E3-F46219B03C5F} + {D3C59DAF-CEB7-4D40-BEFF-1D9AA9FEFE94} = {C186173C-7725-41A6-B5E3-F46219B03C5F} + {2DAE26C2-BB2C-49CE-B52D-D53383ADE560} = {C186173C-7725-41A6-B5E3-F46219B03C5F} + {92BC5C99-A17F-4936-BF8C-ED2AF9795D6E} = {C186173C-7725-41A6-B5E3-F46219B03C5F} + {622B90DB-1665-4822-82EF-7DDAC5629834} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {0FCB18BE-6D50-4567-8CBD-80B0336D9685} = {622B90DB-1665-4822-82EF-7DDAC5629834} + {9B4C9894-D295-4D16-AC90-F98563B37722} = {622B90DB-1665-4822-82EF-7DDAC5629834} + {E7EFE38E-1214-4D7D-A9DA-F753D613F956} = {622B90DB-1665-4822-82EF-7DDAC5629834} + {BC3E9C3B-EA51-4CC8-AD94-7F0285239907} = {622B90DB-1665-4822-82EF-7DDAC5629834} + {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} = {8F690C33-40BF-4EF8-A96A-D7FB56F163AC} + {33D6A170-D609-430C-B110-E1A8F3322C06} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {E1758B64-3ED1-4D79-AAAB-8307BFF16C0F} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {3C4B3AA1-C98D-4D88-AB73-EC4D3FC3177A} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {19CD928F-D16F-4A91-BA0C-2459F5055565} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {86993E17-8793-45ED-B636-C921BB1165D7} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {158AFAD1-39AE-4135-81EE-55F905802A8B} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {2BE2CFE9-26E7-4791-B9DE-109B465B701C} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {C326B106-8818-42FC-9A2F-C58201EE796C} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {BF943CF0-2732-41D3-BFE3-9B843564D807} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {B93528E2-55EA-4847-950D-8B95B1CC2909} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {2BD4EF1A-F6F5-4199-9BD2-4B07319852DB} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {BCF85E69-4D97-4DD3-8526-B33C76BD17CA} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {2B1B759E-670A-4837-854A-4748C67BB15B} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {9ACB83F6-C911-4473-973D-A3BECFB5F1E6} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {97064B96-B5AC-461D-BBBF-97A864F373E6} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {617EEDAE-1E4C-4B6C-836A-DDD1DB2BF2CE} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {DB4498D8-E45B-4A5A-9BF2-830039B2D38D} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {412BAB54-282E-4A01-AF72-E76F3AF31AE7} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {EFD48C85-7EA6-4553-B8A3-15A3867C8EC0} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {21EFCD3B-D0C7-42F5-B77D-3B33D440AE2E} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {7DC9FED9-CB0C-4B8C-9EB2-AF981864F57E} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {DD0EBD4F-0BE9-46A1-91E0-6B66A814664C} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {DA053CAE-EBA4-4532-93B5-3347589CB174} = {C326B106-8818-42FC-9A2F-C58201EE796C} + {8F690C33-40BF-4EF8-A96A-D7FB56F163AC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {91867618-0D86-4410-91C6-B1166A9ACDF9} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {76810110-6683-4777-9157-8030F9205FBF} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {80DDA32B-2BDA-4704-9458-6D680B08B74C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {29EDFC3B-3FC3-47AF-84D5-2F644C7ABD2B} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {FB07F20F-1BC7-4711-9357-A4B7EA0A2C51} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {ED7AADAF-72D8-4C04-96CE-B46B21C9C343} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {6518F1B5-63EA-46A2-87ED-FD90366594EC} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {AB79F7C4-9AE1-4921-B18A-F64074B1DC69} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {DCF463DE-50CA-4585-BA9F-83F7101B5ED7} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {A2E248DB-B2DD-4916-82A6-5D296C1298B5} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {293C7A2B-46D2-49B6-A8C6-294500ED5AE5} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {21691099-AF37-4706-84AE-C19C72DC09B6} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {C31A17E0-AE56-419C-A6D1-3FCBB68005E2} = {C46E03DE-FFFA-4659-97AE-77BDA46C3FCA} + {D9C65C9D-8591-46DA-A3EE-419393E607AB} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {974D842A-9739-40E4-96E8-039552E28D8B} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {7450F9AF-3C5D-4137-AEC7-2AA38E8006E6} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {F3064272-5A6F-4CB9-B79F-8D37A2392CC1} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {1DD17D3E-F8EC-44AA-8437-3AF541CD3988} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {F42FAF67-D10F-487A-A74C-E6D8EA90831C} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {81B74E08-06CD-4134-A02D-B4B837945E2B} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {78635E6D-2C35-437C-96CD-29DAEAFE0076} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {F8CBD522-6668-4A5F-B62D-9E37E7DC1279} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {33FC6389-3931-4BD2-A619-36C4A8F5C7B0} = {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} + {58A4954C-4901-4172-BEE7-5584ABB0DF45} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {D4BC55C7-1991-4866-A7BA-66653DACF945} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {91EE5D5B-B6DF-43F1-BC09-1A982719A34B} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {C6EDE646-6A5E-4495-8A30-88D1EAE9A42E} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {CF1F1193-FECE-4E98-A4FC-643A86F30429} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {46C57140-EE02-4785-9777-F2264EC88135} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {3BA4B7EC-65E1-4BCE-8533-6FB2FBA7DFCA} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {3AD66E47-B667-40D1-AE61-F5EC186241F7} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {AD3E63A3-3422-4A1A-AC89-B20786A5323E} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {CA2975D9-5477-4281-8D84-F0909F22DFF3} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {90F837CB-72DF-40B7-8DA0-6E568ECEEF0A} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {34C9609F-556B-44D7-B3DE-5637FEB0BFEC} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {A69E6742-39A6-4C0D-A098-E16A653331AC} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {6AC4C18F-2BB5-47F9-99F5-5585E1D22111} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {4D738A46-2B08-4A88-8787-668A4AD5AE5F} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {0B9E97DE-0265-4192-9FAF-B5AF65AC6611} = {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} + {C873BEE8-D4AF-48E5-8E77-24C2E5B24CC2} = {3A74FBEF-AE1F-420D-9B08-E09E03C740D5} + {96BA4536-5E1E-476D-9368-BAF6FC939D25} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {EA56194E-B0EF-42B1-BC35-9A677D7D66BB} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {56C00F97-6769-44B2-8004-341D5286E31F} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {DEF21757-F9F0-4D98-BB4B-007D8F7F6C5E} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {6C774F10-5FAC-4177-9BFA-28486747DF3D} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {91BD29B8-FD39-4429-A8FF-C5A1E511C632} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {DB29E904-C164-46B3-A12C-3A908FCA6DB9} = {96BA4536-5E1E-476D-9368-BAF6FC939D25} + {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {6F5CD33F-ACD9-4BF3-99DE-33A24116A672} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {1EA3971F-E854-4198-AC8D-BC3C4F804B25} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {A5CA092D-E294-4BF6-92AF-CCF136A643D1} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {9CDC9B6C-C69E-483F-B881-5D065FA064C9} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {A74A9B50-0E40-44AD-9360-5BF96696B405} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {A243383E-7025-4893-9611-EE75DA055301} = {E17C1E4A-9BD2-42DC-99E4-B6E104D3789A} + {936C5D74-B90F-4932-87C3-C1A0A29083B9} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {3192C227-A18D-48A1-A2E8-C414981E9C5A} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} + {86ED8028-5533-4B5D-8594-C09929F2A553} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} + {C056C11F-EC74-4720-ACEA-D4C57DC4736F} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {A09032AD-D895-4D83-8D3D-67FF3285F7A6} = {936C5D74-B90F-4932-87C3-C1A0A29083B9} + {59A3A2B8-7992-4321-A481-8C2CD08D0835} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {F9D10E1C-38DC-423D-8B79-BE4673C75B50} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {53479279-0E9C-4921-BEB1-46FDB553C8E2} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {8472D376-D2DB-40C3-AAF9-9ACDF1731919} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {1D7770AA-1669-45CE-88D9-3009C6A48AEE} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {F4ED4FC9-74D5-4379-9787-1F7756B56201} = {C056C11F-EC74-4720-ACEA-D4C57DC4736F} + {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {F87CA546-1ED2-409A-AD87-62E133BD3EF9} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} + {2BB68CBB-2220-466B-B24E-6916819DFB79} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} + {ACEFA4C4-4CA8-4358-9B75-3806DF228517} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} + {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {AF2F208F-43D6-4296-9826-677681BEC6D4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {B3F2E786-B28D-444D-9BD9-DD16CBFD38C4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {7B26E45A-99B1-47EA-9015-7DD78CAFC423} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {F826B05A-2736-4361-ADE5-04B1CF171ED4} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {CA0B06C4-BBD3-42B3-A637-5B9FD601FFBB} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {0E84E1E4-82F8-412B-94F2-E06FF1320B1D} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {C9202B23-45E9-4167-BFAC-89651AF554EB} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {16666C1F-09C1-4829-9AFC-77FB22439A59} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {152DA047-C1BF-4028-B3E7-EF7CEE01AC4E} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {1695CAAA-C8BA-4B28-B8A9-F6D8F7C7BB45} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {DAFCBF4F-8174-4934-929E-374FBDCE854D} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {CC05C0C9-A0C6-4DFC-863A-6E2778E627EA} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {1C3BCC38-D583-402F-B922-5562F19EA12C} = {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} + {00A6598E-8913-47C4-97F7-0E784EA9D55F} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {A8A8A180-C40F-43C7-B6B2-622344CE276B} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {232EF431-1366-4A4B-B2C7-C3FEDC5F5AD7} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {5960FE7B-EC00-4C8D-A522-8FFEC184694D} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {07C2CB8A-5CEB-4245-AC16-67BCB50FAB7A} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {6A79337A-879F-4A9F-8328-5578E40177B5} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {65CF5AD9-7D2A-4E31-B695-390B2D4A70D0} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {233C2407-3ED3-4322-B28D-0F93CF4C6E33} = {65CF5AD9-7D2A-4E31-B695-390B2D4A70D0} + {118D91CE-091B-4C65-8979-2F5363C56CDC} = {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} + {3EF74657-9EBC-46FD-B2CA-40959D0EE692} = {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} + {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {03EE2B05-32A4-43E1-B7F7-D2FCBD94B0DD} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {A15DA7D6-1C3A-436B-9D2D-4ABC0C2A80E2} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {A788317B-1649-4D26-AB6C-6AA5B35767DA} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {BD990314-682C-4BF1-A1B3-A0A0E37AAEB2} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {C027362E-9B72-4058-91DF-D7F0FDD162AA} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {4EFA5940-881E-4A32-BF8C-D15FF74DFB0E} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {0E0683C3-5169-4965-A886-D960811E1807} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {8011A4C4-F08C-463D-A376-F33A7F780F57} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {78767BC5-FE68-4919-BC1B-DE7FF71F294B} = {F3449D35-8671-4BF6-8D1B-EFBB8AFD61DD} + {8F29FD0D-D84C-4374-9BE1-02D7FA99E10E} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {7C714185-D3D9-4D94-B5CB-D857A0091F04} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {9697AB9A-2ACA-42E5-877E-EEF371166898} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {76A4D1FD-479A-4C57-96E0-BBFCCBADB683} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {E4C02147-34FA-43D1-B03C-00D539CF18BC} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {AABB5ABC-790E-48D1-B654-72143227FA64} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {CA5E2785-511D-4A14-8883-2544C869B2DF} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {AB897095-EA92-4AD9-829C-66FEE1878A5D} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {40A9F0DB-66AA-42A8-8670-9DD6DA992103} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {1FA05CCA-0584-4320-B278-D5AA1234BA02} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} + {7B6A98B3-90C1-49F2-8A17-C70FED500627} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} + {4F837B81-EA7D-472A-8482-3D5A730DF810} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {1F404E43-FA13-485D-B922-7D8848EBCE0F} = {4F837B81-EA7D-472A-8482-3D5A730DF810} + {2230E355-50F7-424F-929F-532B0A5DABE0} = {4F837B81-EA7D-472A-8482-3D5A730DF810} + {FBCDC571-F747-46AB-AFCB-38D191DCFFB6} = {4F837B81-EA7D-472A-8482-3D5A730DF810} + {F94E77C1-61E0-4FE8-9ECD-10A0102342E9} = {4F837B81-EA7D-472A-8482-3D5A730DF810} + {83D2F8F2-82C7-4919-9B65-D0FBF0B5324C} = {B4247B78-34BC-4A3F-91A4-661F7DCD6E10} + {FD9F5933-FDE5-4504-99BF-9050E0435C6D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {CAEF3248-527D-48B7-9C98-929AC573C381} = {FD9F5933-FDE5-4504-99BF-9050E0435C6D} + {209E7129-4B39-4768-A0D6-797F796E4FCE} = {FD9F5933-FDE5-4504-99BF-9050E0435C6D} + {D67EBE62-C541-45E4-957E-D1D11BE74F68} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {0D69B63D-F082-4D57-9FF0-355642C56993} = {DE48451F-D4CB-4C9F-B300-4CA0B8ED9E1C} + {7623D363-F0BD-400C-B8AB-3FD9699D92D9} = {0D69B63D-F082-4D57-9FF0-355642C56993} + {E2BA59EA-769B-4D5B-8032-CB9682D0D73A} = {0D69B63D-F082-4D57-9FF0-355642C56993} + {5F0926F3-463D-445B-9746-0A037DC431F9} = {42F31C68-B8B2-4BE0-9AD0-A7DFA6092629} + {21878B72-9801-41CE-88CD-7195714AE9BA} = {B4247B78-34BC-4A3F-91A4-661F7DCD6E10} + {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {99CB6AD9-92E8-4B9B-99E3-28404AA41655} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {2263600B-30CB-4188-925D-92F12F904163} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} + {2ED0ED0F-15F6-4555-BC97-F5426FCC0C0E} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} + {C1023A56-87CE-4227-8F0E-0F9DAA1E20B8} = {97C36EF3-805E-4B93-9AF6-C1E22AA583B1} + {FAD86432-6A95-47DE-8E3A-FC2101753C52} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} + {5F278E32-3A2A-4654-BD3C-B183301382FB} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} + {1DB57C74-1C40-4414-B968-937C3C1C157E} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} + {F10EB725-5A50-4C80-B8D1-88C7BE23D5A9} = {99CB6AD9-92E8-4B9B-99E3-28404AA41655} + {C4D3B4CA-6631-4447-9D89-A535305E581A} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} + {18FCB763-1EFF-47DF-ACED-98B7F994FD10} = {7F7FB560-7005-438B-8D95-4FA781B5F1F3} + {3B5EB3D6-08FD-490C-BC70-805B199A0333} = {FF0DFDF2-2E59-48B9-9C0F-CFF13EA0AD58} + {28422FE4-8D58-4D8A-8363-7A9D569A5695} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} + {B65FCDE2-8D6E-4E37-A2B3-BBE3159C1EF5} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {90C71347-89E2-4546-9A64-FE56F6A48E13} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {93B1913D-41B8-4FAB-8472-4BE03F4DC03C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {6FA91938-03AB-41B0-9A80-14AE550D745E} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {838A6EB6-BCD4-498E-A729-6875F4A6EDF1} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {EA9F69A2-ACCF-477B-9519-257CF47DC0F4} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {7DEB35A1-09AC-4183-A5BE-8DE1CBFFC075} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {78DDE8A1-6501-4213-9BB5-CE6A11341F7D} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {3DFAECE7-496B-4E86-A23F-5F9A597D1119} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} + {3690518A-D6C3-42CC-AEC2-6D48C6987F68} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} + {0D34162C-0CE3-4D7B-B19A-4786C616D0B3} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD} + {FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103} + {6026DAE3-F2AD-4F6B-99EF-EEAAA5873861} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {E957DB2E-589D-4310-9576-92F108A67CE7} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {C4690A20-8628-4A39-8E71-2D09800D0E72} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {8233A44F-4DFC-4701-9C04-834FD3C97060} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {66A6E78D-E547-4DD7-9844-087FAB3D03C2} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {A99F5406-37DC-4677-9166-9BDE90C26CA6} = {D9C65C9D-8591-46DA-A3EE-419393E607AB} + {8FA3ED81-19AB-4E0C-B36A-DF49131A2AB3} = {0DF5AD76-AEEA-4052-A6CA-A44C24879F11} + {7C1A8FF7-9FD1-41FC-856D-7A2DC6F7CE6F} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {986B92F6-A758-4D1F-8BC7-BFD13FF38591} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {62D72C3E-5C57-439D-B7F7-5C55CC384A7A} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {74156CFF-C236-4DED-B810-FAD8948F51CA} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {63D08153-B43C-4884-8818-4AB42E1FEE75} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {AF02868C-283E-4CB2-8866-3B0CAD1BB2DE} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {F7459720-873C-4741-A991-A671CF03A6AF} = {A3B6DFC3-5D27-496E-9AD6-C1035213F1DC} + {382CAC43-EE1F-4DA3-B433-E23C3F58F44A} = {7C714185-D3D9-4D94-B5CB-D857A0091F04} + {4634B421-36E6-4169-AA1A-11050902495F} = {D94D6AFE-20BD-4F21-8708-03F5E34F49FC} + {BB2DF96A-6ED8-4F47-948C-230EA2065C4C} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {DB80C55F-8B70-4840-942A-ED021ED88BD6} = {91867618-0D86-4410-91C6-B1166A9ACDF9} + {E3C07A77-EAF9-4A3F-8814-7D2F116C8E26} = {ECE6E6D7-A4F6-4F50-BC21-AE2EB14A3129} + {DA54E88E-C43E-4E31-92D0-08A753F2C08D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {A7417E7F-DB97-48DB-B849-AFC15854A6E7} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} + {8DDE4291-BC57-4C56-9871-B982462F4C3D} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} + {C5D64A2B-7E7E-4509-9F31-425D59712E6F} = {37E2CAFE-0024-452E-BF81-E15F937E08EF} + {07C2FB08-985C-42FE-85AF-38E40A301668} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {A52C54FB-C96D-4032-8588-AFC2CD158D23} = {07C2FB08-985C-42FE-85AF-38E40A301668} + {B05ED61E-9A36-4E90-B876-F48559E018A6} = {07C2FB08-985C-42FE-85AF-38E40A301668} + {1E8DE890-F27F-4A1A-B356-0B6B9D3B1EF7} = {07C2FB08-985C-42FE-85AF-38E40A301668} + {4FCD7337-4320-412D-9BC8-A0B243BC27B3} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {9D2C789C-8241-4F53-AFEF-F2AB15BAA823} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {36AEA095-E34D-43F5-8000-9FA3A696C312} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {2D5A9AB0-9F32-4784-8972-814F86C0239D} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {A4ECDDC4-1115-48A2-AC74-3B75B58F8FFB} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {AF15C829-9288-4D7F-95A0-4EA8DF909929} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {616652A5-A420-475C-AC9F-FC687E3C768B} = {4FCD7337-4320-412D-9BC8-A0B243BC27B3} + {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} = {0B58AA48-665A-443F-A6A8-751FB9629DAF} + {D736C433-C230-46B7-9D43-17D0282EBBDF} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {FA525A71-C0BF-49FB-BAB7-547944618587} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {532D5703-0090-4F2E-B725-5786D53506C9} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {E538580B-A21F-4B3B-9CB4-741FE8C1C6EF} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {71CF0E82-FA07-472A-B32A-AC25EDA82BB0} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {77965572-373C-4319-9EF9-73D6E660044B} = {E29EC2A4-A2DE-442F-8616-DAFD69F128B8} + {4A2CF141-F32D-45A0-8665-B3705667A6D2} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {A3924A79-1ADC-458D-8764-3958297BDEB0} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} + {38A933EB-82F1-42A6-ABF3-F55975B4078E} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} + {03C9FFB2-E9A3-4CCC-A6B1-8B248BFBCB65} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} + {CBC64BD6-297B-48F6-A3BA-0DBB4B0F5A69} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} + {319428B9-CE7F-4027-92FA-6311C4CE95FB} = {4A2CF141-F32D-45A0-8665-B3705667A6D2} + {9AE3E97E-8846-4315-9546-FF97E97FD49F} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {BC7A8662-4313-4F1D-B267-9B1B69444CD3} = {3AD66E47-B667-40D1-AE61-F5EC186241F7} + {7C35101B-EA29-4B3D-B424-FAD625977E4D} = {99B7CBDE-A251-4738-97F0-DB1DB484BEE1} + {4539FCDB-7192-442C-BD9B-0AC71E882F4F} = {7C35101B-EA29-4B3D-B424-FAD625977E4D} + {DFDF367D-EDE1-4365-90F9-32F529117B60} = {C22741F9-FC56-4AE3-B543-9F15C779D345} + {8D0C8993-580A-4585-BE3B-87895C76FC89} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {AA742577-63B0-4188-AA36-AC6E0ED99BB6} = {07DFEB1E-ED92-4E97-A801-FAB2D70F4F35} + {5A07FFDF-F979-44F9-BE24-81D6A25BEADB} = {0D69B63D-F082-4D57-9FF0-355642C56993} + {2B167D92-2327-4679-9096-49F274FABE0C} = {0D69B63D-F082-4D57-9FF0-355642C56993} + {30EEF879-CFF7-4661-89CB-9CB68328D008} = {0D69B63D-F082-4D57-9FF0-355642C56993} + {37740138-D088-46F5-83A8-8A8180FE65D8} = {B4247B78-34BC-4A3F-91A4-661F7DCD6E10} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {711A43C0-A2F8-4E5C-9B9F-F2551E4B3FF1} + EndGlobalSection +EndGlobal diff --git a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/CreateCommand.cs b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/CreateCommand.cs index 6fc58163f..506b462b8 100644 --- a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/CreateCommand.cs +++ b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/CreateCommand.cs @@ -196,7 +196,7 @@ public string GetUsageInfo() sb.AppendLine("Options:"); sb.AppendLine(""); sb.AppendLine("-pk|--package (default: app)"); - sb.AppendLine("-t|--template (default: lam)"); + sb.AppendLine("-t|--template (default: lam), optional:lam、laa"); sb.AppendLine("-d|--database-provider (if supported by the template)"); sb.AppendLine("-o|--output-folder (default: current folder)"); sb.AppendLine("-v|--version (default: latest version)"); diff --git a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/LocalFileCreateProjectService.cs b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/LocalFileCreateProjectService.cs index 49d3eeb0b..facacbf37 100644 --- a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/LocalFileCreateProjectService.cs +++ b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/Commands/LocalFileCreateProjectService.cs @@ -87,7 +87,7 @@ await TryReplacePackageAndCompanyNameWithProjectFile( projectFiles, createArgs.PackageName, createArgs.SolutionName.CompanyName, - createArgs.DatabaseManagementSystem); + dbm); Logger.LogInformation("Rewrite appsettings.json."); await TryReplaceAppSettingsWithProjectFile( @@ -96,6 +96,13 @@ await TryReplaceAppSettingsWithProjectFile( createArgs.SolutionName.CompanyName, createArgs.SolutionName.ProjectName, createArgs.ConnectionString); + + // Logger.LogInformation("Rewrite scripts."); + // await TryReplaceScriptProjectFile( + // projectFiles, + // createArgs.PackageName, + // createArgs.SolutionName.CompanyName, + // dbm); Logger.LogInformation("Rewrite application url."); await TryReplaceApplicationUrlWithProjectFile( @@ -112,7 +119,8 @@ await TryReplaceVersionWithProjectFile( await TryReplacePackageAndCompanyNameWithProjectFolder( projectFiles, createArgs.PackageName, - createArgs.SolutionName.CompanyName); + createArgs.SolutionName.CompanyName, + dbm); Logger.LogInformation($"'{createArgs.SolutionName.ProjectName}' has been successfully created to '{createArgs.OutputFolder}'"); } @@ -203,32 +211,53 @@ protected async virtual Task TryReplaceAppSettingsWithProjectFile( await ReplaceFileTextAsync(projectFile, defaultConnectionString, connectionString); } } + + // + // protected async virtual Task TryReplaceScriptProjectFile( + // List projectFiles, + // string packageName, + // string companyName, + // string dbm = "MySQL") + // { + // var canReplaceFiles = projectFiles.Where(f => !f.IsFolder && f.Name.EndsWith(".bat", StringComparison.OrdinalIgnoreCase) || + // f.Name.EndsWith(".sh", StringComparison.OrdinalIgnoreCase) || + // f.Name.EndsWith(".ps1", StringComparison.OrdinalIgnoreCase)); + // foreach (var projectFile in canReplaceFiles) + // { + // await ReplaceFileTextAsync(projectFile, "PackageName", packageName); + // await ReplaceFileTextAsync(projectFile, "CompanyName", companyName); + // + // await ReplaceFileTextAsync(projectFile, "DatabaseManagementName", dbm); + // } + // } protected async virtual Task TryReplacePackageAndCompanyNameWithProjectFile( List projectFiles, string packageName, string companyName, - DatabaseManagementSystem database = DatabaseManagementSystem.NotSpecified) + string dbm = "MySQL") { var canReplaceFiles = projectFiles.Where(f => !f.IsFolder && !f.Name.Contains("appsettings")); foreach (var projectFile in canReplaceFiles) { await ReplaceFileTextAsync(projectFile, "PackageName", packageName); await ReplaceFileTextAsync(projectFile, "CompanyName", companyName); + await ReplaceFileTextAsync(projectFile, "DatabaseManagementName", dbm); } } protected virtual Task TryReplacePackageAndCompanyNameWithProjectFolder( List projectFiles, string packageName, - string companyName) + string companyName, + string dbm = "MySQL") { var canReplaceFiles = projectFiles .OrderByDescending(f => f.Depth) .OrderByDescending(f => !f.IsFolder); foreach (var projectFile in canReplaceFiles) { - var replaceFileName = projectFile.Name.Replace("PackageName", packageName).Replace("CompanyName", companyName); + var replaceFileName = projectFile.Name.Replace("PackageName", packageName).Replace("CompanyName", companyName).Replace("DatabaseManagementName", dbm); if (File.Exists(projectFile.Name)) { @@ -238,7 +267,7 @@ protected virtual Task TryReplacePackageAndCompanyNameWithProjectFolder( } var canReplacePaths = projectFiles - .Where(projectFile => projectFile.Name.Contains("PackageName") || projectFile.Name.Contains("CompanyName")) + .Where(projectFile => projectFile.Name.Contains("PackageName") || projectFile.Name.Contains("CompanyName") || projectFile.Name.Contains("DatabaseManagementName")) .OrderByDescending(f => f.Depth) .OrderByDescending(f => f.IsFolder); foreach (var projectFile in canReplacePaths) diff --git a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json index a9b8b5fd2..a10980f84 100644 --- a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json +++ b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json @@ -3,7 +3,8 @@ "LINGYUN.Abp.Cli": { "commandName": "Project", //"commandLineArgs": "generate-view -t vben-view -m auditing -o D:\\Projects\\Development\\view-script -url http://127.0.0.1:30000/" - "commandLineArgs": "generate-proxy -t flutter -asp rest-service -u http://127.0.0.1:30000 -m notifications -o D:\\Projects\\Development\\flutter-script -skip-cli-version-check" +// "commandLineArgs": "generate-proxy -t flutter -asp rest-service -u http://127.0.0.1:30000 -m notifications -o D:\\Projects\\Development\\flutter-script -skip-cli-version-check" + "commandLineArgs": "create MyCompanyName.MyProjectName -t lam -pk MyPackageName -o /Users/feijie/Projects/Tests --dbms MySql --cs \"Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None\" --no-random-port" } } } \ No newline at end of file diff --git a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/README.zh-Hans.md b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/README.zh-Hans.md index 61b716992..0bff40e8a 100644 --- a/aspnet-core/framework/cli/LINGYUN.Abp.Cli/README.zh-Hans.md +++ b/aspnet-core/framework/cli/LINGYUN.Abp.Cli/README.zh-Hans.md @@ -8,6 +8,13 @@ dotnet tool install --global LINGYUN.Abp.Cli ``` +打包项目为LINGYUN.Abp.Cli.8.3.0.nupkg + +```shell +dotnet pack -o ./nupkg +dotnet tool install -g LINGYUN.Abp.Cli --version 8.3.0 --add-source ./nupkg +``` + ## 使用方法 ```shell diff --git a/aspnet-core/framework/cloud-aliyun/README.md b/aspnet-core/framework/cloud-aliyun/README.md new file mode 100644 index 000000000..bd5216537 --- /dev/null +++ b/aspnet-core/framework/cloud-aliyun/README.md @@ -0,0 +1,33 @@ +# LINGYUN.Abp.Aliyun 模块概述 + +## 简介 +LINGYUN.Abp.Aliyun 模块集成了阿里云的 SDK,提供了对阿里云服务的全面支持,包括认证、短信服务和对象存储等功能。 + +## 包含的项目列表 +- **LINGYUN.Abp.Aliyun** +- **LINGYUN.Abp.Aliyun.Features** +- **LINGYUN.Abp.Aliyun.SettingManagement** + +## 每个项目的主要功能概述 + +### LINGYUN.Abp.Aliyun +- 提供阿里云服务的基础 SDK 集成。 +- 支持阿里云 RAM 认证和 STS Token 访问。 +- 支持短信服务和对象存储。 +- 提供分布式缓存支持。 + +### LINGYUN.Abp.Aliyun.Features +- 提供阿里云服务的功能定义和管理。 +- 支持启用/禁用阿里云服务功能。 +- 与 ABP 功能管理系统集成。 + +### LINGYUN.Abp.Aliyun.SettingManagement +- 提供阿里云服务配置的查询接口。 +- 通过 API 接口获取阿里云配置信息。 +- 与 ABP 设置管理系统集成。 + +## 模块的整体用途和重要性 +该模块为开发者提供了与阿里云服务的无缝集成,简化了云服务的使用和管理,提升了应用程序的灵活性和可扩展性。 + +## 如何使用或集成该模块 +在项目中引用相应的模块,并根据需要配置阿里云的相关参数。确保与 ABP 框架的其他模块配合使用,以实现最佳效果。 diff --git a/aspnet-core/framework/cloud-tencent/README.md b/aspnet-core/framework/cloud-tencent/README.md new file mode 100644 index 000000000..10b839f4b --- /dev/null +++ b/aspnet-core/framework/cloud-tencent/README.md @@ -0,0 +1,42 @@ +# LINGYUN.Abp.Tencent 模块概述 + +## 简介 +LINGYUN.Abp.Tencent 模块集成了腾讯云的各项服务,提供了对腾讯云服务的全面支持,包括对象存储、短信服务、QQ 互联和语音合成等功能。 + +## 包含的项目列表 +- **LINGYUN.Abp.Tencent** +- **LINGYUN.Abp.BlobStoring.Tencent** +- **LINGYUN.Abp.Sms.Tencent** +- **LINGYUN.Abp.Tencent.QQ** +- **LINGYUN.Abp.Tencent.SettingManagement** +- **LINGYUN.Abp.Tencent.TTS** + +## 每个项目的主要功能概述 + +### LINGYUN.Abp.Tencent +- 提供腾讯云 SDK 客户端工厂,支持动态创建腾讯云各项服务的客户端。 +- 支持多租户配置和多语言本地化。 +- 提供统一的腾讯云服务配置管理。 + +### LINGYUN.Abp.BlobStoring.Tencent +- 支持腾讯云对象存储服务,自动创建存储桶。 +- 支持多区域配置和文件大小限制。 + +### LINGYUN.Abp.Sms.Tencent +- 支持腾讯云短信服务的发送功能,支持多手机号批量发送。 +- 内置错误处理和日志记录。 + +### LINGYUN.Abp.Tencent.QQ +- 支持 QQ 互联快速登录,支持多租户配置。 + +### LINGYUN.Abp.Tencent.SettingManagement +- 提供腾讯云服务的配置管理界面,支持全局和租户级别的配置管理。 + +### LINGYUN.Abp.Tencent.TTS +- 支持腾讯云语音合成服务,提供 TTS 客户端工厂。 + +## 模块的整体用途和重要性 +该模块为开发者提供了与腾讯云服务的无缝集成,简化了云服务的使用和管理,提升了应用程序的灵活性和可扩展性。 + +## 如何使用或集成该模块 +在项目中引用相应的模块,并根据需要配置腾讯云的相关参数。确保与 ABP 框架的其他模块配合使用,以实现最佳效果。 diff --git a/aspnet-core/framework/common/README.md b/aspnet-core/framework/common/README.md new file mode 100644 index 000000000..bbb1c7e35 --- /dev/null +++ b/aspnet-core/framework/common/README.md @@ -0,0 +1,59 @@ +# common 模块概述 + +## 模块简介 +`common`模块是ABP框架的基础模块,提供了一系列通用功能和服务,旨在支持各种应用程序的开发和扩展。该模块包含多个子模块,每个子模块实现了特定的功能,帮助开发者快速构建高效的应用程序。 + +## 包含的项目列表 +1. **LINGYUN.Abp.Aliyun.Authorization** + - 提供阿里云基础认证功能,支持AppKeyId和AccessKeySecret的配置。 + +2. **LINGYUN.Abp.AspNetCore.HttpOverrides** + - 实现HTTP传输标头的重写,支持获取反向代理中的真实客户地址。 + +3. **LINGYUN.Abp.AspNetCore.Mvc.Client** + - 提供可配置的用户配置缓存时间,支持多租户接口。 + +4. **LINGYUN.Abp.BackgroundJobs.Hangfire** + - 基于Hangfire实现的后台作业模块,支持即时、延迟和周期性任务。 + +5. **LINGYUN.Abp.ExceptionHandling** + - 提供统一的异常处理和通知机制,支持自定义异常处理程序。 + +6. **LINGYUN.Abp.Location** + - 提供地理编码、反向地理编码和IP地理位置解析功能。 + +7. **LINGYUN.Abp.IdGenerator** + - 实现分布式唯一ID生成器,支持雪花算法。 + +8. **LINGYUN.Abp.Wrapper** + - 统一包装API返回结果和异常处理。 + +## 每个项目的主要功能概述 +- **阿里云认证模块**: 提供阿里云的认证功能,简化了对阿里云服务的访问。 +- **HTTP重写模块**: 处理HTTP请求中的标头,确保获取真实的客户端地址。 +- **MVC客户端模块**: 提供用户配置缓存,支持多租户架构。 +- **后台作业模块**: 支持任务的调度和执行,确保后台任务的可靠性。 +- **异常处理模块**: 处理应用中的异常,提供统一的通知机制。 +- **位置服务模块**: 提供地理位置相关的功能,支持地址与坐标之间的转换。 +- **ID生成模块**: 生成分布式唯一ID,确保在高并发环境下的唯一性。 +- **包装器模块**: 统一处理API的返回结果和异常,提升API的可用性。 + +## 模块的整体用途和重要性 +`common`模块为ABP框架提供了基础设施,支持开发者在构建应用时快速集成常用功能,减少重复工作,提高开发效率。通过这些模块,开发者能够更专注于业务逻辑的实现,而无需担心底层的实现细节。 + +## 如何使用或集成该模块的简要说明 +在项目中使用`common`模块时,只需在模块类中添加相应的依赖项,并在`ConfigureServices`方法中进行必要的配置。例如: + +```csharp +[DependsOn(typeof(LINGYUN.Abp.Aliyun.Authorization))] +public class YourProjectModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + // 配置服务 + } +} +``` + +## 提示 +本项目中的README是由AI模型分析代码逻辑后自动生成的,如有误,请提issues或PR。 diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/LY.MicroService.Applications.Single.DbMigrator.csproj b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/LY.MicroService.Applications.Single.DbMigrator.csproj index 9eb63519f..438ad81cf 100644 --- a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/LY.MicroService.Applications.Single.DbMigrator.csproj +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/LY.MicroService.Applications.Single.DbMigrator.csproj @@ -35,6 +35,10 @@ PreserveNewest + + + PreserveNewest + @@ -46,6 +50,7 @@ + diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/SingleDbMigratorModule.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/SingleDbMigratorModule.cs index 4bce3b4fd..c42eeea3f 100644 --- a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/SingleDbMigratorModule.cs +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/SingleDbMigratorModule.cs @@ -1,7 +1,7 @@ using LINGYUN.Abp.UI.Navigation.VueVbenAdmin; using Microsoft.Extensions.DependencyInjection; using LY.MicroService.Applications.Single.EntityFrameworkCore.PostgreSql; -// using LY.MicroService.Applications.Single.EntityFrameworkCore.MySql; +using LY.MicroService.Applications.Single.EntityFrameworkCore.MySql; using Volo.Abp.Autofac; using Volo.Abp.Modularity; @@ -9,8 +9,8 @@ namespace LY.MicroService.Applications.Single.DbMigrator; [DependsOn( typeof(AbpUINavigationVueVbenAdminModule), - typeof(SingleMigrationsEntityFrameworkCorePostgreSqlModule), - // typeof(SingleMigrationsEntityFrameworkCoreMySqlModule), + // typeof(SingleMigrationsEntityFrameworkCorePostgreSqlModule), + typeof(SingleMigrationsEntityFrameworkCoreMySqlModule), typeof(AbpAutofacModule) )] public partial class SingleDbMigratorModule : AbpModule diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.SqlServer.json b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.SqlServer.json new file mode 100644 index 000000000..555dab9fb --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.SqlServer.json @@ -0,0 +1,228 @@ +{ + "App": { + "ShowPii": true, + "SelfUrl": "http://127.0.0.1:30001/", + "CorsOrigins": "http://127.0.0.1:3100,http://127.0.0.1:30001", + "Urls": { + "Applications": { + "MVC": { + "RootUrl": "http://127.0.0.1:30001/", + "Urls": { + "Abp.Account.EmailConfirm": "Account/EmailConfirm", + "Abp.Account.EmailVerifyLogin": "Account/VerifyCode" + } + }, + "STS": { + "RootUrl": "http://127.0.0.1:30001/" + }, + "VueVbenAdmin": { + "RootUrl": "http://127.0.0.1:3100", + "Urls": { + "Abp.Account.EmailConfirm": "account/email-confirm" + } + } + } + } + }, + "Auditing": { + "AllEntitiesSelector": true + }, + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=sa;Password=yourStrong(!)Password;TrustServerCertificate=True" + }, + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=14" + } + }, + "Elsa": { + "Features": { + "DefaultPersistence": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "SqlServer": { + "Enabled": true + } + } + }, + "Console": true, + "Http": true, + "Email": true, + "TemporalQuartz": true, + "JavaScriptActivities": true, + "UserTask": true, + "Conductor": true, + "Telnyx": true, + "BlobStoring": true, + "Emailing": true, + "Notification": true, + "Sms": true, + "IM": true, + "PublishWebhook": true, + "Webhooks": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "SqlServer": { + "Enabled": true + } + } + }, + "WorkflowSettings": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "SqlServer": { + "Enabled": true + } + } + } + }, + "Server": { + "BaseUrl": "http://127.0.0.1:30000" + } + }, + "Quartz": { + "UsePersistentStore": false, + "Properties": { + "quartz.jobStore.dataSource": "tkm", + "quartz.jobStore.type": "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz", + "quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz", + "quartz.dataSource.tkm.connectionString": "Server=127.0.0.1;Database=Platform-V70;User Id=sa;Password=yourStrong(!)Password;", + "quartz.dataSource.tkm.provider": "SqlServer", + "quartz.jobStore.clustered": "true", + "quartz.serializer.type": "json", + "quartz.dataSource.tkm.connectionStringName": "TaskManagement" + } + }, + "Redis": { + "IsEnabled": true, + "Configuration": "127.0.0.1,defaultDatabase=15", + "InstanceName": "LINGYUN.Abp.Application" + }, + "AuthServer": { + "UseOpenIddict": true, + "Authority": "http://127.0.0.1:30001/", + "ApiName": "lingyun-abp-application", + "SwaggerClientId": "InternalServiceClient", + "SwaggerClientSecret": "1q2w3E*" + }, + "IdentityServer": { + "Clients": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + } + }, + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + }, + "Lifetime": { + "AuthorizationCode": "00:05:00", + "AccessToken": "14:00:00", + "DeviceCode": "00:10:00", + "IdentityToken": "00:20:00", + "RefreshToken": "14:00:00", + "RefreshTokenReuseLeeway": "00:00:30", + "UserCode": "00:10:00" + } + }, + "Identity": { + "Password": { + "RequiredLength": 6, + "RequiredUniqueChars": 0, + "RequireNonAlphanumeric": false, + "RequireLowercase": false, + "RequireUppercase": false, + "RequireDigit": false + }, + "Lockout": { + "AllowedForNewUsers": false, + "LockoutDuration": 5, + "MaxFailedAccessAttempts": 5 + }, + "SignIn": { + "RequireConfirmedEmail": false, + "RequireConfirmedPhoneNumber": false + } + }, + "FeatureManagement": { + "IsDynamicStoreEnabled": true + }, + "SettingManagement": { + "IsDynamicStoreEnabled": true + }, + "PermissionManagement": { + "IsDynamicStoreEnabled": true + }, + "TextTemplating": { + "IsDynamicStoreEnabled": true + }, + "WebhooksManagement": { + "IsDynamicStoreEnabled": true + }, + "Logging": { + "Serilog": { + "Elasticsearch": { + "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" + } + } + }, + "AuditLogging": { + "Elasticsearch": { + "IndexPrefix": "abp.dev.auditing" + } + }, + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Debug", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Debug" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "Elasticsearch", + "Args": { + "nodeUris": "http://127.0.0.1:9200", + "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", + "autoRegisterTemplate": true, + "autoRegisterTemplateVersion": "ESv7" + } + } + ] + } +} diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json index 2b17de592..4a3dae71a 100644 --- a/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json @@ -3,7 +3,8 @@ "Kind": "Local" }, "ConnectionStrings": { - "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" + "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None"//MySql +// "Default": "Host=127.0.0.1;Database=Platform-V70;Username=postgres;Password=123456;SslMode=Prefer"//PostgreSql }, "StringEncryption": { "DefaultPassPhrase": "s46c5q55nxpeS8Ra", diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.Designer.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.Designer.cs new file mode 100644 index 000000000..f61908182 --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.Designer.cs @@ -0,0 +1,5828 @@ +// +using System; +using LY.MicroService.Applications.Single.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; + +#nullable disable + +namespace LY.MicroService.Applications.Single.EntityFrameworkCore.MySql.Migrations +{ + [DbContext(typeof(SingleMigrationsDbContext))] + [Migration("20241218145610_AddNewMigration_20241218_225542")] + partial class AddNewMigration_20241218_225542 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql) + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityPropertyInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("TypeFullName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("TypeFullName"); + + b.Property("TypeInfoId") + .HasColumnType("char(36)"); + + b.Property("ValueRange") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("ValueRange"); + + b.HasKey("Id"); + + b.HasIndex("TypeInfoId", "TypeFullName"); + + b.ToTable("AbpAuthEntityProperties", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsAuditEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("TypeFullName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("TypeFullName"); + + b.HasKey("Id"); + + b.HasIndex("TypeFullName"); + + b.ToTable("AbpAuthEntitites", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.OrganizationUnitEntityRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowProperties") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("AllowProperties"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("EntityTypeFullName") + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FilterGroup") + .HasColumnType("longtext") + .HasColumnName("FilterGroup"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Operation") + .HasColumnType("int"); + + b.Property("OrgCode") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("OrgCode"); + + b.Property("OrgId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.ToTable("AbpAuthOrganizationUnitEntityRules", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.RoleEntityRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowProperties") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("AllowProperties"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("EntityTypeFullName") + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FilterGroup") + .HasColumnType("longtext") + .HasColumnName("FilterGroup"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Operation") + .HasColumnType("int"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("RoleName"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.ToTable("AbpAuthRoleEntityRules", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Demo.Authors.Author", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("BirthDate") + .HasColumnType("datetime(6)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ShortBio") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("Demo_Authors", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Demo.Books.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuthorId") + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("PublishDate") + .HasColumnType("datetime(6)"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AuthorId"); + + b.ToTable("Demo_Books", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.LocalizationManagement.Language", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("varchar(20)") + .HasColumnName("CultureName"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("DisplayName"); + + b.Property("Enable") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("TwoLetterISOLanguageName") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("TwoLetterISOLanguageName"); + + b.Property("UiCultureName") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("varchar(20)") + .HasColumnName("UiCultureName"); + + b.HasKey("Id"); + + b.HasIndex("CultureName"); + + b.ToTable("AbpLocalizationLanguages", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.LocalizationManagement.Resource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DefaultCultureName") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("DefaultCultureName"); + + b.Property("Description") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Description"); + + b.Property("DisplayName") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("DisplayName"); + + b.Property("Enable") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("Name"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AbpLocalizationResources", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.LocalizationManagement.Text", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CultureName") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("varchar(20)") + .HasColumnName("CultureName"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("Key"); + + b.Property("ResourceName") + .HasColumnType("longtext"); + + b.Property("Value") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)") + .HasColumnName("Value"); + + b.HasKey("Id"); + + b.HasIndex("Key"); + + b.ToTable("AbpLocalizationTexts", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatCard", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("int"); + + b.Property("AvatarUrl") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("Birthday") + .HasColumnType("datetime(6)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Description") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LastOnlineTime") + .HasColumnType("datetime(6)"); + + b.Property("NickName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("Sex") + .HasColumnType("int"); + + b.Property("Sign") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("State") + .HasColumnType("int"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AppUserChatCards", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatFriend", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Black") + .HasColumnType("tinyint(1)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Description") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("DontDisturb") + .HasColumnType("tinyint(1)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FrientId") + .HasColumnType("char(36)"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)"); + + b.Property("RemarkName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("SpecialFocus") + .HasColumnType("tinyint(1)"); + + b.Property("Status") + .HasColumnType("tinyint unsigned"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId", "FrientId"); + + b.ToTable("AppUserChatFriends", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatSetting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("AllowAddFriend") + .HasColumnType("tinyint(1)"); + + b.Property("AllowAnonymous") + .HasColumnType("tinyint(1)"); + + b.Property("AllowReceiveMessage") + .HasColumnType("tinyint(1)"); + + b.Property("AllowSendMessage") + .HasColumnType("tinyint(1)"); + + b.Property("RequireAddFriendValition") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AppUserChatSettings", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("MessageId") + .HasColumnType("bigint"); + + b.Property("ReceiveUserId") + .HasColumnType("char(36)"); + + b.Property("SendUserName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Source") + .HasColumnType("int"); + + b.Property("State") + .HasColumnType("tinyint"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ReceiveUserId"); + + b.ToTable("AppUserMessages", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.ChatGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Address") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("AdminUserId") + .HasColumnType("char(36)"); + + b.Property("AllowAnonymous") + .HasColumnType("tinyint(1)"); + + b.Property("AllowSendMessage") + .HasColumnType("tinyint(1)"); + + b.Property("AvatarUrl") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Description") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("MaxUserCount") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("varchar(20)"); + + b.Property("Notice") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Tag") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name"); + + b.ToTable("AppChatGroups", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupChatBlack", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("ShieldUserId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "GroupId"); + + b.ToTable("AppGroupChatBlacks", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasMaxLength(1048576) + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("MessageId") + .HasColumnType("bigint"); + + b.Property("SendUserName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Source") + .HasColumnType("int"); + + b.Property("State") + .HasColumnType("tinyint"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "GroupId"); + + b.ToTable("AppGroupMessages", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserChatGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("GroupId") + .HasColumnType("bigint"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "GroupId", "UserId"); + + b.ToTable("AppUserChatGroups", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserGroupCard", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("NickName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("SilenceEnd") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AppUserGroupCards", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Notifications.Notification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("ContentType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("ExpirationTime") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("NotificationId") + .HasColumnType("bigint"); + + b.Property("NotificationName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("NotificationTypeName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("Severity") + .HasColumnType("tinyint"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "NotificationName"); + + b.ToTable("AppNotifications", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Notifications.NotificationDefinitionGroupRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowSubscriptionToClients") + .HasColumnType("tinyint(1)"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("DisplayName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.HasKey("Id"); + + b.ToTable("AppNotificationDefinitionGroups", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Notifications.NotificationDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowSubscriptionToClients") + .HasColumnType("tinyint(1)"); + + b.Property("ContentType") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("DisplayName") + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("NotificationLifetime") + .HasColumnType("int"); + + b.Property("NotificationType") + .HasColumnType("int"); + + b.Property("Providers") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Template") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.ToTable("AppNotificationDefinitions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Notifications.UserNotification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("NotificationId") + .HasColumnType("bigint"); + + b.Property("ReadStatus") + .HasColumnType("int"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId", "NotificationId") + .HasDatabaseName("IX_Tenant_User_Notification_Id"); + + b.ToTable("AppUserNotifications", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Notifications.UserSubscribe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("NotificationName") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") + .IsRequired() + .ValueGeneratedOnAdd() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasDefaultValue("/"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "UserId", "NotificationName") + .IsUnique() + .HasDatabaseName("IX_Tenant_User_Notification_Name"); + + b.ToTable("AppUserSubscribes", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Editions.Edition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName"); + + b.ToTable("AbpEditions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisableTime") + .HasColumnType("datetime(6)"); + + b.Property("EditionId") + .HasColumnType("char(36)"); + + b.Property("EnableTime") + .HasColumnType("datetime(6)"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("NormalizedName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.HasKey("Id"); + + b.HasIndex("EditionId"); + + b.HasIndex("Name"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpTenants", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b => + { + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("JobId") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("JobId"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Name"); + + b.Property("Paramters") + .HasColumnType("longtext") + .HasColumnName("Paramters"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("TK_BackgroundJobActions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobInfo", b => + { + b.Property("Id") + .HasColumnType("varchar(255)"); + + b.Property("Args") + .HasColumnType("longtext") + .HasColumnName("Args"); + + b.Property("BeginTime") + .HasColumnType("datetime(6)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Cron") + .HasMaxLength(50) + .HasColumnType("varchar(50)") + .HasColumnName("Cron"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Description"); + + b.Property("EndTime") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Group") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Group"); + + b.Property("Interval") + .HasColumnType("int"); + + b.Property("IsAbandoned") + .HasColumnType("tinyint(1)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("JobType") + .HasColumnType("int"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LastRunTime") + .HasColumnType("datetime(6)"); + + b.Property("LockTimeOut") + .HasColumnType("int"); + + b.Property("MaxCount") + .HasColumnType("int"); + + b.Property("MaxTryCount") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Name"); + + b.Property("NextRunTime") + .HasColumnType("datetime(6)"); + + b.Property("NodeName") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("NodeName"); + + b.Property("Priority") + .HasColumnType("int"); + + b.Property("Result") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)") + .HasColumnName("Result"); + + b.Property("Source") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("TriggerCount") + .HasColumnType("int"); + + b.Property("TryCount") + .HasColumnType("int"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("varchar(1000)") + .HasColumnName("Type"); + + b.HasKey("Id"); + + b.HasIndex("Name", "Group"); + + b.ToTable("TK_BackgroundJobs", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Exception") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)") + .HasColumnName("Exception"); + + b.Property("JobGroup") + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("JobGroup"); + + b.Property("JobId") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("JobId"); + + b.Property("JobName") + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("JobName"); + + b.Property("JobType") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)") + .HasColumnName("JobType"); + + b.Property("Message") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)") + .HasColumnName("Message"); + + b.Property("RunTime") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("JobGroup", "JobName"); + + b.ToTable("TK_BackgroundJobLogs", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplate", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Content") + .HasMaxLength(1048576) + .HasColumnType("longtext") + .HasColumnName("Content"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Culture") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Culture"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("DisplayName"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Name"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .HasDatabaseName("IX_Tenant_Text_Template_Name"); + + b.ToTable("AbpTextTemplates", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.TextTemplating.TextTemplateDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("DefaultCultureName") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("DefaultCultureName"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsInlineLocalized") + .HasColumnType("tinyint(1)"); + + b.Property("IsLayout") + .HasColumnType("tinyint(1)"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)"); + + b.Property("Layout") + .HasMaxLength(60) + .HasColumnType("varchar(60)") + .HasColumnName("Layout"); + + b.Property("LocalizationResourceName") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("LocalizationResourceName"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("Name"); + + b.Property("RenderEngine") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("RenderEngine"); + + b.HasKey("Id"); + + b.ToTable("AbpTextTemplateDefinitions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("RequiredFeatures") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpWebhooksWebhooks", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookEventRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("Data") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("Data"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WebhookName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("WebhookName"); + + b.HasKey("Id"); + + b.ToTable("AbpWebhooksEvents", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpWebhooksWebhookGroups", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookSendRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("RequestHeaders") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("RequestHeaders"); + + b.Property("Response") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("Response"); + + b.Property("ResponseHeaders") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("ResponseHeaders"); + + b.Property("ResponseStatusCode") + .HasColumnType("int"); + + b.Property("SendExactSameData") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("WebhookEventId") + .HasColumnType("char(36)"); + + b.Property("WebhookSubscriptionId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("WebhookEventId"); + + b.ToTable("AbpWebhooksSendAttempts", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookSubscription", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Description") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("Description"); + + b.Property("Headers") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("Headers"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)"); + + b.Property("Secret") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("Secret"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.Property("TimeoutDuration") + .HasColumnType("int"); + + b.Property("WebhookUri") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("WebhookUri"); + + b.Property("Webhooks") + .HasMaxLength(2147483647) + .HasColumnType("longtext") + .HasColumnName("Webhooks"); + + b.HasKey("Id"); + + b.ToTable("AbpWebhooksSubscriptions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Datas.Data", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("Description"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Name"); + + b.Property("ParentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("AppPlatformDatas", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Datas.DataItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowBeNull") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DataId") + .HasColumnType("char(36)"); + + b.Property("DefaultValue") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DefaultValue"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("Description"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Name"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("DataId"); + + b.HasIndex("Name"); + + b.ToTable("AppPlatformDataItems", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Layouts.Layout", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DataId") + .HasColumnType("char(36)"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Framework") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Framework"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("Path") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Path"); + + b.Property("Redirect") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Redirect"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AppPlatformLayouts", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Menus.Menu", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(23) + .HasColumnType("varchar(23)") + .HasColumnName("Code"); + + b.Property("Component") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Component"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Framework") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Framework"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsPublic") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LayoutId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("ParentId") + .HasColumnType("char(36)"); + + b.Property("Path") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Path"); + + b.Property("Redirect") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Redirect"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AppPlatformMenus", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Menus.RoleMenu", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("MenuId") + .HasColumnType("char(36)"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("RoleName"); + + b.Property("Startup") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleName", "MenuId"); + + b.ToTable("AppPlatformRoleMenus", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Menus.UserFavoriteMenu", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AliasName") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("AliasName"); + + b.Property("Color") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Color"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("Framework") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Framework"); + + b.Property("Icon") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("Icon"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("MenuId") + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("Path") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Path"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "MenuId"); + + b.ToTable("AppPlatformUserFavoriteMenus", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Menus.UserMenu", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("MenuId") + .HasColumnType("char(36)"); + + b.Property("Startup") + .HasColumnType("tinyint(1)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UserId", "MenuId"); + + b.ToTable("AppPlatformUserMenus", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Packages.Package", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Authors") + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Authors"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Description"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("ForceUpdate") + .HasColumnType("tinyint(1)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Level") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Name"); + + b.Property("Note") + .IsRequired() + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("Note"); + + b.Property("Version") + .IsRequired() + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("Version"); + + b.HasKey("Id"); + + b.HasIndex("Name", "Version"); + + b.ToTable("AppPlatformPackages", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Packages.PackageBlob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property("Id")); + + b.Property("Authors") + .HasMaxLength(100) + .HasColumnType("varchar(100)") + .HasColumnName("Authors"); + + b.Property("ContentType") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("ContentType"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DownloadCount") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("License") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("License"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Name"); + + b.Property("PackageId") + .HasColumnType("char(36)"); + + b.Property("SHA256") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("SHA256"); + + b.Property("Size") + .HasColumnType("bigint"); + + b.Property("Summary") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)") + .HasColumnName("Summary"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Url") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("Url"); + + b.HasKey("Id"); + + b.HasIndex("PackageId", "Name"); + + b.ToTable("AppPlatformPackageBlobs", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Platform.Portal.Enterprise", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Address") + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Address"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("EnglishName") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("EnglishName"); + + b.Property("ExpirationDate") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LegalMan") + .HasMaxLength(60) + .HasColumnType("varchar(60)") + .HasColumnName("LegalMan"); + + b.Property("Logo") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("Logo"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("varchar(255)") + .HasColumnName("Name"); + + b.Property("OrganizationCode") + .HasMaxLength(16) + .HasColumnType("varchar(16)") + .HasColumnName("OrganizationCode"); + + b.Property("RegistrationCode") + .HasMaxLength(30) + .HasColumnType("varchar(30)") + .HasColumnName("RegistrationCode"); + + b.Property("RegistrationDate") + .HasColumnType("datetime(6)"); + + b.Property("TaxCode") + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("TaxCode"); + + b.Property("TenantId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("AppPlatformEnterprises", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("varchar(96)") + .HasColumnName("ApplicationName"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("BrowserInfo"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("ClientId"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("ClientIpAddress"); + + b.Property("ClientName") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("ClientName"); + + b.Property("Comments") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("Comments"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("CorrelationId"); + + b.Property("Exceptions") + .HasColumnType("longtext"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasMaxLength(16) + .HasColumnType("varchar(16)") + .HasColumnName("HttpMethod"); + + b.Property("HttpStatusCode") + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnType("char(36)") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorTenantName") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("ImpersonatorTenantName"); + + b.Property("ImpersonatorUserId") + .HasColumnType("char(36)") + .HasColumnName("ImpersonatorUserId"); + + b.Property("ImpersonatorUserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("ImpersonatorUserName"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("TenantName"); + + b.Property("Url") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("Url"); + + b.Property("UserId") + .HasColumnType("char(36)") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuditLogId") + .HasColumnType("char(36)") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnType("datetime(6)") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("MethodName"); + + b.Property("Parameters") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)") + .HasColumnName("Parameters"); + + b.Property("ServiceName") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("ServiceName"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AuditLogId") + .HasColumnType("char(36)") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnType("datetime(6)") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnType("tinyint unsigned") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("EntityId"); + + b.Property("EntityTenantId") + .HasColumnType("char(36)"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("EntityTypeFullName"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EntityChangeId") + .HasColumnType("char(36)"); + + b.Property("NewValue") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("NewValue"); + + b.Property("OriginalValue") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("OriginalValue"); + + b.Property("PropertyName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("PropertyName"); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("PropertyTypeFullName"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedProviders") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("DefaultValue") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("IsAvailableToHost") + .HasColumnType("tinyint(1)"); + + b.Property("IsVisibleToClients") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ValueType") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatures", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpFeatureGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpFeatureValues", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Required") + .HasColumnType("tinyint(1)"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("SourceTenantId") + .HasColumnType("char(36)"); + + b.Property("SourceUserId") + .HasColumnType("char(36)"); + + b.Property("TargetTenantId") + .HasColumnType("char(36)"); + + b.Property("TargetUserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique(); + + b.ToTable("AbpLinkUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("tinyint(1)") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("tinyint(1)") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("tinyint(1)") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("char(36)"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("varchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("varchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("varchar(96)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySession", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Device") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("DeviceInfo") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("IpAddresses") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("LastAccessed") + .HasColumnType("datetime(6)"); + + b.Property("SessionId") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("SignedIn") + .HasColumnType("datetime(6)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("Device"); + + b.HasIndex("SessionId"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSessions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsActive") + .HasColumnType("tinyint(1)") + .HasColumnName("IsActive"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LastPasswordChangeTime") + .HasColumnType("datetime(6)"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("varchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("ShouldChangePasswordOnNextLogin") + .HasColumnType("tinyint(1)"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("char(36)"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("EndTime") + .HasColumnType("datetime(6)"); + + b.Property("SourceUserId") + .HasColumnType("char(36)"); + + b.Property("StartTime") + .HasColumnType("datetime(6)"); + + b.Property("TargetUserId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("varchar(196)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("char(36)"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("longtext"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("varchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("EntityVersion") + .HasColumnType("int"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("char(36)"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowedAccessTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.Property("ApiResourceId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("ApiResourceId", "Type"); + + b.ToTable("IdentityServerApiResourceClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.Property("ApiResourceId") + .HasColumnType("char(36)"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("ApiResourceId", "Key", "Value"); + + b.ToTable("IdentityServerApiResourceProperties", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => + { + b.Property("ApiResourceId") + .HasColumnType("char(36)"); + + b.Property("Scope") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("ApiResourceId", "Scope"); + + b.ToTable("IdentityServerApiResourceScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => + { + b.Property("ApiResourceId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.HasKey("ApiResourceId", "Type", "Value"); + + b.ToTable("IdentityServerApiResourceSecrets", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Emphasize") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Required") + .HasColumnType("tinyint(1)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerApiScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => + { + b.Property("ApiScopeId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("ApiScopeId", "Type"); + + b.ToTable("IdentityServerApiScopeClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => + { + b.Property("ApiScopeId") + .HasColumnType("char(36)"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("ApiScopeId", "Key", "Value"); + + b.ToTable("IdentityServerApiScopeProperties", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AbsoluteRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenLifetime") + .HasColumnType("int"); + + b.Property("AccessTokenType") + .HasColumnType("int"); + + b.Property("AllowAccessTokensViaBrowser") + .HasColumnType("tinyint(1)"); + + b.Property("AllowOfflineAccess") + .HasColumnType("tinyint(1)"); + + b.Property("AllowPlainTextPkce") + .HasColumnType("tinyint(1)"); + + b.Property("AllowRememberConsent") + .HasColumnType("tinyint(1)"); + + b.Property("AllowedIdentityTokenSigningAlgorithms") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("AlwaysIncludeUserClaimsInIdToken") + .HasColumnType("tinyint(1)"); + + b.Property("AlwaysSendClientClaims") + .HasColumnType("tinyint(1)"); + + b.Property("AuthorizationCodeLifetime") + .HasColumnType("int"); + + b.Property("BackChannelLogoutSessionRequired") + .HasColumnType("tinyint(1)"); + + b.Property("BackChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("ClientClaimsPrefix") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentLifetime") + .HasColumnType("int"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DeviceCodeLifetime") + .HasColumnType("int"); + + b.Property("EnableLocalLogin") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FrontChannelLogoutSessionRequired") + .HasColumnType("tinyint(1)"); + + b.Property("FrontChannelLogoutUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("IdentityTokenLifetime") + .HasColumnType("int"); + + b.Property("IncludeJwtId") + .HasColumnType("tinyint(1)"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("PairWiseSubjectSalt") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ProtocolType") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("RefreshTokenExpiration") + .HasColumnType("int"); + + b.Property("RefreshTokenUsage") + .HasColumnType("int"); + + b.Property("RequireClientSecret") + .HasColumnType("tinyint(1)"); + + b.Property("RequireConsent") + .HasColumnType("tinyint(1)"); + + b.Property("RequirePkce") + .HasColumnType("tinyint(1)"); + + b.Property("RequireRequestObject") + .HasColumnType("tinyint(1)"); + + b.Property("SlidingRefreshTokenLifetime") + .HasColumnType("int"); + + b.Property("UpdateAccessTokenClaimsOnRefresh") + .HasColumnType("tinyint(1)"); + + b.Property("UserCodeType") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("UserSsoLifetime") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("IdentityServerClients", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Origin") + .HasMaxLength(150) + .HasColumnType("varchar(150)"); + + b.HasKey("ClientId", "Origin"); + + b.ToTable("IdentityServerClientCorsOrigins", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("GrantType") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.HasKey("ClientId", "GrantType"); + + b.ToTable("IdentityServerClientGrantTypes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Provider") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("ClientId", "Provider"); + + b.ToTable("IdentityServerClientIdPRestrictions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("PostLogoutRedirectUri") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("ClientId", "PostLogoutRedirectUri"); + + b.ToTable("IdentityServerClientPostLogoutRedirectUris", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("ClientId", "Key", "Value"); + + b.ToTable("IdentityServerClientProperties", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("RedirectUri") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("ClientId", "RedirectUri"); + + b.ToTable("IdentityServerClientRedirectUris", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Scope") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("ClientId", "Scope"); + + b.ToTable("IdentityServerClientScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.Property("ClientId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.HasKey("ClientId", "Type", "Value"); + + b.ToTable("IdentityServerClientSecrets", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Devices.DeviceFlowCodes", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(10000) + .HasColumnType("varchar(10000)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("DeviceCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Expiration") + .IsRequired() + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("UserCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("DeviceCode") + .IsUnique(); + + b.HasIndex("Expiration"); + + b.HasIndex("UserCode"); + + b.ToTable("IdentityServerDeviceFlowCodes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Grants.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsumedTime") + .HasColumnType("datetime(6)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(10000) + .HasColumnType("varchar(10000)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Expiration") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Id") + .HasColumnType("char(36)"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Key"); + + b.HasIndex("Expiration"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.HasIndex("SubjectId", "SessionId", "Type"); + + b.ToTable("IdentityServerPersistedGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("varchar(1000)"); + + b.Property("DisplayName") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Emphasize") + .HasColumnType("tinyint(1)"); + + b.Property("Enabled") + .HasColumnType("tinyint(1)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Required") + .HasColumnType("tinyint(1)"); + + b.Property("ShowInDiscoveryDocument") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("IdentityServerIdentityResources", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.Property("IdentityResourceId") + .HasColumnType("char(36)"); + + b.Property("Type") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.HasKey("IdentityResourceId", "Type"); + + b.ToTable("IdentityServerIdentityResourceClaims", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.Property("IdentityResourceId") + .HasColumnType("char(36)"); + + b.Property("Key") + .HasMaxLength(250) + .HasColumnType("varchar(250)"); + + b.Property("Value") + .HasMaxLength(300) + .HasColumnType("varchar(300)"); + + b.HasKey("IdentityResourceId", "Key", "Value"); + + b.ToTable("IdentityServerIdentityResourceProperties", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApplicationType") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("ClientId") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ClientSecret") + .HasColumnType("longtext"); + + b.Property("ClientType") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("ClientUri") + .HasColumnType("longtext"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ConsentType") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .HasColumnType("longtext"); + + b.Property("DisplayNames") + .HasColumnType("longtext"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("JsonWebKeySet") + .HasColumnType("longtext"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("LogoUri") + .HasColumnType("longtext"); + + b.Property("Permissions") + .HasColumnType("longtext"); + + b.Property("PostLogoutRedirectUris") + .HasColumnType("longtext"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("RedirectUris") + .HasColumnType("longtext"); + + b.Property("Requirements") + .HasColumnType("longtext"); + + b.Property("Settings") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.ToTable("OpenIddictApplications", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApplicationId") + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("Scopes") + .HasColumnType("longtext"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictAuthorizations", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Scopes.OpenIddictScope", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("Descriptions") + .HasColumnType("longtext"); + + b.Property("DisplayName") + .HasColumnType("longtext"); + + b.Property("DisplayNames") + .HasColumnType("longtext"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("Resources") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("OpenIddictScopes", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ApplicationId") + .HasColumnType("char(36)"); + + b.Property("AuthorizationId") + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationDate") + .HasColumnType("datetime(6)"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("char(36)") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime(6)") + .HasColumnName("DeletionTime"); + + b.Property("ExpirationDate") + .HasColumnType("datetime(6)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Payload") + .HasColumnType("longtext"); + + b.Property("Properties") + .HasColumnType("longtext"); + + b.Property("RedemptionDate") + .HasColumnType("datetime(6)"); + + b.Property("ReferenceId") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Status") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("Subject") + .HasMaxLength(400) + .HasColumnType("varchar(400)"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationId"); + + b.HasIndex("ReferenceId"); + + b.HasIndex("ApplicationId", "Status", "Subject", "Type"); + + b.ToTable("OpenIddictTokens", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("MultiTenancySide") + .HasColumnType("tinyint unsigned"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ParentName") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Providers") + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("StateCheckers") + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("GroupName"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissions", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpPermissionGrants", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGroupDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpPermissionGroups", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey") + .IsUnique(); + + b.ToTable("AbpSettings", (string)null); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.SettingDefinitionRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DefaultValue") + .HasMaxLength(2048) + .HasColumnType("varchar(2048)"); + + b.Property("Description") + .HasMaxLength(512) + .HasColumnType("varchar(512)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsEncrypted") + .HasColumnType("tinyint(1)"); + + b.Property("IsInherited") + .HasColumnType("tinyint(1)"); + + b.Property("IsVisibleToClients") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)"); + + b.Property("Providers") + .HasMaxLength(1024) + .HasColumnType("varchar(1024)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpSettingDefinitions", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityPropertyInfo", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "TypeInfo") + .WithMany("Properties") + .HasForeignKey("TypeInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TypeInfo"); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.OrganizationUnitEntityRule", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "EntityTypeInfo") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeInfo"); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.RoleEntityRule", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "EntityTypeInfo") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeInfo"); + }); + + modelBuilder.Entity("LINGYUN.Abp.Demo.Books.Book", b => + { + b.HasOne("LINGYUN.Abp.Demo.Authors.Author", null) + .WithMany() + .HasForeignKey("AuthorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b => + { + b.HasOne("LINGYUN.Abp.Saas.Editions.Edition", "Edition") + .WithMany() + .HasForeignKey("EditionId"); + + b.Navigation("Edition"); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.TenantConnectionString", b => + { + b.HasOne("LINGYUN.Abp.Saas.Tenants.Tenant", null) + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LINGYUN.Abp.WebhooksManagement.WebhookSendRecord", b => + { + b.HasOne("LINGYUN.Abp.WebhooksManagement.WebhookEventRecord", "WebhookEvent") + .WithOne() + .HasForeignKey("LINGYUN.Abp.WebhooksManagement.WebhookSendRecord", "WebhookEventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("WebhookEvent"); + }); + + modelBuilder.Entity("LINGYUN.Platform.Datas.DataItem", b => + { + b.HasOne("LINGYUN.Platform.Datas.Data", null) + .WithMany("Items") + .HasForeignKey("DataId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LINGYUN.Platform.Packages.PackageBlob", b => + { + b.HasOne("LINGYUN.Platform.Packages.Package", "Package") + .WithMany("Blobs") + .HasForeignKey("PackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Package"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog", null) + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange", null) + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("UserClaims") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Properties") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Scopes") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResourceSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiResources.ApiResource", null) + .WithMany("Secrets") + .HasForeignKey("ApiResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("UserClaims") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScopeProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.ApiScopes.ApiScope", null) + .WithMany("Properties") + .HasForeignKey("ApiScopeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Claims") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientCorsOrigin", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedCorsOrigins") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientGrantType", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedGrantTypes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientIdPRestriction", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("IdentityProviderRestrictions") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientPostLogoutRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("PostLogoutRedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("Properties") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientRedirectUri", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("RedirectUris") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientScope", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("AllowedScopes") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.ClientSecret", b => + { + b.HasOne("Volo.Abp.IdentityServer.Clients.Client", null) + .WithMany("ClientSecrets") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceClaim", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("UserClaims") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResourceProperty", b => + { + b.HasOne("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", null) + .WithMany("Properties") + .HasForeignKey("IdentityResourceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + }); + + modelBuilder.Entity("Volo.Abp.OpenIddict.Tokens.OpenIddictToken", b => + { + b.HasOne("Volo.Abp.OpenIddict.Applications.OpenIddictApplication", null) + .WithMany() + .HasForeignKey("ApplicationId"); + + b.HasOne("Volo.Abp.OpenIddict.Authorizations.OpenIddictAuthorization", null) + .WithMany() + .HasForeignKey("AuthorizationId"); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", b => + { + b.Navigation("Properties"); + }); + + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); + + modelBuilder.Entity("LINGYUN.Platform.Datas.Data", b => + { + b.Navigation("Items"); + }); + + modelBuilder.Entity("LINGYUN.Platform.Packages.Package", b => + { + b.Navigation("Blobs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiResources.ApiResource", b => + { + b.Navigation("Properties"); + + b.Navigation("Scopes"); + + b.Navigation("Secrets"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.ApiScopes.ApiScope", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.Clients.Client", b => + { + b.Navigation("AllowedCorsOrigins"); + + b.Navigation("AllowedGrantTypes"); + + b.Navigation("AllowedScopes"); + + b.Navigation("Claims"); + + b.Navigation("ClientSecrets"); + + b.Navigation("IdentityProviderRestrictions"); + + b.Navigation("PostLogoutRedirectUris"); + + b.Navigation("Properties"); + + b.Navigation("RedirectUris"); + }); + + modelBuilder.Entity("Volo.Abp.IdentityServer.IdentityResources.IdentityResource", b => + { + b.Navigation("Properties"); + + b.Navigation("UserClaims"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.cs new file mode 100644 index 000000000..e93c422e8 --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/20241218145610_AddNewMigration_20241218_225542.cs @@ -0,0 +1,183 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace LY.MicroService.Applications.Single.EntityFrameworkCore.MySql.Migrations +{ + /// + public partial class AddNewMigration_20241218_225542 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuthEntitites", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "varchar(64)", maxLength: 64, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DisplayName = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TypeFullName = table.Column(type: "varchar(256)", maxLength: 256, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + IsAuditEnabled = table.Column(type: "tinyint(1)", nullable: false), + ExtraProperties = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ConcurrencyStamp = table.Column(type: "varchar(40)", maxLength: 40, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + CreatorId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + LastModificationTime = table.Column(type: "datetime(6)", nullable: true), + LastModifierId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuthEntitites", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AbpAuthEntityProperties", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + Name = table.Column(type: "varchar(64)", maxLength: 64, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + DisplayName = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + TypeFullName = table.Column(type: "varchar(256)", maxLength: 256, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ValueRange = table.Column(type: "varchar(512)", maxLength: 512, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + TypeInfoId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci") + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuthEntityProperties", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuthEntityProperties_AbpAuthEntitites_TypeInfoId", + column: x => x.TypeInfoId, + principalTable: "AbpAuthEntitites", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AbpAuthOrganizationUnitEntityRules", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + OrgId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + OrgCode = table.Column(type: "varchar(128)", maxLength: 128, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ExtraProperties = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ConcurrencyStamp = table.Column(type: "varchar(40)", maxLength: 40, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + CreatorId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + LastModificationTime = table.Column(type: "datetime(6)", nullable: true), + LastModifierId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + IsEnabled = table.Column(type: "tinyint(1)", nullable: false), + Operation = table.Column(type: "int", nullable: false), + FilterGroup = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + EntityTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + EntityTypeFullName = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + AllowProperties = table.Column(type: "varchar(512)", maxLength: 512, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuthOrganizationUnitEntityRules", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuthOrganizationUnitEntityRules_AbpAuthEntitites_EntityTy~", + column: x => x.EntityTypeId, + principalTable: "AbpAuthEntitites", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "AbpAuthRoleEntityRules", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + RoleId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + RoleName = table.Column(type: "varchar(256)", maxLength: 256, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ExtraProperties = table.Column(type: "longtext", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + ConcurrencyStamp = table.Column(type: "varchar(40)", maxLength: 40, nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + CreatorId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + LastModificationTime = table.Column(type: "datetime(6)", nullable: true), + LastModifierId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + TenantId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"), + IsEnabled = table.Column(type: "tinyint(1)", nullable: false), + Operation = table.Column(type: "int", nullable: false), + FilterGroup = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + EntityTypeId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + EntityTypeFullName = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + AllowProperties = table.Column(type: "varchar(512)", maxLength: 512, nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuthRoleEntityRules", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuthRoleEntityRules_AbpAuthEntitites_EntityTypeId", + column: x => x.EntityTypeId, + principalTable: "AbpAuthEntitites", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuthEntitites_TypeFullName", + table: "AbpAuthEntitites", + column: "TypeFullName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuthEntityProperties_TypeInfoId_TypeFullName", + table: "AbpAuthEntityProperties", + columns: new[] { "TypeInfoId", "TypeFullName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuthOrganizationUnitEntityRules_EntityTypeId", + table: "AbpAuthOrganizationUnitEntityRules", + column: "EntityTypeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuthRoleEntityRules_EntityTypeId", + table: "AbpAuthRoleEntityRules", + column: "EntityTypeId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuthEntityProperties"); + + migrationBuilder.DropTable( + name: "AbpAuthOrganizationUnitEntityRules"); + + migrationBuilder.DropTable( + name: "AbpAuthRoleEntityRules"); + + migrationBuilder.DropTable( + name: "AbpAuthEntitites"); + } + } +} diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/SingleMigrationsDbContextModelSnapshot.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/SingleMigrationsDbContextModelSnapshot.cs index a49f2bc46..1a4f9fc50 100644 --- a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/SingleMigrationsDbContextModelSnapshot.cs +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Migrations/SingleMigrationsDbContextModelSnapshot.cs @@ -24,6 +24,257 @@ protected override void BuildModel(ModelBuilder modelBuilder) MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityPropertyInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("TypeFullName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("TypeFullName"); + + b.Property("TypeInfoId") + .HasColumnType("char(36)"); + + b.Property("ValueRange") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("ValueRange"); + + b.HasKey("Id"); + + b.HasIndex("TypeInfoId", "TypeFullName"); + + b.ToTable("AbpAuthEntityProperties", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("IsAuditEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("varchar(64)") + .HasColumnName("Name"); + + b.Property("TypeFullName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("TypeFullName"); + + b.HasKey("Id"); + + b.HasIndex("TypeFullName"); + + b.ToTable("AbpAuthEntitites", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.OrganizationUnitEntityRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowProperties") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("AllowProperties"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("EntityTypeFullName") + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FilterGroup") + .HasColumnType("longtext") + .HasColumnName("FilterGroup"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Operation") + .HasColumnType("int"); + + b.Property("OrgCode") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("varchar(128)") + .HasColumnName("OrgCode"); + + b.Property("OrgId") + .HasColumnType("char(36)"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.ToTable("AbpAuthOrganizationUnitEntityRules", (string)null); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.RoleEntityRule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllowProperties") + .HasMaxLength(512) + .HasColumnType("varchar(512)") + .HasColumnName("AllowProperties"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasMaxLength(40) + .HasColumnType("varchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("char(36)") + .HasColumnName("CreatorId"); + + b.Property("EntityTypeFullName") + .HasColumnType("longtext"); + + b.Property("EntityTypeId") + .HasColumnType("char(36)"); + + b.Property("ExtraProperties") + .IsRequired() + .HasColumnType("longtext") + .HasColumnName("ExtraProperties"); + + b.Property("FilterGroup") + .HasColumnType("longtext") + .HasColumnName("FilterGroup"); + + b.Property("IsEnabled") + .HasColumnType("tinyint(1)"); + + b.Property("LastModificationTime") + .HasColumnType("datetime(6)") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("char(36)") + .HasColumnName("LastModifierId"); + + b.Property("Operation") + .HasColumnType("int"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("varchar(256)") + .HasColumnName("RoleName"); + + b.Property("TenantId") + .HasColumnType("char(36)") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityTypeId"); + + b.ToTable("AbpAuthRoleEntityRules", (string)null); + }); + modelBuilder.Entity("LINGYUN.Abp.Demo.Authors.Author", b => { b.Property("Id") @@ -5254,6 +5505,39 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("AbpSettingDefinitions", (string)null); }); + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityPropertyInfo", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "TypeInfo") + .WithMany("Properties") + .HasForeignKey("TypeInfoId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("TypeInfo"); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.OrganizationUnitEntityRule", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "EntityTypeInfo") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeInfo"); + }); + + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.RoleEntityRule", b => + { + b.HasOne("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", "EntityTypeInfo") + .WithMany() + .HasForeignKey("EntityTypeId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EntityTypeInfo"); + }); + modelBuilder.Entity("LINGYUN.Abp.Demo.Books.Book", b => { b.HasOne("LINGYUN.Abp.Demo.Authors.Author", null) @@ -5616,6 +5900,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("AuthorizationId"); }); + modelBuilder.Entity("LINGYUN.Abp.DataProtectionManagement.EntityTypeInfo", b => + { + b.Navigation("Properties"); + }); + modelBuilder.Entity("LINGYUN.Abp.Saas.Tenants.Tenant", b => { b.Navigation("ConnectionStrings"); diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer.csproj b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer.csproj new file mode 100644 index 000000000..8f0eab1d8 --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer.csproj @@ -0,0 +1,16 @@ + + + net8.0 + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.en.md b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.en.md new file mode 100644 index 000000000..06cf0b61a --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.en.md @@ -0,0 +1,59 @@ +# SQL Server Database Migration Guide + +This guide will help you manage SQL Server database migrations using the migration scripts. + +## Prerequisites + +1. Ensure .NET Core SDK is installed +2. Ensure Entity Framework Core tools are installed + ```powershell + dotnet tool install --global dotnet-ef + ``` +3. Ensure SQL Server connection string is properly configured + +## Usage Instructions + +### 1. Create New Migration + +1. Run the migration script in the `aspnet-core/migrations` directory: + ```powershell + # Use English version + .\MigrateEn.ps1 + + # Or use Chinese version + .\Migrate.ps1 + ``` + +2. Select SQL Server database context from the menu: + ``` + [3] LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer + ``` + +3. Enter migration name (optional): + - Press Enter to use default name: `AddNewMigration_yyyyMMdd_HHmmss` + - Or enter custom name, e.g.: `AddNewFeature` + +### 2. Generate SQL Script + +After creating the migration, the script will ask if you want to generate SQL script: + +1. Choose whether to generate SQL script (Y/N) +2. If Y is selected, following options will be available: + - `[A]` - Generate SQL script for all migrations + - `[L]` - Generate SQL script for latest migration only + - `[0-9]` - Generate from specified migration version + +Generated SQL scripts will be saved in: +``` +aspnet-core/InitSql/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/ +``` + +### 3. Apply Migration + +Generated SQL scripts can be applied to database through: + +1. Using SQL Server Management Studio or other SQL Server client tools to execute SQL script +2. Or using command line: + ```bash + sqlcmd -S your_server -d your_database -i your_script.sql + ``` diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.md b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.md new file mode 100644 index 000000000..e086b650a --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/README.md @@ -0,0 +1,59 @@ +# SQL Server 数据库迁移指南 + +本指南将帮助您使用迁移脚本来管理 SQL Server 数据库的迁移操作。 + +## 前置条件 + +1. 确保已安装 .NET Core SDK +2. 确保已安装 Entity Framework Core 工具 + ```powershell + dotnet tool install --global dotnet-ef + ``` +3. 确保已正确配置 SQL Server 连接字符串 + +## 使用说明 + +### 1. 创建新的迁移 + +1. 在 `aspnet-core/migrations` 目录下运行迁移脚本: + ```powershell + # 使用中文版本 + .\Migrate.ps1 + + # 或使用英文版本 + .\MigrateEn.ps1 + ``` + +2. 在菜单中选择 SQL Server 数据库上下文: + ``` + [3] LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer + ``` + +3. 输入迁移名称(可选): + - 直接回车将使用默认名称:`AddNewMigration_yyyyMMdd_HHmmss` + - 或输入自定义名称,如:`AddNewFeature` + +### 2. 生成 SQL 脚本 + +在创建迁移后,脚本会询问是否需要生成 SQL 脚本: + +1. 选择是否生成 SQL 脚本 (Y/N) +2. 如果选择 Y,将提供以下选项: + - `[A]` - 生成所有迁移的 SQL 脚本 + - `[L]` - 仅生成最新迁移的 SQL 脚本 + - `[0-9]` - 从指定的迁移版本开始生成 + +生成的 SQL 脚本将保存在: +``` +aspnet-core/InitSql/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/ +``` + +### 3. 应用迁移 + +生成的 SQL 脚本可以通过以下方式应用到数据库: + +1. 使用 SQL Server Management Studio 或其他 SQL Server 客户端工具执行 SQL 脚本 +2. 或使用命令行: + ```bash + sqlcmd -S your_server -d your_database -i your_script.sql + ``` diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsDbContextFactory.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsDbContextFactory.cs new file mode 100644 index 000000000..0d6919c93 --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsDbContextFactory.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System; +using System.IO; + +namespace LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer; + +public class SingleMigrationsDbContextFactory : IDesignTimeDbContextFactory +{ + public SingleMigrationsDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + var connectionString = configuration.GetConnectionString("Default"); + + var builder = new DbContextOptionsBuilder() + .UseSqlServer(connectionString, + b => b.MigrationsAssembly("LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer")); + + return new SingleMigrationsDbContext(builder!.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), + "../LY.MicroService.Applications.Single.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false) + .AddJsonFile( + "appsettings.SqlServer.json", + optional: false); + + return builder.Build(); + } +} diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsEntityFrameworkCoreSqlServerModule.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsEntityFrameworkCoreSqlServerModule.cs new file mode 100644 index 000000000..e08840d28 --- /dev/null +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer/SingleMigrationsEntityFrameworkCoreSqlServerModule.cs @@ -0,0 +1,26 @@ +using LINGYUN.Abp.Elsa.EntityFrameworkCore.SqlServer; +using Microsoft.Extensions.DependencyInjection; +using System; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.Modularity; + +namespace LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer; + +[DependsOn( + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(AbpElsaEntityFrameworkCoreSqlServerModule), + typeof(SingleMigrationsEntityFrameworkCoreModule) + )] +public class SingleMigrationsEntityFrameworkCoreSqlServerModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(); + + Configure(options => + { + options.UseSqlServer(); + }); + } +} diff --git a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/SingleDbMigrationService.cs b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/SingleDbMigrationService.cs index a02a8e3aa..1247b3499 100644 --- a/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/SingleDbMigrationService.cs +++ b/aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/SingleDbMigrationService.cs @@ -1,101 +1,101 @@ -using LINGYUN.Abp.Saas.Tenants; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using System; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.DistributedLocking; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.Migrations; -using Volo.Abp.EventBus.Distributed; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Uow; - -namespace LY.MicroService.Applications.Single.EntityFrameworkCore; - -public class SingleDbMigrationService : EfCoreRuntimeDatabaseMigratorBase, ITransientDependency -{ - protected IDataSeeder DataSeeder { get; } - protected ITenantRepository TenantRepository { get; } - public SingleDbMigrationService( - IUnitOfWorkManager unitOfWorkManager, - IServiceProvider serviceProvider, - ICurrentTenant currentTenant, - IAbpDistributedLock abpDistributedLock, - IDistributedEventBus distributedEventBus, - ILoggerFactory loggerFactory, - IDataSeeder dataSeeder, - ITenantRepository tenantRepository) - : base("SingleDbMigrator", unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) - { - DataSeeder = dataSeeder; - TenantRepository = tenantRepository; - } - protected async override Task LockAndApplyDatabaseMigrationsAsync() - { - await base.LockAndApplyDatabaseMigrationsAsync(); - - var tenants = await TenantRepository.GetListAsync(); - foreach (var tenant in tenants.Where(x => x.IsActive)) - { - Logger.LogInformation($"Trying to acquire the distributed lock for database migration: {DatabaseName} with tenant: {tenant.Name}."); - - var schemaMigrated = false; - - await using (var handle = await DistributedLock.TryAcquireAsync("DatabaseMigration_" + DatabaseName + "_Tenant" + tenant.Id.ToString())) - { - if (handle is null) - { - Logger.LogInformation($"Distributed lock could not be acquired for database migration: {DatabaseName} with tenant: {tenant.Name}. Operation cancelled."); - return; - } - - Logger.LogInformation($"Distributed lock is acquired for database migration: {DatabaseName} with tenant: {tenant.Name}..."); - - using (CurrentTenant.Change(tenant.Id)) - { - // Create database tables if needed - using var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: false); - var dbContext = await ServiceProvider - .GetRequiredService>() - .GetDbContextAsync(); - - var pendingMigrations = await dbContext - .Database - .GetPendingMigrationsAsync(); - - if (pendingMigrations.Any()) - { - await dbContext.Database.MigrateAsync(); - schemaMigrated = true; - } - - await uow.CompleteAsync(); - - await SeedAsync(); - - if (schemaMigrated || AlwaysSeedTenantDatabases) - { - await DistributedEventBus.PublishAsync( - new AppliedDatabaseMigrationsEto - { - DatabaseName = DatabaseName, - TenantId = tenant.Id - } - ); - } - } - } - - Logger.LogInformation($"Distributed lock has been released for database migration: {DatabaseName} with tenant: {tenant.Name}..."); - } - } - - protected async override Task SeedAsync() - { - await DataSeeder.SeedAsync(CurrentTenant.Id); - } +using LINGYUN.Abp.Saas.Tenants; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Migrations; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace LY.MicroService.Applications.Single.EntityFrameworkCore; + +public class SingleDbMigrationService : EfCoreRuntimeDatabaseMigratorBase, ITransientDependency +{ + protected IDataSeeder DataSeeder { get; } + protected ITenantRepository TenantRepository { get; } + public SingleDbMigrationService( + IUnitOfWorkManager unitOfWorkManager, + IServiceProvider serviceProvider, + ICurrentTenant currentTenant, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory, + IDataSeeder dataSeeder, + ITenantRepository tenantRepository) + : base("SingleDbMigrator", unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) + { + DataSeeder = dataSeeder; + TenantRepository = tenantRepository; + } + protected async override Task LockAndApplyDatabaseMigrationsAsync() + { + await base.LockAndApplyDatabaseMigrationsAsync(); + + var tenants = await TenantRepository.GetListAsync(); + foreach (var tenant in tenants.Where(x => x.IsActive)) + { + Logger.LogInformation($"Trying to acquire the distributed lock for database migration: {DatabaseName} with tenant: {tenant.Name}."); + + var schemaMigrated = false; + + await using (var handle = await DistributedLock.TryAcquireAsync("DatabaseMigration_" + DatabaseName + "_Tenant" + tenant.Id.ToString())) + { + if (handle is null) + { + Logger.LogInformation($"Distributed lock could not be acquired for database migration: {DatabaseName} with tenant: {tenant.Name}. Operation cancelled."); + return; + } + + Logger.LogInformation($"Distributed lock is acquired for database migration: {DatabaseName} with tenant: {tenant.Name}..."); + + using (CurrentTenant.Change(tenant.Id)) + { + // Create database tables if needed + using var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: false); + var dbContext = await ServiceProvider + .GetRequiredService>() + .GetDbContextAsync(); + + var pendingMigrations = await dbContext + .Database + .GetPendingMigrationsAsync(); + + if (pendingMigrations.Any()) + { + await dbContext.Database.MigrateAsync(); + schemaMigrated = true; + } + + await uow.CompleteAsync(); + + await SeedAsync(); + + if (schemaMigrated || AlwaysSeedTenantDatabases) + { + await DistributedEventBus.PublishAsync( + new AppliedDatabaseMigrationsEto + { + DatabaseName = DatabaseName, + TenantId = tenant.Id + } + ); + } + } + } + + Logger.LogInformation($"Distributed lock has been released for database migration: {DatabaseName} with tenant: {tenant.Name}..."); + } + } + + protected async override Task SeedAsync() + { + await DataSeeder.SeedAsync(CurrentTenant.Id); + } } \ No newline at end of file diff --git a/aspnet-core/migrations/Migrate.ps1 b/aspnet-core/migrations/Migrate.ps1 index f52891443..3d6486b9b 100755 --- a/aspnet-core/migrations/Migrate.ps1 +++ b/aspnet-core/migrations/Migrate.ps1 @@ -21,6 +21,11 @@ $dbContexts = @{ Context = "SingleMigrationsDbContext" Factory = "SingleMigrationsDbContextFactory" } + “3” = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer" + Context = "SingleMigrationsDbContext" + Factory = "SingleMigrationsDbContextFactory" + } } # 显示DbContext选择菜单 diff --git a/aspnet-core/migrations/MigrateEn.ps1 b/aspnet-core/migrations/MigrateEn.ps1 index 348910a43..3ae0df556 100644 --- a/aspnet-core/migrations/MigrateEn.ps1 +++ b/aspnet-core/migrations/MigrateEn.ps1 @@ -21,6 +21,11 @@ $dbContexts = @{ Context = "SingleMigrationsDbContext" Factory = "SingleMigrationsDbContextFactory" } + "3" = @{ + Name = "LY.MicroService.Applications.Single.EntityFrameworkCore.SqlServer" + Context = "SingleMigrationsDbContext" + Factory = "SingleMigrationsDbContextFactory" + } } # Display DbContext selection menu diff --git a/aspnet-core/services/Directory.Packages.props b/aspnet-core/services/Directory.Packages.props new file mode 100644 index 000000000..84f4c0737 --- /dev/null +++ b/aspnet-core/services/Directory.Packages.props @@ -0,0 +1,263 @@ + + + + 8.3.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/.config/dotnet-tools.json b/aspnet-core/services/LY.AIO.Applications.Single/.config/dotnet-tools.json new file mode 100644 index 000000000..6b93cca86 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "7.0.3", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/.gitignore b/aspnet-core/services/LY.AIO.Applications.Single/.gitignore new file mode 100644 index 000000000..7b6f60857 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/.gitignore @@ -0,0 +1,2 @@ +wwwroot +package*.json \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Authentication/AbpCookieAuthenticationHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/Authentication/AbpCookieAuthenticationHandler.cs new file mode 100644 index 000000000..2cf43e1f2 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Authentication/AbpCookieAuthenticationHandler.cs @@ -0,0 +1,89 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.Extensions.Options; +using System.Text.Encodings.Web; + +namespace LY.AIO.Applications.Single.Authentication; + +public class AbpCookieAuthenticationHandler : CookieAuthenticationHandler +{ + public AbpCookieAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder) : base(options, logger, encoder) + { + } + + public AbpCookieAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder, + ISystemClock clock) : base(options, logger, encoder, clock) + { + } + + protected const string XRequestFromHeader = "X-Request-From"; + protected const string DontRedirectRequestFromHeader = "vben"; + protected override Task InitializeEventsAsync() + { + var events = new CookieAuthenticationEvents + { + OnRedirectToLogin = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToAccessDenied = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToLogout = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToReturnUrl = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + } + }; + + Events = events; + + return Task.CompletedTask; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJob.cs b/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJob.cs new file mode 100644 index 000000000..e1bbef7c2 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJob.cs @@ -0,0 +1,38 @@ +using LINGYUN.Abp.Notifications; +using Microsoft.Extensions.Options; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; + +namespace LY.AIO.Applications.Single.BackgroundJobs; + +public class NotificationPublishJob : AsyncBackgroundJob, ITransientDependency +{ + protected AbpNotificationsPublishOptions Options { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected INotificationDataSerializer NotificationDataSerializer { get; } + public NotificationPublishJob( + IOptions options, + IServiceScopeFactory serviceScopeFactory, + INotificationDataSerializer notificationDataSerializer) + { + Options = options.Value; + ServiceScopeFactory = serviceScopeFactory; + NotificationDataSerializer = notificationDataSerializer; + } + + public override async Task ExecuteAsync(NotificationPublishJobArgs args) + { + var providerType = Type.GetType(args.ProviderType); + using (var scope = ServiceScopeFactory.CreateScope()) + { + if (scope.ServiceProvider.GetRequiredService(providerType) is INotificationPublishProvider publishProvider) + { + var store = scope.ServiceProvider.GetRequiredService(); + var notification = await store.GetNotificationOrNullAsync(args.TenantId, args.NotificationId); + notification.Data = NotificationDataSerializer.Serialize(notification.Data); + + await publishProvider.PublishAsync(notification, args.UserIdentifiers); + } + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJobArgs.cs b/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJobArgs.cs new file mode 100644 index 000000000..8d721981c --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/BackgroundJobs/NotificationPublishJobArgs.cs @@ -0,0 +1,22 @@ +using LINGYUN.Abp.Notifications; + +namespace LY.AIO.Applications.Single.BackgroundJobs; + +public class NotificationPublishJobArgs +{ + public Guid? TenantId { get; set; } + public long NotificationId { get; set; } + public string ProviderType { get; set; } + public List UserIdentifiers { get; set; } + public NotificationPublishJobArgs() + { + UserIdentifiers = new List(); + } + public NotificationPublishJobArgs(long id, string providerType, List userIdentifiers, Guid? tenantId = null) + { + NotificationId = id; + ProviderType = providerType; + UserIdentifiers = userIdentifiers; + TenantId = tenantId; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Controllers/HomeController.cs b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/HomeController.cs new file mode 100644 index 000000000..c154b5098 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/HomeController.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc; + +namespace LY.AIO.Applications.Single.Controllers; + +public class HomeController : Controller +{ + public IActionResult Index() + { + return Redirect("/swagger"); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Controllers/SettingMergeController.cs b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/SettingMergeController.cs new file mode 100644 index 000000000..dd64e4201 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/SettingMergeController.cs @@ -0,0 +1,70 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace LY.AIO.Applications.Single.Controllers; + +[ExposeServices( + typeof(SettingController), + typeof(SettingMergeController))] +public class SettingMergeController : SettingController +{ + private readonly SettingManagementMergeOptions _mergeOptions; + public SettingMergeController( + ISettingAppService settingAppService, + ISettingTestAppService settingTestAppService, + IOptions mergeOptions) + : base(settingAppService, settingTestAppService) + { + _mergeOptions = mergeOptions.Value; + } + + [HttpGet] + [Route("by-current-tenant")] + public async override Task GetAllForCurrentTenantAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(SettingMergeController), + }; + foreach (var serviceType in _mergeOptions.GlobalSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForCurrentTenantAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } + + [HttpGet] + [Route("by-global")] + public async override Task GetAllForGlobalAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(SettingMergeController), + }; + foreach (var serviceType in _mergeOptions.GlobalSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForGlobalAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Controllers/UserSettingMergeController.cs b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/UserSettingMergeController.cs new file mode 100644 index 000000000..ab8428491 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Controllers/UserSettingMergeController.cs @@ -0,0 +1,45 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace LY.AIO.Applications.Single.Controllers; + +[ExposeServices( + typeof(UserSettingController), + typeof(UserSettingMergeController))] +public class UserSettingMergeController : UserSettingController +{ + private readonly SettingManagementMergeOptions _mergeOptions; + public UserSettingMergeController( + IUserSettingAppService service, + IOptions mergeOptions) + : base(service) + { + _mergeOptions = mergeOptions.Value; + } + + [HttpGet] + [Route("by-current-user")] + public async override Task GetAllForCurrentUserAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(UserSettingMergeController), + }; + foreach (var serviceType in _mergeOptions.UserSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForCurrentUserAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Dockerfile b/aspnet-core/services/LY.AIO.Applications.Single/Dockerfile new file mode 100644 index 000000000..aee09fd66 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +LABEL maintainer="colin.in@foxmail.com" +WORKDIR /app + +COPY . /app + +#东8区 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone + +EXPOSE 80/tcp +VOLUME [ "./app/blobs" ] +VOLUME [ "./app/Logs" ] +VOLUME [ "./app/Modules" ] + +RUN apt update +RUN apt install wget -y + +ENTRYPOINT ["dotnet", "LY.MicroService.Applications.Single.dll"] diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/ChatMessageEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/ChatMessageEventHandler.cs new file mode 100644 index 000000000..52cf0d875 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/ChatMessageEventHandler.cs @@ -0,0 +1,59 @@ +using LINGYUN.Abp.IM; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.RealTime; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace LY.AIO.Applications.Single.EventBus.Distributed +{ + public class ChatMessageEventHandler : IDistributedEventHandler>, ITransientDependency + { + /// + /// Reference to . + /// + public ILogger Logger { get; set; } + /// + /// Reference to . + /// + protected AbpIMOptions Options { get; } + + protected IMessageStore MessageStore { get; } + protected IMessageBlocker MessageBlocker { get; } + protected IMessageSenderProviderManager MessageSenderProviderManager { get; } + + public ChatMessageEventHandler( + IOptions options, + IMessageStore messageStore, + IMessageBlocker messageBlocker, + IMessageSenderProviderManager messageSenderProviderManager) + { + Options = options.Value; + MessageStore = messageStore; + MessageBlocker = messageBlocker; + MessageSenderProviderManager = messageSenderProviderManager; + + Logger = NullLogger.Instance; + } + + public async virtual Task HandleEventAsync(RealTimeEto eventData) + { + Logger.LogDebug($"Persistent chat message."); + + var message = eventData.Data; + // 消息拦截 + // 扩展敏感词汇过滤 + await MessageBlocker.InterceptAsync(message); + + await MessageStore.StoreMessageAsync(message); + + // 发送消息 + foreach (var provider in MessageSenderProviderManager.Providers) + { + Logger.LogDebug($"Sending message with provider {provider.Name}"); + await provider.SendMessageAsync(message); + } + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/NotificationEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/NotificationEventHandler.cs new file mode 100644 index 000000000..275ba0a4d --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/NotificationEventHandler.cs @@ -0,0 +1,470 @@ +using LINGYUN.Abp.Notifications; +using LY.AIO.Applications.Single.BackgroundJobs; +using LY.AIO.Applications.Single.MultiTenancy; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using System.Globalization; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Json; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.TextTemplating; +using Volo.Abp.Uow; + +namespace LY.AIO.Applications.Single.EventBus.Distributed +{ + /// + /// 订阅通知发布事件,统一发布消息 + /// + /// + /// 作用在于SignalR客户端只会与一台服务器建立连接, + /// 只有启用了SignlR服务端的才能真正将消息发布到客户端 + /// + public class NotificationEventHandler : + IDistributedEventHandler>, + IDistributedEventHandler>, + ITransientDependency + { + /// + /// Reference to . + /// + public ILogger Logger { get; set; } + /// + /// Reference to . + /// + protected AbpNotificationsPublishOptions Options { get; } + /// + /// Reference to . + /// + protected ICurrentTenant CurrentTenant { get; } + /// + /// Reference to . + /// + protected ITenantConfigurationCache TenantConfigurationCache { get; } + /// + /// Reference to . + /// + protected IJsonSerializer JsonSerializer { get; } + /// + /// Reference to . + /// + protected IBackgroundJobManager BackgroundJobManager { get; } + /// + /// Reference to . + /// + protected ITemplateRenderer TemplateRenderer { get; } + /// + /// Reference to . + /// + protected INotificationStore NotificationStore { get; } + /// + /// Reference to . + /// + protected IStringLocalizerFactory StringLocalizerFactory { get; } + /// + /// Reference to . + /// + protected INotificationDataSerializer NotificationDataSerializer { get; } + /// + /// Reference to . + /// + protected INotificationDefinitionManager NotificationDefinitionManager { get; } + /// + /// Reference to . + /// + protected INotificationSubscriptionManager NotificationSubscriptionManager { get; } + /// + /// Reference to . + /// + protected INotificationPublishProviderManager NotificationPublishProviderManager { get; } + + /// + /// Initializes a new instance of the class. + /// + public NotificationEventHandler( + ICurrentTenant currentTenant, + ITenantConfigurationCache tenantConfigurationCache, + IJsonSerializer jsonSerializer, + ITemplateRenderer templateRenderer, + IBackgroundJobManager backgroundJobManager, + IStringLocalizerFactory stringLocalizerFactory, + IOptions options, + INotificationStore notificationStore, + INotificationDataSerializer notificationDataSerializer, + INotificationDefinitionManager notificationDefinitionManager, + INotificationSubscriptionManager notificationSubscriptionManager, + INotificationPublishProviderManager notificationPublishProviderManager) + { + Options = options.Value; + TenantConfigurationCache = tenantConfigurationCache; + CurrentTenant = currentTenant; + JsonSerializer = jsonSerializer; + TemplateRenderer = templateRenderer; + BackgroundJobManager = backgroundJobManager; + StringLocalizerFactory = stringLocalizerFactory; + NotificationStore = notificationStore; + NotificationDataSerializer = notificationDataSerializer; + NotificationDefinitionManager = notificationDefinitionManager; + NotificationSubscriptionManager = notificationSubscriptionManager; + NotificationPublishProviderManager = notificationPublishProviderManager; + + Logger = NullLogger.Instance; + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(NotificationEto eventData) + { + var notification = await NotificationDefinitionManager.GetOrNullAsync(eventData.Name); + if (notification == null) + { + return; + } + + var culture = eventData.Data.Culture; + if (culture.IsNullOrWhiteSpace()) + { + culture = CultureInfo.CurrentCulture.Name; + } + using (CultureHelper.Use(culture, culture)) + { + if (notification.NotificationType == NotificationType.System) + { + using (CurrentTenant.Change(null)) + { + await SendToTenantAsync(null, notification, eventData); + + var allActiveTenants = await TenantConfigurationCache.GetTenantsAsync(); + + foreach (var activeTenant in allActiveTenants) + { + await SendToTenantAsync(activeTenant.Id, notification, eventData); + } + } + } + else + { + await SendToTenantAsync(eventData.TenantId, notification, eventData); + } + } + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(NotificationEto eventData) + { + var notification = await NotificationDefinitionManager.GetOrNullAsync(eventData.Name); + if (notification == null) + { + return; + } + + if (notification.NotificationType == NotificationType.System) + { + using (CurrentTenant.Change(null)) + { + await SendToTenantAsync(null, notification, eventData); + + var allActiveTenants = await TenantConfigurationCache.GetTenantsAsync(); + + foreach (var activeTenant in allActiveTenants) + { + await SendToTenantAsync(activeTenant.Id, notification, eventData); + } + } + } + else + { + await SendToTenantAsync(eventData.TenantId, notification, eventData); + } + } + + protected async virtual Task SendToTenantAsync( + Guid? tenantId, + NotificationDefinition notification, + NotificationEto eventData) + { + using (CurrentTenant.Change(tenantId)) + { + var providers = Enumerable.Reverse(NotificationPublishProviderManager.Providers); + + // 过滤用户指定提供者 + if (eventData.UseProviders.Any()) + { + providers = providers.Where(p => eventData.UseProviders.Contains(p.Name)); + } + else if (notification.Providers.Any()) + { + providers = providers.Where(p => notification.Providers.Contains(p.Name)); + } + + var notificationInfo = new NotificationInfo + { + Name = notification.Name, + TenantId = tenantId, + Severity = eventData.Severity, + Type = notification.NotificationType, + ContentType = notification.ContentType, + CreationTime = eventData.CreationTime, + Lifetime = notification.NotificationLifetime, + }; + notificationInfo.SetId(eventData.Id); + + var title = notification.DisplayName.Localize(StringLocalizerFactory); + var message = ""; + + try + { + // 由于模板通知受租户影响, 格式化失败的消息将被丢弃. + message = await TemplateRenderer.RenderAsync( + templateName: eventData.Data.Name, + model: eventData.Data.ExtraProperties, + cultureName: eventData.Data.Culture, + globalContext: new Dictionary + { + // 模板不支持 $ 字符, 改为普通关键字 + { NotificationKeywords.Name, notification.Name }, + { NotificationKeywords.FormUser, eventData.Data.FormUser }, + { NotificationKeywords.Id, eventData.Id }, + { NotificationKeywords.Title, title.ToString() }, + { NotificationKeywords.CreationTime, eventData.CreationTime.ToString(Options.DateTimeFormat) }, + }); + } + catch(Exception ex) + { + Logger.LogWarning("Formatting template notification failed, message will be discarded, cause :{message}", ex.Message); + return; + } + + var notificationData = new NotificationData(); + notificationData.WriteStandardData( + title: title.ToString(), + message: message, + createTime: eventData.CreationTime, + formUser: eventData.Data.FormUser); + notificationData.ExtraProperties.AddIfNotContains(eventData.Data.ExtraProperties); + + notificationInfo.Data = notificationData; + + var subscriptionUsers = await GerSubscriptionUsersAsync( + notificationInfo.Name, + eventData.Users, + tenantId); + + await PersistentNotificationAsync( + notificationInfo, + subscriptionUsers, + providers); + + if (subscriptionUsers.Any()) + { + // 发布通知 + foreach (var provider in providers) + { + await PublishToSubscriberAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + } + + protected async virtual Task SendToTenantAsync( + Guid? tenantId, + NotificationDefinition notification, + NotificationEto eventData) + { + using (CurrentTenant.Change(tenantId)) + { + var providers = Enumerable.Reverse(NotificationPublishProviderManager.Providers); + + // 过滤用户指定提供者 + if (eventData.UseProviders.Any()) + { + providers = providers.Where(p => eventData.UseProviders.Contains(p.Name)); + } + else if (notification.Providers.Any()) + { + providers = providers.Where(p => notification.Providers.Contains(p.Name)); + } + + var notificationInfo = new NotificationInfo + { + Name = notification.Name, + CreationTime = eventData.CreationTime, + Data = eventData.Data, + Severity = eventData.Severity, + Lifetime = notification.NotificationLifetime, + TenantId = tenantId, + Type = notification.NotificationType, + ContentType = notification.ContentType, + }; + notificationInfo.SetId(eventData.Id); + + notificationInfo.Data = NotificationDataSerializer.Serialize(notificationInfo.Data); + + // 获取用户订阅 + var subscriptionUsers = await GerSubscriptionUsersAsync( + notificationInfo.Name, + eventData.Users, + tenantId); + + // 持久化通知 + await PersistentNotificationAsync( + notificationInfo, + subscriptionUsers, + providers); + + if (subscriptionUsers.Any()) + { + // 发布订阅通知 + foreach (var provider in providers) + { + await PublishToSubscriberAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + } + /// + /// 获取用户订阅列表 + /// + /// 通知名称 + /// 接收用户列表 + /// 租户标识 + /// 用户订阅列表 + protected async Task> GerSubscriptionUsersAsync( + string notificationName, + IEnumerable sendToUsers, + Guid? tenantId = null) + { + try + { + // 获取用户订阅列表 + var userSubscriptions = await NotificationSubscriptionManager.GetUsersSubscriptionsAsync( + tenantId, + notificationName, + sendToUsers); + + return userSubscriptions.Select(us => new UserIdentifier(us.UserId, us.UserName)); + } + catch(Exception ex) + { + Logger.LogWarning("Failed to get user subscription, message will not be received by the user, reason: {message}", ex.Message); + } + + return new List(); + } + /// + /// 持久化通知并返回订阅用户列表 + /// + /// 通知实体 + /// 订阅用户列表 + /// 通知发送提供者 + /// 返回订阅者列表 + protected async Task PersistentNotificationAsync( + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers, + IEnumerable sendToProviders) + { + try + { + // 持久化通知 + await NotificationStore.InsertNotificationAsync(notificationInfo); + + if (!subscriptionUsers.Any()) + { + return; + } + + // 持久化用户通知 + await NotificationStore.InsertUserNotificationsAsync(notificationInfo, subscriptionUsers.Select(u => u.UserId)); + + if (notificationInfo.Lifetime == NotificationLifetime.OnlyOne) + { + // 一次性通知取消用户订阅 + await NotificationStore.DeleteUserSubscriptionAsync( + notificationInfo.TenantId, + subscriptionUsers, + notificationInfo.Name); + } + } + catch (Exception ex) + { + Logger.LogWarning("Failed to persistent notification failed, reason: {message}", ex.Message); + + foreach (var provider in sendToProviders) + { + // 处理持久化失败进入后台队列 + await ProcessingFailedToQueueAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + /// + /// 发布订阅者通知 + /// + /// 通知发布者 + /// 通知信息 + /// 订阅用户列表 + /// + protected async Task PublishToSubscriberAsync( + INotificationPublishProvider provider, + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers) + { + try + { + Logger.LogDebug($"Sending notification with provider {provider.Name}"); + + // 2024-10-10: 框架层面应该取消通知数据转换,而是交给提供商来实现 + //var notifacationDataMapping = Options.NotificationDataMappings + // .GetMapItemOrDefault(provider.Name, notificationInfo.Name); + //if (notifacationDataMapping != null) + //{ + // notificationInfo.Data = notifacationDataMapping.MappingFunc(notificationInfo.Data); + //} + + // 发布 + await provider.PublishAsync(notificationInfo, subscriptionUsers); + + 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.LogDebug($"Failed to send notification {notificationInfo.Name}. Try to push notification to background job"); + // 发送失败的消息进入后台队列 + await ProcessingFailedToQueueAsync(provider, notificationInfo, subscriptionUsers); + } + } + /// + /// 处理失败的消息进入后台队列 + /// + /// + /// 注: 如果入队失败,消息将被丢弃. + /// + /// + /// + /// + /// + protected async Task ProcessingFailedToQueueAsync( + INotificationPublishProvider provider, + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers) + { + try + { + // 发送失败的消息进入后台队列 + await BackgroundJobManager.EnqueueAsync( + new NotificationPublishJobArgs( + notificationInfo.GetId(), + provider.GetType().AssemblyQualifiedName, + subscriptionUsers.ToList(), + notificationInfo.TenantId)); + } + catch(Exception ex) + { + Logger.LogWarning("Failed to push to background job, notification will be discarded, error cause: {message}", ex.Message); + } + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/TenantSynchronizer.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/TenantSynchronizer.cs new file mode 100644 index 000000000..7a33a9cae --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/TenantSynchronizer.cs @@ -0,0 +1,53 @@ +using LINGYUN.Abp.Saas.Tenants; +using LY.AIO.Applications.Single.MultiTenancy; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace LY.AIO.Applications.Single.EventBus.Distributed +{ + public class TenantSynchronizer : + IDistributedEventHandler>, + IDistributedEventHandler>, + IDistributedEventHandler>, + IDistributedEventHandler, + ITransientDependency + { + protected IDataSeeder DataSeeder { get; } + protected ITenantConfigurationCache TenantConfigurationCache { get; } + + public TenantSynchronizer( + IDataSeeder dataSeeder, + ITenantConfigurationCache tenantConfigurationCache) + { + DataSeeder = dataSeeder; + TenantConfigurationCache = tenantConfigurationCache; + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(EntityCreatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + + await DataSeeder.SeedAsync(eventData.Entity.Id); + } + + public async virtual Task HandleEventAsync(EntityUpdatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + + public async virtual Task HandleEventAsync(EntityDeletedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + + public async virtual Task HandleEventAsync(TenantConnectionStringUpdatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/UserCreateEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/UserCreateEventHandler.cs new file mode 100644 index 000000000..11684352e --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/UserCreateEventHandler.cs @@ -0,0 +1,30 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; +using Volo.Abp.Users; + +namespace LY.AIO.Applications.Single.EventBus.Distributed +{ + public class UserCreateEventHandler : IDistributedEventHandler>, ITransientDependency + { + private readonly ILocalEventBus _localEventBus; + public UserCreateEventHandler( + ILocalEventBus localEventBus) + { + _localEventBus = localEventBus; + } + /// + /// 接收添加用户事件,发布本地事件 + /// + /// + /// + public async Task HandleEventAsync(EntityCreatedEto eventData) + { + var localUserCreateEventData = new EntityCreatedEventData(eventData.Entity); + + await _localEventBus.PublishAsync(localUserCreateEventData); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/WebhooksEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/WebhooksEventHandler.cs new file mode 100644 index 000000000..3681560cb --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Distributed/WebhooksEventHandler.cs @@ -0,0 +1,112 @@ +using LINGYUN.Abp.Webhooks; +using LINGYUN.Abp.Webhooks.EventBus; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; + +namespace LY.AIO.Applications.Single.EventBus.Distributed; + +public class WebhooksEventHandler : + IDistributedEventHandler, + ITransientDependency +{ + public IWebhookEventStore WebhookEventStore { get; set; } + + private readonly ICurrentTenant _currentTenant; + private readonly IBackgroundJobManager _backgroundJobManager; + private readonly IWebhookSubscriptionManager _webhookSubscriptionManager; + + public WebhooksEventHandler( + IWebhookSubscriptionManager webhookSubscriptionManager, + ICurrentTenant currentTenant, + IBackgroundJobManager backgroundJobManager) + { + _currentTenant = currentTenant; + _backgroundJobManager = backgroundJobManager; + _webhookSubscriptionManager = webhookSubscriptionManager; + + WebhookEventStore = NullWebhookEventStore.Instance; + } + + public async virtual Task HandleEventAsync(WebhooksEventData eventData) + { + var subscriptions = await _webhookSubscriptionManager + .GetAllSubscriptionsOfTenantsIfFeaturesGrantedAsync( + eventData.TenantIds, + eventData.WebhookName); + + await PublishAsync(eventData.WebhookName, eventData.Data, subscriptions, eventData.SendExactSameData, eventData.Headers); + } + + protected async virtual Task PublishAsync( + string webhookName, + string data, + List webhookSubscriptions, + bool sendExactSameData = false, + WebhookHeader headers = null) + { + if (webhookSubscriptions.IsNullOrEmpty()) + { + return; + } + + var subscriptionsGroupedByTenant = webhookSubscriptions.GroupBy(x => x.TenantId); + + foreach (var subscriptionGroupedByTenant in subscriptionsGroupedByTenant) + { + var webhookInfo = await SaveAndGetWebhookAsync(subscriptionGroupedByTenant.Key, webhookName, data); + + foreach (var webhookSubscription in subscriptionGroupedByTenant) + { + var headersToSend = webhookSubscription.Headers; + if (headers != null) + { + if (headers.UseOnlyGivenHeaders)//do not use the headers defined in subscription + { + headersToSend = headers.Headers; + } + else + { + //use the headers defined in subscription. If additional headers has same header, use additional headers value. + foreach (var additionalHeader in headers.Headers) + { + headersToSend[additionalHeader.Key] = additionalHeader.Value; + } + } + } + + await _backgroundJobManager.EnqueueAsync(new WebhookSenderArgs + { + TenantId = webhookSubscription.TenantId, + WebhookEventId = webhookInfo.Id, + Data = webhookInfo.Data, + WebhookName = webhookInfo.WebhookName, + WebhookSubscriptionId = webhookSubscription.Id, + Headers = headersToSend, + Secret = webhookSubscription.Secret, + WebhookUri = webhookSubscription.WebhookUri, + SendExactSameData = sendExactSameData + }); + } + } + } + + protected async virtual Task SaveAndGetWebhookAsync( + Guid? tenantId, + string webhookName, + string data) + { + var webhookInfo = new WebhookEvent + { + WebhookName = webhookName, + Data = data, + TenantId = tenantId + }; + + var webhookId = await WebhookEventStore.InsertAndGetIdAsync(webhookInfo); + webhookInfo.Id = webhookId; + + return webhookInfo; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateJoinIMEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateJoinIMEventHandler.cs new file mode 100644 index 000000000..822e1220d --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateJoinIMEventHandler.cs @@ -0,0 +1,58 @@ +using LINGYUN.Abp.MessageService.Chat; +using LINGYUN.Abp.MessageService.Notifications; +using LINGYUN.Abp.Notifications; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace LY.AIO.Applications.Single.EventBus.Local +{ + public class UserCreateJoinIMEventHandler : ILocalEventHandler>, ITransientDependency + { + private readonly IChatDataSeeder _chatDataSeeder; + private readonly INotificationSubscriptionManager _notificationSubscriptionManager; + public UserCreateJoinIMEventHandler( + IChatDataSeeder chatDataSeeder, + INotificationSubscriptionManager notificationSubscriptionManager) + { + _chatDataSeeder = chatDataSeeder; + _notificationSubscriptionManager = notificationSubscriptionManager; + } + /// + /// 接收添加用户事件,初始化IM用户种子 + /// + /// + /// + [UnitOfWork] + public async virtual Task HandleEventAsync(EntityCreatedEventData eventData) + { + await SeedChatDataAsync(eventData.Entity); + + await SeedUserSubscriptionNotifiersAsync(eventData.Entity); + } + + protected async virtual Task SeedChatDataAsync(IUserData user) + { + await _chatDataSeeder.SeedAsync(user); + } + + protected async virtual Task SeedUserSubscriptionNotifiersAsync(IUserData user) + { + var userIdentifier = new UserIdentifier(user.Id, user.UserName); + + await _notificationSubscriptionManager + .SubscribeAsync( + user.TenantId, + userIdentifier, + MessageServiceNotificationNames.IM.FriendValidation); + + await _notificationSubscriptionManager + .SubscribeAsync( + user.TenantId, + userIdentifier, + MessageServiceNotificationNames.IM.NewFriend); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateSendWelcomeEventHandler.cs b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateSendWelcomeEventHandler.cs new file mode 100644 index 000000000..c430f94c0 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/EventBus/Local/UserCreateSendWelcomeEventHandler.cs @@ -0,0 +1,69 @@ +using LINGYUN.Abp.Notifications; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.Users; + +namespace LY.AIO.Applications.Single.EventBus.Local +{ + public class UserCreateSendWelcomeEventHandler : ILocalEventHandler>, ITransientDependency + { + private readonly INotificationSender _notificationSender; + private readonly INotificationSubscriptionManager _notificationSubscriptionManager; + public UserCreateSendWelcomeEventHandler( + INotificationSender notificationSender, + INotificationSubscriptionManager notificationSubscriptionManager + ) + { + _notificationSender = notificationSender; + _notificationSubscriptionManager = notificationSubscriptionManager; + } + + public async Task HandleEventAsync(EntityCreatedEventData eventData) + { + var userIdentifer = new UserIdentifier(eventData.Entity.Id, eventData.Entity.UserName); + // 订阅用户欢迎消息 + await SubscribeInternalNotifers(userIdentifer, eventData.Entity.TenantId); + + await _notificationSender.SendNofiterAsync( + UserNotificationNames.WelcomeToApplication, + new NotificationTemplate( + UserNotificationNames.WelcomeToApplication, + formUser: eventData.Entity.UserName, + data: new Dictionary + { + { "name", eventData.Entity.UserName }, + }), + userIdentifer, + eventData.Entity.TenantId, + NotificationSeverity.Info); + } + + private async Task SubscribeInternalNotifers(UserIdentifier userIdentifer, Guid? tenantId = null) + { + // 订阅内置通知 + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.SystemNotice); + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.OnsideNotice); + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.ActivityNotice); + + // 订阅用户欢迎消息 + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + UserNotificationNames.WelcomeToApplication); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/IdentityResources/CustomIdentityResources.cs b/aspnet-core/services/LY.AIO.Applications.Single/IdentityResources/CustomIdentityResources.cs new file mode 100644 index 000000000..feefc80df --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/IdentityResources/CustomIdentityResources.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.Identity; +using IdentityServer4.Models; + +namespace LY.AIO.Applications.Single.IdentityResources; + +public class CustomIdentityResources +{ + public class AvatarUrl : IdentityResource + { + public AvatarUrl() + { + Name = IdentityConsts.ClaimType.Avatar.Name; + DisplayName = IdentityConsts.ClaimType.Avatar.DisplayName; + Description = IdentityConsts.ClaimType.Avatar.Description; + Emphasize = true; + UserClaims = new string[] { IdentityConsts.ClaimType.Avatar.Name }; + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/LY.AIO.Applications.Single.csproj b/aspnet-core/services/LY.AIO.Applications.Single/LY.AIO.Applications.Single.csproj new file mode 100644 index 000000000..0fbfdd223 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/LY.AIO.Applications.Single.csproj @@ -0,0 +1,272 @@ + + + + + + net8.0 + enable + LY.AIO.Applications.Single + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs b/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs new file mode 100644 index 000000000..5ec0178f6 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs @@ -0,0 +1,935 @@ +using Elsa; +using Elsa.Options; +using LINGYUN.Abp.Aliyun.Localization; +using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.ExceptionHandling; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.Exporter.MiniExcel; +using LINGYUN.Abp.Idempotent; +using LINGYUN.Abp.Identity.Session; +using LINGYUN.Abp.IdentityServer.IdentityResources; +using LINGYUN.Abp.Localization.CultureMap; +using LINGYUN.Abp.Notifications; +using LINGYUN.Abp.OpenIddict.AspNetCore.Session; +using LINGYUN.Abp.OpenIddict.LinkUser; +using LINGYUN.Abp.OpenIddict.Permissions; +using LINGYUN.Abp.OpenIddict.Portal; +using LINGYUN.Abp.OpenIddict.Sms; +using LINGYUN.Abp.OpenIddict.WeChat; +using LINGYUN.Abp.Saas; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using LINGYUN.Abp.Tencent.Localization; +using LINGYUN.Abp.TextTemplating; +using LINGYUN.Abp.WebhooksManagement; +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Localization; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.Wrapper; +using LINGYUN.Platform.Localization; +using LY.AIO.Applications.Single.Authentication; +using LY.AIO.Applications.Single.IdentityResources; +using LY.AIO.Applications.Single.Microsoft.Extensions.DependencyInjection; +using LY.AIO.Applications.Single.WeChat.Official.Messages; +using Medallion.Threading; +using Medallion.Threading.Redis; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Server.Kestrel.Core; +using Microsoft.Extensions.Caching.StackExchangeRedis; +using Microsoft.IdentityModel.Logging; +using Microsoft.OpenApi.Models; +using MiniExcelLibs.Attributes; +using OpenIddict.Server; +using OpenIddict.Server.AspNetCore; +using Quartz; +using StackExchange.Redis; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text.Encodings.Web; +using System.Text.Unicode; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.AntiForgery; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Auditing; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.BlobStoring; +using Volo.Abp.BlobStoring.FileSystem; +using Volo.Abp.Caching; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Http.Client; +using Volo.Abp.Identity.Localization; +using Volo.Abp.IdentityServer; +using Volo.Abp.IdentityServer.Localization; +using Volo.Abp.Json; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.OpenIddict; +using Volo.Abp.OpenIddict.Localization; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Quartz; +using Volo.Abp.Security.Claims; +using Volo.Abp.SettingManagement; +using Volo.Abp.SettingManagement.Localization; +using Volo.Abp.Threading; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; +using VoloAbpExceptionHandlingOptions = Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingOptions; + +namespace LY.AIO.Applications.Single; + +public partial class MicroServiceApplicationsSingleModule +{ + protected const string DefaultCorsPolicyName = "Default"; + public static string ApplicationName { get; set; } = "MicroService-Applications-Single"; + private readonly static OneTimeRunner OneTimeRunner = new(); + + private void PreConfigureFeature() + { + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.Editions().EnableAll(); + }); + } + + private void PreConfigureApp(IConfiguration configuration) + { + AbpSerilogEnrichersConsts.ApplicationName = ApplicationName; + + PreConfigure(options => + { + // 以开放端口区别,应在0-31之间 + options.SnowflakeIdOptions.WorkerId = 1; + options.SnowflakeIdOptions.WorkerIdBits = 5; + options.SnowflakeIdOptions.DatacenterId = 1; + }); + + if (configuration.GetValue("App:ShowPii")) + { + IdentityModelEventSource.ShowPII = true; + } + } + + private void PreConfigureAuthServer(IConfiguration configuration) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + //options.AddAudiences("lingyun-abp-application"); + + options.UseLocalServer(); + + options.UseAspNetCore(); + + options.UseDataProtection(); + }); + }); + } + + private void PreConfigureIdentity() + { + PreConfigure(builder => + { + builder.AddDefaultTokenProviders(); + }); + } + + private void PreConfigureCertificate(IConfiguration configuration, IWebHostEnvironment environment) + { + var cerConfig = configuration.GetSection("Certificates"); + if (environment.IsProduction() && cerConfig.Exists()) + { + // 开发环境下存在证书配置 + // 且证书文件存在则使用自定义的证书文件来启动Ids服务器 + var cerPath = Path.Combine(environment.ContentRootPath, cerConfig["CerPath"]); + if (File.Exists(cerPath)) + { + var certificate = new X509Certificate2(cerPath, cerConfig["Password"]); + + if (configuration.GetValue("AuthServer:UseOpenIddict")) + { + PreConfigure(options => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + + PreConfigure(builder => + { + builder.AddSigningCertificate(certificate); + builder.AddEncryptionCertificate(certificate); + + builder.UseDataProtection(); + + // 禁用https + builder.UseAspNetCore() + .DisableTransportSecurityRequirement(); + }); + } + else + { + PreConfigure(options => + { + options.AddDeveloperSigningCredential = false; + }); + + PreConfigure(builder => + { + builder.AddSigningCredential(certificate); + }); + } + } + } + else + { + if (configuration.GetValue("AuthServer:UseOpenIddict")) + { + PreConfigure(options => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + + PreConfigure(builder => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Encryption Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddSigningCertificate(certificate); + } + + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Signing Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddEncryptionCertificate(certificate); + } + + builder.UseDataProtection(); + + // 禁用https + builder.UseAspNetCore() + .DisableTransportSecurityRequirement(); + }); + } + } + } + + private void PreConfigureQuartz(IConfiguration configuration) + { + PreConfigure(options => + { + // 如果使用持久化存储, 则配置quartz持久层 + if (configuration.GetSection("Quartz:UsePersistentStore").Get()) + { + var settings = configuration.GetSection("Quartz:Properties").Get>(); + if (settings != null) + { + foreach (var setting in settings) + { + options.Properties[setting.Key] = setting.Value; + } + } + + options.Configurator += (config) => + { + config.UsePersistentStore(store => + { + store.UseProperties = false; + store.UseNewtonsoftJsonSerializer(); + }); + }; + } + }); + } + + private void PreConfigureElsa(IServiceCollection services, IConfiguration configuration) + { + var elsaSection = configuration.GetSection("Elsa"); + var startups = new[] + { + typeof(Elsa.Activities.Console.Startup), + typeof(Elsa.Activities.Http.Startup), + typeof(Elsa.Activities.UserTask.Startup), + typeof(Elsa.Activities.Temporal.Quartz.Startup), + typeof(Elsa.Activities.Email.Startup), + typeof(Elsa.Scripting.JavaScript.Startup), + typeof(Elsa.Activities.Webhooks.Startup), + }; + + PreConfigure(elsa => + { + elsa + .AddActivitiesFrom() + .AddWorkflowsFrom() + .AddFeatures(startups, configuration) + .ConfigureWorkflowChannels(options => elsaSection.GetSection("WorkflowChannels").Bind(options)); + + elsa.DistributedLockingOptionsBuilder + .UseProviderFactory(sp => name => + { + var provider = sp.GetRequiredService(); + + return provider.CreateLock(name); + }); + }); + + services.AddNotificationHandlersFrom(); + + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(Elsa.Webhooks.Api.Endpoints.List).Assembly); + }); + } + + private void ConfigureAuthServer(IConfiguration configuration) + { + Configure(builder => + { + builder.DisableTransportSecurityRequirement(); + }); + + Configure(options => + { + options.DisableTransportSecurityRequirement = true; + }); + + Configure(options => + { + var lifetime = configuration.GetSection("OpenIddict:Lifetime"); + options.AuthorizationCodeLifetime = lifetime.GetValue("AuthorizationCode", options.AuthorizationCodeLifetime); + options.AccessTokenLifetime = lifetime.GetValue("AccessToken", options.AccessTokenLifetime); + options.DeviceCodeLifetime = lifetime.GetValue("DeviceCode", options.DeviceCodeLifetime); + options.IdentityTokenLifetime = lifetime.GetValue("IdentityToken", options.IdentityTokenLifetime); + options.RefreshTokenLifetime = lifetime.GetValue("RefreshToken", options.RefreshTokenLifetime); + options.RefreshTokenReuseLeeway = lifetime.GetValue("RefreshTokenReuseLeeway", options.RefreshTokenReuseLeeway); + options.UserCodeLifetime = lifetime.GetValue("UserCode", options.UserCodeLifetime); + }); + Configure(options => + { + options.PersistentSessionGrantTypes.Add(SmsTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(PortalTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(LinkUserTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(WeChatTokenExtensionGrantConsts.OfficialGrantType); + options.PersistentSessionGrantTypes.Add(WeChatTokenExtensionGrantConsts.MiniProgramGrantType); + options.PersistentSessionGrantTypes.Add(AbpWeChatWorkGlobalConsts.GrantType); + }); + } + + private void ConfigureEndpoints(IServiceCollection services) + { + // 不需要 + //Configure(options => + //{ + // options.EndpointConfigureActions.Add( + // (context) => + // { + // context.Endpoints.MapFallbackToPage("/_Host"); + // }); + //}); + var preActions = services.GetPreConfigureActions(); + + services.AddAbpApiVersioning(options => + { + options.ReportApiVersions = true; + options.AssumeDefaultVersionWhenUnspecified = true; + + //options.ApiVersionReader = new HeaderApiVersionReader("api-version"); //Supports header too + //options.ApiVersionReader = new MediaTypeApiVersionReader(); //Supports accept header too + }, mvcOptions => + { + mvcOptions.ConfigureAbp(preActions.Configure()); + }); + + //services.AddApiVersioning(config => + //{ + // // Specify the default API Version as 1.0 + // config.DefaultApiVersion = new ApiVersion(1, 0); + // // Advertise the API versions supported for the particular endpoint (through 'api-supported-versions' response header which lists all available API versions for that endpoint) + // config.ReportApiVersions = true; + //}); + + //services.AddVersionedApiExplorer(options => + //{ + // // add the versioned api explorer, which also adds IApiVersionDescriptionProvider service + // // note: the specified format code will format the version as "'v'major[.minor][-status]" + // options.GroupNameFormat = "'v'VVV"; + + // // note: this option is only necessary when versioning by url segment. the SubstitutionFormat + // // can also be used to control the format of the API version in route templates + // options.SubstituteApiVersionInUrl = true; + //}); + } + + private void ConfigureKestrelServer() + { + Configure(options => + { + options.Limits.MaxRequestBodySize = null; + options.Limits.MaxRequestBufferSize = null; + }); + } + + private void ConfigureBlobStoring(IConfiguration configuration) + { + Configure(options => + { + options.Containers.ConfigureAll((containerName, containerConfiguration) => + { + containerConfiguration.UseFileSystem(fileSystem => + { + fileSystem.BasePath = Path.Combine(Directory.GetCurrentDirectory(), "blobs"); + }); + + //containerConfiguration.UseMinio(minio => + //{ + // configuration.GetSection("Minio").Bind(minio); + //}); + }); + }); + } + + private void ConfigureBackgroundTasks() + { + Configure(options => + { + options.NodeName = ApplicationName; + options.JobCleanEnabled = true; + options.JobFetchEnabled = true; + options.JobCheckEnabled = true; + }); + } + + private void ConfigureTextTemplating(IConfiguration configuration) + { + if (configuration.GetValue("TextTemplating:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicTemplateDefinitionStoreEnabled = true; + }); + } + } + + private void ConfigureFeatureManagement(IConfiguration configuration) + { + if (configuration.GetValue("FeatureManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicFeatureStoreEnabled = true; + }); + } + Configure(options => + { + options.ProviderPolicies[EditionFeatureValueProvider.ProviderName] = AbpSaasPermissions.Editions.ManageFeatures; + options.ProviderPolicies[TenantFeatureValueProvider.ProviderName] = AbpSaasPermissions.Tenants.ManageFeatures; + }); + } + + private void ConfigureSettingManagement(IConfiguration configuration) + { + if (configuration.GetValue("SettingManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicSettingStoreEnabled = true; + }); + } + } + + private void ConfigureWebhooksManagement(IConfiguration configuration) + { + if (configuration.GetValue("WebhooksManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicWebhookStoreEnabled = true; + }); + } + } + /// + /// 配置数据导出 + /// + private void ConfigureExporter() + { + Configure(options => + { + // options.MapExportSetting(typeof(BookDto), config => + // { + // config.DynamicColumns = new[] + // { + // // 忽略某些字段 + // new DynamicExcelColumn(nameof(BookDto.AuthorId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.LastModificationTime)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.LastModifierId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.CreationTime)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.CreatorId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.Id)){ Ignore = true }, + // }; + // }); + }); + } + /// + /// 配置数据权限 + /// + private void ConfigureEntityDataProtected() + { + // Configure(options => + // { + // options.AddEntities(typeof(DemoResource), + // new[] + // { + // typeof(Book), + // }); + // }); + } + + private void ConfigurePermissionManagement(IConfiguration configuration) + { + if (configuration.GetValue("PermissionManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicPermissionStoreEnabled = true; + }); + } + Configure(options => + { + // Rename IdentityServer.Client.ManagePermissions + // See https://github.com/abpframework/abp/blob/dev/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs + options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpOpenIddictPermissions.Applications.ManagePermissions; + + //if (configuration.GetValue("AuthServer:UseOpenIddict")) + //{ + // options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpOpenIddictPermissions.Applications.ManagePermissions; + //} + //else + //{ + // options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpIdentityServerPermissions.Clients.ManagePermissions; + //} + }); + } + + private void ConfigureNotificationManagement(IConfiguration configuration) + { + if (configuration.GetValue("NotificationsManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicNotificationsStoreEnabled = true; + }); + } + } + + private void ConfigureDistributedLock(IServiceCollection services, IConfiguration configuration) + { + var distributedLockEnabled = configuration["DistributedLock:IsEnabled"]; + if (distributedLockEnabled.IsNullOrEmpty() || bool.Parse(distributedLockEnabled)) + { + var redis = ConnectionMultiplexer.Connect(configuration["DistributedLock:Redis:Configuration"]); + services.AddSingleton(_ => new RedisDistributedSynchronizationProvider(redis.GetDatabase())); + } + } + + private void ConfigureVirtualFileSystem() + { + Configure(options => + { + options.FileSets.AddEmbedded("LY.MicroService.Applications.Single"); + }); + } + + private void ConfigureIdempotent() + { + Configure(options => + { + options.IsEnabled = true; + options.DefaultTimeout = 0; + }); + } + + private void ConfigureDbContext() + { + Configure(options => + { + // AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);//解决PostgreSql设置为utc时间后无法写入local时区的问题 + // options.UseNpgsql(); + + options.UseMySQL(); + }); + } + + private void ConfigureDataSeeder() + { + Configure(options => + { + options.Resources.Add(new CustomIdentityResources.AvatarUrl()); + }); + } + + private void ConfigureExceptionHandling() + { + // 自定义需要处理的异常 + Configure(options => + { + // 加入需要处理的异常类型 + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + }); + // 自定义需要发送邮件通知的异常类型 + Configure(options => + { + // 是否发送堆栈信息 + options.SendStackTrace = true; + // 未指定异常接收者的默认接收邮件 + // 指定自己的邮件地址 + }); + + Configure(options => + { + options.SendStackTraceToClients = false; + options.SendExceptionsDetailsToClients = false; + }); + } + + private void ConfigureJsonSerializer(IConfiguration configuration) + { + // 统一时间日期格式 + Configure(options => + { + var jsonConfiguration = configuration.GetSection("Json"); + if (jsonConfiguration.Exists()) + { + jsonConfiguration.Bind(options); + } + }); + // 中文序列化的编码问题 + Configure(options => + { + options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); + }); + } + + private void ConfigureCaching(IConfiguration configuration) + { + Configure(options => + { + configuration.GetSection("DistributedCache").Bind(options); + }); + + Configure(options => + { + var redisConfig = ConfigurationOptions.Parse(options.Configuration); + options.ConfigurationOptions = redisConfig; + options.InstanceName = configuration["Redis:InstanceName"]; + }); + } + + private void ConfigureMultiTenancy(IConfiguration configuration) + { + // 多租户 + Configure(options => + { + options.IsEnabled = true; + }); + + var tenantResolveCfg = configuration.GetSection("App:Domains"); + if (tenantResolveCfg.Exists()) + { + Configure(options => + { + var domains = tenantResolveCfg.Get(); + foreach (var domain in domains) + { + options.AddDomainTenantResolver(domain); + } + }); + } + } + + private void ConfigureAuditing(IConfiguration configuration) + { + Configure(options => + { + options.ApplicationName = ApplicationName; + // 是否启用实体变更记录 + var allEntitiesSelectorIsEnabled = configuration["Auditing:AllEntitiesSelector"]; + if (allEntitiesSelectorIsEnabled.IsNullOrWhiteSpace() || + (bool.TryParse(allEntitiesSelectorIsEnabled, out var enabled) && enabled)) + { + options.EntityHistorySelectors.AddAllEntities(); + } + }); + } + + private void ConfigureSwagger(IServiceCollection services) + { + // Swagger + services.AddSwaggerGen( + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "App API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + Name = "Authorization", + In = ParameterLocation.Header, + Scheme = "bearer", + Type = SecuritySchemeType.Http, + BearerFormat = "JWT" + }); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } + }, + new string[] { } + } + }); + options.OperationFilter(); + }); + } + + private void ConfigureIdentity(IConfiguration configuration) + { + // 增加配置文件定义,在新建租户时需要 + Configure(options => + { + var identityConfiguration = configuration.GetSection("Identity"); + if (identityConfiguration.Exists()) + { + identityConfiguration.Bind(options); + } + }); + Configure(options => + { + options.IsDynamicClaimsEnabled = true; + }); + Configure(options => + { + options.IsCleanupEnabled = true; + }); + } + + private void ConfigureMvcUiTheme() + { + Configure(options => + { + //options.StyleBundles.Configure( + // LeptonXLiteThemeBundles.Styles.Global, + // bundle => + // { + // bundle.AddFiles("/global-styles.css"); + // } + //); + }); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + + options + .AddLanguagesMapOrUpdate( + "vue-admin-element-ui", + new NameValue("zh-Hans", "zh"), + new NameValue("en", "en")); + + // vben admin 语言映射 + options + .AddLanguagesMapOrUpdate( + "vben-admin-ui", + new NameValue("zh_CN", "zh-Hans")); + + options.Resources.Get() + .AddBaseTypes( + typeof(IdentityResource), + typeof(AliyunResource), + typeof(TencentCloudResource), + typeof(WeChatResource), + typeof(PlatformResource), + typeof(AbpOpenIddictResource), + typeof(AbpIdentityServerResource)); + + options.UseAllPersistence(); + }); + + Configure(options => + { + var zhHansCultureMapInfo = new CultureMapInfo + { + TargetCulture = "zh-Hans", + SourceCultures = new string[] { "zh", "zh_CN", "zh-CN" } + }; + + options.CulturesMaps.Add(zhHansCultureMapInfo); + options.UiCulturesMaps.Add(zhHansCultureMapInfo); + }); + } + + private void ConfigureWrapper() + { + Configure(options => + { + options.IsEnabled = true; + // options.IsWrapUnauthorizedEnabled = true; + options.IgnoreNamespaces.Add("Elsa"); + }); + } + + private void PreConfigureWrapper() + { + //PreConfigure(options => + //{ + // options.ProxyRequestActions.Add( + // (appid, httprequestmessage) => + // { + // httprequestmessage.Headers.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + // }); + //}); + + PreConfigure(options => + { + options.ProxyClientActions.Add( + (_, _, client) => + { + client.DefaultRequestHeaders.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + }); + }); + } + + private void ConfigureAuditing() + { + Configure(options => + { + // options.IsEnabledForGetRequests = true; + options.ApplicationName = ApplicationName; + }); + } + + private void ConfigureUrls(IConfiguration configuration) + { + Configure(options => + { + var applicationConfiguration = configuration.GetSection("App:Urls:Applications"); + foreach (var appConfig in applicationConfiguration.GetChildren()) + { + options.Applications[appConfig.Key].RootUrl = appConfig["RootUrl"]; + foreach (var urlsConfig in appConfig.GetSection("Urls").GetChildren()) + { + options.Applications[appConfig.Key].Urls[urlsConfig.Key] = urlsConfig.Value; + } + } + }); + } + + private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false) + { + Configure(options => + { + options.AutoValidate = false; + }); + + services.Replace(ServiceLifetime.Scoped); + + services.AddAuthentication() + .AddAbpJwtBearer(options => + { + configuration.GetSection("AuthServer").Bind(options); + + options.Events ??= new JwtBearerEvents(); + options.Events.OnMessageReceived = context => + { + var accessToken = context.Request.Query["access_token"]; + var path = context.HttpContext.Request.Path; + if (!string.IsNullOrEmpty(accessToken) && + (path.StartsWithSegments("/api/files"))) + { + context.Token = accessToken; + } + return Task.CompletedTask; + }; + }); + + if (!isDevelopment) + { + var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); + services + .AddDataProtection() + .SetApplicationName("LINGYUN.Abp.Application") + .PersistKeysToStackExchangeRedis(redis, "LINGYUN.Abp.Application:DataProtection:Protection-Keys"); + } + + services.AddSameSiteCookiePolicy(); + } + + private void ConfigureCors(IServiceCollection services, IConfiguration configuration) + { + services.AddCors(options => + { + options.AddPolicy(DefaultCorsPolicyName, builder => + { + builder + .WithOrigins( + configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .WithAbpWrapExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + private void ConfigureWeChat() + { + Configure(options => + { + // 回复文本消息 + options.MapMessage< + LINGYUN.Abp.WeChat.Official.Messages.Models.TextMessage, + TextMessageReplyContributor>(); + // 处理关注事件 + options.MapEvent< + LINGYUN.Abp.WeChat.Official.Messages.Models.UserSubscribeEvent, + UserSubscribeEventContributor>(); + + options.MapMessage< + LINGYUN.Abp.WeChat.Work.Common.Messages.Models.TextMessage, + WeChat.Work.Messages.TextMessageReplyContributor>(); + }); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.cs b/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.cs new file mode 100644 index 000000000..b83019ebb --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/MicroServiceApplicationsSingleModule.cs @@ -0,0 +1,394 @@ +using LINGYUN.Abp.Account; +using LINGYUN.Abp.Account.Templates; +using LINGYUN.Abp.Aliyun.SettingManagement; +using LINGYUN.Abp.AspNetCore.HttpOverrides; +using LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper; +using LINGYUN.Abp.AspNetCore.Mvc.Localization; +using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; +using LINGYUN.Abp.Auditing; +using LINGYUN.Abp.AuditLogging.EntityFrameworkCore; +using LINGYUN.Abp.Authentication.QQ; +using LINGYUN.Abp.Authentication.WeChat; +using LINGYUN.Abp.Authorization.OrganizationUnits; +using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.BackgroundTasks.Activities; +using LINGYUN.Abp.BackgroundTasks.DistributedLocking; +using LINGYUN.Abp.BackgroundTasks.EventBus; +using LINGYUN.Abp.BackgroundTasks.ExceptionHandling; +using LINGYUN.Abp.BackgroundTasks.Jobs; +using LINGYUN.Abp.BackgroundTasks.Notifications; +using LINGYUN.Abp.BackgroundTasks.Quartz; +using LINGYUN.Abp.CachingManagement; +using LINGYUN.Abp.CachingManagement.StackExchangeRedis; +using LINGYUN.Abp.Dapr.Client; +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore; +// using LINGYUN.Abp.Demo; +// using LINGYUN.Abp.Demo.EntityFrameworkCore; +using LINGYUN.Abp.ExceptionHandling; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.Exporter.MiniExcel; +using LINGYUN.Abp.FeatureManagement; +using LINGYUN.Abp.FeatureManagement.HttpApi; +using LINGYUN.Abp.Features.LimitValidation; +using LINGYUN.Abp.Features.LimitValidation.Redis.Client; +using LINGYUN.Abp.Http.Client.Wrapper; +using LINGYUN.Abp.Identity; +using LINGYUN.Abp.Identity.AspNetCore.Session; +using LINGYUN.Abp.Identity.EntityFrameworkCore; +using LINGYUN.Abp.Identity.Notifications; +using LINGYUN.Abp.Identity.OrganizaztionUnits; +using LINGYUN.Abp.Identity.Session.AspNetCore; +using LINGYUN.Abp.Identity.WeChat; +using LINGYUN.Abp.IdGenerator; +using LINGYUN.Abp.IM.SignalR; +using LINGYUN.Abp.Localization.CultureMap; +using LINGYUN.Abp.Localization.Persistence; +using LINGYUN.Abp.LocalizationManagement; +using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; +using LINGYUN.Abp.MessageService; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.MultiTenancy.Editions; +using LINGYUN.Abp.Notifications; +using LINGYUN.Abp.Notifications.Common; +using LINGYUN.Abp.Notifications.Emailing; +using LINGYUN.Abp.Notifications.EntityFrameworkCore; +using LINGYUN.Abp.Notifications.SignalR; +using LINGYUN.Abp.Notifications.WeChat.MiniProgram; +using LINGYUN.Abp.OpenApi.Authorization; +using LINGYUN.Abp.OpenIddict; +using LINGYUN.Abp.OpenIddict.AspNetCore; +using LINGYUN.Abp.OpenIddict.AspNetCore.Session; +using LINGYUN.Abp.OpenIddict.Portal; +using LINGYUN.Abp.OpenIddict.Sms; +using LINGYUN.Abp.OpenIddict.WeChat; +using LINGYUN.Abp.OpenIddict.WeChat.Work; +using LINGYUN.Abp.OssManagement; +using LINGYUN.Abp.OssManagement.FileSystem; +// using LINGYUN.Abp.OssManagement.Imaging; +using LINGYUN.Abp.OssManagement.SettingManagement; +using LINGYUN.Abp.PermissionManagement; +using LINGYUN.Abp.PermissionManagement.HttpApi; +using LINGYUN.Abp.PermissionManagement.OrganizationUnits; +using LINGYUN.Abp.Saas; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using LINGYUN.Abp.SettingManagement; +using LINGYUN.Abp.Sms.Aliyun; +using LINGYUN.Abp.TaskManagement; +using LINGYUN.Abp.TaskManagement.EntityFrameworkCore; +using LINGYUN.Abp.Tencent.QQ; +using LINGYUN.Abp.Tencent.SettingManagement; +using LINGYUN.Abp.TextTemplating; +using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; +using LINGYUN.Abp.UI.Navigation; +using LINGYUN.Abp.UI.Navigation.VueVbenAdmin; +using LINGYUN.Abp.Webhooks; +using LINGYUN.Abp.Webhooks.EventBus; +using LINGYUN.Abp.Webhooks.Identity; +using LINGYUN.Abp.Webhooks.Saas; +using LINGYUN.Abp.WebhooksManagement; +using LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore; +using LINGYUN.Abp.WeChat.MiniProgram; +using LINGYUN.Abp.WeChat.Official; +using LINGYUN.Abp.WeChat.Official.Handlers; +using LINGYUN.Abp.WeChat.SettingManagement; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Handlers; +using LINGYUN.Platform; +using LINGYUN.Platform.EntityFrameworkCore; +using LINGYUN.Platform.HttpApi; +using LINGYUN.Platform.Settings.VueVbenAdmin; +using LINGYUN.Platform.Theme.VueVbenAdmin; +using Volo.Abp; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Authentication.JwtBearer; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Caching.StackExchangeRedis; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore.PostgreSql; +using Volo.Abp.EventBus; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Imaging; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.OpenIddict; +using Volo.Abp.SettingManagement; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.Threading; +// using LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql; +using Volo.Abp.EntityFrameworkCore.MySQL; + +namespace LY.AIO.Applications.Single; + +[DependsOn( + typeof(AbpAccountApplicationModule), + typeof(AbpAccountHttpApiModule), + typeof(AbpAccountWebOpenIddictModule), + typeof(AbpAuditingApplicationModule), + typeof(AbpAuditingHttpApiModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpCachingManagementStackExchangeRedisModule), + typeof(AbpCachingManagementApplicationModule), + typeof(AbpCachingManagementHttpApiModule), + typeof(AbpIdentityAspNetCoreSessionModule), + typeof(AbpIdentitySessionAspNetCoreModule), + typeof(AbpIdentityNotificationsModule), + typeof(AbpIdentityDomainModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementDomainModule), + typeof(AbpLocalizationManagementApplicationModule), + typeof(AbpLocalizationManagementHttpApiModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpSerilogEnrichersApplicationModule), + typeof(AbpSerilogEnrichersUniqueIdModule), + typeof(AbpMessageServiceDomainModule), + typeof(AbpMessageServiceApplicationModule), + typeof(AbpMessageServiceHttpApiModule), + typeof(AbpMessageServiceEntityFrameworkCoreModule), + typeof(AbpNotificationsDomainModule), + typeof(AbpNotificationsApplicationModule), + typeof(AbpNotificationsHttpApiModule), + typeof(AbpNotificationsEntityFrameworkCoreModule), + + //typeof(AbpIdentityServerSessionModule), + //typeof(AbpIdentityServerApplicationModule), + //typeof(AbpIdentityServerHttpApiModule), + //typeof(AbpIdentityServerEntityFrameworkCoreModule), + + typeof(AbpOpenIddictAspNetCoreModule), + typeof(AbpOpenIddictAspNetCoreSessionModule), + typeof(AbpOpenIddictApplicationModule), + typeof(AbpOpenIddictHttpApiModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpOpenIddictSmsModule), + typeof(AbpOpenIddictPortalModule), + typeof(AbpOpenIddictWeChatModule), + typeof(AbpOpenIddictWeChatWorkModule), + + //typeof(AbpOssManagementMinioModule), // 取消注释以使用Minio + typeof(AbpOssManagementFileSystemModule), + // typeof(AbpOssManagementImagingModule), + typeof(AbpOssManagementDomainModule), + typeof(AbpOssManagementApplicationModule), + typeof(AbpOssManagementHttpApiModule), + typeof(AbpOssManagementSettingManagementModule), + typeof(AbpImagingImageSharpModule), + + typeof(PlatformDomainModule), + typeof(PlatformApplicationModule), + typeof(PlatformHttpApiModule), + typeof(PlatformEntityFrameworkCoreModule), + typeof(PlatformSettingsVueVbenAdminModule), + typeof(PlatformThemeVueVbenAdminModule), + typeof(AbpUINavigationVueVbenAdminModule), + + typeof(AbpSaasDomainModule), + typeof(AbpSaasApplicationModule), + typeof(AbpSaasHttpApiModule), + typeof(AbpSaasEntityFrameworkCoreModule), + + typeof(TaskManagementDomainModule), + typeof(TaskManagementApplicationModule), + typeof(TaskManagementHttpApiModule), + typeof(TaskManagementEntityFrameworkCoreModule), + + typeof(AbpTextTemplatingDomainModule), + typeof(AbpTextTemplatingApplicationModule), + typeof(AbpTextTemplatingHttpApiModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + + typeof(AbpWebhooksModule), + typeof(AbpWebhooksEventBusModule), + typeof(AbpWebhooksIdentityModule), + typeof(AbpWebhooksSaasModule), + typeof(WebhooksManagementDomainModule), + typeof(WebhooksManagementApplicationModule), + typeof(WebhooksManagementHttpApiModule), + typeof(WebhooksManagementEntityFrameworkCoreModule), + + typeof(AbpFeatureManagementApplicationModule), + typeof(AbpFeatureManagementHttpApiModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + + typeof(AbpSettingManagementDomainModule), + typeof(AbpSettingManagementApplicationModule), + typeof(AbpSettingManagementHttpApiModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + // typeof(AbpPermissionManagementDomainIdentityServerModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementDomainOrganizationUnitsModule), // 组织机构权限管理 + + // typeof(AbpEntityFrameworkCorePostgreSqlModule), + typeof(AbpEntityFrameworkCoreMySQLModule), + + typeof(AbpAliyunSmsModule), + typeof(AbpAliyunSettingManagementModule), + + typeof(AbpAuthenticationQQModule), + typeof(AbpAuthenticationWeChatModule), + typeof(AbpAuthorizationOrganizationUnitsModule), + typeof(AbpIdentityOrganizaztionUnitsModule), + + typeof(AbpBackgroundTasksModule), + typeof(AbpBackgroundTasksActivitiesModule), + typeof(AbpBackgroundTasksDistributedLockingModule), + typeof(AbpBackgroundTasksEventBusModule), + typeof(AbpBackgroundTasksExceptionHandlingModule), + typeof(AbpBackgroundTasksJobsModule), + typeof(AbpBackgroundTasksNotificationsModule), + typeof(AbpBackgroundTasksQuartzModule), + + typeof(AbpDataProtectionManagementApplicationModule), + typeof(AbpDataProtectionManagementHttpApiModule), + typeof(AbpDataProtectionManagementEntityFrameworkCoreModule), + + // typeof(AbpDemoApplicationModule), + // typeof(AbpDemoHttpApiModule), + // typeof(AbpDemoEntityFrameworkCoreModule), + + typeof(AbpDaprClientModule), + typeof(AbpExceptionHandlingModule), + typeof(AbpEmailingExceptionHandlingModule), + typeof(AbpFeaturesLimitValidationModule), + typeof(AbpFeaturesValidationRedisClientModule), + typeof(AbpAspNetCoreMvcLocalizationModule), + + typeof(AbpLocalizationCultureMapModule), + typeof(AbpLocalizationPersistenceModule), + + typeof(AbpOpenApiAuthorizationModule), + + typeof(AbpIMSignalRModule), + + typeof(AbpNotificationsModule), + typeof(AbpNotificationsCommonModule), + typeof(AbpNotificationsSignalRModule), + typeof(AbpNotificationsEmailingModule), + typeof(AbpMultiTenancyEditionsModule), + + typeof(AbpTencentQQModule), + typeof(AbpTencentCloudSettingManagementModule), + + typeof(AbpIdentityWeChatModule), + typeof(AbpNotificationsWeChatMiniProgramModule), + typeof(AbpWeChatMiniProgramModule), + typeof(AbpWeChatOfficialModule), + typeof(AbpWeChatOfficialApplicationModule), + typeof(AbpWeChatOfficialHttpApiModule), + typeof(AbpWeChatWorkModule), + typeof(AbpWeChatWorkApplicationModule), + typeof(AbpWeChatWorkHttpApiModule), + typeof(AbpWeChatOfficialHandlersModule), + typeof(AbpWeChatWorkHandlersModule), + typeof(AbpWeChatSettingManagementModule), + + typeof(AbpDataDbMigratorModule), + typeof(AbpIdGeneratorModule), + typeof(AbpUINavigationModule), + typeof(AbpAccountTemplatesModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpCachingStackExchangeRedisModule), + // typeof(AbpElsaModule), + // typeof(AbpElsaServerModule), + // typeof(AbpElsaActivitiesModule), + // typeof(AbpElsaEntityFrameworkCoreModule), + // typeof(AbpElsaEntityFrameworkCorePostgreSqlModule), + // typeof(AbpElsaModule), + // typeof(AbpElsaServerModule), + // typeof(AbpElsaActivitiesModule), + // typeof(AbpElsaEntityFrameworkCoreModule), + // typeof(AbpElsaEntityFrameworkCoreMySqlModule), + + typeof(AbpExporterMiniExcelModule), + typeof(AbpAspNetCoreMvcUiMultiTenancyModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpHttpClientWrapperModule), + typeof(AbpAspNetCoreMvcWrapperModule), + typeof(AbpAspNetCoreMvcIdempotentWrapperModule), + typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpEventBusModule), + typeof(AbpAutofacModule) + )] +public partial class MicroServiceApplicationsSingleModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + PreConfigureWrapper(); + PreConfigureFeature(); + PreConfigureIdentity(); + PreConfigureApp(configuration); + PreConfigureQuartz(configuration); + PreConfigureAuthServer(configuration); + PreConfigureElsa(context.Services, configuration); + PreConfigureCertificate(configuration, hostingEnvironment); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + ConfigureWeChat(); + ConfigureWrapper(); + ConfigureExporter(); + ConfigureAuditing(); + ConfigureDbContext(); + ConfigureIdempotent(); + ConfigureMvcUiTheme(); + ConfigureDataSeeder(); + ConfigureLocalization(); + ConfigureKestrelServer(); + ConfigureBackgroundTasks(); + ConfigureExceptionHandling(); + ConfigureVirtualFileSystem(); + ConfigureEntityDataProtected(); + ConfigureUrls(configuration); + ConfigureCaching(configuration); + ConfigureAuditing(configuration); + ConfigureIdentity(configuration); + ConfigureAuthServer(configuration); + ConfigureSwagger(context.Services); + ConfigureEndpoints(context.Services); + ConfigureBlobStoring(configuration); + ConfigureMultiTenancy(configuration); + ConfigureJsonSerializer(configuration); + ConfigureTextTemplating(configuration); + ConfigureFeatureManagement(configuration); + ConfigureSettingManagement(configuration); + ConfigureWebhooksManagement(configuration); + ConfigurePermissionManagement(configuration); + ConfigureNotificationManagement(configuration); + ConfigureCors(context.Services, configuration); + ConfigureDistributedLock(context.Services, configuration); + ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(async () => await OnApplicationInitializationAsync(context)); + } + + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await context.ServiceProvider.GetRequiredService().SeedAsync(); ; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs b/aspnet-core/services/LY.AIO.Applications.Single/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs new file mode 100644 index 000000000..9413fb658 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs @@ -0,0 +1,67 @@ +namespace LY.AIO.Applications.Single.Microsoft.Extensions.DependencyInjection +{ + public static class SameSiteCookiesServiceCollectionExtensions + { + public static IServiceCollection AddSameSiteCookiePolicy(this IServiceCollection services) + { + services.Configure(options => + { + options.MinimumSameSitePolicy = SameSiteMode.Unspecified; + options.OnAppendCookie = cookieContext => + CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); + options.OnDeleteCookie = cookieContext => + CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); + }); + + return services; + } + + private static void CheckSameSite(HttpContext httpContext, CookieOptions options) + { + if (options.SameSite == SameSiteMode.None) + { + var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); + if (!httpContext.Request.IsHttps || DisallowsSameSiteNone(userAgent)) + { + // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1) + options.SameSite = SameSiteMode.Unspecified; + } + } + } + + private static bool DisallowsSameSiteNone(string userAgent) + { + // Cover all iOS based browsers here. This includes: + // - Safari on iOS 12 for iPhone, iPod Touch, iPad + // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad + // - Chrome on iOS 12 for iPhone, iPod Touch, iPad + // All of which are broken by SameSite=None, because they use the iOS networking stack + if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12")) + { + return true; + } + + // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes: + // - Safari on Mac OS X. + // This does not include: + // - Chrome on Mac OS X + // Because they do not use the Mac OS networking stack. + if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && + userAgent.Contains("Version/") && userAgent.Contains("Safari")) + { + return true; + } + + // Cover Chrome 50-69, because some versions are broken by SameSite=None, + // and none in this range require it. + // Note: this covers some pre-Chromium Edge versions, + // but pre-Chromium Edge does not require SameSite=None. + if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6")) + { + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/ITenantConfigurationCache.cs b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/ITenantConfigurationCache.cs new file mode 100644 index 000000000..475466d04 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/ITenantConfigurationCache.cs @@ -0,0 +1,10 @@ +using Volo.Abp.MultiTenancy; + +namespace LY.AIO.Applications.Single.MultiTenancy; + +public interface ITenantConfigurationCache +{ + Task RefreshAsync(); + + Task> GetTenantsAsync(); +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCache.cs b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCache.cs new file mode 100644 index 000000000..e6d81bdcc --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCache.cs @@ -0,0 +1,59 @@ +using LINGYUN.Abp.Saas.Tenants; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace LY.AIO.Applications.Single.MultiTenancy; + +public class TenantConfigurationCache : ITenantConfigurationCache, ITransientDependency +{ + protected ITenantRepository TenantRepository { get; } + protected IDistributedCache TenantCache { get; } + + public TenantConfigurationCache( + ITenantRepository tenantRepository, + IDistributedCache tenantCache) + { + TenantRepository = tenantRepository; + TenantCache = tenantCache; + } + + public async virtual Task RefreshAsync() + { + var cacheKey = GetCacheKey(); + + await TenantCache.RemoveAsync(cacheKey); + } + + public async virtual Task> GetTenantsAsync() + { + return (await GetForCacheItemAsync()).Tenants; + } + + protected async virtual Task GetForCacheItemAsync() + { + var cacheKey = GetCacheKey(); + var cacheItem = await TenantCache.GetAsync(cacheKey); + if (cacheItem == null) + { + var allActiveTenants = await TenantRepository.GetListAsync(); + + cacheItem = new TenantConfigurationCacheItem( + allActiveTenants + .Where(t => t.IsActive) + .Select(t => new TenantConfiguration(t.Id, t.Name) + { + IsActive = t.IsActive, + }).ToList()); + + await TenantCache.SetAsync(cacheKey, cacheItem); + } + + return cacheItem; + } + + protected virtual string GetCacheKey() + { + return "_Abp_Tenant_Configuration"; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCacheItem.cs b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCacheItem.cs new file mode 100644 index 000000000..023235e3e --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/MultiTenancy/TenantConfigurationCacheItem.cs @@ -0,0 +1,19 @@ +using Volo.Abp.MultiTenancy; + +namespace LY.AIO.Applications.Single.MultiTenancy; + +[IgnoreMultiTenancy] +public class TenantConfigurationCacheItem +{ + public List Tenants { get; set; } + + public TenantConfigurationCacheItem() + { + Tenants = new List(); + } + + public TenantConfigurationCacheItem(List tenants) + { + Tenants = tenants; + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml new file mode 100644 index 000000000..aed9202eb --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml @@ -0,0 +1,103 @@ +@using Volo.Abp.Account.Localization +@using Volo.Abp.Users +@using Microsoft.AspNetCore.Mvc.Localization +@using Microsoft.Extensions.Localization +@using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.Data +@using Volo.Abp.Identity.Settings +@using Volo.Abp.Localization +@using Volo.Abp.Settings +@using Volo.Abp.ObjectExtending +@inject IHtmlLocalizer L +@inject ICurrentUser CurrentUser +@inject ISettingProvider SettingManager +@inject IThemeManager ThemeManager +@inject IStringLocalizerFactory StringLocalizerFactory +@model Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo.AccountProfilePersonalInfoManagementGroupViewComponent.PersonalInfoModel +@{ + var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); + + var isEmailUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); +} + +

@L["PersonalSettings"]


+
+ + + + + + + + + + + + + + + + + + + + @if (CurrentUser.EmailVerified) + { + + } + else + { + @**@ + @L["Validation"].Value + } + + + + + + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) + { + var isAllowed = propertyInfo.Configuration.GetOrDefault(IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit); + + if (isAllowed == null || !isAllowed.Equals(true)) + { + continue; + } + + if (!propertyInfo.Name.EndsWith("_Text")) + { + if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty()) + { + if (propertyInfo.Type.IsEnum) + { + Model.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type); + } + + + } + else + { + + } + } + } + + + diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js new file mode 100644 index 000000000..55a88e52e --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js @@ -0,0 +1,28 @@ +(function ($) { + $(function () { + var l = abp.localization.getResource("AbpAccount"); + + $('#PersonalSettingsForm').submit(function (e) { + e.preventDefault(); + + if (!$('#PersonalSettingsForm').valid()) { + return false; + } + + var input = $('#PersonalSettingsForm').serializeFormToObject(); + + volo.abp.account.profile.update(input).then(function (result) { + abp.notify.success(l('PersonalSettingsSaved')); + updateConcurrencyStamp(); + }); + }); + }); + + abp.event.on('passwordChanged', updateConcurrencyStamp); + + function updateConcurrencyStamp(){ + volo.abp.account.profile.get().then(function(profile){ + $("#ConcurrencyStamp").val(profile.concurrencyStamp); + }); + } +})(jQuery); diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml new file mode 100644 index 000000000..63e834b2b --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml @@ -0,0 +1,17 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model LY.AIO.Applications.Single.Pages.Account.EmailConfirmModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +
+
+

@L["EmailConfirm"]

+
+ + + @L["Cancel"] + + +
+
diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml.cs new file mode 100644 index 000000000..ea7b4671c --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirm.cshtml.cs @@ -0,0 +1,72 @@ +using LINGYUN.Abp.Account; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class EmailConfirmModel : AccountPageModel + { + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid UserId { get; set; } + + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ConfirmToken { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public IMyProfileAppService MyProfileAppService { get; set; } + + public EmailConfirmModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public async virtual Task OnPostAsync() + { + try + { + ValidateModel(); + + await MyProfileAppService.ConfirmEmailAsync( + new ConfirmEmailInput + { + ConfirmToken = ConfirmToken, + }); + } + catch (AbpIdentityResultException e) + { + if (!string.IsNullOrWhiteSpace(e.Message)) + { + Alerts.Warning(GetLocalizeExceptionMessage(e)); + return Page(); + } + + throw; + } + catch (AbpValidationException) + { + return Page(); + } + + return RedirectToPage("./ConfirmEmailConfirmation", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash + }); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml new file mode 100644 index 000000000..56c00aeaf --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml @@ -0,0 +1,13 @@ +@page +@model LY.AIO.Applications.Single.Pages.Account.EmailConfirmConfirmationModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@inject IHtmlLocalizer L +
+
+

@L["EmailConfirm"]

+

@L["YourEmailIsSuccessfullyConfirm"]

+ @L["GoToTheApplication"] +
+
diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml.cs new file mode 100644 index 000000000..a66f51c1b --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/EmailConfirmConfirmation.cshtml.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Account.Web.Pages.Account; + +namespace LY.AIO.Applications.Single.Pages.Account; + +[AllowAnonymous] +public class EmailConfirmConfirmationModel : AccountPageModel +{ + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public async virtual Task OnGetAsync() + { + ReturnUrl = await GetRedirectUrlAsync(ReturnUrl, ReturnUrlHash); + + return Page(); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml new file mode 100644 index 000000000..1598132ba --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml @@ -0,0 +1,26 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model LY.AIO.Applications.Single.Pages.Account.SendCodeModel +@inject IHtmlLocalizer L + +
+
+

@L["TwoFactor"]

+
+ + + +
+ +
+
+ @L["SendVerifyCode"] +
+ + @L["Login"] + + +
+
+ diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml.cs new file mode 100644 index 000000000..34b2f4c86 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendCode.cshtml.cs @@ -0,0 +1,125 @@ +using LINGYUN.Abp.Account.Emailing; +using LINGYUN.Abp.Identity.Settings; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Volo.Abp; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Sms; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class SendCodeModel : AccountPageModel + { + [BindProperty] + public SendCodeInputModel Input { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public bool RememberMe { get; set; } + + public IEnumerable Providers { get; set; } + + protected ISmsSender SmsSender { get; } + + protected IAccountEmailVerifySender AccountEmailVerifySender { get; } + + public SendCodeModel( + ISmsSender smsSender, + IAccountEmailVerifySender accountEmailVerifySender) + { + SmsSender = smsSender; + AccountEmailVerifySender = accountEmailVerifySender; + + LocalizationResourceType = typeof(AccountResource); + } + + public virtual async Task OnGetAsync() + { + Input = new SendCodeInputModel(); + + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + // ˫������Ϣ��֤ʧ��,һ�㶼�dz�ʱ�˻����û���Ϣ��� + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + var userFactors = await UserManager.GetValidTwoFactorProvidersAsync(user); + Providers = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + + if (Input.SelectedProvider == "Authenticator") + { + // �û�ͨ���ʼ�/�������ӽ�����Ȩҳ�� + return RedirectToPage("VerifyAuthenticatorCode", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = RememberMe + }); + } + // ������֤�� + var code = await UserManager.GenerateTwoFactorTokenAsync(user, Input.SelectedProvider); + if (string.IsNullOrWhiteSpace(code)) + { + Alerts.Warning(L["InvaidGenerateTwoFactorToken"]); + return Page(); + } + + if (Input.SelectedProvider == "Email") + { + await AccountEmailVerifySender + .SendMailLoginVerifyCodeAsync( + code, + user.UserName, + user.Email); + } + else if (Input.SelectedProvider == "Phone") + { + var phoneNumber = await UserManager.GetPhoneNumberAsync(user); + var templateCode = await SettingProvider.GetOrNullAsync(IdentitySettingNames.User.SmsUserSignin); + Check.NotNullOrWhiteSpace(templateCode, nameof(IdentitySettingNames.User.SmsUserSignin)); + + // TODO: �Ժ���չ����ģ�巢�� + var smsMessage = new SmsMessage(phoneNumber, code); + smsMessage.Properties.Add("code", code); + smsMessage.Properties.Add("TemplateCode", templateCode); + + await SmsSender.SendAsync(smsMessage); + } + + return RedirectToPage("VerifyCode", new + { + provider = Input.SelectedProvider, + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = RememberMe + }); + } + } + + public class SendCodeInputModel + { + public string SelectedProvider { get; set; } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml new file mode 100644 index 000000000..68bc7890d --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml @@ -0,0 +1,16 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model LY.AIO.Applications.Single.Pages.Account.SendEmailConfirmModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +
+
+

@L["EmailConfirm"]

+
+ + @L["Cancel"] + + +
+
diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml.cs new file mode 100644 index 000000000..c2ef4852f --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/SendEmailConfirm.cshtml.cs @@ -0,0 +1,73 @@ +using LINGYUN.Abp.Account; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class SendEmailConfirmModel : AccountPageModel + { + [BindProperty(SupportsGet = true)] + public string Email { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public IMyProfileAppService MyProfileAppService { get; set; } + + public SendEmailConfirmModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public virtual Task OnGetAsync() + { + Email = CurrentUser.Email; + + return Task.FromResult(Page()); + } + + public async virtual Task OnPostAsync() + { + try + { + ValidateModel(); + + await MyProfileAppService.SendEmailConfirmLinkAsync( + new SendEmailConfirmCodeDto + { + Email = Email, + AppName = "MVC", + ReturnUrl = ReturnUrl, + ReturnUrlHash = ReturnUrlHash + }); + } + catch (AbpIdentityResultException e) + { + if (!string.IsNullOrWhiteSpace(e.Message)) + { + Alerts.Warning(GetLocalizeExceptionMessage(e)); + return Page(); + } + + throw; + } + catch (AbpValidationException) + { + return Page(); + } + + return RedirectToPage("~/Account/Manage", new + { + returnUrl = ReturnUrl + }); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/TwoFactorSupportedLoginModel.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/TwoFactorSupportedLoginModel.cs new file mode 100644 index 000000000..322cca6be --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/TwoFactorSupportedLoginModel.cs @@ -0,0 +1,63 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.Account.Web; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.OpenIddict; +using IdentityOptions = Microsoft.AspNetCore.Identity.IdentityOptions; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + /// + /// 重写登录模型,实现双因素登录 + /// + [Dependency(ReplaceServices = true)] + [ExposeServices(typeof(LoginModel), typeof(OpenIddictSupportedLoginModel))] + public class TwoFactorSupportedLoginModel : OpenIddictSupportedLoginModel + { + public TwoFactorSupportedLoginModel( + IAuthenticationSchemeProvider schemeProvider, + IOptions accountOptions, + IOptions identityOptions, + IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, + AbpOpenIddictRequestHelper openIddictRequestHelper) + : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, openIddictRequestHelper) + { + + } + + protected async override Task> GetExternalProviders() + { + var providers = await base.GetExternalProviders(); + + foreach (var provider in providers) + { + var localizedDisplayName = L[provider.DisplayName]; + if (localizedDisplayName.ResourceNotFound) + { + localizedDisplayName = L["AuthenticationScheme:" + provider.DisplayName]; + } + + if (!localizedDisplayName.ResourceNotFound) + { + provider.DisplayName = localizedDisplayName.Value; + } + } + + return providers; + } + + protected override Task TwoFactorLoginResultAsync() + { + // 重定向双因素认证页面 + return Task.FromResult(RedirectToPage("SendCode", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = LoginInput.RememberMe + })); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml new file mode 100644 index 000000000..079925ee4 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml @@ -0,0 +1,4 @@ +@page +@model LY.AIO.Applications.Single.Pages.Account.UseRecoveryCodeModel +@{ +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml.cs new file mode 100644 index 000000000..016bf3771 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/UseRecoveryCode.cshtml.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class UseRecoveryCodeModel : PageModel + { + public void OnGet() + { + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml new file mode 100644 index 000000000..bc3e49acf --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml @@ -0,0 +1,26 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model LY.AIO.Applications.Single.Pages.Account.VerifyAuthenticatorCodeModel +@inject IHtmlLocalizer L +
+
+
+ + +
+ + + +
+
+ + +
+ @L["VerifyAuthenticatorCode"] + + @L["Login"] + +
+
+
\ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml.cs new file mode 100644 index 000000000..9a5d3c6ec --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyAuthenticatorCode.cshtml.cs @@ -0,0 +1,59 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Web.Pages.Account; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class VerifyAuthenticatorCodeModel : AccountPageModel + { + [BindProperty] + public VerifyAuthenticatorCodeInputModel Input { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + [BindProperty(SupportsGet = true)] + public bool RememberBrowser { get; set; } + + [HiddenInput] + public bool RememberMe { get; set; } + + public virtual IActionResult OnGet() + { + Input = new VerifyAuthenticatorCodeInputModel(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + var result = await SignInManager.TwoFactorAuthenticatorSignInAsync(Input.VerifyCode, RememberMe, RememberBrowser); + if (result.Succeeded) + { + return await RedirectSafelyAsync(ReturnUrl, ReturnUrlHash); + } + if (result.IsLockedOut) + { + Logger.LogWarning(7, "User account locked out."); + Alerts.Warning(L["UserLockedOutMessage"]); + return Page(); + } + else + { + Alerts.Danger(L["TwoFactorAuthenticationInvaidUser"]);// TODO: ����״̬��Ľ�� + return Page(); + } + } + } + + public class VerifyAuthenticatorCodeInputModel + { + [Required] + public string VerifyCode { get; set; } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml new file mode 100644 index 000000000..94589fb71 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml @@ -0,0 +1,29 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model LY.AIO.Applications.Single.Pages.Account.VerifyCodeModel +
+
+
+ + + + +
+ +
+ + + + + +
+ @L["VerifyAuthenticatorCode"] +
+ + @L["ReSendVerifyCode"] + +
+
+
diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml.cs new file mode 100644 index 000000000..17ebff5bb --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Account/VerifyCode.cshtml.cs @@ -0,0 +1,90 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; + +namespace LY.AIO.Applications.Single.Pages.Account +{ + public class VerifyCodeModel : AccountPageModel + { + [BindProperty] + public VerifyCodeInputModel Input { get; set; } + /// + /// ˫������֤�ṩ���� + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string Provider { get; set; } + /// + /// �ض���Url + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + /// + /// + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + /// + /// �Ƿ��ס��¼״̬ + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public bool RememberMe { get; set; } + + public VerifyCodeModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public virtual IActionResult OnGet() + { + Input = new VerifyCodeInputModel(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + // ��֤�û���¼״̬ + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + // ˫���ص�¼ + var result = await SignInManager.TwoFactorSignInAsync(Provider, Input.VerifyCode, RememberMe, Input.RememberBrowser); + if (result.Succeeded) + { + return await RedirectSafelyAsync(ReturnUrl, ReturnUrlHash); + } + if (result.IsLockedOut) + { + Logger.LogWarning(7, "User account locked out."); + Alerts.Warning(L["UserLockedOutMessage"]); + return Page(); + } + else + { + Alerts.Danger(L["TwoFactorAuthenticationInvaidUser"]);// TODO: ����״̬��Ľ�� + return Page(); + } + } + } + + public class VerifyCodeInputModel + { + /// + /// �Ƿ���������м�ס��¼״̬ + /// + public bool RememberBrowser { get; set; } + /// + /// ���͵���֤�� + /// + [Required] + public string VerifyCode { get; set; } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml new file mode 100644 index 000000000..f220a0b10 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml @@ -0,0 +1,36 @@ +@page +@using Microsoft.AspNetCore.Mvc.TagHelpers +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Alert +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid +@using Volo.Abp.Users +@model LY.AIO.Applications.Single.Pages.IndexModel +@inject ICurrentUser CurrentUser +@if (CurrentUser.IsAuthenticated) +{ +
+ + + + Logout + + +

@CurrentUser.UserName

+
@CurrentUser.Email
+
+ Roles: @CurrentUser.Roles.JoinAsString(", ") +
+ Claims:
+ @Html.Raw(CurrentUser.GetAllClaims().Select(c => $"{c.Type}={c.Value}").JoinAsString("
")) +
+
+
+
+} + +@if (!CurrentUser.IsAuthenticated) +{ +
+

+ Login +
+} \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml.cs b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml.cs new file mode 100644 index 000000000..5164786e9 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/Index.cshtml.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace LY.AIO.Applications.Single.Pages +{ + public class IndexModel : AbpPageModel + { + public void OnGet() + { + } + } +} \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Pages/_ViewImports.cshtml b/aspnet-core/services/LY.AIO.Applications.Single/Pages/_ViewImports.cshtml new file mode 100644 index 000000000..c1da1f5f1 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Pages/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Program.cs b/aspnet-core/services/LY.AIO.Applications.Single/Program.cs new file mode 100644 index 000000000..7d97a1b43 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Program.cs @@ -0,0 +1,82 @@ +using LINGYUN.Abp.Identity.Session.AspNetCore; +using LY.AIO.Applications.Single; +using Microsoft.AspNetCore.Cors; +using Serilog; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddCors(options => +{ + options.AddDefaultPolicy(policy => + { + policy + .WithOrigins( + builder.Configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .WithAbpWrapExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); +builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog((context, provider, config) => + { + config.ReadFrom.Configuration(context.Configuration); + }); + +await builder.AddApplicationAsync(options => +{ + MicroServiceApplicationsSingleModule.ApplicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") + ?? MicroServiceApplicationsSingleModule.ApplicationName; + options.ApplicationName = MicroServiceApplicationsSingleModule.ApplicationName; + options.Configuration.UserSecretsId = Environment.GetEnvironmentVariable("APPLICATION_USER_SECRETS_ID"); + options.Configuration.UserSecretsAssembly = typeof(MicroServiceApplicationsSingleModule).Assembly; + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); +}); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); + +app.UseForwardedHeaders(); +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} +// app.UseAbpExceptionHandling(); +app.UseCookiePolicy(); +app.UseMapRequestLocalization(); +app.UseCorrelationId(); +app.UseStaticFiles(); +app.UseRouting(); +app.UseCors(); +app.UseAuthentication(); +app.UseMultiTenancy(); +app.UseUnitOfWork(); +app.UseAbpOpenIddictValidation(); +app.UseAbpSession(); +app.UseDynamicClaims(); +app.UseAuthorization(); +app.UseSwagger(); +app.UseSwaggerUI(options => +{ + options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support App API"); +}); +app.UseAuditing(); +app.UseAbpSerilogEnrichers(); +app.UseConfiguredEndpoints(); + +await app.RunAsync(); diff --git a/aspnet-core/services/LY.AIO.Applications.Single/Properties/launchSettings.json b/aspnet-core/services/LY.AIO.Applications.Single/Properties/launchSettings.json new file mode 100644 index 000000000..337677308 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:19139", + "sslPort": 0 + } + }, + "profiles": { + "LY.MicroService.Applications.Single": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30001", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Production" + } + }, + "LY.MicroService.Applications.Single.Development": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/TenantHeaderParamter.cs b/aspnet-core/services/LY.AIO.Applications.Single/TenantHeaderParamter.cs new file mode 100644 index 000000000..9d80a45fd --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/TenantHeaderParamter.cs @@ -0,0 +1,35 @@ +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.MultiTenancy; + +namespace LY.AIO.Applications.Single; + +public class TenantHeaderParamter : IOperationFilter +{ + private readonly AbpMultiTenancyOptions _multiTenancyOptions; + private readonly AbpAspNetCoreMultiTenancyOptions _aspNetCoreMultiTenancyOptions; + public TenantHeaderParamter( + IOptions multiTenancyOptions, + IOptions aspNetCoreMultiTenancyOptions) + { + _multiTenancyOptions = multiTenancyOptions.Value; + _aspNetCoreMultiTenancyOptions = aspNetCoreMultiTenancyOptions.Value; + } + + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (_multiTenancyOptions.IsEnabled) + { + operation.Parameters = operation.Parameters ?? new List(); + operation.Parameters.Add(new OpenApiParameter + { + Name = _aspNetCoreMultiTenancyOptions.TenantKey, + In = ParameterLocation.Header, + Description = "Tenant Id in http header", + Required = false + }); + } + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/TextMessageReplyContributor.cs b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/TextMessageReplyContributor.cs new file mode 100644 index 000000000..593116275 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/TextMessageReplyContributor.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Official.Messages.Models; +using LINGYUN.Abp.WeChat.Official.Services; + +namespace LY.AIO.Applications.Single.WeChat.Official.Messages; +/// +/// 文本消息客服回复 +/// +public class TextMessageReplyContributor : IMessageHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessageModel( + context.Message.FromUserName, + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessage( + context.Message.Content))); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/UserSubscribeEventContributor.cs b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/UserSubscribeEventContributor.cs new file mode 100644 index 000000000..249105de0 --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Official/Messages/UserSubscribeEventContributor.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Official.Messages.Models; +using LINGYUN.Abp.WeChat.Official.Services; + +namespace LY.AIO.Applications.Single.WeChat.Official.Messages; +/// +/// 用户关注回复消息 +/// +public class UserSubscribeEventContributor : IEventHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessageModel( + context.Message.FromUserName, + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessage( + "感谢您的关注, 点击菜单了解更多."))); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Work/Messages/TextMessageReplyContributor.cs b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Work/Messages/TextMessageReplyContributor.cs new file mode 100644 index 000000000..f0c6a2b1f --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/WeChat/Work/Messages/TextMessageReplyContributor.cs @@ -0,0 +1,24 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +using LINGYUN.Abp.WeChat.Work.Messages; + +namespace LY.AIO.Applications.Single.WeChat.Work.Messages; +/// +/// 文本消息客服回复 +/// +public class TextMessageReplyContributor : IMessageHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Work.Messages.Models.WeChatWorkTextMessage( + context.Message.AgentId.ToString(), + new LINGYUN.Abp.WeChat.Work.Messages.Models.TextMessage( + context.Message.Content)) + { + ToUser = context.Message.FromUserName, + }); + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/appsettings.Development.json b/aspnet-core/services/LY.AIO.Applications.Single/appsettings.Development.json new file mode 100644 index 000000000..4f753c08e --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/appsettings.Development.json @@ -0,0 +1,249 @@ +{ + "App": { + "ShowPii": true, + "SelfUrl": "http://127.0.0.1:30001/", + "CorsOrigins": "http://127.0.0.1:3100,http://127.0.0.1:30001", + "Urls": { + "Applications": { + "MVC": { + "RootUrl": "http://127.0.0.1:30001/", + "Urls": { + "Abp.Account.EmailConfirm": "Account/EmailConfirm", + "Abp.Account.EmailVerifyLogin": "Account/VerifyCode" + } + }, + "STS": { + "RootUrl": "http://127.0.0.1:30001/" + }, + "VueVbenAdmin": { + "RootUrl": "http://127.0.0.1:3100", + "Urls": { + "Abp.Account.EmailConfirm": "account/email-confirm" + } + } + } + } + }, + "Auditing": { + "AllEntitiesSelector": true + }, + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None"//Mysql +// "Default": "Host=127.0.0.1;Database=Platform-V70;Username=postgres;Password=123456;"//Postgres + }, + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=14" + } + }, + "Elsa": { + "Features": { + "DefaultPersistence": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "MySql": { + "Enabled": true + } + } + }, + "Console": true, + "Http": true, + "Email": true, + "TemporalQuartz": true, + "JavaScriptActivities": true, + "UserTask": true, + "Conductor": true, + "Telnyx": true, + "BlobStoring": true, + "Emailing": true, + "Notification": true, + "Sms": true, + "IM": true, + "PublishWebhook": true, + "Webhooks": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "MySql": { + "Enabled": true + } + } + }, + "WorkflowSettings": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "MySql": { + "Enabled": true + } + } + } + }, + "Server": { + "BaseUrl": "http://127.0.0.1:30000" + } + }, + "Quartz": { + "UsePersistentStore": false, + "Properties": { + "quartz.jobStore.dataSource": "tkm", + "quartz.jobStore.type": "Quartz.Impl.AdoJobStore.JobStoreTX,Quartz", + "quartz.dataSource.tkm.connectionStringName": "Default", + "quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.MySQLDelegate,Quartz", + "quartz.dataSource.tkm.connectionString": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456", + "quartz.dataSource.tkm.provider": "MySqlConnector", +// "quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.PostgreSQLDelegate,Quartz", +// "quartz.dataSource.tkm.connectionString": "Host=127.0.0.1;Database=Platform-V70;Username=postgres;Password=123456;", +// "quartz.dataSource.tkm.provider": "Npgsql", + "quartz.jobStore.clustered": "true", + "quartz.serializer.type": "json" + } + }, + "Redis": { + "IsEnabled": true, + "Configuration": "127.0.0.1,defaultDatabase=15", + "InstanceName": "LINGYUN.Abp.Application" + }, + "Features": { + "Validation": { + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=13", + "InstanceName": "LINGYUN.Abp.Application" + } + } + }, + "AuthServer": { + "UseOpenIddict": true, + "Authority": "http://127.0.0.1:30001/", + "Audience": "lingyun-abp-application", + "RequireHttpsMetadata": false, + "SwaggerClientId": "InternalServiceClient", + "SwaggerClientSecret": "1q2w3E*" + }, + "IdentityServer": { + "Clients": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + } + }, + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + }, + "Lifetime": { + "AuthorizationCode": "00:05:00", + "AccessToken": "14:00:00", + "DeviceCode": "00:10:00", + "IdentityToken": "00:20:00", + "RefreshToken": "14:00:00", + "RefreshTokenReuseLeeway": "00:00:30", + "UserCode": "00:10:00" + } + }, + "Identity": { + "Password": { + "RequiredLength": 6, + "RequiredUniqueChars": 0, + "RequireNonAlphanumeric": false, + "RequireLowercase": false, + "RequireUppercase": false, + "RequireDigit": false + }, + "Lockout": { + "AllowedForNewUsers": false, + "LockoutDuration": 5, + "MaxFailedAccessAttempts": 5 + }, + "SignIn": { + "RequireConfirmedEmail": false, + "RequireConfirmedPhoneNumber": false + } + }, + "FeatureManagement": { + "IsDynamicStoreEnabled": true + }, + "SettingManagement": { + "IsDynamicStoreEnabled": true + }, + "PermissionManagement": { + "IsDynamicStoreEnabled": true + }, + "TextTemplating": { + "IsDynamicStoreEnabled": true + }, + "WebhooksManagement": { + "IsDynamicStoreEnabled": true + }, + "Logging": { + "Serilog": { + "Elasticsearch": { + "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" + } + } + }, + "AuditLogging": { + "Elasticsearch": { + "IndexPrefix": "abp.dev.auditing" + } + }, + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + }, + "Minio": { + "WithSSL": false, + "BucketName": "blobs", + "EndPoint": "127.0.0.1:19000", + "AccessKey": "ZD43kNpimiJf9mCuomTP", + "SecretKey": "w8IqMgi4Tnz0DGzN8jZ7IJWq7OEdbUnAU0jlZxQK", + "CreateBucketIfNotExists": false + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Warning" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "Elasticsearch", + "Args": { + "nodeUris": "http://127.0.0.1:9200", + "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", + "autoRegisterTemplate": true, + "autoRegisterTemplateVersion": "ESv7" + } + } + ] + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/appsettings.json b/aspnet-core/services/LY.AIO.Applications.Single/appsettings.json new file mode 100644 index 000000000..ff9beea3e --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/appsettings.json @@ -0,0 +1,89 @@ +{ + "Clock": { + "Kind": "Local" + }, + "Forwarded": { + "ForwardedHeaders": "XForwardedFor,XForwardedProto" + }, + "StringEncryption": { + "DefaultPassPhrase": "s46c5q55nxpeS8Ra", + "InitVectorBytes": "s83ng0abvd02js84", + "DefaultSalt": "sf&5)s3#" + }, + "Json": { + "OutputDateTimeFormat": "yyyy-MM-dd HH:mm:ss", + "InputDateTimeFormats": [ + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-ddTHH:mm:ss" + ] + }, + "AllowedHosts": "*", + "Hosting": { + "BasePath": "" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Information" + } + }, + "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Debug-.log", + "restrictedToMinimumLevel": "Debug", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "restrictedToMinimumLevel": "Information", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Warn-.log", + "restrictedToMinimumLevel": "Warning", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Error-.log", + "restrictedToMinimumLevel": "Error", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Fatal-.log", + "restrictedToMinimumLevel": "Fatal", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + } + ] + } +} diff --git a/aspnet-core/services/LY.AIO.Applications.Single/gulpfile.js b/aspnet-core/services/LY.AIO.Applications.Single/gulpfile.js new file mode 100644 index 000000000..bec4d578f --- /dev/null +++ b/aspnet-core/services/LY.AIO.Applications.Single/gulpfile.js @@ -0,0 +1,10 @@ +"use strict"; + +var gulp = require("gulp"), + path = require('path'), + copyResources = require('./node_modules/@abp/aspnetcore.mvc.ui/gulp/copy-resources.js'); + +exports.default = function(done){ + copyResources(path.resolve('./')); + done(); +}; \ No newline at end of file diff --git a/aspnet-core/templates/aio/PackageName.CompanyName.ProjectName.AIO.csproj b/aspnet-core/templates/aio/PackageName.CompanyName.ProjectName.AIO.csproj new file mode 100644 index 000000000..88bfabf98 --- /dev/null +++ b/aspnet-core/templates/aio/PackageName.CompanyName.ProjectName.AIO.csproj @@ -0,0 +1,30 @@ + + + net8.0 + true + LINGYUN.Abp.AllInOne.Templates + 8.3.0 + colin.in@foxmail.com + Abp framework all-in-one template + MIT + false + https://github.com/colinin/abp-next-admin + allinone webapi cloud + Template + git + https://github.com/colinin/abp-next-admin + true + true + true + true + False + False + + + + + true + content + + + diff --git a/aspnet-core/templates/aio/content/.template.config/template.json b/aspnet-core/templates/aio/content/.template.config/template.json new file mode 100644 index 000000000..d8da1581b --- /dev/null +++ b/aspnet-core/templates/aio/content/.template.config/template.json @@ -0,0 +1,115 @@ +{ + "$schema": "http://json.schemastore.org/template", + "author": "colin.in@foxmail.com", + "classifications": ["allinone", "webapi", "cloud"], + "name": "LINGYUN.Abp.AllInOne", + "identity": "LINGYUN.Abp.AllInOne", + "description": "Abp framework all-in-one template", + "groupIdentity": "LINGYUN.Abp", + "shortName": "laa", + "tags": { + "language": "C#", + "type": "project" + }, + "sources": [ + { + "modifiers": [ + { + "exclude": [ + "**/[Bb]in/**", + "**/[Oo]bj/**", + "**/[Ll]ocalNuget/**", + ".template.config/**/*", + ".vs/**/*" + ] + } + ] + } + ], + "sourceName": "ProjectName", + "preferNameDirectory": true, + "symbols": { + "AuthenticationScheme": { + "type": "parameter", + "description": "Authentication Scheme", + "datatype": "choice", + "defaultValue": "IdentityServer4", + "isRequired": false, + "choices": [ + { + "choice": "IdentityServer4", + "description": "IdentityServer4" + }, + { + "choice": "OpenIddict", + "description": "OpenIddict" + } + ] + }, + "DatabaseManagement": { + "type": "parameter", + "description": "Database Management", + "dataType": "choice", + "defaultValue": "MySQL", + "isRequired": false, + "choices": [ + { + "choice": "SqlServer", + "description": "Sql Server" + }, + { + "choice": "MySQL", + "description": "My SQL" + }, + { + "choice": "Sqlite", + "description": "Sqlite" + }, + { + "choice": "Oracle", + "description": "Oracle" + }, + { + "choice": "OracleDevart", + "description": "Oracle Devart Driver" + }, + { + "choice": "PostgreSql", + "description": "Postgre Sql" + } + ] + }, + "SqlServer": { + "type": "computed", + "value": "(DatabaseManagement == \"SqlServer\")" + }, + "MySQL": { + "type": "computed", + "value": "(DatabaseManagement == \"MySQL\")" + }, + "Sqlite": { + "type": "computed", + "value": "(DatabaseManagement == \"Sqlite\")" + }, + "Oracle": { + "type": "computed", + "value": "(DatabaseManagement == \"Oracle\")" + }, + "OracleDevart": { + "type": "computed", + "value": "(DatabaseManagement == \"Oracle.Devart\")" + }, + "PostgreSql": { + "type": "computed", + "value": "(DatabaseManagement == \"PostgreSql\")" + }, + "IdentityServer4": { + "type": "computed", + "value": "(AuthenticationScheme == \"IdentityServer4\")" + }, + "OpenIddict": { + "type": "computed", + "value": "(AuthenticationScheme == \"OpenIddict\")" + } + } +} diff --git a/aspnet-core/templates/content/.template.config/template.zh-Hans.json b/aspnet-core/templates/aio/content/.template.config/template.zh-Hans.json similarity index 100% rename from aspnet-core/templates/content/.template.config/template.zh-Hans.json rename to aspnet-core/templates/aio/content/.template.config/template.zh-Hans.json diff --git a/aspnet-core/templates/content/Directory.Build.props b/aspnet-core/templates/aio/content/Directory.Build.props similarity index 97% rename from aspnet-core/templates/content/Directory.Build.props rename to aspnet-core/templates/aio/content/Directory.Build.props index a9ca45ada..6f2501679 100644 --- a/aspnet-core/templates/content/Directory.Build.props +++ b/aspnet-core/templates/aio/content/Directory.Build.props @@ -1,13 +1,13 @@ - - - true - - - - - all - runtime; build; native; contentfiles; analyzers - - - - + + + true + + + + + all + runtime; build; native; contentfiles; analyzers + + + + diff --git a/aspnet-core/templates/aio/content/Directory.Packages.props b/aspnet-core/templates/aio/content/Directory.Packages.props new file mode 100644 index 000000000..f464588df --- /dev/null +++ b/aspnet-core/templates/aio/content/Directory.Packages.props @@ -0,0 +1,537 @@ + + + 8.2.0 + 2.14.1 + 8.3.0 + 8.3.0 + 8.0.0 + 8.0.0 + 8.0.0 + 3.1.1 + 8.0.0 + 2.6.1 + 1.8.1 + 6.8.0 + 17.8.0 + 1.12.0 + 6.2.0 + 8.2.0 + 3.7.0 + 1.8.6 + 1.0.5 + 1.0.2 + 16.18.9 + 3.0.2 + 6.0.0 + 3.0.0 + 5.1.0 + 4.2.1 + 2.5.3 + 1.5.10 + 2.13.0 + 1.6.9 + 0.34.0 + 13.0.3 + 7.15.1 + 0.9.2 + 20.0.0 + 4.0.0 + 2023.3.0 + 2.0.1 + 2.7.4 + 6.5.0 + 2.0.3 + 1.0.0-beta.11 + 5.0.0 + 5.4.37 + 3.0.712 + 2.1.0 + 5.5.0 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/NuGet.Config b/aspnet-core/templates/aio/content/NuGet.Config similarity index 100% rename from aspnet-core/templates/content/NuGet.Config rename to aspnet-core/templates/aio/content/NuGet.Config diff --git a/aspnet-core/templates/aio/content/README.md b/aspnet-core/templates/aio/content/README.md new file mode 100644 index 000000000..7d7b52ed3 --- /dev/null +++ b/aspnet-core/templates/aio/content/README.md @@ -0,0 +1,135 @@ +# LINGYUN.Abp.Templates + +[English](README.md) | [中文](README.zh-CN.md) + +## Introduction + +LINGYUN.Abp.Templates provides two types of project templates based on ABP Framework: + +1. **Microservice Template**: A complete microservice architecture template with distributed services. +2. **All-in-One Template**: A single-application template that combines all services into one project. + +## Features + +### Common Features + +- Integrated authentication (IdentityServer4/OpenIddict) +- Database integration (multiple databases supported) +- Unified configuration management +- Distributed event bus support +- Background job processing + +### Microservice Template Features + +- Complete microservice project structure +- Service discovery and registration +- Distributed deployment support + +### All-in-One Template Features + +- Simplified deployment +- Easier maintenance +- Lower resource requirements + +## How to Use + +### Install labp CLI Tool + +```bash +dotnet tool install --global LINGYUN.Abp.Cli +``` + +### Install Templates + +```bash +# Install Microservice Template +dotnet new install LINGYUN.Abp.MicroService.Templates + +# Install All-in-One Template +dotnet new install LINGYUN.Abp.AllInOne.Templates +``` + +### Create New Project + +#### For Microservice Project + +```bash +# Short name: lam (LINGYUN Abp Microservice) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t lam -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +#### For All-in-One Project + +```bash +# Short name: laa (LINGYUN Abp AllInOne) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t laa -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +## How to Run + +After creating your project, you can run it using the following command: + +### For Microservice Project + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.HttpApi.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +### For All-in-One Project + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## How to Package and Publish + +1. Clone the Project + +```bash +git clone +cd /aspnet-core/templates/content +``` + +2. Modify Version + Edit the project files to update versions: + - For Microservice: `../PackageName.CompanyName.ProjectName.csproj` + - For All-in-One: `../PackageName.CompanyName.ProjectName.AIO.csproj` + +```xml +8.3.0 +``` + +3. Execute Packaging Script + +```powershell +# Windows PowerShell +.\pack.ps1 + +# PowerShell Core (Windows/Linux/macOS) +pwsh pack.ps1 +``` + +The script will prompt you to choose which template to package: + +1. Microservice Template +2. All-in-One Template +3. Both Templates + +## Supported Databases + +- SqlServer +- MySQL +- PostgreSQL +- Oracle +- SQLite + +## Notes + +- Ensure .NET SDK 8.0 or higher is installed +- Choose the appropriate template based on your needs: + - Microservice Template: For large-scale distributed applications + - All-in-One Template: For smaller applications or simpler deployment requirements +- Pay attention to NuGet publish address and key when packaging +- Complete testing is recommended before publishing diff --git a/aspnet-core/templates/aio/content/README.zh-CN.md b/aspnet-core/templates/aio/content/README.zh-CN.md new file mode 100644 index 000000000..ae492e5b8 --- /dev/null +++ b/aspnet-core/templates/aio/content/README.zh-CN.md @@ -0,0 +1,135 @@ +# LINGYUN.Abp.Templates + +[English](README.md) | [中文](README.zh-CN.md) + +## 简介 + +LINGYUN.Abp.Templates 基于 ABP Framework 提供两种项目模板: + +1. **微服务模板**:完整的分布式微服务架构模板 +2. **单体应用模板**:将所有服务集成到一个项目中的单体应用模板 + +## 特性 + +### 共同特性 + +- 集成身份认证(支持 IdentityServer4/OpenIddict) +- 数据库集成(支持多种数据库) +- 统一配置管理 +- 分布式事件总线支持 +- 后台作业处理 + +### 微服务模板特性 + +- 完整的微服务项目结构 +- 服务发现与注册 +- 支持分布式部署 + +### 单体应用模板特性 + +- 简化的部署流程 +- 更容易的维护 +- 更低的资源需求 + +## 使用方法 + +### 安装模板 + +```bash +# 安装微服务模板:lam +dotnet new install LINGYUN.Abp.MicroService.Templates + +# 安装单体应用模板:laa +dotnet new install LINGYUN.Abp.AllInOne.Templates +``` + +### 安装 labp 命令行工具 + +```bash + dotnet tool install --global LINGYUN.Abp.Cli +``` + +### 创建新项目 + +#### 创建微服务项目 + +```bash +# 简写名称:lam (LINGYUN Abp Microservice) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t lam -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +#### 创建单体应用项目 + +```bash +# 简写名称:laa (LINGYUN Abp AllInOne) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t laa -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +## 运行项目 + +创建项目后,可以使用以下命令运行: + +### 运行微服务项目 + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.HttpApi.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +### 运行单体应用项目 + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## 打包与发布 + +1. 克隆项目 + +```bash +git clone +cd /aspnet-core/templates/content +``` + +2. 修改版本号 + 编辑项目文件更新版本号: + - 微服务模板:`../PackageName.CompanyName.ProjectName.csproj` + - 单体应用模板:`../PackageName.CompanyName.ProjectName.AIO.csproj` + +```xml +8.3.0 +``` + +3. 执行打包脚本 + +```powershell +# Windows PowerShell +.\pack.ps1 + +# PowerShell Core (Windows/Linux/macOS) +pwsh pack.ps1 +``` + +脚本会提示您选择要打包的模板: + +1. 微服务模板 +2. 单体应用模板 +3. 两种模板都打包 + +## 支持的数据库 + +- SqlServer +- MySQL +- PostgreSQL +- Oracle +- SQLite + +## 注意事项 + +- 确保已安装 .NET SDK 8.0 或更高版本 +- 根据需求选择合适的模板: + - 微服务模板:适用于大规模分布式应用 + - 单体应用模板:适用于小型应用或简单部署需求 +- 打包时注意 NuGet 发布地址和密钥 +- 发布前建议进行完整测试 diff --git a/aspnet-core/templates/content/common.props b/aspnet-core/templates/aio/content/common.props similarity index 97% rename from aspnet-core/templates/content/common.props rename to aspnet-core/templates/aio/content/common.props index c299ae39b..d7d7622cf 100644 --- a/aspnet-core/templates/content/common.props +++ b/aspnet-core/templates/aio/content/common.props @@ -1,38 +1,38 @@ - - - latest - 8.2.1 - colin - $(NoWarn);CS1591;CS0436;CS8618;NU1803 - https://github.com/colinin/abp-next-admin - $(SolutionDir)LocalNuget - 8.2.1 - MIT - git - https://github.com/colinin/abp-next-admin - true - - - - - - - - - - - - - - - - - - - - - - $(SolutionDir)LocalNuget - - + + + latest + 8.2.1 + colin + $(NoWarn);CS1591;CS0436;CS8618;NU1803 + https://github.com/colinin/abp-next-admin + $(SolutionDir)LocalNuget + 8.2.1 + MIT + git + https://github.com/colinin/abp-next-admin + true + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)LocalNuget + + \ No newline at end of file diff --git a/aspnet-core/templates/content/configureawait.props b/aspnet-core/templates/aio/content/configureawait.props similarity index 100% rename from aspnet-core/templates/content/configureawait.props rename to aspnet-core/templates/aio/content/configureawait.props diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.config/dotnet-tools.json b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.config/dotnet-tools.json new file mode 100644 index 000000000..6b93cca86 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "7.0.3", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.gitignore b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.gitignore new file mode 100644 index 000000000..7b6f60857 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/.gitignore @@ -0,0 +1,2 @@ +wwwroot +package*.json \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Authentication/AbpCookieAuthenticationHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Authentication/AbpCookieAuthenticationHandler.cs new file mode 100644 index 000000000..34517090f --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Authentication/AbpCookieAuthenticationHandler.cs @@ -0,0 +1,89 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.Extensions.Options; +using System.Text.Encodings.Web; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Authentication; + +public class AbpCookieAuthenticationHandler : CookieAuthenticationHandler +{ + public AbpCookieAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder) : base(options, logger, encoder) + { + } + + public AbpCookieAuthenticationHandler( + IOptionsMonitor options, + ILoggerFactory logger, + UrlEncoder encoder, + ISystemClock clock) : base(options, logger, encoder, clock) + { + } + + protected const string XRequestFromHeader = "X-Request-From"; + protected const string DontRedirectRequestFromHeader = "vben"; + protected override Task InitializeEventsAsync() + { + var events = new CookieAuthenticationEvents + { + OnRedirectToLogin = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToAccessDenied = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToLogout = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + }, + OnRedirectToReturnUrl = ctx => + { + if (string.Equals(ctx.Request.Headers[XRequestFromHeader], DontRedirectRequestFromHeader, StringComparison.Ordinal)) + { + // ctx.Response.Headers.Location = ctx.RedirectUri; + ctx.Response.StatusCode = 401; + } + else + { + ctx.Response.Redirect(ctx.RedirectUri); + } + return Task.CompletedTask; + } + }; + + Events = events; + + return Task.CompletedTask; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJob.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJob.cs new file mode 100644 index 000000000..c9db9977a --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJob.cs @@ -0,0 +1,38 @@ +using LINGYUN.Abp.Notifications; +using Microsoft.Extensions.Options; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.BackgroundJobs; + +public class NotificationPublishJob : AsyncBackgroundJob, ITransientDependency +{ + protected AbpNotificationsPublishOptions Options { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected INotificationDataSerializer NotificationDataSerializer { get; } + public NotificationPublishJob( + IOptions options, + IServiceScopeFactory serviceScopeFactory, + INotificationDataSerializer notificationDataSerializer) + { + Options = options.Value; + ServiceScopeFactory = serviceScopeFactory; + NotificationDataSerializer = notificationDataSerializer; + } + + public override async Task ExecuteAsync(NotificationPublishJobArgs args) + { + var providerType = Type.GetType(args.ProviderType); + using (var scope = ServiceScopeFactory.CreateScope()) + { + if (scope.ServiceProvider.GetRequiredService(providerType) is INotificationPublishProvider publishProvider) + { + var store = scope.ServiceProvider.GetRequiredService(); + var notification = await store.GetNotificationOrNullAsync(args.TenantId, args.NotificationId); + notification.Data = NotificationDataSerializer.Serialize(notification.Data); + + await publishProvider.PublishAsync(notification, args.UserIdentifiers); + } + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJobArgs.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJobArgs.cs new file mode 100644 index 000000000..e5f077d65 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/BackgroundJobs/NotificationPublishJobArgs.cs @@ -0,0 +1,22 @@ +using LINGYUN.Abp.Notifications; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.BackgroundJobs; + +public class NotificationPublishJobArgs +{ + public Guid? TenantId { get; set; } + public long NotificationId { get; set; } + public string ProviderType { get; set; } + public List UserIdentifiers { get; set; } + public NotificationPublishJobArgs() + { + UserIdentifiers = new List(); + } + public NotificationPublishJobArgs(long id, string providerType, List userIdentifiers, Guid? tenantId = null) + { + NotificationId = id; + ProviderType = providerType; + UserIdentifiers = userIdentifiers; + TenantId = tenantId; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/HomeController.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/HomeController.cs new file mode 100644 index 000000000..e693a0917 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/HomeController.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Controllers; + +public class HomeController : Controller +{ + public IActionResult Index() + { + return Redirect("/swagger"); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/SettingMergeController.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/SettingMergeController.cs new file mode 100644 index 000000000..11e91bd88 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/SettingMergeController.cs @@ -0,0 +1,70 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Controllers; + +[ExposeServices( + typeof(SettingController), + typeof(SettingMergeController))] +public class SettingMergeController : SettingController +{ + private readonly SettingManagementMergeOptions _mergeOptions; + public SettingMergeController( + ISettingAppService settingAppService, + ISettingTestAppService settingTestAppService, + IOptions mergeOptions) + : base(settingAppService, settingTestAppService) + { + _mergeOptions = mergeOptions.Value; + } + + [HttpGet] + [Route("by-current-tenant")] + public async override Task GetAllForCurrentTenantAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(SettingMergeController), + }; + foreach (var serviceType in _mergeOptions.GlobalSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForCurrentTenantAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } + + [HttpGet] + [Route("by-global")] + public async override Task GetAllForGlobalAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(SettingMergeController), + }; + foreach (var serviceType in _mergeOptions.GlobalSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForGlobalAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/UserSettingMergeController.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/UserSettingMergeController.cs new file mode 100644 index 000000000..5091a8a5e --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Controllers/UserSettingMergeController.cs @@ -0,0 +1,45 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Controllers; + +[ExposeServices( + typeof(UserSettingController), + typeof(UserSettingMergeController))] +public class UserSettingMergeController : UserSettingController +{ + private readonly SettingManagementMergeOptions _mergeOptions; + public UserSettingMergeController( + IUserSettingAppService service, + IOptions mergeOptions) + : base(service) + { + _mergeOptions = mergeOptions.Value; + } + + [HttpGet] + [Route("by-current-user")] + public async override Task GetAllForCurrentUserAsync() + { + var result = new SettingGroupResult(); + var markTypeMap = new List + { + typeof(UserSettingMergeController), + }; + foreach (var serviceType in _mergeOptions.UserSettingProviders + .Where(type => !markTypeMap.Any(markType => type.IsAssignableFrom(markType)))) + { + var settingService = LazyServiceProvider.LazyGetRequiredService(serviceType).As(); + var currentResult = await settingService.GetAllForCurrentUserAsync(); + foreach (var group in currentResult.Items) + { + result.AddGroup(group); + } + markTypeMap.Add(serviceType); + } + + return result; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Dockerfile b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Dockerfile new file mode 100644 index 000000000..f96f82dd4 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +LABEL maintainer="colin.in@foxmail.com" +WORKDIR /app + +COPY . /app + +#东8区 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone + +EXPOSE 80/tcp +VOLUME [ "./app/blobs" ] +VOLUME [ "./app/Logs" ] +VOLUME [ "./app/Modules" ] + +RUN apt update +RUN apt install wget -y + +ENTRYPOINT ["dotnet", "PackageName.CompanyName.ProjectName.AIO.dll"] diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/ChatMessageEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/ChatMessageEventHandler.cs new file mode 100644 index 000000000..a08702a0a --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/ChatMessageEventHandler.cs @@ -0,0 +1,59 @@ +using LINGYUN.Abp.IM; +using LINGYUN.Abp.IM.Messages; +using LINGYUN.Abp.RealTime; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Distributed +{ + public class ChatMessageEventHandler : IDistributedEventHandler>, ITransientDependency + { + /// + /// Reference to . + /// + public ILogger Logger { get; set; } + /// + /// Reference to . + /// + protected AbpIMOptions Options { get; } + + protected IMessageStore MessageStore { get; } + protected IMessageBlocker MessageBlocker { get; } + protected IMessageSenderProviderManager MessageSenderProviderManager { get; } + + public ChatMessageEventHandler( + IOptions options, + IMessageStore messageStore, + IMessageBlocker messageBlocker, + IMessageSenderProviderManager messageSenderProviderManager) + { + Options = options.Value; + MessageStore = messageStore; + MessageBlocker = messageBlocker; + MessageSenderProviderManager = messageSenderProviderManager; + + Logger = NullLogger.Instance; + } + + public async virtual Task HandleEventAsync(RealTimeEto eventData) + { + Logger.LogDebug($"Persistent chat message."); + + var message = eventData.Data; + // 消息拦截 + // 扩展敏感词汇过滤 + await MessageBlocker.InterceptAsync(message); + + await MessageStore.StoreMessageAsync(message); + + // 发送消息 + foreach (var provider in MessageSenderProviderManager.Providers) + { + Logger.LogDebug($"Sending message with provider {provider.Name}"); + await provider.SendMessageAsync(message); + } + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/NotificationEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/NotificationEventHandler.cs new file mode 100644 index 000000000..cb871c6ef --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/NotificationEventHandler.cs @@ -0,0 +1,470 @@ +using LINGYUN.Abp.Notifications; +using Microsoft.Extensions.Localization; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using PackageName.CompanyName.ProjectName.AIO.Host.BackgroundJobs; +using PackageName.CompanyName.ProjectName.AIO.Host.MultiTenancy; +using System.Globalization; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Json; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.TextTemplating; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Distributed +{ + /// + /// 订阅通知发布事件,统一发布消息 + /// + /// + /// 作用在于SignalR客户端只会与一台服务器建立连接, + /// 只有启用了SignlR服务端的才能真正将消息发布到客户端 + /// + public class NotificationEventHandler : + IDistributedEventHandler>, + IDistributedEventHandler>, + ITransientDependency + { + /// + /// Reference to . + /// + public ILogger Logger { get; set; } + /// + /// Reference to . + /// + protected AbpNotificationsPublishOptions Options { get; } + /// + /// Reference to . + /// + protected ICurrentTenant CurrentTenant { get; } + /// + /// Reference to . + /// + protected ITenantConfigurationCache TenantConfigurationCache { get; } + /// + /// Reference to . + /// + protected IJsonSerializer JsonSerializer { get; } + /// + /// Reference to . + /// + protected IBackgroundJobManager BackgroundJobManager { get; } + /// + /// Reference to . + /// + protected ITemplateRenderer TemplateRenderer { get; } + /// + /// Reference to . + /// + protected INotificationStore NotificationStore { get; } + /// + /// Reference to . + /// + protected IStringLocalizerFactory StringLocalizerFactory { get; } + /// + /// Reference to . + /// + protected INotificationDataSerializer NotificationDataSerializer { get; } + /// + /// Reference to . + /// + protected INotificationDefinitionManager NotificationDefinitionManager { get; } + /// + /// Reference to . + /// + protected INotificationSubscriptionManager NotificationSubscriptionManager { get; } + /// + /// Reference to . + /// + protected INotificationPublishProviderManager NotificationPublishProviderManager { get; } + + /// + /// Initializes a new instance of the class. + /// + public NotificationEventHandler( + ICurrentTenant currentTenant, + ITenantConfigurationCache tenantConfigurationCache, + IJsonSerializer jsonSerializer, + ITemplateRenderer templateRenderer, + IBackgroundJobManager backgroundJobManager, + IStringLocalizerFactory stringLocalizerFactory, + IOptions options, + INotificationStore notificationStore, + INotificationDataSerializer notificationDataSerializer, + INotificationDefinitionManager notificationDefinitionManager, + INotificationSubscriptionManager notificationSubscriptionManager, + INotificationPublishProviderManager notificationPublishProviderManager) + { + Options = options.Value; + TenantConfigurationCache = tenantConfigurationCache; + CurrentTenant = currentTenant; + JsonSerializer = jsonSerializer; + TemplateRenderer = templateRenderer; + BackgroundJobManager = backgroundJobManager; + StringLocalizerFactory = stringLocalizerFactory; + NotificationStore = notificationStore; + NotificationDataSerializer = notificationDataSerializer; + NotificationDefinitionManager = notificationDefinitionManager; + NotificationSubscriptionManager = notificationSubscriptionManager; + NotificationPublishProviderManager = notificationPublishProviderManager; + + Logger = NullLogger.Instance; + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(NotificationEto eventData) + { + var notification = await NotificationDefinitionManager.GetOrNullAsync(eventData.Name); + if (notification == null) + { + return; + } + + var culture = eventData.Data.Culture; + if (culture.IsNullOrWhiteSpace()) + { + culture = CultureInfo.CurrentCulture.Name; + } + using (CultureHelper.Use(culture, culture)) + { + if (notification.NotificationType == NotificationType.System) + { + using (CurrentTenant.Change(null)) + { + await SendToTenantAsync(null, notification, eventData); + + var allActiveTenants = await TenantConfigurationCache.GetTenantsAsync(); + + foreach (var activeTenant in allActiveTenants) + { + await SendToTenantAsync(activeTenant.Id, notification, eventData); + } + } + } + else + { + await SendToTenantAsync(eventData.TenantId, notification, eventData); + } + } + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(NotificationEto eventData) + { + var notification = await NotificationDefinitionManager.GetOrNullAsync(eventData.Name); + if (notification == null) + { + return; + } + + if (notification.NotificationType == NotificationType.System) + { + using (CurrentTenant.Change(null)) + { + await SendToTenantAsync(null, notification, eventData); + + var allActiveTenants = await TenantConfigurationCache.GetTenantsAsync(); + + foreach (var activeTenant in allActiveTenants) + { + await SendToTenantAsync(activeTenant.Id, notification, eventData); + } + } + } + else + { + await SendToTenantAsync(eventData.TenantId, notification, eventData); + } + } + + protected async virtual Task SendToTenantAsync( + Guid? tenantId, + NotificationDefinition notification, + NotificationEto eventData) + { + using (CurrentTenant.Change(tenantId)) + { + var providers = Enumerable.Reverse(NotificationPublishProviderManager.Providers); + + // 过滤用户指定提供者 + if (eventData.UseProviders.Any()) + { + providers = providers.Where(p => eventData.UseProviders.Contains(p.Name)); + } + else if (notification.Providers.Any()) + { + providers = providers.Where(p => notification.Providers.Contains(p.Name)); + } + + var notificationInfo = new NotificationInfo + { + Name = notification.Name, + TenantId = tenantId, + Severity = eventData.Severity, + Type = notification.NotificationType, + ContentType = notification.ContentType, + CreationTime = eventData.CreationTime, + Lifetime = notification.NotificationLifetime, + }; + notificationInfo.SetId(eventData.Id); + + var title = notification.DisplayName.Localize(StringLocalizerFactory); + var message = ""; + + try + { + // 由于模板通知受租户影响, 格式化失败的消息将被丢弃. + message = await TemplateRenderer.RenderAsync( + templateName: eventData.Data.Name, + model: eventData.Data.ExtraProperties, + cultureName: eventData.Data.Culture, + globalContext: new Dictionary + { + // 模板不支持 $ 字符, 改为普通关键字 + { NotificationKeywords.Name, notification.Name }, + { NotificationKeywords.FormUser, eventData.Data.FormUser }, + { NotificationKeywords.Id, eventData.Id }, + { NotificationKeywords.Title, title.ToString() }, + { NotificationKeywords.CreationTime, eventData.CreationTime.ToString(Options.DateTimeFormat) }, + }); + } + catch(Exception ex) + { + Logger.LogWarning("Formatting template notification failed, message will be discarded, cause :{message}", ex.Message); + return; + } + + var notificationData = new NotificationData(); + notificationData.WriteStandardData( + title: title.ToString(), + message: message, + createTime: eventData.CreationTime, + formUser: eventData.Data.FormUser); + notificationData.ExtraProperties.AddIfNotContains(eventData.Data.ExtraProperties); + + notificationInfo.Data = notificationData; + + var subscriptionUsers = await GerSubscriptionUsersAsync( + notificationInfo.Name, + eventData.Users, + tenantId); + + await PersistentNotificationAsync( + notificationInfo, + subscriptionUsers, + providers); + + if (subscriptionUsers.Any()) + { + // 发布通知 + foreach (var provider in providers) + { + await PublishToSubscriberAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + } + + protected async virtual Task SendToTenantAsync( + Guid? tenantId, + NotificationDefinition notification, + NotificationEto eventData) + { + using (CurrentTenant.Change(tenantId)) + { + var providers = Enumerable.Reverse(NotificationPublishProviderManager.Providers); + + // 过滤用户指定提供者 + if (eventData.UseProviders.Any()) + { + providers = providers.Where(p => eventData.UseProviders.Contains(p.Name)); + } + else if (notification.Providers.Any()) + { + providers = providers.Where(p => notification.Providers.Contains(p.Name)); + } + + var notificationInfo = new NotificationInfo + { + Name = notification.Name, + CreationTime = eventData.CreationTime, + Data = eventData.Data, + Severity = eventData.Severity, + Lifetime = notification.NotificationLifetime, + TenantId = tenantId, + Type = notification.NotificationType, + ContentType = notification.ContentType, + }; + notificationInfo.SetId(eventData.Id); + + notificationInfo.Data = NotificationDataSerializer.Serialize(notificationInfo.Data); + + // 获取用户订阅 + var subscriptionUsers = await GerSubscriptionUsersAsync( + notificationInfo.Name, + eventData.Users, + tenantId); + + // 持久化通知 + await PersistentNotificationAsync( + notificationInfo, + subscriptionUsers, + providers); + + if (subscriptionUsers.Any()) + { + // 发布订阅通知 + foreach (var provider in providers) + { + await PublishToSubscriberAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + } + /// + /// 获取用户订阅列表 + /// + /// 通知名称 + /// 接收用户列表 + /// 租户标识 + /// 用户订阅列表 + protected async Task> GerSubscriptionUsersAsync( + string notificationName, + IEnumerable sendToUsers, + Guid? tenantId = null) + { + try + { + // 获取用户订阅列表 + var userSubscriptions = await NotificationSubscriptionManager.GetUsersSubscriptionsAsync( + tenantId, + notificationName, + sendToUsers); + + return userSubscriptions.Select(us => new UserIdentifier(us.UserId, us.UserName)); + } + catch(Exception ex) + { + Logger.LogWarning("Failed to get user subscription, message will not be received by the user, reason: {message}", ex.Message); + } + + return new List(); + } + /// + /// 持久化通知并返回订阅用户列表 + /// + /// 通知实体 + /// 订阅用户列表 + /// 通知发送提供者 + /// 返回订阅者列表 + protected async Task PersistentNotificationAsync( + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers, + IEnumerable sendToProviders) + { + try + { + // 持久化通知 + await NotificationStore.InsertNotificationAsync(notificationInfo); + + if (!subscriptionUsers.Any()) + { + return; + } + + // 持久化用户通知 + await NotificationStore.InsertUserNotificationsAsync(notificationInfo, subscriptionUsers.Select(u => u.UserId)); + + if (notificationInfo.Lifetime == NotificationLifetime.OnlyOne) + { + // 一次性通知取消用户订阅 + await NotificationStore.DeleteUserSubscriptionAsync( + notificationInfo.TenantId, + subscriptionUsers, + notificationInfo.Name); + } + } + catch (Exception ex) + { + Logger.LogWarning("Failed to persistent notification failed, reason: {message}", ex.Message); + + foreach (var provider in sendToProviders) + { + // 处理持久化失败进入后台队列 + await ProcessingFailedToQueueAsync(provider, notificationInfo, subscriptionUsers); + } + } + } + /// + /// 发布订阅者通知 + /// + /// 通知发布者 + /// 通知信息 + /// 订阅用户列表 + /// + protected async Task PublishToSubscriberAsync( + INotificationPublishProvider provider, + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers) + { + try + { + Logger.LogDebug($"Sending notification with provider {provider.Name}"); + + // 2024-10-10: 框架层面应该取消通知数据转换,而是交给提供商来实现 + //var notifacationDataMapping = Options.NotificationDataMappings + // .GetMapItemOrDefault(provider.Name, notificationInfo.Name); + //if (notifacationDataMapping != null) + //{ + // notificationInfo.Data = notifacationDataMapping.MappingFunc(notificationInfo.Data); + //} + + // 发布 + await provider.PublishAsync(notificationInfo, subscriptionUsers); + + 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.LogDebug($"Failed to send notification {notificationInfo.Name}. Try to push notification to background job"); + // 发送失败的消息进入后台队列 + await ProcessingFailedToQueueAsync(provider, notificationInfo, subscriptionUsers); + } + } + /// + /// 处理失败的消息进入后台队列 + /// + /// + /// 注: 如果入队失败,消息将被丢弃. + /// + /// + /// + /// + /// + protected async Task ProcessingFailedToQueueAsync( + INotificationPublishProvider provider, + NotificationInfo notificationInfo, + IEnumerable subscriptionUsers) + { + try + { + // 发送失败的消息进入后台队列 + await BackgroundJobManager.EnqueueAsync( + new NotificationPublishJobArgs( + notificationInfo.GetId(), + provider.GetType().AssemblyQualifiedName, + subscriptionUsers.ToList(), + notificationInfo.TenantId)); + } + catch(Exception ex) + { + Logger.LogWarning("Failed to push to background job, notification will be discarded, error cause: {message}", ex.Message); + } + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/TenantSynchronizer.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/TenantSynchronizer.cs new file mode 100644 index 000000000..3e07d5be9 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/TenantSynchronizer.cs @@ -0,0 +1,53 @@ +using LINGYUN.Abp.Saas.Tenants; +using PackageName.CompanyName.ProjectName.AIO.Host.MultiTenancy; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Distributed +{ + public class TenantSynchronizer : + IDistributedEventHandler>, + IDistributedEventHandler>, + IDistributedEventHandler>, + IDistributedEventHandler, + ITransientDependency + { + protected IDataSeeder DataSeeder { get; } + protected ITenantConfigurationCache TenantConfigurationCache { get; } + + public TenantSynchronizer( + IDataSeeder dataSeeder, + ITenantConfigurationCache tenantConfigurationCache) + { + DataSeeder = dataSeeder; + TenantConfigurationCache = tenantConfigurationCache; + } + + [UnitOfWork] + public async virtual Task HandleEventAsync(EntityCreatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + + await DataSeeder.SeedAsync(eventData.Entity.Id); + } + + public async virtual Task HandleEventAsync(EntityUpdatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + + public async virtual Task HandleEventAsync(EntityDeletedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + + public async virtual Task HandleEventAsync(TenantConnectionStringUpdatedEto eventData) + { + await TenantConfigurationCache.RefreshAsync(); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/UserCreateEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/UserCreateEventHandler.cs new file mode 100644 index 000000000..ee5ab700b --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/UserCreateEventHandler.cs @@ -0,0 +1,30 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.EventBus.Local; +using Volo.Abp.Users; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Distributed +{ + public class UserCreateEventHandler : IDistributedEventHandler>, ITransientDependency + { + private readonly ILocalEventBus _localEventBus; + public UserCreateEventHandler( + ILocalEventBus localEventBus) + { + _localEventBus = localEventBus; + } + /// + /// 接收添加用户事件,发布本地事件 + /// + /// + /// + public async Task HandleEventAsync(EntityCreatedEto eventData) + { + var localUserCreateEventData = new EntityCreatedEventData(eventData.Entity); + + await _localEventBus.PublishAsync(localUserCreateEventData); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/WebhooksEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/WebhooksEventHandler.cs new file mode 100644 index 000000000..eeb0fcdb7 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Distributed/WebhooksEventHandler.cs @@ -0,0 +1,112 @@ +using LINGYUN.Abp.Webhooks; +using LINGYUN.Abp.Webhooks.EventBus; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Distributed; + +public class WebhooksEventHandler : + IDistributedEventHandler, + ITransientDependency +{ + public IWebhookEventStore WebhookEventStore { get; set; } + + private readonly ICurrentTenant _currentTenant; + private readonly IBackgroundJobManager _backgroundJobManager; + private readonly IWebhookSubscriptionManager _webhookSubscriptionManager; + + public WebhooksEventHandler( + IWebhookSubscriptionManager webhookSubscriptionManager, + ICurrentTenant currentTenant, + IBackgroundJobManager backgroundJobManager) + { + _currentTenant = currentTenant; + _backgroundJobManager = backgroundJobManager; + _webhookSubscriptionManager = webhookSubscriptionManager; + + WebhookEventStore = NullWebhookEventStore.Instance; + } + + public async virtual Task HandleEventAsync(WebhooksEventData eventData) + { + var subscriptions = await _webhookSubscriptionManager + .GetAllSubscriptionsOfTenantsIfFeaturesGrantedAsync( + eventData.TenantIds, + eventData.WebhookName); + + await PublishAsync(eventData.WebhookName, eventData.Data, subscriptions, eventData.SendExactSameData, eventData.Headers); + } + + protected async virtual Task PublishAsync( + string webhookName, + string data, + List webhookSubscriptions, + bool sendExactSameData = false, + WebhookHeader headers = null) + { + if (webhookSubscriptions.IsNullOrEmpty()) + { + return; + } + + var subscriptionsGroupedByTenant = webhookSubscriptions.GroupBy(x => x.TenantId); + + foreach (var subscriptionGroupedByTenant in subscriptionsGroupedByTenant) + { + var webhookInfo = await SaveAndGetWebhookAsync(subscriptionGroupedByTenant.Key, webhookName, data); + + foreach (var webhookSubscription in subscriptionGroupedByTenant) + { + var headersToSend = webhookSubscription.Headers; + if (headers != null) + { + if (headers.UseOnlyGivenHeaders)//do not use the headers defined in subscription + { + headersToSend = headers.Headers; + } + else + { + //use the headers defined in subscription. If additional headers has same header, use additional headers value. + foreach (var additionalHeader in headers.Headers) + { + headersToSend[additionalHeader.Key] = additionalHeader.Value; + } + } + } + + await _backgroundJobManager.EnqueueAsync(new WebhookSenderArgs + { + TenantId = webhookSubscription.TenantId, + WebhookEventId = webhookInfo.Id, + Data = webhookInfo.Data, + WebhookName = webhookInfo.WebhookName, + WebhookSubscriptionId = webhookSubscription.Id, + Headers = headersToSend, + Secret = webhookSubscription.Secret, + WebhookUri = webhookSubscription.WebhookUri, + SendExactSameData = sendExactSameData + }); + } + } + } + + protected async virtual Task SaveAndGetWebhookAsync( + Guid? tenantId, + string webhookName, + string data) + { + var webhookInfo = new WebhookEvent + { + WebhookName = webhookName, + Data = data, + TenantId = tenantId + }; + + var webhookId = await WebhookEventStore.InsertAndGetIdAsync(webhookInfo); + webhookInfo.Id = webhookId; + + return webhookInfo; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateJoinIMEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateJoinIMEventHandler.cs new file mode 100644 index 000000000..2b78e5841 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateJoinIMEventHandler.cs @@ -0,0 +1,58 @@ +using LINGYUN.Abp.MessageService.Chat; +using LINGYUN.Abp.MessageService.Notifications; +using LINGYUN.Abp.Notifications; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.Uow; +using Volo.Abp.Users; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Local +{ + public class UserCreateJoinIMEventHandler : ILocalEventHandler>, ITransientDependency + { + private readonly IChatDataSeeder _chatDataSeeder; + private readonly INotificationSubscriptionManager _notificationSubscriptionManager; + public UserCreateJoinIMEventHandler( + IChatDataSeeder chatDataSeeder, + INotificationSubscriptionManager notificationSubscriptionManager) + { + _chatDataSeeder = chatDataSeeder; + _notificationSubscriptionManager = notificationSubscriptionManager; + } + /// + /// 接收添加用户事件,初始化IM用户种子 + /// + /// + /// + [UnitOfWork] + public async virtual Task HandleEventAsync(EntityCreatedEventData eventData) + { + await SeedChatDataAsync(eventData.Entity); + + await SeedUserSubscriptionNotifiersAsync(eventData.Entity); + } + + protected async virtual Task SeedChatDataAsync(IUserData user) + { + await _chatDataSeeder.SeedAsync(user); + } + + protected async virtual Task SeedUserSubscriptionNotifiersAsync(IUserData user) + { + var userIdentifier = new UserIdentifier(user.Id, user.UserName); + + await _notificationSubscriptionManager + .SubscribeAsync( + user.TenantId, + userIdentifier, + MessageServiceNotificationNames.IM.FriendValidation); + + await _notificationSubscriptionManager + .SubscribeAsync( + user.TenantId, + userIdentifier, + MessageServiceNotificationNames.IM.NewFriend); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateSendWelcomeEventHandler.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateSendWelcomeEventHandler.cs new file mode 100644 index 000000000..8176df498 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/EventBus/Local/UserCreateSendWelcomeEventHandler.cs @@ -0,0 +1,69 @@ +using LINGYUN.Abp.Notifications; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events; +using Volo.Abp.EventBus; +using Volo.Abp.Users; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.EventBus.Local +{ + public class UserCreateSendWelcomeEventHandler : ILocalEventHandler>, ITransientDependency + { + private readonly INotificationSender _notificationSender; + private readonly INotificationSubscriptionManager _notificationSubscriptionManager; + public UserCreateSendWelcomeEventHandler( + INotificationSender notificationSender, + INotificationSubscriptionManager notificationSubscriptionManager + ) + { + _notificationSender = notificationSender; + _notificationSubscriptionManager = notificationSubscriptionManager; + } + + public async Task HandleEventAsync(EntityCreatedEventData eventData) + { + var userIdentifer = new UserIdentifier(eventData.Entity.Id, eventData.Entity.UserName); + // 订阅用户欢迎消息 + await SubscribeInternalNotifers(userIdentifer, eventData.Entity.TenantId); + + await _notificationSender.SendNofiterAsync( + UserNotificationNames.WelcomeToApplication, + new NotificationTemplate( + UserNotificationNames.WelcomeToApplication, + formUser: eventData.Entity.UserName, + data: new Dictionary + { + { "name", eventData.Entity.UserName }, + }), + userIdentifer, + eventData.Entity.TenantId, + NotificationSeverity.Info); + } + + private async Task SubscribeInternalNotifers(UserIdentifier userIdentifer, Guid? tenantId = null) + { + // 订阅内置通知 + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.SystemNotice); + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.OnsideNotice); + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + DefaultNotifications.ActivityNotice); + + // 订阅用户欢迎消息 + await _notificationSubscriptionManager + .SubscribeAsync( + tenantId, + userIdentifer, + UserNotificationNames.WelcomeToApplication); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/IdentityResources/CustomIdentityResources.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/IdentityResources/CustomIdentityResources.cs new file mode 100644 index 000000000..99fce8c22 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/IdentityResources/CustomIdentityResources.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.Identity; +using IdentityServer4.Models; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.IdentityResources; + +public class CustomIdentityResources +{ + public class AvatarUrl : IdentityResource + { + public AvatarUrl() + { + Name = IdentityConsts.ClaimType.Avatar.Name; + DisplayName = IdentityConsts.ClaimType.Avatar.DisplayName; + Description = IdentityConsts.ClaimType.Avatar.Description; + Emphasize = true; + UserClaims = new string[] { IdentityConsts.ClaimType.Avatar.Name }; + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.Configure.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.Configure.cs new file mode 100644 index 000000000..765a6ceb2 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.Configure.cs @@ -0,0 +1,954 @@ +using Elsa; +using Elsa.Options; +using LINGYUN.Abp.Aliyun.Localization; +using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.ExceptionHandling; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.Exporter.MiniExcel; +using LINGYUN.Abp.Idempotent; +using LINGYUN.Abp.Identity.Session; +using LINGYUN.Abp.IdentityServer.IdentityResources; +using LINGYUN.Abp.Localization.CultureMap; +using LINGYUN.Abp.Notifications; +using LINGYUN.Abp.OpenIddict.AspNetCore.Session; +using LINGYUN.Abp.OpenIddict.LinkUser; +using LINGYUN.Abp.OpenIddict.Permissions; +using LINGYUN.Abp.OpenIddict.Portal; +using LINGYUN.Abp.OpenIddict.Sms; +using LINGYUN.Abp.OpenIddict.WeChat; +using LINGYUN.Abp.Saas; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using LINGYUN.Abp.Tencent.Localization; +using LINGYUN.Abp.TextTemplating; +using LINGYUN.Abp.WebhooksManagement; +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Localization; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.Wrapper; +using LINGYUN.Platform.Localization; +using PackageName.CompanyName.ProjectName.AIO.Host.Microsoft.Extensions.DependencyInjection; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Medallion.Threading; +using Medallion.Threading.Redis; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Server.Kestrel.Core; +using Microsoft.Extensions.Caching.StackExchangeRedis; +using Microsoft.IdentityModel.Logging; +using Microsoft.OpenApi.Models; +using MiniExcelLibs.Attributes; +using OpenIddict.Server; +using OpenIddict.Server.AspNetCore; +using PackageName.CompanyName.ProjectName.AIO.Host.Authentication; +using PackageName.CompanyName.ProjectName.AIO.Host.IdentityResources; +using PackageName.CompanyName.ProjectName.AIO.Host.WeChat.Official.Messages; +using Quartz; +using StackExchange.Redis; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text.Encodings.Web; +using System.Text.Unicode; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.AntiForgery; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.Auditing; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.BlobStoring; +using Volo.Abp.BlobStoring.FileSystem; +using Volo.Abp.Caching; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement; +using Volo.Abp.Features; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Http.Client; +using Volo.Abp.Identity.Localization; +using Volo.Abp.IdentityServer; +using Volo.Abp.IdentityServer.Localization; +using Volo.Abp.Json; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.OpenIddict; +using Volo.Abp.OpenIddict.Localization; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Quartz; +using Volo.Abp.Security.Claims; +using Volo.Abp.SettingManagement; +using Volo.Abp.SettingManagement.Localization; +using Volo.Abp.Threading; +using Volo.Abp.UI.Navigation.Urls; +using Volo.Abp.VirtualFileSystem; +using VoloAbpExceptionHandlingOptions = Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingOptions; + +namespace PackageName.CompanyName.ProjectName.AIO.Host; + +public partial class MicroServiceApplicationsSingleModule +{ + protected const string DefaultCorsPolicyName = "Default"; + public static string ApplicationName { get; set; } = "MicroService-Applications-Single"; + private readonly static OneTimeRunner OneTimeRunner = new(); + + private void PreConfigureFeature() + { + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.Editions().EnableAll(); + }); + } + + private void PreConfigureApp(IConfiguration configuration) + { + AbpSerilogEnrichersConsts.ApplicationName = ApplicationName; + + PreConfigure(options => + { + // 以开放端口区别,应在0-31之间 + options.SnowflakeIdOptions.WorkerId = 1; + options.SnowflakeIdOptions.WorkerIdBits = 5; + options.SnowflakeIdOptions.DatacenterId = 1; + }); + + if (configuration.GetValue("App:ShowPii")) + { + IdentityModelEventSource.ShowPII = true; + } + } + + private void PreConfigureAuthServer(IConfiguration configuration) + { + PreConfigure(builder => + { + builder.AddValidation(options => + { + //options.AddAudiences("lingyun-abp-application"); + + options.UseLocalServer(); + + options.UseAspNetCore(); + + options.UseDataProtection(); + }); + }); + } + + private void PreConfigureIdentity() + { + PreConfigure(builder => + { + builder.AddDefaultTokenProviders(); + }); + } + + private void PreConfigureCertificate(IConfiguration configuration, IWebHostEnvironment environment) + { + var cerConfig = configuration.GetSection("Certificates"); + if (environment.IsProduction() && cerConfig.Exists()) + { + // 开发环境下存在证书配置 + // 且证书文件存在则使用自定义的证书文件来启动Ids服务器 + var cerPath = Path.Combine(environment.ContentRootPath, cerConfig["CerPath"]); + if (File.Exists(cerPath)) + { + var certificate = new X509Certificate2(cerPath, cerConfig["Password"]); + + if (configuration.GetValue("AuthServer:UseOpenIddict")) + { + PreConfigure(options => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + + PreConfigure(builder => + { + builder.AddSigningCertificate(certificate); + builder.AddEncryptionCertificate(certificate); + + builder.UseDataProtection(); + + // 禁用https + builder.UseAspNetCore() + .DisableTransportSecurityRequirement(); + }); + } + else + { + PreConfigure(options => + { + options.AddDeveloperSigningCredential = false; + }); + + PreConfigure(builder => + { + builder.AddSigningCredential(certificate); + }); + } + } + } + else + { + if (configuration.GetValue("AuthServer:UseOpenIddict")) + { + PreConfigure(options => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + options.AddDevelopmentEncryptionAndSigningCertificate = false; + }); + + PreConfigure(builder => + { + //https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Encryption Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddSigningCertificate(certificate); + } + + using (var algorithm = RSA.Create(keySizeInBits: 2048)) + { + var subject = new X500DistinguishedName("CN=Fabrikam Signing Certificate"); + var request = new CertificateRequest(subject, algorithm, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + request.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, critical: true)); + var certificate = request.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(2)); + builder.AddEncryptionCertificate(certificate); + } + + builder.UseDataProtection(); + + // 禁用https + builder.UseAspNetCore() + .DisableTransportSecurityRequirement(); + }); + } + } + } + + private void PreConfigureQuartz(IConfiguration configuration) + { + PreConfigure(options => + { + // 如果使用持久化存储, 则配置quartz持久层 + if (configuration.GetSection("Quartz:UsePersistentStore").Get()) + { + var settings = configuration.GetSection("Quartz:Properties").Get>(); + if (settings != null) + { + foreach (var setting in settings) + { + options.Properties[setting.Key] = setting.Value; + } + } + + options.Configurator += (config) => + { + config.UsePersistentStore(store => + { + store.UseProperties = false; + store.UseNewtonsoftJsonSerializer(); + }); + }; + } + }); + } + + private void PreConfigureElsa(IServiceCollection services, IConfiguration configuration) + { + var elsaSection = configuration.GetSection("Elsa"); + var startups = new[] + { + typeof(Elsa.Activities.Console.Startup), + typeof(Elsa.Activities.Http.Startup), + typeof(Elsa.Activities.UserTask.Startup), + typeof(Elsa.Activities.Temporal.Quartz.Startup), + typeof(Elsa.Activities.Email.Startup), + typeof(Elsa.Scripting.JavaScript.Startup), + typeof(Elsa.Activities.Webhooks.Startup), + }; + + PreConfigure(elsa => + { + elsa + .AddActivitiesFrom() + .AddWorkflowsFrom() + .AddFeatures(startups, configuration) + .ConfigureWorkflowChannels(options => elsaSection.GetSection("WorkflowChannels").Bind(options)); + + elsa.DistributedLockingOptionsBuilder + .UseProviderFactory(sp => name => + { + var provider = sp.GetRequiredService(); + + return provider.CreateLock(name); + }); + }); + + services.AddNotificationHandlersFrom(); + + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(Elsa.Webhooks.Api.Endpoints.List).Assembly); + }); + } + + private void ConfigureAuthServer(IConfiguration configuration) + { + Configure(builder => + { + builder.DisableTransportSecurityRequirement(); + }); + + Configure(options => + { + options.DisableTransportSecurityRequirement = true; + }); + + Configure(options => + { + var lifetime = configuration.GetSection("OpenIddict:Lifetime"); + options.AuthorizationCodeLifetime = lifetime.GetValue("AuthorizationCode", options.AuthorizationCodeLifetime); + options.AccessTokenLifetime = lifetime.GetValue("AccessToken", options.AccessTokenLifetime); + options.DeviceCodeLifetime = lifetime.GetValue("DeviceCode", options.DeviceCodeLifetime); + options.IdentityTokenLifetime = lifetime.GetValue("IdentityToken", options.IdentityTokenLifetime); + options.RefreshTokenLifetime = lifetime.GetValue("RefreshToken", options.RefreshTokenLifetime); + options.RefreshTokenReuseLeeway = lifetime.GetValue("RefreshTokenReuseLeeway", options.RefreshTokenReuseLeeway); + options.UserCodeLifetime = lifetime.GetValue("UserCode", options.UserCodeLifetime); + }); + Configure(options => + { + options.PersistentSessionGrantTypes.Add(SmsTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(PortalTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(LinkUserTokenExtensionGrantConsts.GrantType); + options.PersistentSessionGrantTypes.Add(WeChatTokenExtensionGrantConsts.OfficialGrantType); + options.PersistentSessionGrantTypes.Add(WeChatTokenExtensionGrantConsts.MiniProgramGrantType); + options.PersistentSessionGrantTypes.Add(AbpWeChatWorkGlobalConsts.GrantType); + }); + } + + private void ConfigureEndpoints(IServiceCollection services) + { + // 不需要 + //Configure(options => + //{ + // options.EndpointConfigureActions.Add( + // (context) => + // { + // context.Endpoints.MapFallbackToPage("/_Host"); + // }); + //}); + var preActions = services.GetPreConfigureActions(); + + services.AddAbpApiVersioning(options => + { + options.ReportApiVersions = true; + options.AssumeDefaultVersionWhenUnspecified = true; + + //options.ApiVersionReader = new HeaderApiVersionReader("api-version"); //Supports header too + //options.ApiVersionReader = new MediaTypeApiVersionReader(); //Supports accept header too + }, mvcOptions => + { + mvcOptions.ConfigureAbp(preActions.Configure()); + }); + + //services.AddApiVersioning(config => + //{ + // // Specify the default API Version as 1.0 + // config.DefaultApiVersion = new ApiVersion(1, 0); + // // Advertise the API versions supported for the particular endpoint (through 'api-supported-versions' response header which lists all available API versions for that endpoint) + // config.ReportApiVersions = true; + //}); + + //services.AddVersionedApiExplorer(options => + //{ + // // add the versioned api explorer, which also adds IApiVersionDescriptionProvider service + // // note: the specified format code will format the version as "'v'major[.minor][-status]" + // options.GroupNameFormat = "'v'VVV"; + + // // note: this option is only necessary when versioning by url segment. the SubstitutionFormat + // // can also be used to control the format of the API version in route templates + // options.SubstituteApiVersionInUrl = true; + //}); + } + + private void ConfigureKestrelServer() + { + Configure(options => + { + options.Limits.MaxRequestBodySize = null; + options.Limits.MaxRequestBufferSize = null; + }); + } + + private void ConfigureBlobStoring(IConfiguration configuration) + { + Configure(options => + { + options.Containers.ConfigureAll((containerName, containerConfiguration) => + { + containerConfiguration.UseFileSystem(fileSystem => + { + fileSystem.BasePath = Path.Combine(Directory.GetCurrentDirectory(), "blobs"); + }); + + //containerConfiguration.UseMinio(minio => + //{ + // configuration.GetSection("Minio").Bind(minio); + //}); + }); + }); + } + + private void ConfigureBackgroundTasks() + { + Configure(options => + { + options.NodeName = ApplicationName; + options.JobCleanEnabled = true; + options.JobFetchEnabled = true; + options.JobCheckEnabled = true; + }); + } + + private void ConfigureTextTemplating(IConfiguration configuration) + { + if (configuration.GetValue("TextTemplating:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicTemplateDefinitionStoreEnabled = true; + }); + } + } + + private void ConfigureFeatureManagement(IConfiguration configuration) + { + if (configuration.GetValue("FeatureManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicFeatureStoreEnabled = true; + }); + } + Configure(options => + { + options.ProviderPolicies[EditionFeatureValueProvider.ProviderName] = AbpSaasPermissions.Editions.ManageFeatures; + options.ProviderPolicies[TenantFeatureValueProvider.ProviderName] = AbpSaasPermissions.Tenants.ManageFeatures; + }); + } + + private void ConfigureSettingManagement(IConfiguration configuration) + { + if (configuration.GetValue("SettingManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicSettingStoreEnabled = true; + }); + } + } + + private void ConfigureWebhooksManagement(IConfiguration configuration) + { + if (configuration.GetValue("WebhooksManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicWebhookStoreEnabled = true; + }); + } + } + /// + /// 配置数据导出 + /// + private void ConfigureExporter() + { + Configure(options => + { + // options.MapExportSetting(typeof(BookDto), config => + // { + // config.DynamicColumns = new[] + // { + // // 忽略某些字段 + // new DynamicExcelColumn(nameof(BookDto.AuthorId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.LastModificationTime)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.LastModifierId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.CreationTime)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.CreatorId)){ Ignore = true }, + // new DynamicExcelColumn(nameof(BookDto.Id)){ Ignore = true }, + // }; + // }); + }); + } + /// + /// 配置数据权限 + /// + private void ConfigureEntityDataProtected() + { + // Configure(options => + // { + // options.AddEntities(typeof(DemoResource), + // new[] + // { + // typeof(Book), + // }); + // }); + } + + private void ConfigurePermissionManagement(IConfiguration configuration) + { + if (configuration.GetValue("PermissionManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicPermissionStoreEnabled = true; + }); + } + Configure(options => + { + // Rename IdentityServer.Client.ManagePermissions + // See https://github.com/abpframework/abp/blob/dev/modules/identityserver/src/Volo.Abp.PermissionManagement.Domain.IdentityServer/Volo/Abp/PermissionManagement/IdentityServer/AbpPermissionManagementDomainIdentityServerModule.cs + options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpOpenIddictPermissions.Applications.ManagePermissions; + + //if (configuration.GetValue("AuthServer:UseOpenIddict")) + //{ + // options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpOpenIddictPermissions.Applications.ManagePermissions; + //} + //else + //{ + // options.ProviderPolicies[ClientPermissionValueProvider.ProviderName] = AbpIdentityServerPermissions.Clients.ManagePermissions; + //} + }); + } + + private void ConfigureNotificationManagement(IConfiguration configuration) + { + if (configuration.GetValue("NotificationsManagement:IsDynamicStoreEnabled")) + { + Configure(options => + { + options.IsDynamicNotificationsStoreEnabled = true; + }); + } + } + + private void ConfigureDistributedLock(IServiceCollection services, IConfiguration configuration) + { + var distributedLockEnabled = configuration["DistributedLock:IsEnabled"]; + if (distributedLockEnabled.IsNullOrEmpty() || bool.Parse(distributedLockEnabled)) + { + var redis = ConnectionMultiplexer.Connect(configuration["DistributedLock:Redis:Configuration"]); + services.AddSingleton(_ => new RedisDistributedSynchronizationProvider(redis.GetDatabase())); + } + } + + private void ConfigureVirtualFileSystem() + { + Configure(options => + { + options.FileSets.AddEmbedded("PackageName.CompanyName.ProjectName.AIO"); + }); + } + + private void ConfigureIdempotent() + { + Configure(options => + { + options.IsEnabled = true; + options.DefaultTimeout = 0; + }); + } + + private void ConfigureDbContext() + { + // 配置Ef + Configure(options => + { +#if MySQL + options.UseMySQL(); + options.UseMySQL(); +#elif SqlServer + options.UseSqlServer(); + options.UseSqlServer(builder => + { + // see https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver16 + // builder.UseCompatibilityLevel(150); + }); +#elif Sqlite + options.UseSqlite(); + options.UseSqlite(); +#elif Oracle || OracleDevart + options.UseOracle(); + options.UseOracle(); +#elif PostgreSql + System.AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);//解决PostgreSql设置为utc时间后无法写入local时区的问题 + options.UseNpgsql(); + options.UseNpgsql(); +#endif + }); + } + + private void ConfigureDataSeeder() + { + Configure(options => + { + options.Resources.Add(new CustomIdentityResources.AvatarUrl()); + }); + } + + private void ConfigureExceptionHandling() + { + // 自定义需要处理的异常 + Configure(options => + { + // 加入需要处理的异常类型 + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + }); + // 自定义需要发送邮件通知的异常类型 + Configure(options => + { + // 是否发送堆栈信息 + options.SendStackTrace = true; + // 未指定异常接收者的默认接收邮件 + // 指定自己的邮件地址 + }); + + Configure(options => + { + options.SendStackTraceToClients = false; + options.SendExceptionsDetailsToClients = false; + }); + } + + private void ConfigureJsonSerializer(IConfiguration configuration) + { + // 统一时间日期格式 + Configure(options => + { + var jsonConfiguration = configuration.GetSection("Json"); + if (jsonConfiguration.Exists()) + { + jsonConfiguration.Bind(options); + } + }); + // 中文序列化的编码问题 + Configure(options => + { + options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); + }); + } + + private void ConfigureCaching(IConfiguration configuration) + { + Configure(options => + { + configuration.GetSection("DistributedCache").Bind(options); + }); + + Configure(options => + { + var redisConfig = ConfigurationOptions.Parse(options.Configuration); + options.ConfigurationOptions = redisConfig; + options.InstanceName = configuration["Redis:InstanceName"]; + }); + } + + private void ConfigureMultiTenancy(IConfiguration configuration) + { + // 多租户 + Configure(options => + { + options.IsEnabled = true; + }); + + var tenantResolveCfg = configuration.GetSection("App:Domains"); + if (tenantResolveCfg.Exists()) + { + Configure(options => + { + var domains = tenantResolveCfg.Get(); + foreach (var domain in domains) + { + options.AddDomainTenantResolver(domain); + } + }); + } + } + + private void ConfigureAuditing(IConfiguration configuration) + { + Configure(options => + { + options.ApplicationName = ApplicationName; + // 是否启用实体变更记录 + var allEntitiesSelectorIsEnabled = configuration["Auditing:AllEntitiesSelector"]; + if (allEntitiesSelectorIsEnabled.IsNullOrWhiteSpace() || + (bool.TryParse(allEntitiesSelectorIsEnabled, out var enabled) && enabled)) + { + options.EntityHistorySelectors.AddAllEntities(); + } + }); + } + + private void ConfigureSwagger(IServiceCollection services) + { + // Swagger + services.AddSwaggerGen( + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "App API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + Name = "Authorization", + In = ParameterLocation.Header, + Scheme = "bearer", + Type = SecuritySchemeType.Http, + BearerFormat = "JWT" + }); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } + }, + new string[] { } + } + }); + options.OperationFilter(); + }); + } + + private void ConfigureIdentity(IConfiguration configuration) + { + // 增加配置文件定义,在新建租户时需要 + Configure(options => + { + var identityConfiguration = configuration.GetSection("Identity"); + if (identityConfiguration.Exists()) + { + identityConfiguration.Bind(options); + } + }); + Configure(options => + { + options.IsDynamicClaimsEnabled = true; + }); + Configure(options => + { + options.IsCleanupEnabled = true; + }); + } + + private void ConfigureMvcUiTheme() + { + Configure(options => + { + //options.StyleBundles.Configure( + // LeptonXLiteThemeBundles.Styles.Global, + // bundle => + // { + // bundle.AddFiles("/global-styles.css"); + // } + //); + }); + } + + private void ConfigureLocalization() + { + Configure(options => + { + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + + options + .AddLanguagesMapOrUpdate( + "vue-admin-element-ui", + new NameValue("zh-Hans", "zh"), + new NameValue("en", "en")); + + // vben admin 语言映射 + options + .AddLanguagesMapOrUpdate( + "vben-admin-ui", + new NameValue("zh_CN", "zh-Hans")); + + options.Resources.Get() + .AddBaseTypes( + typeof(IdentityResource), + typeof(AliyunResource), + typeof(TencentCloudResource), + typeof(WeChatResource), + typeof(PlatformResource), + typeof(AbpOpenIddictResource), + typeof(AbpIdentityServerResource)); + + options.UseAllPersistence(); + }); + + Configure(options => + { + var zhHansCultureMapInfo = new CultureMapInfo + { + TargetCulture = "zh-Hans", + SourceCultures = new string[] { "zh", "zh_CN", "zh-CN" } + }; + + options.CulturesMaps.Add(zhHansCultureMapInfo); + options.UiCulturesMaps.Add(zhHansCultureMapInfo); + }); + } + + private void ConfigureWrapper() + { + Configure(options => + { + options.IsEnabled = true; + // options.IsWrapUnauthorizedEnabled = true; + options.IgnoreNamespaces.Add("Elsa"); + }); + } + + private void PreConfigureWrapper() + { + //PreConfigure(options => + //{ + // options.ProxyRequestActions.Add( + // (appid, httprequestmessage) => + // { + // httprequestmessage.Headers.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + // }); + //}); + + PreConfigure(options => + { + options.ProxyClientActions.Add( + (_, _, client) => + { + client.DefaultRequestHeaders.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + }); + }); + } + + private void ConfigureAuditing() + { + Configure(options => + { + // options.IsEnabledForGetRequests = true; + options.ApplicationName = ApplicationName; + }); + } + + private void ConfigureUrls(IConfiguration configuration) + { + Configure(options => + { + var applicationConfiguration = configuration.GetSection("App:Urls:Applications"); + foreach (var appConfig in applicationConfiguration.GetChildren()) + { + options.Applications[appConfig.Key].RootUrl = appConfig["RootUrl"]; + foreach (var urlsConfig in appConfig.GetSection("Urls").GetChildren()) + { + options.Applications[appConfig.Key].Urls[urlsConfig.Key] = urlsConfig.Value; + } + } + }); + } + + private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false) + { + Configure(options => + { + options.AutoValidate = false; + }); + + services.Replace(ServiceLifetime.Scoped); + + services.AddAuthentication() + .AddAbpJwtBearer(options => + { + configuration.GetSection("AuthServer").Bind(options); + + options.Events ??= new JwtBearerEvents(); + options.Events.OnMessageReceived = context => + { + var accessToken = context.Request.Query["access_token"]; + var path = context.HttpContext.Request.Path; + if (!string.IsNullOrEmpty(accessToken) && + (path.StartsWithSegments("/api/files"))) + { + context.Token = accessToken; + } + return Task.CompletedTask; + }; + }); + + if (!isDevelopment) + { + var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); + services + .AddDataProtection() + .SetApplicationName("LINGYUN.Abp.Application") + .PersistKeysToStackExchangeRedis(redis, "LINGYUN.Abp.Application:DataProtection:Protection-Keys"); + } + + services.AddSameSiteCookiePolicy(); + } + + private void ConfigureCors(IServiceCollection services, IConfiguration configuration) + { + services.AddCors(options => + { + options.AddPolicy(DefaultCorsPolicyName, builder => + { + builder + .WithOrigins( + configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .WithAbpWrapExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + private void ConfigureWeChat() + { + Configure(options => + { + // 回复文本消息 + options.MapMessage< + LINGYUN.Abp.WeChat.Official.Messages.Models.TextMessage, + TextMessageReplyContributor>(); + // 处理关注事件 + options.MapEvent< + LINGYUN.Abp.WeChat.Official.Messages.Models.UserSubscribeEvent, + UserSubscribeEventContributor>(); + + options.MapMessage< + LINGYUN.Abp.WeChat.Work.Common.Messages.Models.TextMessage, + WeChat.Work.Messages.TextMessageReplyContributor>(); + }); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.cs new file mode 100644 index 000000000..c3b097cba --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MicroServiceApplicationsSingleModule.cs @@ -0,0 +1,423 @@ +using LINGYUN.Abp.Account; +using LINGYUN.Abp.Account.Templates; +using LINGYUN.Abp.Aliyun.SettingManagement; +using LINGYUN.Abp.AspNetCore.HttpOverrides; +using LINGYUN.Abp.AspNetCore.Mvc.Idempotent.Wrapper; +using LINGYUN.Abp.AspNetCore.Mvc.Localization; +using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; +using LINGYUN.Abp.Auditing; +using LINGYUN.Abp.AuditLogging.EntityFrameworkCore; +using LINGYUN.Abp.Authentication.QQ; +using LINGYUN.Abp.Authentication.WeChat; +using LINGYUN.Abp.Authorization.OrganizationUnits; +using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.BackgroundTasks.Activities; +using LINGYUN.Abp.BackgroundTasks.DistributedLocking; +using LINGYUN.Abp.BackgroundTasks.EventBus; +using LINGYUN.Abp.BackgroundTasks.ExceptionHandling; +using LINGYUN.Abp.BackgroundTasks.Jobs; +using LINGYUN.Abp.BackgroundTasks.Notifications; +using LINGYUN.Abp.BackgroundTasks.Quartz; +using LINGYUN.Abp.CachingManagement; +using LINGYUN.Abp.CachingManagement.StackExchangeRedis; +using LINGYUN.Abp.Dapr.Client; +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore; +// using LINGYUN.Abp.Demo; +// using LINGYUN.Abp.Demo.EntityFrameworkCore; +using LINGYUN.Abp.ExceptionHandling; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.Exporter.MiniExcel; +using LINGYUN.Abp.FeatureManagement; +using LINGYUN.Abp.FeatureManagement.HttpApi; +using LINGYUN.Abp.Features.LimitValidation; +using LINGYUN.Abp.Features.LimitValidation.Redis.Client; +using LINGYUN.Abp.Http.Client.Wrapper; +using LINGYUN.Abp.Identity; +using LINGYUN.Abp.Identity.AspNetCore.Session; +using LINGYUN.Abp.Identity.EntityFrameworkCore; +using LINGYUN.Abp.Identity.Notifications; +using LINGYUN.Abp.Identity.OrganizaztionUnits; +using LINGYUN.Abp.Identity.Session.AspNetCore; +using LINGYUN.Abp.Identity.WeChat; +using LINGYUN.Abp.IdGenerator; +using LINGYUN.Abp.IM.SignalR; +using LINGYUN.Abp.Localization.CultureMap; +using LINGYUN.Abp.Localization.Persistence; +using LINGYUN.Abp.LocalizationManagement; +using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; +using LINGYUN.Abp.MessageService; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.MultiTenancy.Editions; +using LINGYUN.Abp.Notifications; +using LINGYUN.Abp.Notifications.Common; +using LINGYUN.Abp.Notifications.Emailing; +using LINGYUN.Abp.Notifications.EntityFrameworkCore; +using LINGYUN.Abp.Notifications.SignalR; +using LINGYUN.Abp.Notifications.WeChat.MiniProgram; +using LINGYUN.Abp.OpenApi.Authorization; +using LINGYUN.Abp.OpenIddict; +using LINGYUN.Abp.OpenIddict.AspNetCore; +using LINGYUN.Abp.OpenIddict.AspNetCore.Session; +using LINGYUN.Abp.OpenIddict.Portal; +using LINGYUN.Abp.OpenIddict.Sms; +using LINGYUN.Abp.OpenIddict.WeChat; +using LINGYUN.Abp.OpenIddict.WeChat.Work; +using LINGYUN.Abp.OssManagement; +using LINGYUN.Abp.OssManagement.FileSystem; +// using LINGYUN.Abp.OssManagement.Imaging; +using LINGYUN.Abp.OssManagement.SettingManagement; +using LINGYUN.Abp.PermissionManagement; +using LINGYUN.Abp.PermissionManagement.HttpApi; +using LINGYUN.Abp.PermissionManagement.OrganizationUnits; +using LINGYUN.Abp.Saas; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using LINGYUN.Abp.SettingManagement; +using LINGYUN.Abp.Sms.Aliyun; +using LINGYUN.Abp.TaskManagement; +using LINGYUN.Abp.TaskManagement.EntityFrameworkCore; +using LINGYUN.Abp.Tencent.QQ; +using LINGYUN.Abp.Tencent.SettingManagement; +using LINGYUN.Abp.TextTemplating; +using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; +using LINGYUN.Abp.UI.Navigation; +using LINGYUN.Abp.UI.Navigation.VueVbenAdmin; +using LINGYUN.Abp.Webhooks; +using LINGYUN.Abp.Webhooks.EventBus; +using LINGYUN.Abp.Webhooks.Identity; +using LINGYUN.Abp.Webhooks.Saas; +using LINGYUN.Abp.WebhooksManagement; +using LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore; +using LINGYUN.Abp.WeChat.MiniProgram; +using LINGYUN.Abp.WeChat.Official; +using LINGYUN.Abp.WeChat.Official.Handlers; +using LINGYUN.Abp.WeChat.SettingManagement; +using LINGYUN.Abp.WeChat.Work; +using LINGYUN.Abp.WeChat.Work.Handlers; +using LINGYUN.Platform; +using LINGYUN.Platform.EntityFrameworkCore; +using LINGYUN.Platform.HttpApi; +using LINGYUN.Platform.Settings.VueVbenAdmin; +using LINGYUN.Platform.Theme.VueVbenAdmin; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using PackageName.CompanyName.ProjectName.SettingManagement; +using Volo.Abp; +using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Authentication.JwtBearer; +using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Caching.StackExchangeRedis; +using Volo.Abp.Data; +using Volo.Abp.EventBus; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Imaging; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.Identity; +using Volo.Abp.PermissionManagement.OpenIddict; +using Volo.Abp.SettingManagement; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.Threading; +#if MySQL +using Volo.Abp.EntityFrameworkCore.MySQL; +#elif SqlServer +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore.Infrastructure; +#elif Sqlite +using Volo.Abp.EntityFrameworkCore.Sqlite; +#elif Oracle +using Volo.Abp.EntityFrameworkCore.Oracle; +#elif OracleDevart +using Volo.Abp.EntityFrameworkCore.Oracle.Devart; +#elif PostgreSql +using Volo.Abp.EntityFrameworkCore.PostgreSql; +#endif + +namespace PackageName.CompanyName.ProjectName.AIO.Host; + +[DependsOn( + typeof(AbpAccountApplicationModule), + typeof(AbpAccountHttpApiModule), + typeof(AbpAccountWebOpenIddictModule), + typeof(AbpAuditingApplicationModule), + typeof(AbpAuditingHttpApiModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpCachingManagementStackExchangeRedisModule), + typeof(AbpCachingManagementApplicationModule), + typeof(AbpCachingManagementHttpApiModule), + typeof(AbpIdentityAspNetCoreSessionModule), + typeof(AbpIdentitySessionAspNetCoreModule), + typeof(AbpIdentityNotificationsModule), + typeof(AbpIdentityDomainModule), + typeof(AbpIdentityApplicationModule), + typeof(AbpIdentityHttpApiModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementDomainModule), + typeof(AbpLocalizationManagementApplicationModule), + typeof(AbpLocalizationManagementHttpApiModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpSerilogEnrichersApplicationModule), + typeof(AbpSerilogEnrichersUniqueIdModule), + typeof(AbpMessageServiceDomainModule), + typeof(AbpMessageServiceApplicationModule), + typeof(AbpMessageServiceHttpApiModule), + typeof(AbpMessageServiceEntityFrameworkCoreModule), + typeof(AbpNotificationsDomainModule), + typeof(AbpNotificationsApplicationModule), + typeof(AbpNotificationsHttpApiModule), + typeof(AbpNotificationsEntityFrameworkCoreModule), + + //typeof(AbpIdentityServerSessionModule), + //typeof(AbpIdentityServerApplicationModule), + //typeof(AbpIdentityServerHttpApiModule), + //typeof(AbpIdentityServerEntityFrameworkCoreModule), + + typeof(AbpOpenIddictAspNetCoreModule), + typeof(AbpOpenIddictAspNetCoreSessionModule), + typeof(AbpOpenIddictApplicationModule), + typeof(AbpOpenIddictHttpApiModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpOpenIddictSmsModule), + typeof(AbpOpenIddictPortalModule), + typeof(AbpOpenIddictWeChatModule), + typeof(AbpOpenIddictWeChatWorkModule), + + //typeof(AbpOssManagementMinioModule), // 取消注释以使用Minio + typeof(AbpOssManagementFileSystemModule), + // typeof(AbpOssManagementImagingModule), + typeof(AbpOssManagementDomainModule), + typeof(AbpOssManagementApplicationModule), + typeof(AbpOssManagementHttpApiModule), + typeof(AbpOssManagementSettingManagementModule), + typeof(AbpImagingImageSharpModule), + + typeof(PlatformDomainModule), + typeof(PlatformApplicationModule), + typeof(PlatformHttpApiModule), + typeof(PlatformEntityFrameworkCoreModule), + typeof(PlatformSettingsVueVbenAdminModule), + typeof(PlatformThemeVueVbenAdminModule), + typeof(AbpUINavigationVueVbenAdminModule), + + typeof(AbpSaasDomainModule), + typeof(AbpSaasApplicationModule), + typeof(AbpSaasHttpApiModule), + typeof(AbpSaasEntityFrameworkCoreModule), + + typeof(TaskManagementDomainModule), + typeof(TaskManagementApplicationModule), + typeof(TaskManagementHttpApiModule), + typeof(TaskManagementEntityFrameworkCoreModule), + + typeof(AbpTextTemplatingDomainModule), + typeof(AbpTextTemplatingApplicationModule), + typeof(AbpTextTemplatingHttpApiModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + + typeof(AbpWebhooksModule), + typeof(AbpWebhooksEventBusModule), + typeof(AbpWebhooksIdentityModule), + typeof(AbpWebhooksSaasModule), + typeof(WebhooksManagementDomainModule), + typeof(WebhooksManagementApplicationModule), + typeof(WebhooksManagementHttpApiModule), + typeof(WebhooksManagementEntityFrameworkCoreModule), + + typeof(AbpFeatureManagementApplicationModule), + typeof(AbpFeatureManagementHttpApiModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + + typeof(AbpSettingManagementDomainModule), + typeof(AbpSettingManagementApplicationModule), + typeof(AbpSettingManagementHttpApiModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpPermissionManagementHttpApiModule), + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpPermissionManagementDomainOpenIddictModule), + // typeof(AbpPermissionManagementDomainIdentityServerModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementDomainOrganizationUnitsModule), // 组织机构权限管理 + +#if MySQL + typeof(AbpEntityFrameworkCoreMySQLModule), +#elif SqlServer + typeof(AbpEntityFrameworkCoreSqlServerModule), +#elif Sqlite + typeof(AbpEntityFrameworkCoreSqliteModule), +#elif Oracle + typeof(AbpEntityFrameworkCoreOracleModule), +#elif OracleDevart + typeof(AbpEntityFrameworkCoreOracleDevartModule), +#elif PostgreSql + typeof(AbpEntityFrameworkCorePostgreSqlModule), +#endif + + typeof(AbpAliyunSmsModule), + typeof(AbpAliyunSettingManagementModule), + + typeof(AbpAuthenticationQQModule), + typeof(AbpAuthenticationWeChatModule), + typeof(AbpAuthorizationOrganizationUnitsModule), + typeof(AbpIdentityOrganizaztionUnitsModule), + + typeof(AbpBackgroundTasksModule), + typeof(AbpBackgroundTasksActivitiesModule), + typeof(AbpBackgroundTasksDistributedLockingModule), + typeof(AbpBackgroundTasksEventBusModule), + typeof(AbpBackgroundTasksExceptionHandlingModule), + typeof(AbpBackgroundTasksJobsModule), + typeof(AbpBackgroundTasksNotificationsModule), + typeof(AbpBackgroundTasksQuartzModule), + + typeof(AbpDataProtectionManagementApplicationModule), + typeof(AbpDataProtectionManagementHttpApiModule), + typeof(AbpDataProtectionManagementEntityFrameworkCoreModule), + + // typeof(AbpDemoApplicationModule), + // typeof(AbpDemoHttpApiModule), + // typeof(AbpDemoEntityFrameworkCoreModule), + + typeof(AbpDaprClientModule), + typeof(AbpExceptionHandlingModule), + typeof(AbpEmailingExceptionHandlingModule), + typeof(AbpFeaturesLimitValidationModule), + typeof(AbpFeaturesValidationRedisClientModule), + typeof(AbpAspNetCoreMvcLocalizationModule), + + typeof(AbpLocalizationCultureMapModule), + typeof(AbpLocalizationPersistenceModule), + + typeof(AbpOpenApiAuthorizationModule), + + typeof(AbpIMSignalRModule), + + typeof(AbpNotificationsModule), + typeof(AbpNotificationsCommonModule), + typeof(AbpNotificationsSignalRModule), + typeof(AbpNotificationsEmailingModule), + typeof(AbpMultiTenancyEditionsModule), + + typeof(AbpTencentQQModule), + typeof(AbpTencentCloudSettingManagementModule), + + typeof(AbpIdentityWeChatModule), + typeof(AbpNotificationsWeChatMiniProgramModule), + typeof(AbpWeChatMiniProgramModule), + typeof(AbpWeChatOfficialModule), + typeof(AbpWeChatOfficialApplicationModule), + typeof(AbpWeChatOfficialHttpApiModule), + typeof(AbpWeChatWorkModule), + typeof(AbpWeChatWorkApplicationModule), + typeof(AbpWeChatWorkHttpApiModule), + typeof(AbpWeChatOfficialHandlersModule), + typeof(AbpWeChatWorkHandlersModule), + typeof(AbpWeChatSettingManagementModule), + + typeof(AbpDataDbMigratorModule), + typeof(AbpIdGeneratorModule), + typeof(AbpUINavigationModule), + typeof(AbpAccountTemplatesModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpCachingStackExchangeRedisModule), + // typeof(AbpElsaModule), + // typeof(AbpElsaServerModule), + // typeof(AbpElsaActivitiesModule), + // typeof(AbpElsaEntityFrameworkCoreModule), + // typeof(AbpElsaEntityFrameworkCorePostgreSqlModule), + // typeof(AbpElsaModule), + // typeof(AbpElsaServerModule), + // typeof(AbpElsaActivitiesModule), + // typeof(AbpElsaEntityFrameworkCoreModule), + // typeof(AbpElsaEntityFrameworkCoreMySqlModule), + + typeof(AbpExporterMiniExcelModule), + typeof(AbpAspNetCoreMvcUiMultiTenancyModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(AbpHttpClientWrapperModule), + typeof(AbpAspNetCoreMvcWrapperModule), + typeof(AbpAspNetCoreMvcIdempotentWrapperModule), + typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpEventBusModule), + typeof(AbpAutofacModule), + + typeof(ProjectNameApplicationModule), + typeof(ProjectNameHttpApiModule), + typeof(ProjectNameEntityFrameworkCoreModule), + typeof(ProjectNameSettingManagementModule) + )] +public partial class MicroServiceApplicationsSingleModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + var hostingEnvironment = context.Services.GetHostingEnvironment(); + + PreConfigureWrapper(); + PreConfigureFeature(); + PreConfigureIdentity(); + PreConfigureApp(configuration); + PreConfigureQuartz(configuration); + PreConfigureAuthServer(configuration); + PreConfigureElsa(context.Services, configuration); + PreConfigureCertificate(configuration, hostingEnvironment); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + ConfigureWeChat(); + ConfigureWrapper(); + ConfigureExporter(); + ConfigureAuditing(); + ConfigureDbContext(); + ConfigureIdempotent(); + ConfigureMvcUiTheme(); + ConfigureDataSeeder(); + ConfigureLocalization(); + ConfigureKestrelServer(); + ConfigureBackgroundTasks(); + ConfigureExceptionHandling(); + ConfigureVirtualFileSystem(); + ConfigureEntityDataProtected(); + ConfigureUrls(configuration); + ConfigureCaching(configuration); + ConfigureAuditing(configuration); + ConfigureIdentity(configuration); + ConfigureAuthServer(configuration); + ConfigureSwagger(context.Services); + ConfigureEndpoints(context.Services); + ConfigureBlobStoring(configuration); + ConfigureMultiTenancy(configuration); + ConfigureJsonSerializer(configuration); + ConfigureTextTemplating(configuration); + ConfigureFeatureManagement(configuration); + ConfigureSettingManagement(configuration); + ConfigureWebhooksManagement(configuration); + ConfigurePermissionManagement(configuration); + ConfigureNotificationManagement(configuration); + ConfigureCors(context.Services, configuration); + ConfigureDistributedLock(context.Services, configuration); + ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + AsyncHelper.RunSync(async () => await OnApplicationInitializationAsync(context)); + } + + public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + await context.ServiceProvider.GetRequiredService().SeedAsync(); ; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs new file mode 100644 index 000000000..42108b0eb --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Microsoft/Extensions/DependencyInjection/SameSiteCookiesServiceCollectionExtensions.cs @@ -0,0 +1,67 @@ +namespace PackageName.CompanyName.ProjectName.AIO.Host.Microsoft.Extensions.DependencyInjection +{ + public static class SameSiteCookiesServiceCollectionExtensions + { + public static IServiceCollection AddSameSiteCookiePolicy(this IServiceCollection services) + { + services.Configure(options => + { + options.MinimumSameSitePolicy = SameSiteMode.Unspecified; + options.OnAppendCookie = cookieContext => + CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); + options.OnDeleteCookie = cookieContext => + CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); + }); + + return services; + } + + private static void CheckSameSite(HttpContext httpContext, CookieOptions options) + { + if (options.SameSite == SameSiteMode.None) + { + var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); + if (!httpContext.Request.IsHttps || DisallowsSameSiteNone(userAgent)) + { + // For .NET Core < 3.1 set SameSite = (SameSiteMode)(-1) + options.SameSite = SameSiteMode.Unspecified; + } + } + } + + private static bool DisallowsSameSiteNone(string userAgent) + { + // Cover all iOS based browsers here. This includes: + // - Safari on iOS 12 for iPhone, iPod Touch, iPad + // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad + // - Chrome on iOS 12 for iPhone, iPod Touch, iPad + // All of which are broken by SameSite=None, because they use the iOS networking stack + if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12")) + { + return true; + } + + // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes: + // - Safari on Mac OS X. + // This does not include: + // - Chrome on Mac OS X + // Because they do not use the Mac OS networking stack. + if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && + userAgent.Contains("Version/") && userAgent.Contains("Safari")) + { + return true; + } + + // Cover Chrome 50-69, because some versions are broken by SameSite=None, + // and none in this range require it. + // Note: this covers some pre-Chromium Edge versions, + // but pre-Chromium Edge does not require SameSite=None. + if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6")) + { + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/ITenantConfigurationCache.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/ITenantConfigurationCache.cs new file mode 100644 index 000000000..daabe255d --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/ITenantConfigurationCache.cs @@ -0,0 +1,10 @@ +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.MultiTenancy; + +public interface ITenantConfigurationCache +{ + Task RefreshAsync(); + + Task> GetTenantsAsync(); +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCache.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCache.cs new file mode 100644 index 000000000..61f939f97 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCache.cs @@ -0,0 +1,59 @@ +using LINGYUN.Abp.Saas.Tenants; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.MultiTenancy; + +public class TenantConfigurationCache : ITenantConfigurationCache, ITransientDependency +{ + protected ITenantRepository TenantRepository { get; } + protected IDistributedCache TenantCache { get; } + + public TenantConfigurationCache( + ITenantRepository tenantRepository, + IDistributedCache tenantCache) + { + TenantRepository = tenantRepository; + TenantCache = tenantCache; + } + + public async virtual Task RefreshAsync() + { + var cacheKey = GetCacheKey(); + + await TenantCache.RemoveAsync(cacheKey); + } + + public async virtual Task> GetTenantsAsync() + { + return (await GetForCacheItemAsync()).Tenants; + } + + protected async virtual Task GetForCacheItemAsync() + { + var cacheKey = GetCacheKey(); + var cacheItem = await TenantCache.GetAsync(cacheKey); + if (cacheItem == null) + { + var allActiveTenants = await TenantRepository.GetListAsync(); + + cacheItem = new TenantConfigurationCacheItem( + allActiveTenants + .Where(t => t.IsActive) + .Select(t => new TenantConfiguration(t.Id, t.Name) + { + IsActive = t.IsActive, + }).ToList()); + + await TenantCache.SetAsync(cacheKey, cacheItem); + } + + return cacheItem; + } + + protected virtual string GetCacheKey() + { + return "_Abp_Tenant_Configuration"; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCacheItem.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCacheItem.cs new file mode 100644 index 000000000..ac10549e5 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/MultiTenancy/TenantConfigurationCacheItem.cs @@ -0,0 +1,19 @@ +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.MultiTenancy; + +[IgnoreMultiTenancy] +public class TenantConfigurationCacheItem +{ + public List Tenants { get; set; } + + public TenantConfigurationCacheItem() + { + Tenants = new List(); + } + + public TenantConfigurationCacheItem(List tenants) + { + Tenants = tenants; + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/PackageName.CompanyName.ProjectName.AIO.Host.csproj b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/PackageName.CompanyName.ProjectName.AIO.Host.csproj new file mode 100644 index 000000000..90b2d8428 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/PackageName.CompanyName.ProjectName.AIO.Host.csproj @@ -0,0 +1,272 @@ + + + net8.0 + enable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml new file mode 100644 index 000000000..aed9202eb --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.cshtml @@ -0,0 +1,103 @@ +@using Volo.Abp.Account.Localization +@using Volo.Abp.Users +@using Microsoft.AspNetCore.Mvc.Localization +@using Microsoft.Extensions.Localization +@using Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo +@using Volo.Abp.AspNetCore.Mvc.UI.Theming +@using Volo.Abp.Data +@using Volo.Abp.Identity.Settings +@using Volo.Abp.Localization +@using Volo.Abp.Settings +@using Volo.Abp.ObjectExtending +@inject IHtmlLocalizer L +@inject ICurrentUser CurrentUser +@inject ISettingProvider SettingManager +@inject IThemeManager ThemeManager +@inject IStringLocalizerFactory StringLocalizerFactory +@model Volo.Abp.Account.Web.Pages.Account.Components.ProfileManagementGroup.PersonalInfo.AccountProfilePersonalInfoManagementGroupViewComponent.PersonalInfoModel +@{ + var isUserNameUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); + + var isEmailUpdateEnabled = string.Equals(await SettingManager.GetOrNullAsync(IdentitySettingNames.User.IsEmailUpdateEnabled), "true", + StringComparison.OrdinalIgnoreCase); +} + +

@L["PersonalSettings"]


+
+ + + + + + + + + + + + + + + + + + + + @if (CurrentUser.EmailVerified) + { + + } + else + { + @**@ + @L["Validation"].Value + } + + + + + + @foreach (var propertyInfo in ObjectExtensionManager.Instance.GetProperties()) + { + var isAllowed = propertyInfo.Configuration.GetOrDefault(IdentityModuleExtensionConsts.ConfigurationNames.AllowUserToEdit); + + if (isAllowed == null || !isAllowed.Equals(true)) + { + continue; + } + + if (!propertyInfo.Name.EndsWith("_Text")) + { + if (propertyInfo.Type.IsEnum || !propertyInfo.Lookup.Url.IsNullOrEmpty()) + { + if (propertyInfo.Type.IsEnum) + { + Model.ExtraProperties.ToEnum(propertyInfo.Name, propertyInfo.Type); + } + + + } + else + { + + } + } + } + + + diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js new file mode 100644 index 000000000..55a88e52e --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/Components/ProfileManagementGroup/PersonalInfo/Default.js @@ -0,0 +1,28 @@ +(function ($) { + $(function () { + var l = abp.localization.getResource("AbpAccount"); + + $('#PersonalSettingsForm').submit(function (e) { + e.preventDefault(); + + if (!$('#PersonalSettingsForm').valid()) { + return false; + } + + var input = $('#PersonalSettingsForm').serializeFormToObject(); + + volo.abp.account.profile.update(input).then(function (result) { + abp.notify.success(l('PersonalSettingsSaved')); + updateConcurrencyStamp(); + }); + }); + }); + + abp.event.on('passwordChanged', updateConcurrencyStamp); + + function updateConcurrencyStamp(){ + volo.abp.account.profile.get().then(function(profile){ + $("#ConcurrencyStamp").val(profile.concurrencyStamp); + }); + } +})(jQuery); diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml new file mode 100644 index 000000000..d4d8cda0f --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml @@ -0,0 +1,17 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.EmailConfirmModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +
+
+

@L["EmailConfirm"]

+
+ + + @L["Cancel"] + + +
+
diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml.cs new file mode 100644 index 000000000..b2ed2b28e --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirm.cshtml.cs @@ -0,0 +1,72 @@ +using LINGYUN.Abp.Account; +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class EmailConfirmModel : AccountPageModel + { + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public Guid UserId { get; set; } + + [Required] + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ConfirmToken { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public IMyProfileAppService MyProfileAppService { get; set; } + + public EmailConfirmModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public async virtual Task OnPostAsync() + { + try + { + ValidateModel(); + + await MyProfileAppService.ConfirmEmailAsync( + new ConfirmEmailInput + { + ConfirmToken = ConfirmToken, + }); + } + catch (AbpIdentityResultException e) + { + if (!string.IsNullOrWhiteSpace(e.Message)) + { + Alerts.Warning(GetLocalizeExceptionMessage(e)); + return Page(); + } + + throw; + } + catch (AbpValidationException) + { + return Page(); + } + + return RedirectToPage("./ConfirmEmailConfirmation", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash + }); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml new file mode 100644 index 000000000..8ffc6586b --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml @@ -0,0 +1,13 @@ +@page +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.EmailConfirmConfirmationModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@inject IHtmlLocalizer L +
+
+

@L["EmailConfirm"]

+

@L["YourEmailIsSuccessfullyConfirm"]

+ @L["GoToTheApplication"] +
+
diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml.cs new file mode 100644 index 000000000..01f1f0f01 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/EmailConfirmConfirmation.cshtml.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Account.Web.Pages.Account; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account; + +[AllowAnonymous] +public class EmailConfirmConfirmationModel : AccountPageModel +{ + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public async virtual Task OnGetAsync() + { + ReturnUrl = await GetRedirectUrlAsync(ReturnUrl, ReturnUrlHash); + + return Page(); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml new file mode 100644 index 000000000..8d55fdd34 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml @@ -0,0 +1,26 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.SendCodeModel +@inject IHtmlLocalizer L + +
+
+

@L["TwoFactor"]

+
+ + + +
+ +
+
+ @L["SendVerifyCode"] +
+ + @L["Login"] + + +
+
+ diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml.cs new file mode 100644 index 000000000..8155e20f1 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendCode.cshtml.cs @@ -0,0 +1,125 @@ +using LINGYUN.Abp.Account.Emailing; +using LINGYUN.Abp.Identity.Settings; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Rendering; +using Volo.Abp; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Sms; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class SendCodeModel : AccountPageModel + { + [BindProperty] + public SendCodeInputModel Input { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public bool RememberMe { get; set; } + + public IEnumerable Providers { get; set; } + + protected ISmsSender SmsSender { get; } + + protected IAccountEmailVerifySender AccountEmailVerifySender { get; } + + public SendCodeModel( + ISmsSender smsSender, + IAccountEmailVerifySender accountEmailVerifySender) + { + SmsSender = smsSender; + AccountEmailVerifySender = accountEmailVerifySender; + + LocalizationResourceType = typeof(AccountResource); + } + + public virtual async Task OnGetAsync() + { + Input = new SendCodeInputModel(); + + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + // ˫������Ϣ��֤ʧ��,һ�㶼�dz�ʱ�˻����û���Ϣ��� + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + var userFactors = await UserManager.GetValidTwoFactorProvidersAsync(user); + Providers = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + + if (Input.SelectedProvider == "Authenticator") + { + // �û�ͨ���ʼ�/�������ӽ�����Ȩҳ�� + return RedirectToPage("VerifyAuthenticatorCode", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = RememberMe + }); + } + // ������֤�� + var code = await UserManager.GenerateTwoFactorTokenAsync(user, Input.SelectedProvider); + if (string.IsNullOrWhiteSpace(code)) + { + Alerts.Warning(L["InvaidGenerateTwoFactorToken"]); + return Page(); + } + + if (Input.SelectedProvider == "Email") + { + await AccountEmailVerifySender + .SendMailLoginVerifyCodeAsync( + code, + user.UserName, + user.Email); + } + else if (Input.SelectedProvider == "Phone") + { + var phoneNumber = await UserManager.GetPhoneNumberAsync(user); + var templateCode = await SettingProvider.GetOrNullAsync(IdentitySettingNames.User.SmsUserSignin); + Check.NotNullOrWhiteSpace(templateCode, nameof(IdentitySettingNames.User.SmsUserSignin)); + + // TODO: �Ժ���չ����ģ�巢�� + var smsMessage = new SmsMessage(phoneNumber, code); + smsMessage.Properties.Add("code", code); + smsMessage.Properties.Add("TemplateCode", templateCode); + + await SmsSender.SendAsync(smsMessage); + } + + return RedirectToPage("VerifyCode", new + { + provider = Input.SelectedProvider, + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = RememberMe + }); + } + } + + public class SendCodeInputModel + { + public string SelectedProvider { get; set; } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml new file mode 100644 index 000000000..8f0dd7030 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml @@ -0,0 +1,16 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.SendEmailConfirmModel +@inject Volo.Abp.AspNetCore.Mvc.UI.Layout.IPageLayout PageLayout +
+
+

@L["EmailConfirm"]

+
+ + @L["Cancel"] + + +
+
diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml.cs new file mode 100644 index 000000000..9d14d5710 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/SendEmailConfirm.cshtml.cs @@ -0,0 +1,73 @@ +using LINGYUN.Abp.Account; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.Identity; +using Volo.Abp.Validation; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class SendEmailConfirmModel : AccountPageModel + { + [BindProperty(SupportsGet = true)] + public string Email { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + public IMyProfileAppService MyProfileAppService { get; set; } + + public SendEmailConfirmModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public virtual Task OnGetAsync() + { + Email = CurrentUser.Email; + + return Task.FromResult(Page()); + } + + public async virtual Task OnPostAsync() + { + try + { + ValidateModel(); + + await MyProfileAppService.SendEmailConfirmLinkAsync( + new SendEmailConfirmCodeDto + { + Email = Email, + AppName = "MVC", + ReturnUrl = ReturnUrl, + ReturnUrlHash = ReturnUrlHash + }); + } + catch (AbpIdentityResultException e) + { + if (!string.IsNullOrWhiteSpace(e.Message)) + { + Alerts.Warning(GetLocalizeExceptionMessage(e)); + return Page(); + } + + throw; + } + catch (AbpValidationException) + { + return Page(); + } + + return RedirectToPage("~/Account/Manage", new + { + returnUrl = ReturnUrl + }); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/TwoFactorSupportedLoginModel.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/TwoFactorSupportedLoginModel.cs new file mode 100644 index 000000000..166f827e9 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/TwoFactorSupportedLoginModel.cs @@ -0,0 +1,63 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Volo.Abp.Account.Web; +using Volo.Abp.Account.Web.Pages.Account; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Identity; +using Volo.Abp.OpenIddict; +using IdentityOptions = Microsoft.AspNetCore.Identity.IdentityOptions; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + /// + /// 重写登录模型,实现双因素登录 + /// + [Dependency(ReplaceServices = true)] + [ExposeServices(typeof(LoginModel), typeof(OpenIddictSupportedLoginModel))] + public class TwoFactorSupportedLoginModel : OpenIddictSupportedLoginModel + { + public TwoFactorSupportedLoginModel( + IAuthenticationSchemeProvider schemeProvider, + IOptions accountOptions, + IOptions identityOptions, + IdentityDynamicClaimsPrincipalContributorCache identityDynamicClaimsPrincipalContributorCache, + AbpOpenIddictRequestHelper openIddictRequestHelper) + : base(schemeProvider, accountOptions, identityOptions, identityDynamicClaimsPrincipalContributorCache, openIddictRequestHelper) + { + + } + + protected async override Task> GetExternalProviders() + { + var providers = await base.GetExternalProviders(); + + foreach (var provider in providers) + { + var localizedDisplayName = L[provider.DisplayName]; + if (localizedDisplayName.ResourceNotFound) + { + localizedDisplayName = L["AuthenticationScheme:" + provider.DisplayName]; + } + + if (!localizedDisplayName.ResourceNotFound) + { + provider.DisplayName = localizedDisplayName.Value; + } + } + + return providers; + } + + protected override Task TwoFactorLoginResultAsync() + { + // 重定向双因素认证页面 + return Task.FromResult(RedirectToPage("SendCode", new + { + returnUrl = ReturnUrl, + returnUrlHash = ReturnUrlHash, + rememberMe = LoginInput.RememberMe + })); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml new file mode 100644 index 000000000..1936197c0 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml @@ -0,0 +1,4 @@ +@page +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.UseRecoveryCodeModel +@{ +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml.cs new file mode 100644 index 000000000..c8ccca339 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/UseRecoveryCode.cshtml.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class UseRecoveryCodeModel : PageModel + { + public void OnGet() + { + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml new file mode 100644 index 000000000..2b14e2168 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml @@ -0,0 +1,26 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.VerifyAuthenticatorCodeModel +@inject IHtmlLocalizer L +
+
+
+ + +
+ + + +
+
+ + +
+ @L["VerifyAuthenticatorCode"] + + @L["Login"] + +
+
+
\ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml.cs new file mode 100644 index 000000000..899e3df30 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyAuthenticatorCode.cshtml.cs @@ -0,0 +1,59 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Web.Pages.Account; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class VerifyAuthenticatorCodeModel : AccountPageModel + { + [BindProperty] + public VerifyAuthenticatorCodeInputModel Input { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + + [BindProperty(SupportsGet = true)] + public bool RememberBrowser { get; set; } + + [HiddenInput] + public bool RememberMe { get; set; } + + public virtual IActionResult OnGet() + { + Input = new VerifyAuthenticatorCodeInputModel(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + var result = await SignInManager.TwoFactorAuthenticatorSignInAsync(Input.VerifyCode, RememberMe, RememberBrowser); + if (result.Succeeded) + { + return await RedirectSafelyAsync(ReturnUrl, ReturnUrlHash); + } + if (result.IsLockedOut) + { + Logger.LogWarning(7, "User account locked out."); + Alerts.Warning(L["UserLockedOutMessage"]); + return Page(); + } + else + { + Alerts.Danger(L["TwoFactorAuthenticationInvaidUser"]);// TODO: ����״̬��Ľ�� + return Page(); + } + } + } + + public class VerifyAuthenticatorCodeInputModel + { + [Required] + public string VerifyCode { get; set; } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml new file mode 100644 index 000000000..44d45b36e --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml @@ -0,0 +1,29 @@ +@page +@inject IHtmlLocalizer L +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Abp.Account.Localization +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account.VerifyCodeModel +
+
+
+ + + + +
+ +
+ + + + + +
+ @L["VerifyAuthenticatorCode"] +
+ + @L["ReSendVerifyCode"] + +
+
+
diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml.cs new file mode 100644 index 000000000..169c48eda --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Account/VerifyCode.cshtml.cs @@ -0,0 +1,90 @@ +using Microsoft.AspNetCore.Mvc; +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Account.Localization; +using Volo.Abp.Account.Web.Pages.Account; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages.Account +{ + public class VerifyCodeModel : AccountPageModel + { + [BindProperty] + public VerifyCodeInputModel Input { get; set; } + /// + /// ˫������֤�ṩ���� + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string Provider { get; set; } + /// + /// �ض���Url + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrl { get; set; } + /// + /// + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public string ReturnUrlHash { get; set; } + /// + /// �Ƿ��ס��¼״̬ + /// + [HiddenInput] + [BindProperty(SupportsGet = true)] + public bool RememberMe { get; set; } + + public VerifyCodeModel() + { + LocalizationResourceType = typeof(AccountResource); + } + + public virtual IActionResult OnGet() + { + Input = new VerifyCodeInputModel(); + + return Page(); + } + + public virtual async Task OnPostAsync() + { + // ��֤�û���¼״̬ + var user = await SignInManager.GetTwoFactorAuthenticationUserAsync(); + if (user == null) + { + Alerts.Warning(L["TwoFactorAuthenticationInvaidUser"]); + return Page(); + } + // ˫���ص�¼ + var result = await SignInManager.TwoFactorSignInAsync(Provider, Input.VerifyCode, RememberMe, Input.RememberBrowser); + if (result.Succeeded) + { + return await RedirectSafelyAsync(ReturnUrl, ReturnUrlHash); + } + if (result.IsLockedOut) + { + Logger.LogWarning(7, "User account locked out."); + Alerts.Warning(L["UserLockedOutMessage"]); + return Page(); + } + else + { + Alerts.Danger(L["TwoFactorAuthenticationInvaidUser"]);// TODO: ����״̬��Ľ�� + return Page(); + } + } + } + + public class VerifyCodeInputModel + { + /// + /// �Ƿ���������м�ס��¼״̬ + /// + public bool RememberBrowser { get; set; } + /// + /// ���͵���֤�� + /// + [Required] + public string VerifyCode { get; set; } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml new file mode 100644 index 000000000..c149bd95d --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml @@ -0,0 +1,36 @@ +@page +@using Microsoft.AspNetCore.Mvc.TagHelpers +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Alert +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid +@using Volo.Abp.Users +@model PackageName.CompanyName.ProjectName.AIO.Host.Pages.IndexModel +@inject ICurrentUser CurrentUser +@if (CurrentUser.IsAuthenticated) +{ +
+ + + + Logout + + +

@CurrentUser.UserName

+
@CurrentUser.Email
+
+ Roles: @CurrentUser.Roles.JoinAsString(", ") +
+ Claims:
+ @Html.Raw(CurrentUser.GetAllClaims().Select(c => $"{c.Type}={c.Value}").JoinAsString("
")) +
+
+
+
+} + +@if (!CurrentUser.IsAuthenticated) +{ +
+

+ Login +
+} \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml.cs new file mode 100644 index 000000000..7047bc406 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/Index.cshtml.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.Pages +{ + public class IndexModel : AbpPageModel + { + public void OnGet() + { + } + } +} \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/_ViewImports.cshtml b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/_ViewImports.cshtml new file mode 100644 index 000000000..c1da1f5f1 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Pages/_ViewImports.cshtml @@ -0,0 +1,4 @@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap +@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Program.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Program.cs new file mode 100644 index 000000000..3daf07fe4 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Program.cs @@ -0,0 +1,82 @@ +using LINGYUN.Abp.Identity.Session.AspNetCore; +using PackageName.CompanyName.ProjectName.AIO.Host; +using Microsoft.AspNetCore.Cors; +using Serilog; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddCors(options => +{ + options.AddDefaultPolicy(policy => + { + policy + .WithOrigins( + builder.Configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .WithAbpWrapExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); +}); +builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .UseSerilog((context, provider, config) => + { + config.ReadFrom.Configuration(context.Configuration); + }); + +await builder.AddApplicationAsync(options => +{ + MicroServiceApplicationsSingleModule.ApplicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") + ?? MicroServiceApplicationsSingleModule.ApplicationName; + options.ApplicationName = MicroServiceApplicationsSingleModule.ApplicationName; + options.Configuration.UserSecretsId = Environment.GetEnvironmentVariable("APPLICATION_USER_SECRETS_ID"); + options.Configuration.UserSecretsAssembly = typeof(MicroServiceApplicationsSingleModule).Assembly; + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); +}); + +var app = builder.Build(); + +await app.InitializeApplicationAsync(); + +app.UseForwardedHeaders(); +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} +// app.UseAbpExceptionHandling(); +app.UseCookiePolicy(); +app.UseMapRequestLocalization(); +app.UseCorrelationId(); +app.UseStaticFiles(); +app.UseRouting(); +app.UseCors(); +app.UseAuthentication(); +app.UseMultiTenancy(); +app.UseUnitOfWork(); +app.UseAbpOpenIddictValidation(); +app.UseAbpSession(); +app.UseDynamicClaims(); +app.UseAuthorization(); +app.UseSwagger(); +app.UseSwaggerUI(options => +{ + options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support App API"); +}); +app.UseAuditing(); +app.UseAbpSerilogEnrichers(); +app.UseConfiguredEndpoints(); + +await app.RunAsync(); diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Properties/launchSettings.json b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Properties/launchSettings.json new file mode 100644 index 000000000..2d629479f --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:19139", + "sslPort": 0 + } + }, + "profiles": { + "PackageName.CompanyName.ProjectName.AIO": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30001", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Production" + } + }, + "PackageName.CompanyName.ProjectName.AIO.Development": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://0.0.0.0:30000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/TenantHeaderParamter.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/TenantHeaderParamter.cs new file mode 100644 index 000000000..a4218a9c4 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/TenantHeaderParamter.cs @@ -0,0 +1,35 @@ +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName.AIO.Host; + +public class TenantHeaderParamter : IOperationFilter +{ + private readonly AbpMultiTenancyOptions _multiTenancyOptions; + private readonly AbpAspNetCoreMultiTenancyOptions _aspNetCoreMultiTenancyOptions; + public TenantHeaderParamter( + IOptions multiTenancyOptions, + IOptions aspNetCoreMultiTenancyOptions) + { + _multiTenancyOptions = multiTenancyOptions.Value; + _aspNetCoreMultiTenancyOptions = aspNetCoreMultiTenancyOptions.Value; + } + + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (_multiTenancyOptions.IsEnabled) + { + operation.Parameters = operation.Parameters ?? new List(); + operation.Parameters.Add(new OpenApiParameter + { + Name = _aspNetCoreMultiTenancyOptions.TenantKey, + In = ParameterLocation.Header, + Description = "Tenant Id in http header", + Required = false + }); + } + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/TextMessageReplyContributor.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/TextMessageReplyContributor.cs new file mode 100644 index 000000000..31aafda51 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/TextMessageReplyContributor.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Official.Messages.Models; +using LINGYUN.Abp.WeChat.Official.Services; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.WeChat.Official.Messages; +/// +/// 文本消息客服回复 +/// +public class TextMessageReplyContributor : IMessageHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessageModel( + context.Message.FromUserName, + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessage( + context.Message.Content))); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/UserSubscribeEventContributor.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/UserSubscribeEventContributor.cs new file mode 100644 index 000000000..806302c0d --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Official/Messages/UserSubscribeEventContributor.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Official.Messages.Models; +using LINGYUN.Abp.WeChat.Official.Services; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.WeChat.Official.Messages; +/// +/// 用户关注回复消息 +/// +public class UserSubscribeEventContributor : IEventHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessageModel( + context.Message.FromUserName, + new LINGYUN.Abp.WeChat.Official.Services.Models.TextMessage( + "感谢您的关注, 点击菜单了解更多."))); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Work/Messages/TextMessageReplyContributor.cs b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Work/Messages/TextMessageReplyContributor.cs new file mode 100644 index 000000000..f85f858a1 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/WeChat/Work/Messages/TextMessageReplyContributor.cs @@ -0,0 +1,24 @@ +using LINGYUN.Abp.WeChat.Common.Messages.Handlers; +using LINGYUN.Abp.WeChat.Work.Common.Messages.Models; +using LINGYUN.Abp.WeChat.Work.Messages; + +namespace PackageName.CompanyName.ProjectName.AIO.Host.WeChat.Work.Messages; +/// +/// 文本消息客服回复 +/// +public class TextMessageReplyContributor : IMessageHandleContributor +{ + public async virtual Task HandleAsync(MessageHandleContext context) + { + var messageSender = context.ServiceProvider.GetRequiredService(); + + await messageSender.SendAsync( + new LINGYUN.Abp.WeChat.Work.Messages.Models.WeChatWorkTextMessage( + context.Message.AgentId.ToString(), + new LINGYUN.Abp.WeChat.Work.Messages.Models.TextMessage( + context.Message.Content)) + { + ToUser = context.Message.FromUserName, + }); + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.Development.json b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.Development.json new file mode 100644 index 000000000..07d801a94 --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.Development.json @@ -0,0 +1,248 @@ +{ + "App": { + "ShowPii": true, + "SelfUrl": "http://127.0.0.1:30001/", + "CorsOrigins": "http://127.0.0.1:3100,http://127.0.0.1:30001", + "Urls": { + "Applications": { + "MVC": { + "RootUrl": "http://127.0.0.1:30001/", + "Urls": { + "Abp.Account.EmailConfirm": "Account/EmailConfirm", + "Abp.Account.EmailVerifyLogin": "Account/VerifyCode" + } + }, + "STS": { + "RootUrl": "http://127.0.0.1:30001/" + }, + "VueVbenAdmin": { + "RootUrl": "http://127.0.0.1:3100", + "Urls": { + "Abp.Account.EmailConfirm": "account/email-confirm" + } + } + } + } + }, + "Auditing": { + "AllEntitiesSelector": true + }, + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=14" + } + }, + "Elsa": { + "Features": { + "DefaultPersistence": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "DatabaseManagementName": { + "Enabled": true + } + } + }, + "Console": true, + "Http": true, + "Email": true, + "TemporalQuartz": true, + "JavaScriptActivities": true, + "UserTask": true, + "Conductor": true, + "Telnyx": true, + "BlobStoring": true, + "Emailing": true, + "Notification": true, + "Sms": true, + "IM": true, + "PublishWebhook": true, + "Webhooks": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "DatabaseManagementName": { + "Enabled": true + } + } + }, + "WorkflowSettings": { + "Enabled": true, + "ConnectionStringIdentifier": "Default", + "EntityFrameworkCore": { + "DatabaseManagementName": { + "Enabled": true + } + } + } + }, + "Server": { + "BaseUrl": "http://127.0.0.1:30000" + } + }, + "Quartz": { + "UsePersistentStore": false, + "Properties": { + "quartz.jobStore.dataSource": "tkm", + "quartz.jobStore.type": "Quartz.Impl.AdoJobStore.JobStoreTX,Quartz", + "quartz.dataSource.tkm.connectionStringName": "Default", + "quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.MySQLDelegate,Quartz", + "quartz.dataSource.tkm.connectionString": "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "quartz.dataSource.tkm.provider": "DatabaseManagementNameConnector", +// "quartz.jobStore.driverDelegateType": "Quartz.Impl.AdoJobStore.PostgreSQLDelegate,Quartz", +// "quartz.dataSource.tkm.connectionString": "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", +// "quartz.dataSource.tkm.provider": "Npgsql", + "quartz.jobStore.clustered": "true", + "quartz.serializer.type": "json" + } + }, + "Redis": { + "IsEnabled": true, + "Configuration": "127.0.0.1,defaultDatabase=15", + "InstanceName": "LINGYUN.Abp.Application" + }, + "Features": { + "Validation": { + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=13", + "InstanceName": "LINGYUN.Abp.Application" + } + } + }, + "AuthServer": { + "UseOpenIddict": true, + "Authority": "http://127.0.0.1:30001/", + "Audience": "lingyun-abp-application", + "RequireHttpsMetadata": false, + "SwaggerClientId": "InternalServiceClient", + "SwaggerClientSecret": "1q2w3E*" + }, + "IdentityServer": { + "Clients": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + } + }, + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + }, + "Lifetime": { + "AuthorizationCode": "00:05:00", + "AccessToken": "14:00:00", + "DeviceCode": "00:10:00", + "IdentityToken": "00:20:00", + "RefreshToken": "14:00:00", + "RefreshTokenReuseLeeway": "00:00:30", + "UserCode": "00:10:00" + } + }, + "Identity": { + "Password": { + "RequiredLength": 6, + "RequiredUniqueChars": 0, + "RequireNonAlphanumeric": false, + "RequireLowercase": false, + "RequireUppercase": false, + "RequireDigit": false + }, + "Lockout": { + "AllowedForNewUsers": false, + "LockoutDuration": 5, + "MaxFailedAccessAttempts": 5 + }, + "SignIn": { + "RequireConfirmedEmail": false, + "RequireConfirmedPhoneNumber": false + } + }, + "FeatureManagement": { + "IsDynamicStoreEnabled": true + }, + "SettingManagement": { + "IsDynamicStoreEnabled": true + }, + "PermissionManagement": { + "IsDynamicStoreEnabled": true + }, + "TextTemplating": { + "IsDynamicStoreEnabled": true + }, + "WebhooksManagement": { + "IsDynamicStoreEnabled": true + }, + "Logging": { + "Serilog": { + "Elasticsearch": { + "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" + } + } + }, + "AuditLogging": { + "Elasticsearch": { + "IndexPrefix": "abp.dev.auditing" + } + }, + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + }, + "Minio": { + "WithSSL": false, + "BucketName": "blobs", + "EndPoint": "127.0.0.1:19000", + "AccessKey": "ZD43kNpimiJf9mCuomTP", + "SecretKey": "w8IqMgi4Tnz0DGzN8jZ7IJWq7OEdbUnAU0jlZxQK", + "CreateBucketIfNotExists": false + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Warning" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "Elasticsearch", + "Args": { + "nodeUris": "http://127.0.0.1:9200", + "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", + "autoRegisterTemplate": true, + "autoRegisterTemplateVersion": "ESv7" + } + } + ] + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.json b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.json new file mode 100644 index 000000000..ff9beea3e --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/appsettings.json @@ -0,0 +1,89 @@ +{ + "Clock": { + "Kind": "Local" + }, + "Forwarded": { + "ForwardedHeaders": "XForwardedFor,XForwardedProto" + }, + "StringEncryption": { + "DefaultPassPhrase": "s46c5q55nxpeS8Ra", + "InitVectorBytes": "s83ng0abvd02js84", + "DefaultSalt": "sf&5)s3#" + }, + "Json": { + "OutputDateTimeFormat": "yyyy-MM-dd HH:mm:ss", + "InputDateTimeFormats": [ + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-ddTHH:mm:ss" + ] + }, + "AllowedHosts": "*", + "Hosting": { + "BasePath": "" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Information" + } + }, + "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Debug-.log", + "restrictedToMinimumLevel": "Debug", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "restrictedToMinimumLevel": "Information", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Warn-.log", + "restrictedToMinimumLevel": "Warning", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Error-.log", + "restrictedToMinimumLevel": "Error", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Fatal-.log", + "restrictedToMinimumLevel": "Fatal", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + } + ] + } +} diff --git a/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/gulpfile.js b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/gulpfile.js new file mode 100644 index 000000000..bec4d578f --- /dev/null +++ b/aspnet-core/templates/aio/content/host/PackageName.CompanyName.ProjectName.AIO.Host/gulpfile.js @@ -0,0 +1,10 @@ +"use strict"; + +var gulp = require("gulp"), + path = require('path'), + copyResources = require('./node_modules/@abp/aspnetcore.mvc.ui/gulp/copy-resources.js'); + +exports.default = function(done){ + copyResources(path.resolve('./')); + done(); +}; \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/migrations/Migrate.ps1 b/aspnet-core/templates/aio/content/migrations/Migrate.ps1 new file mode 100755 index 000000000..b983af60a --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/Migrate.ps1 @@ -0,0 +1,203 @@ +# 数据库迁移脚本 + +# 导入必要的模块 +using namespace System.Management.Automation.Host + +# 加入环境变量FROM_MIGRATION,使其在Program.cs文件中可以进行判断 +$env:FROM_MIGRATION = "true" + +# 定义项目路径 +$projectPath = Resolve-Path (Join-Path $PSScriptRoot "..") + +# 定义可用的DbContext +$dbContexts = @{ + "1" = @{ + Name = "PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName" + Context = "SingleMigrationsDbContext" + Factory = "SingleMigrationsDbContextFactory" + } +} + +# 显示DbContext选择菜单 +function Show-DbContextMenu { + $host.UI.RawUI.BackgroundColor = "Black" + $host.UI.RawUI.ForegroundColor = "White" + Clear-Host + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host " 数据库迁移上下文选择" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "" + Write-Host "请选择要迁移的数据库上下文:" -ForegroundColor Green + foreach ($key in $dbContexts.Keys) { + $context = $dbContexts[$key] + Write-Host "[$key] " -NoNewline -ForegroundColor Magenta + Write-Host "$($context.Name)" -ForegroundColor White + } + Write-Host "" +} + +# 选择DbContext +function Select-DbContext { + Show-DbContextMenu + + while ($true) { + $choice = Read-Host "请输入数字选择" + if ($dbContexts.ContainsKey($choice)) { + return $dbContexts[$choice] + } + Write-Host "无效的选择,请重新输入。" -ForegroundColor Red + } +} + +# 获取迁移名称 +function Get-MigrationName { + $defaultName = "AddNewMigration_" + (Get-Date -Format "yyyyMMdd_HHmmss") + $migrationName = Read-Host "请输入迁移名称 (留空将使用默认名称: $defaultName)" + + return ($migrationName ? $migrationName : $defaultName) +} + +# 执行数据库迁移 +function Invoke-DatabaseMigration($dbContext, $migrationName) { + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "正在执行数据库迁移..." -ForegroundColor Green + Write-Host "上下文: " -NoNewline -ForegroundColor Yellow + Write-Host "$($dbContext.Name)" -ForegroundColor White + Write-Host "迁移名称: " -NoNewline -ForegroundColor Yellow + Write-Host "$migrationName" -ForegroundColor White + Write-Host "项目路径: " -NoNewline -ForegroundColor Yellow + Write-Host "$projectPath" -ForegroundColor White + Write-Host "========================================" -ForegroundColor Cyan + + # 切换到项目目录并执行迁移 + Push-Location $projectPath + try { + dotnet ef migrations add $migrationName --project "migrations/$($dbContext.Name)" --context "$($dbContext.Context)" + } + finally { + Pop-Location + } +} + +# 获取所有迁移文件 +function Get-AllMigrations($dbContext) { + Push-Location $projectPath + try { + $migrations = @(dotnet ef migrations list --project "migrations/$($dbContext.Name)" --context "$($dbContext.Context)") + return $migrations | Where-Object { $_ -match '\S' } # 过滤空行 + } + finally { + Pop-Location + } +} + +# 选择起始迁移 +function Select-FromMigration($dbContext) { + $migrations = Get-AllMigrations -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "可用的迁移文件:" -ForegroundColor Yellow + Write-Host "========================================" -ForegroundColor Cyan + + for ($i = 0; $i -lt $migrations.Count; $i++) { + Write-Host "[$i] " -NoNewline -ForegroundColor Magenta + Write-Host "$($migrations[$i])" -ForegroundColor White + } + + Write-Host "[A] " -NoNewline -ForegroundColor Magenta + Write-Host "生成所有迁移的SQL脚本" -ForegroundColor White + Write-Host "[L] " -NoNewline -ForegroundColor Magenta + Write-Host "仅生成最新迁移的SQL脚本" -ForegroundColor White + + while ($true) { + $choice = Read-Host "请选择起始迁移文件" + if ($choice -eq "A" -or $choice -eq "a") { + return $null + } + if ($choice -eq "L" -or $choice -eq "l") { + if ($migrations.Count -gt 1) { + return $migrations[$migrations.Count - 2] + } + return $null + } + if ([int]::TryParse($choice, [ref]$null)) { + $index = [int]$choice + if ($index -ge 0 -and $index -lt $migrations.Count) { + return $migrations[$index] + } + } + Write-Host "无效的选择,请重新输入。" -ForegroundColor Red + } +} + +# 生成SQL脚本 +function Export-SqlScript($dbContext, $migrationName) { + $choice = Read-Host "是否生成SQL迁移脚本?(Y/N)" + + if ($choice -eq "Y" -or $choice -eq "y") { + $sqlFileName = (Get-Date -Format "yyyyMMddHHmm") + ".sql" + $initSqlPath = Join-Path $projectPath "InitSql" + $contextSqlPath = Join-Path $initSqlPath $dbContext.Name + + # 确保InitSql和上下文特定目录存在 + if (-not (Test-Path $initSqlPath)) { + New-Item -ItemType Directory -Path $initSqlPath | Out-Null + } + if (-not (Test-Path $contextSqlPath)) { + New-Item -ItemType Directory -Path $contextSqlPath | Out-Null + } + + $sqlFilePath = Join-Path $contextSqlPath $sqlFileName + + # 选择起始迁移 + $fromMigration = Select-FromMigration -dbContext $dbContext + + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "正在生成SQL脚本..." -ForegroundColor Green + Write-Host "输出路径: " -NoNewline -ForegroundColor Yellow + Write-Host "$sqlFilePath" -ForegroundColor White + if ($fromMigration) { + Write-Host "起始迁移: " -NoNewline -ForegroundColor Yellow + Write-Host "$fromMigration" -ForegroundColor White + } + Write-Host "========================================" -ForegroundColor Cyan + + # 切换到项目目录并生成SQL脚本 + Push-Location $projectPath + try { + if ($fromMigration) { + dotnet ef migrations script $fromMigration --project "migrations/$($dbContext.Name)" --context "$($dbContext.Context)" --output $sqlFilePath + } + else { + dotnet ef migrations script --project "migrations/$($dbContext.Name)" --context "$($dbContext.Context)" --output $sqlFilePath + } + } + finally { + Pop-Location + } + + Write-Host "SQL脚本已生成: " -NoNewline -ForegroundColor Green + Write-Host "$sqlFilePath" -ForegroundColor White + } +} + +# 主执行流程 +try { + $dbContext = Select-DbContext + $migrationName = Get-MigrationName + Invoke-DatabaseMigration -dbContext $dbContext -migrationName $migrationName + + # 生成SQL脚本 + Export-SqlScript -dbContext $dbContext -migrationName $migrationName + + Write-Host "迁移完成!" -ForegroundColor Green +} +catch { + Write-Host "迁移过程中发生错误:" -ForegroundColor Red + Write-Host $_.Exception.Message -ForegroundColor Red +} +finally { + Write-Host "`n按任意键退出..." + $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/PackageName.CompanyName.ProjectName.AIO.DbMigrator.csproj b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/PackageName.CompanyName.ProjectName.AIO.DbMigrator.csproj new file mode 100644 index 000000000..9b1ba94a1 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/PackageName.CompanyName.ProjectName.AIO.DbMigrator.csproj @@ -0,0 +1,39 @@ + + + Exe + net8.0 + enable + enable + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + PreserveNewest + + + + + + + + + + + + diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Program.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Program.cs new file mode 100644 index 000000000..53d5c10e2 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Program.cs @@ -0,0 +1,44 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; + +namespace PackageName.CompanyName.ProjectName.AIO.DbMigrator; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) +#if DEBUG + .MinimumLevel.Override("PackageName.CompanyName.ProjectName.AIO.DbMigrator", LogEventLevel.Debug) +#else + .MinimumLevel.Override("PackageName.CompanyName.ProjectName.AIO.DbMigrator", LogEventLevel.Information) +#endif + .Enrich.FromLogContext() + .WriteTo.Console() + .WriteTo.File("Logs/migrations.txt") + .CreateLogger(); + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + // .ConfigureAppConfiguration((context, builder) => + // { + // builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + // .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); + // } ) + .ConfigureLogging((context, logging) => logging.ClearProviders()) + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.EN.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.EN.md new file mode 100644 index 000000000..83caf7b08 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.EN.md @@ -0,0 +1,75 @@ +# PackageName.CompanyName.ProjectName.AIO.DbMigrator + +Single application database migration tool for automatically executing database migrations and initializing data. + +[简体中文](./README.md) + +## Features + +* Automatic database migration execution +* Multi-environment configuration support +* Integrated Serilog logging +* Data migration environment configuration support +* Automatic database migration check and application +* Console application, easy to integrate into CI/CD pipelines + +## Configuration + +```json +{ + "ConnectionStrings": { + "Default": "your-database-connection-string" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Volo.Abp": "Warning" + } + } + } +} +``` + +## Basic Usage + +1. Configure Database Connection + * Configure database connection string in appsettings.json + * Use appsettings.{Environment}.json for different environment configurations + +2. Run Migration Tool + ```bash + dotnet run + ``` + +3. View Migration Logs + * Console output + * Logs/migrations.txt file + +## Environment Variables + +* `ASPNETCORE_ENVIRONMENT`: Set runtime environment (Development, Staging, Production, etc.) +* `DOTNET_ENVIRONMENT`: Same as above, for compatibility + +## Notes + +* Ensure database connection string includes sufficient permissions +* Recommended to backup database before executing migrations +* Check migrations.txt log file for migration details +* If migration fails, check error messages in logs + +## Development and Debugging + +1. Set Environment Variables + ```bash + export ASPNETCORE_ENVIRONMENT=Development + ``` + +2. Debug with Visual Studio or Visual Studio Code + * Set breakpoints + * View detailed migration process + +3. Customize Migration Logic + * Modify SingleDbMigrationService class + * Add new data seeds diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.md new file mode 100644 index 000000000..28fa306fe --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/README.md @@ -0,0 +1,75 @@ +# PackageName.CompanyName.ProjectName.AIO.DbMigrator + +单体应用数据库迁移工具,用于自动执行数据库迁移和初始化数据。 + +[English](./README.EN.md) + +## 功能特性 + +* 自动执行数据库迁移 +* 支持多环境配置 +* 集成Serilog日志记录 +* 支持数据迁移环境配置 +* 自动检查和应用数据库迁移 +* 控制台应用程序,方便集成到CI/CD流程 + +## 配置项 + +```json +{ + "ConnectionStrings": { + "Default": "你的数据库连接字符串" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Volo.Abp": "Warning" + } + } + } +} +``` + +## 基本用法 + +1. 配置数据库连接 + * 在appsettings.json中配置数据库连接字符串 + * 可以通过appsettings.{Environment}.json配置不同环境的连接字符串 + +2. 运行迁移工具 + ```bash + dotnet run + ``` + +3. 查看迁移日志 + * 控制台输出 + * Logs/migrations.txt文件 + +## 环境变量 + +* `ASPNETCORE_ENVIRONMENT`: 设置运行环境(Development、Staging、Production等) +* `DOTNET_ENVIRONMENT`: 同上,用于兼容性 + +## 注意事项 + +* 确保数据库连接字符串中包含足够的权限 +* 建议在执行迁移前备份数据库 +* 查看migrations.txt日志文件以了解迁移详情 +* 如果迁移失败,检查日志中的错误信息 + +## 开发调试 + +1. 设置环境变量 + ```bash + export ASPNETCORE_ENVIRONMENT=Development + ``` + +2. 使用Visual Studio或Visual Studio Code进行调试 + * 可以设置断点 + * 查看详细的迁移过程 + +3. 自定义迁移逻辑 + * 修改SingleDbMigrationService类 + * 添加新的数据种子 diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorHostedService.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorHostedService.cs new file mode 100644 index 000000000..a78908fa1 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorHostedService.cs @@ -0,0 +1,51 @@ +using PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Serilog; +using Volo.Abp; +using Volo.Abp.Data; + +namespace PackageName.CompanyName.ProjectName.AIO.DbMigrator; + +public class SingleDbMigratorHostedService : IHostedService +{ + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IConfiguration _configuration; + + public SingleDbMigratorHostedService( + IHostApplicationLifetime hostApplicationLifetime, + IConfiguration configuration) + { + _hostApplicationLifetime = hostApplicationLifetime; + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using var application = await AbpApplicationFactory + .CreateAsync(options => + { + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + options.AddDataMigrationEnvironment(); + }); + await application.InitializeAsync(); + + await application + .ServiceProvider + .GetRequiredService() + .CheckAndApplyDatabaseMigrationsAsync(); + + await application.ShutdownAsync(); + + _hostApplicationLifetime.StopApplication(); + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} + diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorModule.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorModule.cs new file mode 100644 index 000000000..722ceb8fd --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/SingleDbMigratorModule.cs @@ -0,0 +1,15 @@ +using LINGYUN.Abp.UI.Navigation.VueVbenAdmin; +using PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName.AIO.DbMigrator; + +[DependsOn( + typeof(AbpUINavigationVueVbenAdminModule), + typeof(SingleMigrationsEntityFrameworkCoreDatabaseManagementNameModule), + typeof(AbpAutofacModule) + )] +public class SingleDbMigratorModule : AbpModule +{ +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Usings.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Usings.cs new file mode 100644 index 000000000..c79c834ca --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/Usings.cs @@ -0,0 +1,7 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using LINGYUN.Abp; diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/appsettings.json b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/appsettings.json new file mode 100644 index 000000000..90452ba57 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.DbMigrator/appsettings.json @@ -0,0 +1,103 @@ +{ + "Clock": { + "Kind": "Local" + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "StringEncryption": { + "DefaultPassPhrase": "s46c5q55nxpeS8Ra", + "InitVectorBytes": "s83ng0abvd02js84", + "DefaultSalt": "sf&5)s3#" + }, + "AuthServer": { + "UseOpenIddict": true + }, + "IdentityServer": { + "Clients": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:40080/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + } + }, + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:40080/" + }, + "InternalService": { + "ClientId": "InternalServiceClient" + } + } + }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Information" + } + }, + "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Debug-.log", + "restrictedToMinimumLevel": "Debug", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "restrictedToMinimumLevel": "Information", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Warn-.log", + "restrictedToMinimumLevel": "Warning", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Error-.log", + "restrictedToMinimumLevel": "Error", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Fatal-.log", + "restrictedToMinimumLevel": "Fatal", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + } + ] + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xml b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xml new file mode 100644 index 000000000..be68c182b --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xsd similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd rename to aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xsd index 11da52550..3f3946e28 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/FodyWeavers.xsd @@ -1,30 +1,30 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName.csproj b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName.csproj new file mode 100644 index 000000000..2307cf26f --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName.csproj @@ -0,0 +1,27 @@ + + + + + + + net8.0 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.en.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.en.md new file mode 100644 index 000000000..114aad0be --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.en.md @@ -0,0 +1,59 @@ +# MySQL Database Migration Guide + +This guide will help you manage MySQL database migrations using the migration scripts. + +## Prerequisites + +1. Ensure .NET Core SDK is installed +2. Ensure Entity Framework Core tools are installed + ```powershell + dotnet tool install --global dotnet-ef + ``` +3. Ensure MySQL connection string is properly configured + +## Usage Instructions + +### 1. Create New Migration + +1. Run the migration script in the `aspnet-core/migrations` directory: + ```powershell + # Use English version + .\MigrateEn.ps1 + + # Or use Chinese version + .\Migrate.ps1 + ``` + +2. Select MySQL database context from the menu: + ``` + [1] PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.MySql + ``` + +3. Enter migration name (optional): + - Press Enter to use default name: `AddNewMigration_yyyyMMdd_HHmmss` + - Or enter custom name, e.g.: `AddNewFeature` + +### 2. Generate SQL Script + +After creating the migration, the script will ask if you want to generate SQL script: + +1. Choose whether to generate SQL script (Y/N) +2. If Y is selected, following options will be available: + - `[A]` - Generate SQL script for all migrations + - `[L]` - Generate SQL script for latest migration only + - `[0-9]` - Generate from specified migration version + +Generated SQL scripts will be saved in: +``` +aspnet-core/InitSql/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.MySql/ +``` + +### 3. Apply Migration + +Generated SQL scripts can be applied to database through: + +1. Using MySQL client tools to execute SQL script directly +2. Or using command line: + ```powershell + mysql -u your_username -p your_database < your_script.sql + ``` diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.md new file mode 100644 index 000000000..c43698e9c --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/README.md @@ -0,0 +1,59 @@ +# MySQL 数据库迁移指南 + +本指南将帮助您使用迁移脚本来管理 MySQL 数据库的迁移操作。 + +## 前置条件 + +1. 确保已安装 .NET Core SDK +2. 确保已安装 Entity Framework Core 工具 + ```powershell + dotnet tool install --global dotnet-ef + ``` +3. 确保已正确配置 MySQL 连接字符串 + +## 使用说明 + +### 1. 创建新的迁移 + +1. 在 `aspnet-core/migrations` 目录下运行迁移脚本: + ```powershell + # 使用中文版本 + .\Migrate.ps1 + + # 或使用英文版本 + .\MigrateEn.ps1 + ``` + +2. 在菜单中选择 MySQL 数据库上下文: + ``` + [1] PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.MySql + ``` + +3. 输入迁移名称(可选): + - 直接回车将使用默认名称:`AddNewMigration_yyyyMMdd_HHmmss` + - 或输入自定义名称,如:`AddNewFeature` + +### 2. 生成 SQL 脚本 + +在创建迁移后,脚本会询问是否需要生成 SQL 脚本: + +1. 选择是否生成 SQL 脚本 (Y/N) +2. 如果选择 Y,将提供以下选项: + - `[A]` - 生成所有迁移的 SQL 脚本 + - `[L]` - 仅生成最新迁移的 SQL 脚本 + - `[0-9]` - 从指定的迁移版本开始生成 + +生成的 SQL 脚本将保存在: +``` +aspnet-core/InitSql/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.MySql/ +``` + +### 3. 应用迁移 + +生成的 SQL 脚本可以通过以下方式应用到数据库: + +1. 使用 MySQL 客户端工具直接执行 SQL 脚本 +2. 或使用命令行: + ```powershell + mysql -u your_username -p your_database < your_script.sql + ``` diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsDbContextFactory.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsDbContextFactory.cs new file mode 100644 index 000000000..f9adabc2d --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsDbContextFactory.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName; + +public class SingleMigrationsDbContextFactory : IDesignTimeDbContextFactory +{ + public SingleMigrationsDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + var connectionString = configuration.GetConnectionString("Default"); + DbContextOptionsBuilder builder = null; +#if MySQL + builder = new DbContextOptionsBuilder() + .UseMySql(connectionString, ServerVersion.AutoDetect(connectionString), b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#elif SqlServer + builder = new DbContextOptionsBuilder() + .UseSqlServer(connectionString, b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#elif Sqlite + builder = new DbContextOptionsBuilder() + .UseSqlite(connectionString, b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#elif Oracle + builder = new DbContextOptionsBuilder() + .UseOracle(connectionString, b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#elif OracleDevart + builder = (DbContextOptionsBuilder) new DbContextOptionsBuilder() + .UseOracle(connectionString, b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#elif PostgreSql + builder = new DbContextOptionsBuilder() + .UseNpgsql(connectionString, b => b.MigrationsAssembly("PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName")); +#endif + return new SingleMigrationsDbContext(builder!.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), + "../PackageName.CompanyName.ProjectName.AIO.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false); + + return builder.Build(); + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsEntityFrameworkCoreDatabaseManagementNameModule.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsEntityFrameworkCoreDatabaseManagementNameModule.cs new file mode 100644 index 000000000..6ef5f8205 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName/SingleMigrationsEntityFrameworkCoreDatabaseManagementNameModule.cs @@ -0,0 +1,69 @@ +using Microsoft.Extensions.DependencyInjection; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +#if MySQL +using Volo.Abp.EntityFrameworkCore.MySQL; +#elif SqlServer +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore.Infrastructure; +#elif Sqlite +using Volo.Abp.EntityFrameworkCore.Sqlite; +#elif Oracle +using Volo.Abp.EntityFrameworkCore.Oracle; +#elif OracleDevart +using Volo.Abp.EntityFrameworkCore.Oracle.Devart; +#elif PostgreSql +using Volo.Abp.EntityFrameworkCore.PostgreSql; +#endif +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DatabaseManagementName; + +[DependsOn( +#if MySQL + typeof(AbpEntityFrameworkCoreMySQLModule), +#elif SqlServer + typeof(AbpEntityFrameworkCoreSqlServerModule), +#elif Sqlite + typeof(AbpEntityFrameworkCoreSqliteModule), +#elif Oracle + typeof(AbpEntityFrameworkCoreOracleModule), +#elif OracleDevart + typeof(AbpEntityFrameworkCoreOracleDevartModule), +#elif PostgreSql + typeof(AbpEntityFrameworkCorePostgreSqlModule), +#endif + typeof(SingleMigrationsEntityFrameworkCoreModule) + )] +public class SingleMigrationsEntityFrameworkCoreDatabaseManagementNameModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(); + + Configure(options => + { +#if MySQL + options.UseMySQL(); + options.UseMySQL(); +#elif SqlServer + options.UseSqlServer(); + options.UseSqlServer(builder => + { + // see https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver16 + // builder.UseCompatibilityLevel(150); + }); +#elif Sqlite + options.UseSqlite(); + options.UseSqlite(); +#elif Oracle || OracleDevart + options.UseOracle(); + options.UseOracle(); +#elif PostgreSql + AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);//解决PostgreSql设置为utc时间后无法写入local时区的问题 + options.UseNpgsql(); + options.UseNpgsql(); +#endif + }); + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs new file mode 100644 index 000000000..500e07cd0 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs @@ -0,0 +1,469 @@ +using LINGYUN.Abp.IdentityServer.IdentityResources; +using Microsoft.Extensions.Configuration; +using OpenIddict.Abstractions; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Guids; +using Volo.Abp.IdentityServer.ApiResources; +using Volo.Abp.IdentityServer.ApiScopes; +using Volo.Abp.IdentityServer.Clients; +using Volo.Abp.IdentityServer.IdentityResources; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.DataSeeder; + +public class ClientDataSeederContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IOpenIddictApplicationManager _applicationManager; + private readonly IOpenIddictScopeManager _scopeManager; + + private readonly IClientRepository _clientRepository; + private readonly IApiResourceRepository _apiResourceRepository; + private readonly IApiScopeRepository _apiScopeRepository; + private readonly ICustomIdentityResourceDataSeeder _customIdentityResourceDataSeeder; + private readonly IIdentityResourceDataSeeder _identityResourceDataSeeder; + + private readonly IGuidGenerator _guidGenerator; + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IConfiguration _configuration; + private readonly ICurrentTenant _currentTenant; + + public ClientDataSeederContributor( + IOpenIddictApplicationManager applicationManager, + IOpenIddictScopeManager scopeManager, + IClientRepository clientRepository, + IApiResourceRepository apiResourceRepository, + IApiScopeRepository apiScopeRepository, + ICustomIdentityResourceDataSeeder customIdentityResourceDataSeeder, + IIdentityResourceDataSeeder identityResourceDataSeeder, + IGuidGenerator guidGenerator, + IPermissionDataSeeder permissionDataSeeder, + IConfiguration configuration, + ICurrentTenant currentTenant) + { + _applicationManager = applicationManager; + _scopeManager = scopeManager; + _clientRepository = clientRepository; + _apiResourceRepository = apiResourceRepository; + _apiScopeRepository = apiScopeRepository; + _customIdentityResourceDataSeeder = customIdentityResourceDataSeeder; + _identityResourceDataSeeder = identityResourceDataSeeder; + _guidGenerator = guidGenerator; + _permissionDataSeeder = permissionDataSeeder; + _configuration = configuration; + _currentTenant = currentTenant; + } + + public async virtual Task SeedAsync(DataSeedContext context) + { + using (_currentTenant.Change(context.TenantId)) + { + if (_configuration.GetValue("AuthServer:UseOpenIddict")) + { + await SeedOpenIddictAsync(); + return; + } + + await SeedIdentityServerAsync(); + } + } + + #region OpenIddict + + private async Task SeedOpenIddictAsync() + { + await CreateScopeAsync("lingyun-abp-application"); + await CreateApplicationAsync("lingyun-abp-application"); + } + + private async Task CreateScopeAsync(string scope) + { + if (await _scopeManager.FindByNameAsync(scope) == null) + { + await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() + { + Name = scope, + DisplayName = scope + " access", + DisplayNames = + { + [CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问", + [CultureInfo.GetCultureInfo("en")] = "Abp API Application Access" + }, + Resources = + { + scope + } + }); + } + } + + private async Task CreateApplicationAsync(string scope) + { + var configurationSection = _configuration.GetSection("OpenIddict:Applications"); + + var vueClientId = configurationSection["VueAdmin:ClientId"]; + if (!vueClientId.IsNullOrWhiteSpace()) + { + var vueClientRootUrl = configurationSection["VueAdmin:RootUrl"].EnsureEndsWith('/'); + + if (await _applicationManager.FindByClientIdAsync(vueClientId) == null) + { + await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor + { + ClientId = vueClientId, + ClientSecret = "1q2w3e*", + ApplicationType = OpenIddictConstants.ApplicationTypes.Web, + ConsentType = OpenIddictConstants.ConsentTypes.Explicit, + DisplayName = "Abp Vue Admin Client", + PostLogoutRedirectUris = + { + new Uri(vueClientRootUrl + "signout-callback-oidc"), + new Uri(vueClientRootUrl) + }, + RedirectUris = + { + new Uri(vueClientRootUrl + "/signin-oidc"), + new Uri(vueClientRootUrl) + }, + Permissions = + { + OpenIddictConstants.Permissions.Endpoints.Authorization, + OpenIddictConstants.Permissions.Endpoints.Token, + OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.Introspection, + OpenIddictConstants.Permissions.Endpoints.Revocation, + OpenIddictConstants.Permissions.Endpoints.Logout, + + OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, + OpenIddictConstants.Permissions.GrantTypes.Implicit, + OpenIddictConstants.Permissions.GrantTypes.Password, + OpenIddictConstants.Permissions.GrantTypes.RefreshToken, + OpenIddictConstants.Permissions.GrantTypes.DeviceCode, + OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, + + OpenIddictConstants.Permissions.ResponseTypes.Code, + OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, + OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, + OpenIddictConstants.Permissions.ResponseTypes.CodeToken, + OpenIddictConstants.Permissions.ResponseTypes.IdToken, + OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, + OpenIddictConstants.Permissions.ResponseTypes.None, + OpenIddictConstants.Permissions.ResponseTypes.Token, + + OpenIddictConstants.Permissions.Scopes.Roles, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Prefixes.Scope + scope + } + }); + + var vueClientPermissions = new string[1] + { + "AbpIdentity.UserLookup" + }; + await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions); + } + } + + var internalServiceClientId = configurationSection["InternalService:ClientId"]; + if (!internalServiceClientId.IsNullOrWhiteSpace()) + { + if (await _applicationManager.FindByClientIdAsync(internalServiceClientId) == null) + { + await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor + { + ClientId = internalServiceClientId, + ClientSecret = "1q2w3e*", + ClientType = OpenIddictConstants.ClientTypes.Confidential, + ConsentType = OpenIddictConstants.ConsentTypes.Explicit, + ApplicationType = OpenIddictConstants.ApplicationTypes.Native, + DisplayName = "Abp Vue Admin Client", + Permissions = + { + OpenIddictConstants.Permissions.Endpoints.Authorization, + OpenIddictConstants.Permissions.Endpoints.Token, + OpenIddictConstants.Permissions.Endpoints.Device, + OpenIddictConstants.Permissions.Endpoints.Introspection, + OpenIddictConstants.Permissions.Endpoints.Revocation, + OpenIddictConstants.Permissions.Endpoints.Logout, + + OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, + OpenIddictConstants.Permissions.GrantTypes.Implicit, + OpenIddictConstants.Permissions.GrantTypes.Password, + OpenIddictConstants.Permissions.GrantTypes.RefreshToken, + OpenIddictConstants.Permissions.GrantTypes.DeviceCode, + OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, + + OpenIddictConstants.Permissions.ResponseTypes.Code, + OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, + OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, + OpenIddictConstants.Permissions.ResponseTypes.CodeToken, + OpenIddictConstants.Permissions.ResponseTypes.IdToken, + OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, + OpenIddictConstants.Permissions.ResponseTypes.None, + OpenIddictConstants.Permissions.ResponseTypes.Token, + + OpenIddictConstants.Permissions.Scopes.Roles, + OpenIddictConstants.Permissions.Scopes.Profile, + OpenIddictConstants.Permissions.Scopes.Email, + OpenIddictConstants.Permissions.Scopes.Address, + OpenIddictConstants.Permissions.Scopes.Phone, + OpenIddictConstants.Permissions.Prefixes.Scope + scope + } + }); + + var internalServicePermissions = new string[2] + { + "AbpIdentity.UserLookup","AbpIdentity.Users" + }; + await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, internalServiceClientId, internalServicePermissions); + } + } + } + + #endregion + + #region IdentityServer + + private async Task SeedIdentityServerAsync() + { + await _identityResourceDataSeeder.CreateStandardResourcesAsync(); + await _customIdentityResourceDataSeeder.CreateCustomResourcesAsync(); + await CreateApiResourcesAsync(); + await CreateApiScopesAsync(); + await CreateClientsAsync(); + } + + private async Task CreateApiScopesAsync() + { + await CreateApiScopeAsync("lingyun-abp-application"); + } + + private async Task CreateApiResourcesAsync() + { + var commonApiUserClaims = new[] + { + "email", + "email_verified", + "name", + "phone_number", + "phone_number_verified", + "role" + }; + + await CreateApiResourceAsync("lingyun-abp-application", commonApiUserClaims); + } + + private async Task CreateApiResourceAsync(string name, IEnumerable claims, IEnumerable secrets = null) + { + var apiResource = await _apiResourceRepository.FindByNameAsync(name); + if (apiResource == null) + { + apiResource = await _apiResourceRepository.InsertAsync( + new ApiResource( + _guidGenerator.Create(), + name, + name + " API" + ), + autoSave: true + ); + } + + foreach (var claim in claims) + { + if (apiResource.FindClaim(claim) == null) + { + apiResource.AddUserClaim(claim); + } + } + if (secrets != null) + { + foreach (var secret in secrets) + { + if (apiResource.FindSecret(secret) == null) + { + apiResource.AddSecret(secret); + } + } + } + + return await _apiResourceRepository.UpdateAsync(apiResource); + } + + private async Task CreateApiScopeAsync(string name) + { + var apiScope = await _apiScopeRepository.FindByNameAsync(name); + if (apiScope == null) + { + apiScope = await _apiScopeRepository.InsertAsync( + new ApiScope( + _guidGenerator.Create(), + name, + name + " API" + ), + autoSave: true + ); + } + + return apiScope; + } + + private async Task CreateClientsAsync() + { + + string commonSecret = IdentityServer4.Models.HashExtensions.Sha256("1q2w3e*"); + + var commonScopes = new[] + { + "email", + "openid", + "profile", + "role", + "phone", + "address", + "offline_access" // 加上刷新, + + }; + + var configurationSection = _configuration.GetSection("IdentityServer:Clients"); + + var vueClientId = configurationSection["VueAdmin:ClientId"]; + if (!vueClientId.IsNullOrWhiteSpace()) + { + var vueClientPermissions = new string[1] + { + "AbpIdentity.UserLookup" + }; + var vueClientRootUrl = configurationSection["VueAdmin:RootUrl"].EnsureEndsWith('/'); + await CreateClientAsync( + vueClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "password", "client_credentials", "implicit", "phone_verify", "wx-mp" }, + commonSecret, + redirectUri: $"{vueClientRootUrl}signin-oidc", + postLogoutRedirectUri: $"{vueClientRootUrl}signout-callback-oidc", + corsOrigins: configurationSection["CorsOrigins"], + permissions: vueClientPermissions + ); + } + + // InternalService 内部服务间通讯客户端,必要的话需要在前端指定它拥有所有权限,当前项目仅预置用户查询权限 + var internalServiceClientId = configurationSection["InternalService:ClientId"]; + if (!internalServiceClientId.IsNullOrWhiteSpace()) + { + var internalServicePermissions = new string[2] + { + "AbpIdentity.UserLookup","AbpIdentity.Users" + }; + await CreateClientAsync( + internalServiceClientId, + commonScopes.Union(new[] { "lingyun-abp-application" }), + new[] { "client_credentials" }, + commonSecret, + permissions: internalServicePermissions + ); + } + } + + private async Task CreateClientAsync( + string name, + IEnumerable scopes, + IEnumerable grantTypes, + string secret, + string redirectUri = null, + string postLogoutRedirectUri = null, + IEnumerable permissions = null, + string corsOrigins = null) + { + var client = await _clientRepository.FindByClientIdAsync(name); + if (client == null) + { + client = await _clientRepository.InsertAsync( + new Client( + _guidGenerator.Create(), + name + ) + { + ClientName = name, + ProtocolType = "oidc", + Description = name, + AlwaysIncludeUserClaimsInIdToken = true, + AllowOfflineAccess = true, + AbsoluteRefreshTokenLifetime = 10800, //3 hours + AccessTokenLifetime = 7200, //2 hours + AuthorizationCodeLifetime = 300, + IdentityTokenLifetime = 300, + RequireConsent = false + }, + autoSave: true + ); + } + + foreach (var scope in scopes) + { + if (client.FindScope(scope) == null) + { + client.AddScope(scope); + } + } + + foreach (var grantType in grantTypes) + { + if (client.FindGrantType(grantType) == null) + { + client.AddGrantType(grantType); + } + } + + if (client.FindSecret(secret) == null) + { + client.AddSecret(secret); + } + + if (redirectUri != null) + { + if (client.FindRedirectUri(redirectUri) == null) + { + client.AddRedirectUri(redirectUri); + } + } + + if (postLogoutRedirectUri != null) + { + if (client.FindPostLogoutRedirectUri(postLogoutRedirectUri) == null) + { + client.AddPostLogoutRedirectUri(postLogoutRedirectUri); + } + } + + if (corsOrigins != null) + { + var corsOriginsSplit = corsOrigins.Split(";"); + foreach (var corsOrigin in corsOriginsSplit) + { + if (client.FindCorsOrigin(corsOrigin) == null) + { + client.AddCorsOrigin(corsOrigin); + } + } + } + + if (permissions != null) + { + await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, name, permissions); + } + + return await _clientRepository.UpdateAsync(client); + } + + #endregion +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xml b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xml new file mode 100644 index 000000000..00e1d9a1c --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xsd similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd rename to aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xsd index 11da52550..3f3946e28 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/FodyWeavers.xsd @@ -1,30 +1,30 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.csproj b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.csproj new file mode 100644 index 000000000..52985bc35 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore.csproj @@ -0,0 +1,47 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.EN.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.EN.md new file mode 100644 index 000000000..bbfb6e980 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.EN.md @@ -0,0 +1,97 @@ +# PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore + +Monolithic Application Database Migration Module, providing comprehensive application database migration functionality. + +[简体中文](./README.md) + +## Features + +* Integrated Audit Logging data migration +* Integrated Setting Management data migration +* Integrated Permission Management data migration +* Integrated Feature Management data migration +* Integrated Notification System data migration +* Integrated Message Service data migration +* Integrated Platform Management data migration +* Integrated Localization Management data migration +* Integrated Identity Authentication data migration +* Integrated IdentityServer data migration +* Integrated OpenIddict data migration +* Integrated Text Templating data migration +* Integrated Webhooks Management data migration +* Integrated Task Management data migration +* Integrated SaaS multi-tenancy data migration +* Support for database migration event handling +* Provides database migration service + +## Module Dependencies + +```csharp +[DependsOn( + typeof(AbpSaasEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpNotificationsEntityFrameworkCoreModule), + typeof(AbpMessageServiceEntityFrameworkCoreModule), + typeof(PlatformEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpIdentityServerEntityFrameworkCoreModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + typeof(WebhooksManagementEntityFrameworkCoreModule), + typeof(TaskManagementEntityFrameworkCoreModule), + typeof(AbpWeChatModule), + typeof(AbpDataDbMigratorModule) +)] +``` + +## Configuration + +```json +{ + "ConnectionStrings": { + "SingleDbMigrator": "Your database connection string" + } +} +``` + +## Basic Usage + +1. Configure Database Connection String + * Configure SingleDbMigrator connection string in appsettings.json + +2. Add Module Dependency + ```csharp + [DependsOn(typeof(SingleMigrationsEntityFrameworkCoreModule))] + public class YourModule : AbpModule + { + // ... + } + ``` + +## Database Tables Description + +* AbpAuditLogs - Audit logging data +* Identity Related Tables - User, role, claims and other authentication related data +* IdentityServer Related Tables - Client, API resources, identity resources and other OAuth/OpenID Connect related data +* OpenIddict Related Tables - OpenID Connect authentication related data +* AbpPermissionGrants - Permission authorization data +* AbpSettings - System settings data +* AbpFeatures - Feature data +* AbpNotifications - Notification system data +* AbpMessageService - Message service data +* Platform Related Tables - Platform management related data +* AbpLocalization - Localization management data +* AbpTextTemplates - Text template data +* AbpWebhooks - Webhooks management data +* AbpTasks - Task management data +* Saas Related Tables - Tenant, edition and other multi-tenancy related data + +## More Information + +* [ABP Documentation](https://docs.abp.io) +* [OpenIddict Documentation](https://documentation.openiddict.com) +* [IdentityServer4 Documentation](https://identityserver4.readthedocs.io) diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.md b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.md new file mode 100644 index 000000000..bc72c164e --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/README.md @@ -0,0 +1,97 @@ +# PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore + +单体应用数据迁移模块,提供完整的应用程序数据库迁移功能。 + +[English](./README.EN.md) + +## 功能特性 + +* 集成审计日志数据迁移 +* 集成设置管理数据迁移 +* 集成权限管理数据迁移 +* 集成特性管理数据迁移 +* 集成通知系统数据迁移 +* 集成消息服务数据迁移 +* 集成平台管理数据迁移 +* 集成本地化管理数据迁移 +* 集成身份认证数据迁移 +* 集成IdentityServer数据迁移 +* 集成OpenIddict数据迁移 +* 集成文本模板数据迁移 +* 集成Webhooks管理数据迁移 +* 集成任务管理数据迁移 +* 集成SaaS多租户数据迁移 +* 支持数据库迁移事件处理 +* 提供数据库迁移服务 + +## 模块依赖 + +```csharp +[DependsOn( + typeof(AbpSaasEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpNotificationsEntityFrameworkCoreModule), + typeof(AbpMessageServiceEntityFrameworkCoreModule), + typeof(PlatformEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpIdentityServerEntityFrameworkCoreModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + typeof(WebhooksManagementEntityFrameworkCoreModule), + typeof(TaskManagementEntityFrameworkCoreModule), + typeof(AbpWeChatModule), + typeof(AbpDataDbMigratorModule) +)] +``` + +## 配置项 + +```json +{ + "ConnectionStrings": { + "SingleDbMigrator": "你的数据库连接字符串" + } +} +``` + +## 基本用法 + +1. 配置数据库连接字符串 + * 在appsettings.json中配置SingleDbMigrator连接字符串 + +2. 添加模块依赖 + ```csharp + [DependsOn(typeof(SingleMigrationsEntityFrameworkCoreModule))] + public class YourModule : AbpModule + { + // ... + } + ``` + +## 数据库表说明 + +* AbpAuditLogs - 审计日志数据 +* Identity相关表 - 用户、角色、声明等身份认证相关数据 +* IdentityServer相关表 - 客户端、API资源、身份资源等OAuth/OpenID Connect相关数据 +* OpenIddict相关表 - OpenID Connect认证相关数据 +* AbpPermissionGrants - 权限授权数据 +* AbpSettings - 系统设置数据 +* AbpFeatures - 功能特性数据 +* AbpNotifications - 通知系统数据 +* AbpMessageService - 消息服务数据 +* Platform相关表 - 平台管理相关数据 +* AbpLocalization - 本地化管理数据 +* AbpTextTemplates - 文本模板数据 +* AbpWebhooks - Webhooks管理数据 +* AbpTasks - 任务管理数据 +* Saas相关表 - 租户、版本等多租户相关数据 + +## 更多信息 + +* [ABP文档](https://docs.abp.io) +* [OpenIddict文档](https://documentation.openiddict.com) +* [IdentityServer4文档](https://identityserver4.readthedocs.io) diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationEventHandler.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationEventHandler.cs new file mode 100644 index 000000000..395cf4d39 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationEventHandler.cs @@ -0,0 +1,242 @@ +using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.BackgroundTasks.Internal; +using LINGYUN.Abp.Saas.Tenants; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DistributedLocking; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EntityFrameworkCore.Migrations; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.Guids; +using Volo.Abp.Identity; +using Volo.Abp.MultiTenancy; +using Volo.Abp.PermissionManagement; +using Volo.Abp.Uow; +using IdentityRole = Volo.Abp.Identity.IdentityRole; +using IdentityUser = Volo.Abp.Identity.IdentityUser; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore; +public class SingleDbMigrationEventHandler : + EfCoreDatabaseMigrationEventHandlerBase, + IDistributedEventHandler> +{ + protected AbpBackgroundTasksOptions Options { get; } + protected IJobStore JobStore { get; } + protected IJobScheduler JobScheduler { get; } + protected IGuidGenerator GuidGenerator { get; } + protected IdentityUserManager IdentityUserManager { get; } + protected IdentityRoleManager IdentityRoleManager { get; } + protected IPermissionDataSeeder PermissionDataSeeder { get; } + + public SingleDbMigrationEventHandler( + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + ITenantStore tenantStore, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory, + IGuidGenerator guidGenerator, + IdentityUserManager identityUserManager, + IdentityRoleManager identityRoleManager, + IPermissionDataSeeder permissionDataSeeder, + IJobStore jobStore, + IJobScheduler jobScheduler, + IOptions options) + : base("SingleDbMigrator", currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory) + { + GuidGenerator = guidGenerator; + IdentityUserManager = identityUserManager; + IdentityRoleManager = identityRoleManager; + PermissionDataSeeder = permissionDataSeeder; + JobStore = jobStore; + JobScheduler = jobScheduler; + Options = options.Value; + } + public async virtual Task HandleEventAsync(EntityDeletedEto eventData) + { + // 租户删除时移除轮询作业 + var pollingJob = BuildPollingJobInfo(eventData.Entity.Id, eventData.Entity.Name); + await JobScheduler.RemoveAsync(pollingJob); + await JobStore.RemoveAsync(pollingJob.Id); + + var cleaningJob = BuildCleaningJobInfo(eventData.Entity.Id, eventData.Entity.Name); + await JobScheduler.RemoveAsync(cleaningJob); + await JobStore.RemoveAsync(cleaningJob.Id); + + var checkingJob = BuildCheckingJobInfo(eventData.Entity.Id, eventData.Entity.Name); + await JobScheduler.RemoveAsync(checkingJob); + await JobStore.RemoveAsync(checkingJob.Id); + } + + protected async override Task AfterTenantCreated(TenantCreatedEto eventData, bool schemaMigrated) + { + if (!schemaMigrated) + { + return; + } + + using (CurrentTenant.Change(eventData.Id)) + { + await QueueBackgroundJobAsync(eventData); + + await SeedTenantDefaultRoleAsync(eventData); + await SeedTenantAdminAsync(eventData); + } + } + + protected async virtual Task QueueBackgroundJobAsync(TenantCreatedEto eventData) + { + var pollingJob = BuildPollingJobInfo(eventData.Id, eventData.Name); + await JobStore.StoreAsync(pollingJob); + await JobScheduler.QueueAsync(pollingJob); + + var cleaningJob = BuildCleaningJobInfo(eventData.Id, eventData.Name); + await JobStore.StoreAsync(cleaningJob); + await JobScheduler.QueueAsync(cleaningJob); + + var checkingJob = BuildCheckingJobInfo(eventData.Id, eventData.Name); + await JobStore.StoreAsync(checkingJob); + await JobScheduler.QueueAsync(checkingJob); + } + + protected virtual JobInfo BuildPollingJobInfo(Guid tenantId, string tenantName) + { + return new JobInfo + { + Id = tenantId.ToString() + "_Polling", + Name = nameof(BackgroundPollingJob), + Group = "Polling", + Description = "Polling tasks to be executed", + Args = new Dictionary() { { nameof(JobInfo.TenantId), tenantId } }, + Status = JobStatus.Running, + BeginTime = DateTime.Now, + CreationTime = DateTime.Now, + Cron = Options.JobFetchCronExpression, + JobType = JobType.Period, + Priority = JobPriority.High, + Source = JobSource.System, + LockTimeOut = Options.JobFetchLockTimeOut, + TenantId = tenantId, + Type = typeof(BackgroundPollingJob).AssemblyQualifiedName, + }; + } + + protected virtual JobInfo BuildCleaningJobInfo(Guid tenantId, string tenantName) + { + return new JobInfo + { + Id = tenantId.ToString() + "_Cleaning", + Name = nameof(BackgroundCleaningJob), + Group = "Cleaning", + Description = "Cleaning tasks to be executed", + Args = new Dictionary() { { nameof(JobInfo.TenantId), tenantId } }, + Status = JobStatus.Running, + BeginTime = DateTime.Now, + CreationTime = DateTime.Now, + Cron = Options.JobCleanCronExpression, + JobType = JobType.Period, + Priority = JobPriority.High, + Source = JobSource.System, + TenantId = tenantId, + Type = typeof(BackgroundCleaningJob).AssemblyQualifiedName, + }; + } + + protected virtual JobInfo BuildCheckingJobInfo(Guid tenantId, string tenantName) + { + return new JobInfo + { + Id = tenantId.ToString() + "_Checking", + Name = nameof(BackgroundCheckingJob), + Group = "Checking", + Description = "Checking tasks to be executed", + Args = new Dictionary() { { nameof(JobInfo.TenantId), tenantId } }, + Status = JobStatus.Running, + BeginTime = DateTime.Now, + CreationTime = DateTime.Now, + Cron = Options.JobCheckCronExpression, + LockTimeOut = Options.JobCheckLockTimeOut, + JobType = JobType.Period, + Priority = JobPriority.High, + Source = JobSource.System, + TenantId = tenantId, + Type = typeof(BackgroundCheckingJob).AssemblyQualifiedName, + }; + } + + protected async virtual Task SeedTenantDefaultRoleAsync(TenantCreatedEto eventData) + { + // 默认用户 + var roleId = GuidGenerator.Create(); + var defaultRole = new IdentityRole(roleId, "Users", eventData.Id) + { + IsStatic = true, + IsPublic = true, + IsDefault = true, + }; + (await IdentityRoleManager.CreateAsync(defaultRole)).CheckErrors(); + + // 所有用户都应该具有查询用户权限, 用于IM场景 + await PermissionDataSeeder.SeedAsync( + RolePermissionValueProvider.ProviderName, + defaultRole.Name, + new string[] + { + IdentityPermissions.UserLookup.Default, + IdentityPermissions.Users.Default + }, + tenantId: eventData.Id); + } + + protected async virtual Task SeedTenantAdminAsync(TenantCreatedEto eventData) + { + const string tenantAdminUserName = "admin"; + const string tenantAdminRoleName = "admin"; + Guid tenantAdminRoleId; + if (!await IdentityRoleManager.RoleExistsAsync(tenantAdminRoleName)) + { + tenantAdminRoleId = GuidGenerator.Create(); + var tenantAdminRole = new IdentityRole(tenantAdminRoleId, tenantAdminRoleName, eventData.Id) + { + IsStatic = true, + IsPublic = true + }; + (await IdentityRoleManager.CreateAsync(tenantAdminRole)).CheckErrors(); + } + else + { + var tenantAdminRole = await IdentityRoleManager.FindByNameAsync(tenantAdminRoleName); + tenantAdminRoleId = tenantAdminRole.Id; + } + + var adminUserId = GuidGenerator.Create(); + if (eventData.Properties.TryGetValue("AdminUserId", out var userIdString) && + Guid.TryParse(userIdString, out var adminUserGuid)) + { + adminUserId = adminUserGuid; + } + var adminEmailAddress = eventData.Properties.GetOrDefault("AdminEmail") ?? "admin@abp.io"; + var adminPassword = eventData.Properties.GetOrDefault("AdminPassword") ?? "1q2w3E*"; + + var tenantAdminUser = await IdentityUserManager.FindByNameAsync(adminEmailAddress); + if (tenantAdminUser == null) + { + tenantAdminUser = new IdentityUser( + adminUserId, + tenantAdminUserName, + adminEmailAddress, + eventData.Id); + + tenantAdminUser.AddRole(tenantAdminRoleId); + + // 创建租户管理用户 + (await IdentityUserManager.CreateAsync(tenantAdminUser)).CheckErrors(); + (await IdentityUserManager.AddPasswordAsync(tenantAdminUser, adminPassword)).CheckErrors(); + } + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationService.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationService.cs new file mode 100644 index 000000000..faa7a1030 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleDbMigrationService.cs @@ -0,0 +1,101 @@ +using LINGYUN.Abp.Saas.Tenants; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore.Migrations; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore; + +public class SingleDbMigrationService : EfCoreRuntimeDatabaseMigratorBase, ITransientDependency +{ + protected IDataSeeder DataSeeder { get; } + protected ITenantRepository TenantRepository { get; } + public SingleDbMigrationService( + IUnitOfWorkManager unitOfWorkManager, + IServiceProvider serviceProvider, + ICurrentTenant currentTenant, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory, + IDataSeeder dataSeeder, + ITenantRepository tenantRepository) + : base("SingleDbMigrator", unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) + { + DataSeeder = dataSeeder; + TenantRepository = tenantRepository; + } + protected async override Task LockAndApplyDatabaseMigrationsAsync() + { + await base.LockAndApplyDatabaseMigrationsAsync(); + + var tenants = await TenantRepository.GetListAsync(); + foreach (var tenant in tenants.Where(x => x.IsActive)) + { + Logger.LogInformation($"Trying to acquire the distributed lock for database migration: {DatabaseName} with tenant: {tenant.Name}."); + + var schemaMigrated = false; + + await using (var handle = await DistributedLock.TryAcquireAsync("DatabaseMigration_" + DatabaseName + "_Tenant" + tenant.Id.ToString())) + { + if (handle is null) + { + Logger.LogInformation($"Distributed lock could not be acquired for database migration: {DatabaseName} with tenant: {tenant.Name}. Operation cancelled."); + return; + } + + Logger.LogInformation($"Distributed lock is acquired for database migration: {DatabaseName} with tenant: {tenant.Name}..."); + + using (CurrentTenant.Change(tenant.Id)) + { + // Create database tables if needed + using var uow = UnitOfWorkManager.Begin(requiresNew: true, isTransactional: false); + var dbContext = await ServiceProvider + .GetRequiredService>() + .GetDbContextAsync(); + + var pendingMigrations = await dbContext + .Database + .GetPendingMigrationsAsync(); + + if (pendingMigrations.Any()) + { + await dbContext.Database.MigrateAsync(); + schemaMigrated = true; + } + + await uow.CompleteAsync(); + + await SeedAsync(); + + if (schemaMigrated || AlwaysSeedTenantDatabases) + { + await DistributedEventBus.PublishAsync( + new AppliedDatabaseMigrationsEto + { + DatabaseName = DatabaseName, + TenantId = tenant.Id + } + ); + } + } + } + + Logger.LogInformation($"Distributed lock has been released for database migration: {DatabaseName} with tenant: {tenant.Name}..."); + } + } + + protected async override Task SeedAsync() + { + await DataSeeder.SeedAsync(CurrentTenant.Id); + } +} \ No newline at end of file diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsDbContext.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsDbContext.cs new file mode 100644 index 000000000..1ba308f45 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsDbContext.cs @@ -0,0 +1,58 @@ +using LINGYUN.Abp.DataProtectionManagement.EntityFrameworkCore; +using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.Notifications.EntityFrameworkCore; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using LINGYUN.Abp.TaskManagement.EntityFrameworkCore; +using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; +using LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore; +using LINGYUN.Platform.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.IdentityServer.EntityFrameworkCore; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore; + +[ConnectionStringName("SingleDbMigrator")] +public class SingleMigrationsDbContext : AbpDbContext +{ + public SingleMigrationsDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.ConfigureAuditLogging(); + modelBuilder.ConfigureIdentity(); + modelBuilder.ConfigureIdentityServer(); + modelBuilder.ConfigureOpenIddict(); + modelBuilder.ConfigureSaas(); + modelBuilder.ConfigureFeatureManagement(); + modelBuilder.ConfigureSettingManagement(); + modelBuilder.ConfigurePermissionManagement(); + modelBuilder.ConfigureTextTemplating(); + modelBuilder.ConfigureTaskManagement(); + modelBuilder.ConfigureWebhooksManagement(); + modelBuilder.ConfigurePlatform(); + modelBuilder.ConfigureLocalization(); + modelBuilder.ConfigureNotifications(); + modelBuilder.ConfigureNotificationsDefinition(); + modelBuilder.ConfigureMessageService(); + modelBuilder.ConfigureDataProtectionManagement(); + modelBuilder.ConfigureWebhooksManagement(); + + modelBuilder.ConfigureProjectName(); + } +} diff --git a/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsEntityFrameworkCoreModule.cs b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsEntityFrameworkCoreModule.cs new file mode 100644 index 000000000..60cc95b86 --- /dev/null +++ b/aspnet-core/templates/aio/content/migrations/PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore/SingleMigrationsEntityFrameworkCoreModule.cs @@ -0,0 +1,48 @@ +using LINGYUN.Abp.AuditLogging.EntityFrameworkCore; +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Identity.EntityFrameworkCore; +using LINGYUN.Abp.IdentityServer.EntityFrameworkCore; +using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; +using LINGYUN.Abp.MessageService.EntityFrameworkCore; +using LINGYUN.Abp.Notifications.EntityFrameworkCore; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using LINGYUN.Abp.TaskManagement.EntityFrameworkCore; +using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; +using LINGYUN.Abp.WebhooksManagement.EntityFrameworkCore; +using LINGYUN.Abp.WeChat; +using LINGYUN.Platform.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; + +namespace PackageName.CompanyName.ProjectName.AIO.EntityFrameworkCore; + +[DependsOn( + typeof(AbpSaasEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpNotificationsEntityFrameworkCoreModule), + typeof(AbpMessageServiceEntityFrameworkCoreModule), + typeof(PlatformEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpIdentityEntityFrameworkCoreModule), + typeof(AbpIdentityServerEntityFrameworkCoreModule), + typeof(AbpOpenIddictEntityFrameworkCoreModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + typeof(WebhooksManagementEntityFrameworkCoreModule), + typeof(TaskManagementEntityFrameworkCoreModule), + typeof(AbpWeChatModule), + typeof(AbpDataDbMigratorModule) + )] +public class SingleMigrationsEntityFrameworkCoreModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAbpDbContext(); + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd index 11da52550..3f3946e28 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd @@ -1,30 +1,30 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj index 87d603432..0eaa24015 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj @@ -1,27 +1,27 @@ - - - - - - - netstandard2.0;netstandard2.1;net8.0 - PackageName.CompanyName.ProjectName.Application.Contracts - PackageName.CompanyName.ProjectName.Application.Contracts - false - false - false - - - - - - - - - - - - - - - + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.Application.Contracts + PackageName.CompanyName.ProjectName.Application.Contracts + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs index 0dd18f176..5fed2b916 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs @@ -1,18 +1,18 @@ -using PackageName.CompanyName.ProjectName.Localization; -using Volo.Abp.Features; -using Volo.Abp.Localization; - -namespace PackageName.CompanyName.ProjectName.Features; - -public class ProjectNameFeatureDefinitionProvider : FeatureDefinitionProvider -{ - public override void Define(IFeatureDefinitionContext context) - { - var group = context.AddGroup(ProjectNameFeatureNames.GroupName, L("Features:ProjectName")); - } - - private static ILocalizableString L(string name) - { - return LocalizableString.Create(name); - } -} +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; + +namespace PackageName.CompanyName.ProjectName.Features; + +public class ProjectNameFeatureDefinitionProvider : FeatureDefinitionProvider +{ + public override void Define(IFeatureDefinitionContext context) + { + var group = context.AddGroup(ProjectNameFeatureNames.GroupName, L("Features:ProjectName")); + } + + private static ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs index 4af07a047..6389fbcf6 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs @@ -1,6 +1,6 @@ -namespace PackageName.CompanyName.ProjectName.Features; - -public static class ProjectNameFeatureNames -{ - public const string GroupName = "ProjectName"; -} +namespace PackageName.CompanyName.ProjectName.Features; + +public static class ProjectNameFeatureNames +{ + public const string GroupName = "ProjectName"; +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs index 6cb9ead42..6f132d9a3 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs @@ -1,10 +1,10 @@ -using LINGYUN.Abp.Dynamic.Queryable; - -namespace PackageName.CompanyName.ProjectName; -/// -/// 提供动态查询接口定义 -/// -/// 实体dto类型 -public interface IProjectNameDynamicQueryableAppService : IDynamicQueryableAppService -{ -} +using LINGYUN.Abp.Dynamic.Queryable; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询接口定义 +/// +/// 实体dto类型 +public interface IProjectNameDynamicQueryableAppService : IDynamicQueryableAppService +{ +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs index 9899a0c97..eb0b2fb15 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs @@ -1,17 +1,17 @@ -using LINGYUN.Abp.Dynamic.Queryable; -using Volo.Abp.Application; -using Volo.Abp.Authorization; -using Volo.Abp.Features; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpFeaturesModule), - typeof(AbpAuthorizationModule), - typeof(AbpDddApplicationContractsModule), - typeof(AbpDynamicQueryableApplicationContractsModule), - typeof(ProjectNameDomainSharedModule))] -public class ProjectNameApplicationContractsModule : AbpModule -{ -} +using LINGYUN.Abp.Dynamic.Queryable; +using Volo.Abp.Application; +using Volo.Abp.Authorization; +using Volo.Abp.Features; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpFeaturesModule), + typeof(AbpAuthorizationModule), + typeof(AbpDddApplicationContractsModule), + typeof(AbpDynamicQueryableApplicationContractsModule), + typeof(ProjectNameDomainSharedModule))] +public class ProjectNameApplicationContractsModule : AbpModule +{ +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs index ef949b273..4b5bb260d 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs @@ -1,7 +1,7 @@ -namespace PackageName.CompanyName.ProjectName; - -public static class ProjectNameRemoteServiceConsts -{ - public const string RemoteServiceName = "ProjectName"; - public const string ModuleName = "ProjectName"; -} +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameRemoteServiceConsts +{ + public const string RemoteServiceName = "ProjectName"; + public const string ModuleName = "ProjectName"; +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd index 11da52550..3f3946e28 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd @@ -1,30 +1,30 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj index d376fcd4a..cf195e665 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj @@ -1,26 +1,26 @@ - - - - - - - net8.0 - PackageName.CompanyName.ProjectName.Application - PackageName.CompanyName.ProjectName.Application - false - false - false - - - - - - - - - - - - - - + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.Application + PackageName.CompanyName.ProjectName.Application + false + false + false + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs index 458c4dd29..496140dfe 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs @@ -1,13 +1,13 @@ -using PackageName.CompanyName.ProjectName.Localization; -using Volo.Abp.Application.Services; - -namespace PackageName.CompanyName.ProjectName; - -public abstract class ProjectNameAppServiceBase : ApplicationService -{ - protected ProjectNameAppServiceBase() - { - LocalizationResource = typeof(ProjectNameResource); - ObjectMapperContext = typeof(ProjectNameApplicationModule); - } -} +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Application.Services; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameAppServiceBase : ApplicationService +{ + protected ProjectNameAppServiceBase() + { + LocalizationResource = typeof(ProjectNameResource); + ObjectMapperContext = typeof(ProjectNameApplicationModule); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs similarity index 95% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs index b16e2bc1b..0ace9b456 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs @@ -1,10 +1,10 @@ -using AutoMapper; - -namespace PackageName.CompanyName.ProjectName; - -public class ProjectNameApplicationMapperProfile : Profile -{ - public ProjectNameApplicationMapperProfile() - { - } -} +using AutoMapper; + +namespace PackageName.CompanyName.ProjectName; + +public class ProjectNameApplicationMapperProfile : Profile +{ + public ProjectNameApplicationMapperProfile() + { + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs index 723aa233e..6e1cf009f 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs @@ -1,27 +1,27 @@ -using LINGYUN.Abp.Dynamic.Queryable; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Application; -using Volo.Abp.Authorization; -using Volo.Abp.AutoMapper; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpAuthorizationModule), - typeof(AbpDddApplicationModule), - typeof(ProjectNameDomainModule), - typeof(ProjectNameApplicationContractsModule), - typeof(AbpDynamicQueryableApplicationModule))] -public class ProjectNameApplicationModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAutoMapperObjectMapper(); - - Configure(options => - { - options.AddProfile(validate: true); - }); - } -} +using LINGYUN.Abp.Dynamic.Queryable; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Application; +using Volo.Abp.Authorization; +using Volo.Abp.AutoMapper; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAuthorizationModule), + typeof(AbpDddApplicationModule), + typeof(ProjectNameDomainModule), + typeof(ProjectNameApplicationContractsModule), + typeof(AbpDynamicQueryableApplicationModule))] +public class ProjectNameApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + + Configure(options => + { + options.AddProfile(validate: true); + }); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs index 36e98d204..e20348b53 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs @@ -1,19 +1,19 @@ -using LINGYUN.Abp.Dynamic.Queryable; -using PackageName.CompanyName.ProjectName.Localization; - -namespace PackageName.CompanyName.ProjectName; -/// -/// 提供动态查询接口实现 -/// -/// 实体类型 -/// 实体dto类型 -public abstract class ProjectNameDynamicQueryableAppServiceBase : - DynamicQueryableAppService, - IProjectNameDynamicQueryableAppService -{ - protected ProjectNameDynamicQueryableAppServiceBase() - { - LocalizationResource = typeof(ProjectNameResource); - ObjectMapperContext = typeof(ProjectNameApplicationModule); - } -} +using LINGYUN.Abp.Dynamic.Queryable; +using PackageName.CompanyName.ProjectName.Localization; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询接口实现 +/// +/// 实体类型 +/// 实体dto类型 +public abstract class ProjectNameDynamicQueryableAppServiceBase : + DynamicQueryableAppService, + IProjectNameDynamicQueryableAppService +{ + protected ProjectNameDynamicQueryableAppServiceBase() + { + LocalizationResource = typeof(ProjectNameResource); + ObjectMapperContext = typeof(ProjectNameApplicationModule); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj index 4372fdff4..aa6f4772b 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj @@ -1,19 +1,19 @@ - - - - - - - net8.0 - - - - - - - - - - - - + + + + + + + net8.0 + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs index 81707fa2f..ca16b0bf1 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs @@ -1,18 +1,18 @@ -using LINGYUN.Abp.Dapr.Client; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpDaprClientModule), - typeof(ProjectNameApplicationContractsModule))] -public class ProjectNameDaprClientModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddStaticDaprClientProxies( - typeof(ProjectNameApplicationContractsModule).Assembly, - ProjectNameRemoteServiceConsts.RemoteServiceName); - } -} +using LINGYUN.Abp.Dapr.Client; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpDaprClientModule), + typeof(ProjectNameApplicationContractsModule))] +public class ProjectNameDaprClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddStaticDaprClientProxies( + typeof(ProjectNameApplicationContractsModule).Assembly, + ProjectNameRemoteServiceConsts.RemoteServiceName); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj index b9172c86a..cd98bbcf9 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj @@ -1,30 +1,30 @@ - - - - - - - netstandard2.0;netstandard2.1;net8.0 - PackageName.CompanyName.ProjectName.Domain.Shared - PackageName.CompanyName.ProjectName.Domain.Shared - false - false - false - - - - - - - - - - - - - - - - - - + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.Domain.Shared + PackageName.CompanyName.ProjectName.Domain.Shared + false + false + false + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs similarity index 95% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs index 11db159c1..b0c280d5a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs @@ -1,8 +1,8 @@ -using Volo.Abp.Localization; - -namespace PackageName.CompanyName.ProjectName.Localization; - -[LocalizationResourceName("ProjectName")] -public class ProjectNameResource -{ -} +using Volo.Abp.Localization; + +namespace PackageName.CompanyName.ProjectName.Localization; + +[LocalizationResourceName("ProjectName")] +public class ProjectNameResource +{ +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json index a529d6960..d14e6f1dd 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json @@ -1,8 +1,8 @@ -{ - "culture": "en", - "texts": { - "Features:ProjectName": "ProjectName", - "Permission:ProjectName": "ProjectName", - "Permission:ManageSettings": "Manage Settings" - } +{ + "culture": "en", + "texts": { + "Features:ProjectName": "ProjectName", + "Permission:ProjectName": "ProjectName", + "Permission:ManageSettings": "Manage Settings" + } } \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json index e2af58de8..c85b3754a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json @@ -1,8 +1,8 @@ -{ - "culture": "zh-Hans", - "texts": { - "Features:ProjectName": "ProjectName", - "Permission:ProjectName": "ProjectName", - "Permission:ManageSettings": "管理设置" - } +{ + "culture": "zh-Hans", + "texts": { + "Features:ProjectName": "ProjectName", + "Permission:ProjectName": "ProjectName", + "Permission:ManageSettings": "管理设置" + } } \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs index 6ce706932..6634ceb15 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs @@ -1,16 +1,16 @@ -using System; -using Volo.Abp.ObjectExtending.Modularity; - -namespace PackageName.CompanyName.ProjectName.ObjectExtending; - -public class ProjectNameModuleExtensionConfiguration : ModuleExtensionConfiguration -{ - public ProjectNameModuleExtensionConfiguration ConfigureProjectName( - Action configureAction) - { - return this.ConfigureEntity( - ProjectNameModuleExtensionConsts.EntityNames.Entity, - configureAction - ); - } -} +using System; +using Volo.Abp.ObjectExtending.Modularity; + +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public class ProjectNameModuleExtensionConfiguration : ModuleExtensionConfiguration +{ + public ProjectNameModuleExtensionConfiguration ConfigureProjectName( + Action configureAction) + { + return this.ConfigureEntity( + ProjectNameModuleExtensionConsts.EntityNames.Entity, + configureAction + ); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs index d59e7c515..fabfd40c9 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Volo.Abp.ObjectExtending.Modularity; - -namespace PackageName.CompanyName.ProjectName.ObjectExtending; - -public static class ProjectNameModuleExtensionConfigurationDictionaryExtensions -{ - public static ModuleExtensionConfigurationDictionary ConfigureProjectName( - this ModuleExtensionConfigurationDictionary modules, - Action configureAction) - { - return modules.ConfigureModule( - ProjectNameModuleExtensionConsts.ModuleName, - configureAction - ); - } -} +using System; +using System.Collections.Generic; +using System.Text; +using Volo.Abp.ObjectExtending.Modularity; + +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public static class ProjectNameModuleExtensionConfigurationDictionaryExtensions +{ + public static ModuleExtensionConfigurationDictionary ConfigureProjectName( + this ModuleExtensionConfigurationDictionary modules, + Action configureAction) + { + return modules.ConfigureModule( + ProjectNameModuleExtensionConsts.ModuleName, + configureAction + ); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs index dd5e13da8..1973ef9b6 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs @@ -1,11 +1,11 @@ -namespace PackageName.CompanyName.ProjectName.ObjectExtending; - -public static class ProjectNameModuleExtensionConsts -{ - public const string ModuleName = "ProjectName"; - - public static class EntityNames - { - public const string Entity = "Entity"; - } -} +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public static class ProjectNameModuleExtensionConsts +{ + public const string ModuleName = "ProjectName"; + + public static class EntityNames + { + public const string Entity = "Entity"; + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs index 7473c7453..ec682b498 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs @@ -1,32 +1,32 @@ -using PackageName.CompanyName.ProjectName.Localization; -using Volo.Abp.Localization; -using Volo.Abp.Localization.ExceptionHandling; -using Volo.Abp.Modularity; -using Volo.Abp.VirtualFileSystem; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpLocalizationModule))] -public class ProjectNameDomainSharedModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.FileSets.AddEmbedded(); - }); - - Configure(options => - { - options.Resources - .Add() - .AddVirtualJson("/PackageName/CompanyName/ProjectName/Localization/Resources"); - }); - - Configure(options => - { - options.MapCodeNamespace(ProjectNameErrorCodes.Namespace, typeof(ProjectNameResource)); - }); - } -} +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpLocalizationModule))] +public class ProjectNameDomainSharedModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add() + .AddVirtualJson("/PackageName/CompanyName/ProjectName/Localization/Resources"); + }); + + Configure(options => + { + options.MapCodeNamespace(ProjectNameErrorCodes.Namespace, typeof(ProjectNameResource)); + }); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs index 7a652e651..b2383ee40 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs @@ -1,6 +1,6 @@ -namespace PackageName.CompanyName.ProjectName; - -public static class ProjectNameErrorCodes -{ - public const string Namespace = "ProjectName"; -} +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameErrorCodes +{ + public const string Namespace = "ProjectName"; +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj index b8f035091..2cccd0944 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj @@ -1,27 +1,27 @@ - - - - - - - net8.0 - PackageName.CompanyName.ProjectName.Domain - PackageName.CompanyName.ProjectName.Domain - false - false - false - - - - - - - - - - - - - - - + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.Domain + PackageName.CompanyName.ProjectName.Domain + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs index 5cd27642b..a18947c6c 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs @@ -1,11 +1,11 @@ -namespace PackageName.CompanyName.ProjectName; - -public static class ProjectNameDbProperties -{ - public static string DbTablePrefix { get; set; } = "ProjectName_"; - - public static string DbSchema { get; set; } = null; - - - public const string ConnectionStringName = "ProjectName"; -} +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameDbProperties +{ + public static string DbTablePrefix { get; set; } = "ProjectName_"; + + public static string DbSchema { get; set; } = null; + + + public const string ConnectionStringName = "ProjectName"; +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs similarity index 94% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs index b2cc42748..79c7af553 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs @@ -1,11 +1,11 @@ -using AutoMapper; - -namespace PackageName.CompanyName.ProjectName; - -public class ProjectNameDomainMapperProfile : Profile -{ - public ProjectNameDomainMapperProfile() - { - - } -} +using AutoMapper; + +namespace PackageName.CompanyName.ProjectName; + +public class ProjectNameDomainMapperProfile : Profile +{ + public ProjectNameDomainMapperProfile() + { + + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs index 715c1c3b2..401aa849e 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs @@ -1,45 +1,45 @@ -using LINGYUN.Abp.DataProtection; -using Microsoft.Extensions.DependencyInjection; -using PackageName.CompanyName.ProjectName.ObjectExtending; -using Volo.Abp.AutoMapper; -using Volo.Abp.Domain.Entities.Events.Distributed; -using Volo.Abp.Modularity; -using Volo.Abp.ObjectExtending.Modularity; -using Volo.Abp.Threading; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpAutoMapperModule), - typeof(AbpDataProtectionModule), - typeof(ProjectNameDomainSharedModule))] -public class ProjectNameDomainModule : AbpModule -{ - private static readonly OneTimeRunner OneTimeRunner = new(); - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAutoMapperObjectMapper(); - - Configure(options => - { - options.AddProfile(validate: true); - }); - - Configure(options => - { - }); - } - - public override void PostConfigureServices(ServiceConfigurationContext context) - { - OneTimeRunner.Run(() => - { - // 扩展实体配置 - //ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToEntity( - // ProjectNameModuleExtensionConsts.ModuleName, - // ProjectNameModuleExtensionConsts.EntityNames.Entity, - // typeof(Entity) - //); - }); - } -} +using LINGYUN.Abp.DataProtection; +using Microsoft.Extensions.DependencyInjection; +using PackageName.CompanyName.ProjectName.ObjectExtending; +using Volo.Abp.AutoMapper; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.Threading; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAutoMapperModule), + typeof(AbpDataProtectionModule), + typeof(ProjectNameDomainSharedModule))] +public class ProjectNameDomainModule : AbpModule +{ + private static readonly OneTimeRunner OneTimeRunner = new(); + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + + Configure(options => + { + options.AddProfile(validate: true); + }); + + Configure(options => + { + }); + } + + public override void PostConfigureServices(ServiceConfigurationContext context) + { + OneTimeRunner.Run(() => + { + // 扩展实体配置 + //ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToEntity( + // ProjectNameModuleExtensionConsts.ModuleName, + // ProjectNameModuleExtensionConsts.EntityNames.Entity, + // typeof(Entity) + //); + }); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs index 3845b6ba7..cdfdef118 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs @@ -1,10 +1,10 @@ -using Volo.Abp.Settings; - -namespace PackageName.CompanyName.ProjectName.Settings; - -public class ProjectNameSettingDefinitionProvider : SettingDefinitionProvider -{ - public override void Define(ISettingDefinitionContext context) - { - } -} +using Volo.Abp.Settings; + +namespace PackageName.CompanyName.ProjectName.Settings; + +public class ProjectNameSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs index 5d6afce6c..deb0b7b71 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs @@ -1,6 +1,6 @@ -namespace PackageName.CompanyName.ProjectName.Settings; - -public static class ProjectNameSettings -{ - public const string GroupName = "ProjectName"; -} +namespace PackageName.CompanyName.ProjectName.Settings; + +public static class ProjectNameSettings +{ + public const string GroupName = "ProjectName"; +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs similarity index 95% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs index 74e3c828a..fd7a017ea 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs @@ -1,32 +1,32 @@ -using Volo.Abp.Specifications; - -namespace System.Linq.Expressions; - -internal static class ExpressionFuncExtensions -{ - public static Expression> AndIf( - this Expression> first, - bool condition, - Expression> second) - { - if (condition) - { - return ExpressionFuncExtender.And(first, second); - } - - return first; - } - - public static Expression> OrIf( - this Expression> first, - bool condition, - Expression> second) - { - if (condition) - { - return ExpressionFuncExtender.Or(first, second); - } - - return first; - } -} +using Volo.Abp.Specifications; + +namespace System.Linq.Expressions; + +internal static class ExpressionFuncExtensions +{ + public static Expression> AndIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.And(first, second); + } + + return first; + } + + public static Expression> OrIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.Or(first, second); + } + + return first; + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj similarity index 98% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj index 7c2260bd8..05ba83db3 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj @@ -1,37 +1,37 @@ - - - - - - - net8.0 - PackageName.CompanyName.ProjectName.EntityFrameworkCore - PackageName.CompanyName.ProjectName.EntityFrameworkCore - false - false - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.EntityFrameworkCore + PackageName.CompanyName.ProjectName.EntityFrameworkCore + false + false + false + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs index b9abdef0c..c39c2923e 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs @@ -1,9 +1,9 @@ -using Volo.Abp.Data; -using Volo.Abp.EntityFrameworkCore; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] -public interface IProjectNameDbContext : IEfCoreDbContext -{ -} +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] +public interface IProjectNameDbContext : IEfCoreDbContext +{ +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs index 3b7ad579f..5cb2c015b 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs @@ -1,21 +1,21 @@ -using LINGYUN.Abp.DataProtection.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Volo.Abp.Data; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] -public class ProjectNameDbContext : AbpDataProtectionDbContext, IProjectNameDbContext -{ - public ProjectNameDbContext( - DbContextOptions options) : base(options) - { - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - - modelBuilder.ConfigureProjectName(); - } -} +using LINGYUN.Abp.DataProtection.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Data; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] +public class ProjectNameDbContext : AbpDataProtectionDbContext, IProjectNameDbContext +{ + public ProjectNameDbContext( + DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.ConfigureProjectName(); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs index 04338731b..d9ffcb9ca 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs @@ -1,49 +1,49 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Configuration; -using System.IO; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; -public class ProjectNameDbContextFactory : IDesignTimeDbContextFactory -{ - public ProjectNameDbContext CreateDbContext(string[] args) - { - var configuration = BuildConfiguration(); - var connectionString = configuration.GetConnectionString("ProjectName"); - - DbContextOptionsBuilder builder = null; - -#if MySQL - builder = new DbContextOptionsBuilder() - .UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); -#elif SqlServer - builder = new DbContextOptionsBuilder() - .UseSqlServer(connectionString); -#elif Sqlite - builder = new DbContextOptionsBuilder() - .UseSqlite(connectionString); -#elif Oracle - builder = new DbContextOptionsBuilder() - .UseOracle(connectionString); -#elif OracleDevart - builder = (DbContextOptionsBuilder) new DbContextOptionsBuilder() - .UseOracle(connectionString); -#elif PostgreSql - builder = new DbContextOptionsBuilder() - .UseNpgsql(connectionString); -#endif - - return new ProjectNameDbContext(builder!.Options); - } - - private static IConfigurationRoot BuildConfiguration() - { - var builder = new ConfigurationBuilder() - .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../PackageName.CompanyName.ProjectName.DbMigrator/")) - .AddJsonFile("appsettings.json", optional: false) - .AddJsonFile("appsettings.Development.json", optional: true); - - return builder.Build(); - } -} - +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; +public class ProjectNameDbContextFactory : IDesignTimeDbContextFactory +{ + public ProjectNameDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + var connectionString = configuration.GetConnectionString("ProjectName"); + + DbContextOptionsBuilder builder = null; + +#if MySQL + builder = new DbContextOptionsBuilder() + .UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); +#elif SqlServer + builder = new DbContextOptionsBuilder() + .UseSqlServer(connectionString); +#elif Sqlite + builder = new DbContextOptionsBuilder() + .UseSqlite(connectionString); +#elif Oracle + builder = new DbContextOptionsBuilder() + .UseOracle(connectionString); +#elif OracleDevart + builder = (DbContextOptionsBuilder) new DbContextOptionsBuilder() + .UseOracle(connectionString); +#elif PostgreSql + builder = new DbContextOptionsBuilder() + .UseNpgsql(connectionString); +#endif + + return new ProjectNameDbContext(builder!.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../PackageName.CompanyName.ProjectName.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false) + .AddJsonFile("appsettings.Development.json", optional: true); + + return builder.Build(); + } +} + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs index f812977e6..726b4ec9a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs @@ -1,21 +1,21 @@ -using Microsoft.EntityFrameworkCore; -using System; -using Volo.Abp; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -public static class ProjectNameDbContextModelCreatingExtensions -{ - public static void ConfigureProjectName( - this ModelBuilder builder, - Action optionsAction = null) - { - Check.NotNull(builder, nameof(builder)); - - var options = new ProjectNameModelBuilderConfigurationOptions( - ProjectNameDbProperties.DbTablePrefix, - ProjectNameDbProperties.DbSchema - ); - optionsAction?.Invoke(options); - } -} +using Microsoft.EntityFrameworkCore; +using System; +using Volo.Abp; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public static class ProjectNameDbContextModelCreatingExtensions +{ + public static void ConfigureProjectName( + this ModelBuilder builder, + Action optionsAction = null) + { + Check.NotNull(builder, nameof(builder)); + + var options = new ProjectNameModelBuilderConfigurationOptions( + ProjectNameDbProperties.DbTablePrefix, + ProjectNameDbProperties.DbSchema + ); + optionsAction?.Invoke(options); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs index e64bc081a..70d5d69e8 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs @@ -1,58 +1,58 @@ -using LINGYUN.Abp.Data.DbMigrator; -using LINGYUN.Abp.Saas.Tenants; -using Microsoft.Extensions.Logging; -using System; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.DistributedLocking; -using Volo.Abp.EventBus.Distributed; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Uow; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -public class ProjectNameDbMigrationService : EfCoreRuntimeDbMigratorBase, ITransientDependency -{ - protected IDataSeeder DataSeeder { get; } - protected IDbSchemaMigrator DbSchemaMigrator { get; } - protected ITenantRepository TenantRepository { get; } - - public ProjectNameDbMigrationService( - IDataSeeder dataSeeder, - IDbSchemaMigrator dbSchemaMigrator, - ITenantRepository tenantRepository, - ICurrentTenant currentTenant, - IUnitOfWorkManager unitOfWorkManager, - IServiceProvider serviceProvider, - IAbpDistributedLock abpDistributedLock, - IDistributedEventBus distributedEventBus, - ILoggerFactory loggerFactory) - : base( - ConnectionStringNameAttribute.GetConnStringName(), - unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) - { - DataSeeder = dataSeeder; - DbSchemaMigrator = dbSchemaMigrator; - TenantRepository = tenantRepository; - } - - protected async override Task LockAndApplyDatabaseMigrationsAsync() - { - await base.LockAndApplyDatabaseMigrationsAsync(); - - var tenants = await TenantRepository.GetListAsync(); - foreach (var tenant in tenants.Where(x => x.IsActive)) - { - await LockAndApplyDatabaseWithTenantMigrationsAsync(tenant.Id); - } - } - - protected async override Task SeedAsync() - { - Logger.LogInformation($"Executing {(!CurrentTenant.IsAvailable ? "host" : CurrentTenant.Name ?? CurrentTenant.GetId().ToString())} database seed..."); - - await DataSeeder.SeedAsync(CurrentTenant.Id); - } +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Saas.Tenants; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public class ProjectNameDbMigrationService : EfCoreRuntimeDbMigratorBase, ITransientDependency +{ + protected IDataSeeder DataSeeder { get; } + protected IDbSchemaMigrator DbSchemaMigrator { get; } + protected ITenantRepository TenantRepository { get; } + + public ProjectNameDbMigrationService( + IDataSeeder dataSeeder, + IDbSchemaMigrator dbSchemaMigrator, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IServiceProvider serviceProvider, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory) + : base( + ConnectionStringNameAttribute.GetConnStringName(), + unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) + { + DataSeeder = dataSeeder; + DbSchemaMigrator = dbSchemaMigrator; + TenantRepository = tenantRepository; + } + + protected async override Task LockAndApplyDatabaseMigrationsAsync() + { + await base.LockAndApplyDatabaseMigrationsAsync(); + + var tenants = await TenantRepository.GetListAsync(); + foreach (var tenant in tenants.Where(x => x.IsActive)) + { + await LockAndApplyDatabaseWithTenantMigrationsAsync(tenant.Id); + } + } + + protected async override Task SeedAsync() + { + Logger.LogInformation($"Executing {(!CurrentTenant.IsAvailable ? "host" : CurrentTenant.Name ?? CurrentTenant.GetId().ToString())} database seed..."); + + await DataSeeder.SeedAsync(CurrentTenant.Id); + } } \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs index eb9a9214b..90b369745 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs @@ -1,6 +1,6 @@ -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -public static class ProjectNameEfCoreQueryableExtensions -{ - // 在此聚合仓储服务的扩展方法 -} +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public static class ProjectNameEfCoreQueryableExtensions +{ + // 在此聚合仓储服务的扩展方法 +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs index d88c1eb17..b18f43183 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs @@ -1,76 +1,76 @@ -using LINGYUN.Abp.Data.DbMigrator; -using LINGYUN.Abp.DataProtection.EntityFrameworkCore; -using LINGYUN.Abp.Saas.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.Modularity; -#if MySQL -using Volo.Abp.EntityFrameworkCore.MySQL; -#elif SqlServer -using Volo.Abp.EntityFrameworkCore.SqlServer; -using Microsoft.EntityFrameworkCore.Infrastructure; -#elif Sqlite -using Volo.Abp.EntityFrameworkCore.Sqlite; -#elif Oracle -using Volo.Abp.EntityFrameworkCore.Oracle; -#elif OracleDevart -using Volo.Abp.EntityFrameworkCore.Oracle.Devart; -#elif PostgreSql -using Volo.Abp.EntityFrameworkCore.PostgreSql; -#endif - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -[DependsOn( - typeof(ProjectNameDomainModule), - typeof(AbpDataDbMigratorModule), - typeof(AbpDataProtectionEntityFrameworkCoreModule), -#if MySQL - typeof(AbpEntityFrameworkCoreMySQLModule), -#elif SqlServer - typeof(AbpEntityFrameworkCoreSqlServerModule), -#elif Sqlite - typeof(AbpEntityFrameworkCoreSqliteModule), -#elif Oracle - typeof(AbpEntityFrameworkCoreOracleModule), -#elif OracleDevart - typeof(AbpEntityFrameworkCoreOracleDevartModule), -#elif PostgreSql - typeof(AbpEntityFrameworkCorePostgreSqlModule), -#endif - typeof(AbpSaasEntityFrameworkCoreModule))] -public class ProjectNameEntityFrameworkCoreModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - // 配置Ef - Configure(options => - { -#if MySQL - options.UseMySQL(); - options.UseMySQL(); -#elif SqlServer - options.UseSqlServer(); - options.UseSqlServer(builder => - { - // see https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver16 - // builder.UseCompatibilityLevel(150); - }); -#elif Sqlite - options.UseSqlite(); - options.UseSqlite(); -#elif Oracle || OracleDevart - options.UseOracle(); - options.UseOracle(); -#elif PostgreSql - options.UseNpgsql(); - options.UseNpgsql(); -#endif - }); - - context.Services.AddAbpDbContext(options => - { - options.AddDefaultRepositories(); - }); - } -} +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.DataProtection.EntityFrameworkCore; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; +#if MySQL +using Volo.Abp.EntityFrameworkCore.MySQL; +#elif SqlServer +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore.Infrastructure; +#elif Sqlite +using Volo.Abp.EntityFrameworkCore.Sqlite; +#elif Oracle +using Volo.Abp.EntityFrameworkCore.Oracle; +#elif OracleDevart +using Volo.Abp.EntityFrameworkCore.Oracle.Devart; +#elif PostgreSql +using Volo.Abp.EntityFrameworkCore.PostgreSql; +#endif + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[DependsOn( + typeof(ProjectNameDomainModule), + typeof(AbpDataDbMigratorModule), + typeof(AbpDataProtectionEntityFrameworkCoreModule), +#if MySQL + typeof(AbpEntityFrameworkCoreMySQLModule), +#elif SqlServer + typeof(AbpEntityFrameworkCoreSqlServerModule), +#elif Sqlite + typeof(AbpEntityFrameworkCoreSqliteModule), +#elif Oracle + typeof(AbpEntityFrameworkCoreOracleModule), +#elif OracleDevart + typeof(AbpEntityFrameworkCoreOracleDevartModule), +#elif PostgreSql + typeof(AbpEntityFrameworkCorePostgreSqlModule), +#endif + typeof(AbpSaasEntityFrameworkCoreModule))] +public class ProjectNameEntityFrameworkCoreModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + // 配置Ef + Configure(options => + { +#if MySQL + options.UseMySQL(); + options.UseMySQL(); +#elif SqlServer + options.UseSqlServer(); + options.UseSqlServer(builder => + { + // see https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver16 + // builder.UseCompatibilityLevel(150); + }); +#elif Sqlite + options.UseSqlite(); + options.UseSqlite(); +#elif Oracle || OracleDevart + options.UseOracle(); + options.UseOracle(); +#elif PostgreSql + options.UseNpgsql(); + options.UseNpgsql(); +#endif + }); + + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(); + }); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs index ba62d48a8..5849eb902 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs @@ -1,17 +1,17 @@ -using JetBrains.Annotations; -using Volo.Abp.EntityFrameworkCore.Modeling; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -public class ProjectNameModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions -{ - public ProjectNameModelBuilderConfigurationOptions( - [NotNull] string tablePrefix = "", - [CanBeNull] string schema = null) - : base( - tablePrefix, - schema) - { - - } -} +using JetBrains.Annotations; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public class ProjectNameModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions +{ + public ProjectNameModelBuilderConfigurationOptions( + [NotNull] string tablePrefix = "", + [CanBeNull] string schema = null) + : base( + tablePrefix, + schema) + { + + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj index 6d85b6452..30cf00fd9 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj @@ -1,24 +1,24 @@ - - - - - - - netstandard2.0;netstandard2.1;net8.0 - PackageName.CompanyName.ProjectName.HttpApi.Client - PackageName.CompanyName.ProjectName.HttpApi.Client - false - false - false - - - - - - - - - - - - + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.HttpApi.Client + PackageName.CompanyName.ProjectName.HttpApi.Client + false + false + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs index f6cb1e324..831ba468a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs @@ -1,18 +1,18 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Http.Client; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpHttpClientModule), - typeof(ProjectNameApplicationContractsModule))] -public class ProjectNameHttpApiClientModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddStaticHttpClientProxies( - typeof(ProjectNameApplicationContractsModule).Assembly, - ProjectNameRemoteServiceConsts.RemoteServiceName); - } -} +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpHttpClientModule), + typeof(ProjectNameApplicationContractsModule))] +public class ProjectNameHttpApiClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddStaticHttpClientProxies( + typeof(ProjectNameApplicationContractsModule).Assembly, + ProjectNameRemoteServiceConsts.RemoteServiceName); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj index b8a73da64..0f2375f61 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj @@ -1,25 +1,25 @@ - - - - - - - net8.0 - PackageName.CompanyName.ProjectName.HttpApi - PackageName.CompanyName.ProjectName.HttpApi - false - false - false - - - - - - - - - - - - - + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.HttpApi + PackageName.CompanyName.ProjectName.HttpApi + false + false + false + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs index 6797f475c..7345f99ea 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs @@ -1,12 +1,12 @@ -using PackageName.CompanyName.ProjectName.Localization; -using Volo.Abp.AspNetCore.Mvc; - -namespace PackageName.CompanyName.ProjectName; - -public abstract class ProjectNameControllerBase : AbpControllerBase -{ - protected ProjectNameControllerBase() - { - LocalizationResource = typeof(ProjectNameResource); - } -} +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameControllerBase : AbpControllerBase +{ + protected ProjectNameControllerBase() + { + LocalizationResource = typeof(ProjectNameResource); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs index 865145f86..41cfe834a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs @@ -1,17 +1,17 @@ -using LINGYUN.Abp.Dynamic.Queryable; -using PackageName.CompanyName.ProjectName.Localization; - -namespace PackageName.CompanyName.ProjectName; -/// -/// 提供动态查询控制器实现 -/// -/// 实体dto类型 -public abstract class ProjectNameDynamicQueryableControllerBase : DynamicQueryableControllerBase -{ - protected ProjectNameDynamicQueryableControllerBase( - IDynamicQueryableAppService service) - : base(service) - { - LocalizationResource = typeof(ProjectNameResource); - } -} +using LINGYUN.Abp.Dynamic.Queryable; +using PackageName.CompanyName.ProjectName.Localization; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询控制器实现 +/// +/// 实体dto类型 +public abstract class ProjectNameDynamicQueryableControllerBase : DynamicQueryableControllerBase +{ + protected ProjectNameDynamicQueryableControllerBase( + IDynamicQueryableAppService service) + : base(service) + { + LocalizationResource = typeof(ProjectNameResource); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs index 90dccd31c..3a68e60da 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs @@ -1,42 +1,42 @@ -using PackageName.CompanyName.ProjectName.Localization; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.Localization; -using Volo.Abp.Localization; -using Volo.Abp.Modularity; -using Volo.Abp.Validation.Localization; -using LINGYUN.Abp.Dynamic.Queryable; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpAspNetCoreMvcModule), - typeof(ProjectNameApplicationContractsModule), - typeof(AbpDynamicQueryableHttpApiModule))] -public class ProjectNameHttpApiModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - PreConfigure(mvcBuilder => - { - mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameHttpApiModule).Assembly); - }); - - PreConfigure(options => - { - options.AddAssemblyResource( - typeof(ProjectNameResource), - typeof(ProjectNameApplicationContractsModule).Assembly); - }); - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.Resources - .Get() - .AddBaseTypes(typeof(AbpValidationResource)); - }); - } -} +using PackageName.CompanyName.ProjectName.Localization; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.Validation.Localization; +using LINGYUN.Abp.Dynamic.Queryable; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(ProjectNameApplicationContractsModule), + typeof(AbpDynamicQueryableHttpApiModule))] +public class ProjectNameHttpApiModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameHttpApiModule).Assembly); + }); + + PreConfigure(options => + { + options.AddAssemblyResource( + typeof(ProjectNameResource), + typeof(ProjectNameApplicationContractsModule).Assembly); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpValidationResource)); + }); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml diff --git a/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj index 66aa001bd..51af57d0b 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj @@ -1,27 +1,27 @@ - - - - - - - net8.0 - PackageName.CompanyName.ProjectName.SettingManagement - PackageName.CompanyName.ProjectName.SettingManagement - false - false - false - - - - - - - - - - - - - - - + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.SettingManagement + PackageName.CompanyName.ProjectName.SettingManagement + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs index 308135ed0..dff74dddb 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs @@ -1,7 +1,7 @@ -using LINGYUN.Abp.SettingManagement; - -namespace PackageName.CompanyName.ProjectName.SettingManagement; - -public interface IProjectNameSettingAppService : ISettingAppService, IUserSettingAppService -{ -} +using LINGYUN.Abp.SettingManagement; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +public interface IProjectNameSettingAppService : ISettingAppService, IUserSettingAppService +{ +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs index 619fdd3ab..4fab9bdd6 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs @@ -1,106 +1,106 @@ -using LINGYUN.Abp.SettingManagement; -using Microsoft.AspNetCore.Authorization; -using PackageName.CompanyName.ProjectName.Permissions; -using PackageName.CompanyName.ProjectName.Localization; -using System.Threading.Tasks; -using Volo.Abp.Application.Services; -using Volo.Abp.Features; -using Volo.Abp.MultiTenancy; -using Volo.Abp.SettingManagement; -using Volo.Abp.Settings; -using Volo.Abp.Users; - -namespace PackageName.CompanyName.ProjectName.SettingManagement; - -public class ProjectNameSettingAppService : ApplicationService, IProjectNameSettingAppService -{ - protected ISettingManager SettingManager { get; } - protected ISettingDefinitionManager SettingDefinitionManager { get; } - - public ProjectNameSettingAppService( - ISettingManager settingManager, - ISettingDefinitionManager settingDefinitionManager) - { - SettingManager = settingManager; - SettingDefinitionManager = settingDefinitionManager; - LocalizationResource = typeof(ProjectNameResource); - } - - public virtual async Task GetAllForCurrentTenantAsync() - { - return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); - } - - [Authorize] - public virtual async Task GetAllForCurrentUserAsync() - { - return await GetAllForProviderAsync(UserSettingValueProvider.ProviderName, CurrentUser.GetId().ToString()); - } - - public virtual async Task GetAllForGlobalAsync() - { - return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); - } - - [Authorize(ProjectNamePermissions.ManageSettings)] - public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) - { - // 增加特性检查 - await CheckFeatureAsync(); - - if (CurrentTenant.IsAvailable) - { - foreach (var setting in input.Settings) - { - await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); - } - - await CurrentUnitOfWork.SaveChangesAsync(); - } - } - - [Authorize] - public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) - { - // 增加特性检查 - await CheckFeatureAsync(); - - foreach (var setting in input.Settings) - { - await SettingManager.SetForCurrentUserAsync(setting.Name, setting.Value); - } - - await CurrentUnitOfWork.SaveChangesAsync(); - } - - [Authorize(ProjectNamePermissions.ManageSettings)] - public virtual async Task SetGlobalAsync(UpdateSettingsDto input) - { - // 增加特性检查 - await CheckFeatureAsync(); - - foreach (var setting in input.Settings) - { - await SettingManager.SetGlobalAsync(setting.Name, setting.Value); - } - - await CurrentUnitOfWork.SaveChangesAsync(); - } - - - protected virtual async Task CheckFeatureAsync() - { - await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); - } - - protected virtual async Task GetAllForProviderAsync(string providerName, string providerKey) - { - var settingGroups = new SettingGroupResult(); - - //TODO: 当前项目所有配置项在此定义返回 - - await Task.CompletedTask; - - return settingGroups; - } -} +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Authorization; +using PackageName.CompanyName.ProjectName.Permissions; +using PackageName.CompanyName.ProjectName.Localization; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Features; +using Volo.Abp.MultiTenancy; +using Volo.Abp.SettingManagement; +using Volo.Abp.Settings; +using Volo.Abp.Users; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +public class ProjectNameSettingAppService : ApplicationService, IProjectNameSettingAppService +{ + protected ISettingManager SettingManager { get; } + protected ISettingDefinitionManager SettingDefinitionManager { get; } + + public ProjectNameSettingAppService( + ISettingManager settingManager, + ISettingDefinitionManager settingDefinitionManager) + { + SettingManager = settingManager; + SettingDefinitionManager = settingDefinitionManager; + LocalizationResource = typeof(ProjectNameResource); + } + + public virtual async Task GetAllForCurrentTenantAsync() + { + return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); + } + + [Authorize] + public virtual async Task GetAllForCurrentUserAsync() + { + return await GetAllForProviderAsync(UserSettingValueProvider.ProviderName, CurrentUser.GetId().ToString()); + } + + public virtual async Task GetAllForGlobalAsync() + { + return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + if (CurrentTenant.IsAvailable) + { + foreach (var setting in input.Settings) + { + await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + } + + [Authorize] + public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + foreach (var setting in input.Settings) + { + await SettingManager.SetForCurrentUserAsync(setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + public virtual async Task SetGlobalAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + foreach (var setting in input.Settings) + { + await SettingManager.SetGlobalAsync(setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + + protected virtual async Task CheckFeatureAsync() + { + await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); + } + + protected virtual async Task GetAllForProviderAsync(string providerName, string providerKey) + { + var settingGroups = new SettingGroupResult(); + + //TODO: 当前项目所有配置项在此定义返回 + + await Task.CompletedTask; + + return settingGroups; + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs similarity index 96% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs index 58df5fe31..2c045ba59 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs @@ -1,69 +1,69 @@ -using Asp.Versioning; -using LINGYUN.Abp.SettingManagement; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using PackageName.CompanyName.ProjectName.Permissions; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.AspNetCore.Mvc; - -namespace PackageName.CompanyName.ProjectName.SettingManagement; - -[RemoteService(Name = ProjectNameRemoteServiceConsts.RemoteServiceName)] -[ApiVersion("2.0")] -[Area(ProjectNameRemoteServiceConsts.ModuleName)] -[Route("api/ProjectName/settings")] -public class ProjectNameSettingController : AbpController, IProjectNameSettingAppService -{ - private readonly IProjectNameSettingAppService _settingAppService; - public ProjectNameSettingController(IProjectNameSettingAppService settingAppService) - { - _settingAppService = settingAppService; - } - - [Authorize(ProjectNamePermissions.ManageSettings)] - [HttpPut] - [Route("by-current-tenant")] - public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) - { - await _settingAppService.SetCurrentTenantAsync(input); - } - - [HttpGet] - [Route("by-current-tenant")] - public virtual async Task GetAllForCurrentTenantAsync() - { - return await _settingAppService.GetAllForCurrentTenantAsync(); - } - - [Authorize] - [HttpPut] - [Route("by-current-user")] - public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) - { - await _settingAppService.SetCurrentTenantAsync(input); - } - - [Authorize] - [HttpGet] - [Route("by-current-user")] - public virtual async Task GetAllForCurrentUserAsync() - { - return await _settingAppService.GetAllForCurrentTenantAsync(); - } - - [Authorize(ProjectNamePermissions.ManageSettings)] - [HttpPut] - [Route("by-global")] - public virtual async Task SetGlobalAsync(UpdateSettingsDto input) - { - await _settingAppService.SetGlobalAsync(input); - } - - [HttpGet] - [Route("by-global")] - public virtual async Task GetAllForGlobalAsync() - { - return await _settingAppService.GetAllForGlobalAsync(); - } -} +using Asp.Versioning; +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PackageName.CompanyName.ProjectName.Permissions; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +[RemoteService(Name = ProjectNameRemoteServiceConsts.RemoteServiceName)] +[ApiVersion("2.0")] +[Area(ProjectNameRemoteServiceConsts.ModuleName)] +[Route("api/ProjectName/settings")] +public class ProjectNameSettingController : AbpController, IProjectNameSettingAppService +{ + private readonly IProjectNameSettingAppService _settingAppService; + public ProjectNameSettingController(IProjectNameSettingAppService settingAppService) + { + _settingAppService = settingAppService; + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + [HttpPut] + [Route("by-current-tenant")] + public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) + { + await _settingAppService.SetCurrentTenantAsync(input); + } + + [HttpGet] + [Route("by-current-tenant")] + public virtual async Task GetAllForCurrentTenantAsync() + { + return await _settingAppService.GetAllForCurrentTenantAsync(); + } + + [Authorize] + [HttpPut] + [Route("by-current-user")] + public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) + { + await _settingAppService.SetCurrentTenantAsync(input); + } + + [Authorize] + [HttpGet] + [Route("by-current-user")] + public virtual async Task GetAllForCurrentUserAsync() + { + return await _settingAppService.GetAllForCurrentTenantAsync(); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + [HttpPut] + [Route("by-global")] + public virtual async Task SetGlobalAsync(UpdateSettingsDto input) + { + await _settingAppService.SetGlobalAsync(input); + } + + [HttpGet] + [Route("by-global")] + public virtual async Task GetAllForGlobalAsync() + { + return await _settingAppService.GetAllForGlobalAsync(); + } +} diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs similarity index 97% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs rename to aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs index 09eb20393..914707f4a 100644 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs +++ b/aspnet-core/templates/aio/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs @@ -1,22 +1,22 @@ -using LINGYUN.Abp.SettingManagement; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Modularity; -using Volo.Abp.SettingManagement; - -namespace PackageName.CompanyName.ProjectName.SettingManagement; - -[DependsOn( - typeof(AbpSettingManagementApplicationContractsModule), - typeof(AbpAspNetCoreMvcModule), - typeof(AbpSettingManagementDomainModule))] -public class ProjectNameSettingManagementModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - PreConfigure(mvcBuilder => - { - mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameSettingManagementModule).Assembly); - }); - } -} +using LINGYUN.Abp.SettingManagement; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +[DependsOn( + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpAspNetCoreMvcModule), + typeof(AbpSettingManagementDomainModule))] +public class ProjectNameSettingManagementModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameSettingManagementModule).Assembly); + }); + } +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj index 8a875c135..7aefab82c 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj @@ -1,18 +1,18 @@ - - - - net8.0 - - false - - - - - - - - - - - - + + + + net8.0 + + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs index 64198871d..f5ae45141 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs @@ -1,5 +1,5 @@ -namespace PackageName.CompanyName.ProjectName; - -public abstract class ProjectNameApplicationTestBase : ProjectNameTestBase -{ -} +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameApplicationTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs similarity index 95% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs index 12175d486..7e9fa658a 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs @@ -1,11 +1,11 @@ -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(ProjectNameDomainTestModule), - typeof(ProjectNameApplicationModule) - )] -public class ProjectNameApplicationTestModule : AbpModule -{ -} +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(ProjectNameDomainTestModule), + typeof(ProjectNameApplicationModule) + )] +public class ProjectNameApplicationTestModule : AbpModule +{ +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj similarity index 96% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj index 09e35ceb3..5ca01ede0 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj @@ -1,18 +1,18 @@ - - - - net8.0 - - false - - - - - - - - - - - - + + + + net8.0 + + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs similarity index 96% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs index 01b678fe1..471e0adf8 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs @@ -1,5 +1,5 @@ -namespace PackageName.CompanyName.ProjectName; - -public abstract class ProjectNameDomainTestBase : ProjectNameTestBase -{ -} +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameDomainTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs similarity index 95% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs index 55d69b77c..f4a8a9d16 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs @@ -1,11 +1,11 @@ -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(ProjectNameTestBaseModule), - typeof(ProjectNameDomainModule) - )] -public class ProjectNameDomainTestModule : AbpModule -{ -} +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(ProjectNameTestBaseModule), + typeof(ProjectNameDomainModule) + )] +public class ProjectNameDomainTestModule : AbpModule +{ +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj index 61d399721..cb9c91e1f 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj @@ -1,19 +1,19 @@ - - - - net8.0 - - false - - - - - - - - - - - - - + + + + net8.0 + + false + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs index 6971ba357..738149b6f 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs @@ -1,5 +1,5 @@ -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -public abstract class ProjectNameEntityFrameworkCoreTestBase : ProjectNameTestBase -{ -} +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public abstract class ProjectNameEntityFrameworkCoreTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs index 2146db9ca..da8ce7c6c 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs @@ -1,38 +1,38 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using System; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.Modularity; -using Volo.Abp.Uow; - -namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; - -[DependsOn( - typeof(ProjectNameTestBaseModule), - typeof(ProjectNameEntityFrameworkCoreModule) - )] -public class ProjectNameEntityFrameworkCoreTestModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddEntityFrameworkInMemoryDatabase(); - - var databaseName = Guid.NewGuid().ToString(); - - Configure(options => - { - options.Configure(abpDbContextConfigurationContext => - { - abpDbContextConfigurationContext.DbContextOptions.EnableDetailedErrors(); - abpDbContextConfigurationContext.DbContextOptions.EnableSensitiveDataLogging(); - - abpDbContextConfigurationContext.DbContextOptions.UseInMemoryDatabase(databaseName); - }); - }); - - Configure(options => - { - options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions - }); - } -} +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[DependsOn( + typeof(ProjectNameTestBaseModule), + typeof(ProjectNameEntityFrameworkCoreModule) + )] +public class ProjectNameEntityFrameworkCoreTestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddEntityFrameworkInMemoryDatabase(); + + var databaseName = Guid.NewGuid().ToString(); + + Configure(options => + { + options.Configure(abpDbContextConfigurationContext => + { + abpDbContextConfigurationContext.DbContextOptions.EnableDetailedErrors(); + abpDbContextConfigurationContext.DbContextOptions.EnableSensitiveDataLogging(); + + abpDbContextConfigurationContext.DbContextOptions.UseInMemoryDatabase(databaseName); + }); + }); + + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions + }); + } +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj similarity index 97% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj index e983ebfaf..ae4b6d5bf 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj @@ -1,23 +1,23 @@ - - - - net8.0 - - false - - - - - - - - - - - - - - - - - + + + + net8.0 + + false + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs similarity index 96% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs index 79cca930d..08aeffccb 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs @@ -1,58 +1,58 @@ -using Microsoft.Extensions.DependencyInjection; -using System; -using System.Threading.Tasks; -using Volo.Abp; -using Volo.Abp.Modularity; -using Volo.Abp.Testing; -using Volo.Abp.Uow; - -namespace PackageName.CompanyName.ProjectName; - -public abstract class ProjectNameTestBase : AbpIntegratedTest - where TStartupModule : IAbpModule -{ - protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) - { - options.UseAutofac(); - } - - protected virtual Task WithUnitOfWorkAsync(Func func) - { - return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); - } - - protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) - { - using (var scope = ServiceProvider.CreateScope()) - { - var uowManager = scope.ServiceProvider.GetRequiredService(); - - using (var uow = uowManager.Begin(options)) - { - await action(); - - await uow.CompleteAsync(); - } - } - } - - protected virtual Task WithUnitOfWorkAsync(Func> func) - { - return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); - } - - protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) - { - using (var scope = ServiceProvider.CreateScope()) - { - var uowManager = scope.ServiceProvider.GetRequiredService(); - - using (var uow = uowManager.Begin(options)) - { - var result = await func(); - await uow.CompleteAsync(); - return result; - } - } - } -} +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Testing; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameTestBase : AbpIntegratedTest + where TStartupModule : IAbpModule +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } +} diff --git a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs similarity index 96% rename from aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs rename to aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs index adab3640d..4564d29b6 100644 --- a/aspnet-core/templates/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs +++ b/aspnet-core/templates/aio/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs @@ -1,24 +1,24 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.Authorization; -using Volo.Abp.Autofac; -using Volo.Abp.Features; -using Volo.Abp.MemoryDb; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(AbpTestBaseModule), - typeof(AbpAuthorizationModule), - typeof(AbpFeaturesModule), - typeof(AbpMemoryDbModule) - )] -public class ProjectNameTestBaseModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddAlwaysAllowAuthorization(); - } -} +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Authorization; +using Volo.Abp.Autofac; +using Volo.Abp.Features; +using Volo.Abp.MemoryDb; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpTestBaseModule), + typeof(AbpAuthorizationModule), + typeof(AbpFeaturesModule), + typeof(AbpMemoryDbModule) + )] +public class ProjectNameTestBaseModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAlwaysAllowAuthorization(); + } +} diff --git a/aspnet-core/templates/content/PackageName.CompanyName.ProjectName.sln b/aspnet-core/templates/content/PackageName.CompanyName.ProjectName.sln deleted file mode 100644 index f66e0df1f..000000000 --- a/aspnet-core/templates/content/PackageName.CompanyName.ProjectName.sln +++ /dev/null @@ -1,143 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4B0AD527-99B3-49A9-8A45-FD8671F8BE4D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.HttpApi.Host", "host\PackageName.CompanyName.ProjectName.HttpApi.Host\PackageName.CompanyName.ProjectName.HttpApi.Host.csproj", "{31E33CE2-71D3-43FF-9A30-2DCC82C607AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Solution Items", ".Solution Items", "{C9675742-7986-4BC1-9781-FD1C3C5B6287}" - ProjectSection(SolutionItems) = preProject - common.props = common.props - configureawait.props = configureawait.props - Directory.Build.props = Directory.Build.props - Directory.Packages.props = Directory.Packages.props - NuGet.Config = NuGet.Config - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "host", "host", "{4786387C-C1C5-46F8-806F-EBC54DB0A4FA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A9CB1547-1C2C-4A23-82EC-C834C1626E0A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Application.Tests", "tests\PackageName.CompanyName.ProjectName.Application.Tests\PackageName.CompanyName.ProjectName.Application.Tests.csproj", "{9262FE7A-76B2-424F-8C34-AFA1D95D7E5A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Domain.Tests", "tests\PackageName.CompanyName.ProjectName.Domain.Tests\PackageName.CompanyName.ProjectName.Domain.Tests.csproj", "{A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests", "tests\PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests\PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj", "{0B2E1C9E-092D-4E5F-BE9F-5506E689FC85}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.TestBase", "tests\PackageName.CompanyName.ProjectName.TestBase\PackageName.CompanyName.ProjectName.TestBase.csproj", "{4A9D43A2-D08B-40E8-9C74-F2B95BF81AED}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.DbMigrator", "host\PackageName.CompanyName.ProjectName.DbMigrator\PackageName.CompanyName.ProjectName.DbMigrator.csproj", "{F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "migrations", "migrations", "{2BF87FAA-69E7-486E-9123-1F407A2BB633}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Domain.Shared", "src\PackageName.CompanyName.ProjectName.Domain.Shared\PackageName.CompanyName.ProjectName.Domain.Shared.csproj", "{77090F97-BD80-4469-842F-F5769CF849E9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Domain", "src\PackageName.CompanyName.ProjectName.Domain\PackageName.CompanyName.ProjectName.Domain.csproj", "{DF2CCF03-95D5-4BE4-8B32-742818C56F15}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Application.Contracts", "src\PackageName.CompanyName.ProjectName.Application.Contracts\PackageName.CompanyName.ProjectName.Application.Contracts.csproj", "{54FB9929-7D9C-40FC-A0D0-94ACBA37D20E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Application", "src\PackageName.CompanyName.ProjectName.Application\PackageName.CompanyName.ProjectName.Application.csproj", "{F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.Dapr.Client", "src\PackageName.CompanyName.ProjectName.Dapr.Client\PackageName.CompanyName.ProjectName.Dapr.Client.csproj", "{B69F04FF-8505-49F6-9B60-BB800846C87C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.EntityFrameworkCore", "src\PackageName.CompanyName.ProjectName.EntityFrameworkCore\PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj", "{09CA7186-DBA7-4428-A1ED-31292AC02050}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.HttpApi", "src\PackageName.CompanyName.ProjectName.HttpApi\PackageName.CompanyName.ProjectName.HttpApi.csproj", "{FDB3A3E9-C072-438D-8B8D-2AA957C1167F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.HttpApi.Client", "src\PackageName.CompanyName.ProjectName.HttpApi.Client\PackageName.CompanyName.ProjectName.HttpApi.Client.csproj", "{8CE7C515-CD78-42D4-A9D7-39D217A3D046}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PackageName.CompanyName.ProjectName.SettingManagement", "src\PackageName.CompanyName.ProjectName.SettingManagement\PackageName.CompanyName.ProjectName.SettingManagement.csproj", "{CAEB3435-A332-4FFA-BE5F-4E386FA8B19B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {31E33CE2-71D3-43FF-9A30-2DCC82C607AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31E33CE2-71D3-43FF-9A30-2DCC82C607AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31E33CE2-71D3-43FF-9A30-2DCC82C607AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31E33CE2-71D3-43FF-9A30-2DCC82C607AE}.Release|Any CPU.Build.0 = Release|Any CPU - {9262FE7A-76B2-424F-8C34-AFA1D95D7E5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9262FE7A-76B2-424F-8C34-AFA1D95D7E5A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9262FE7A-76B2-424F-8C34-AFA1D95D7E5A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9262FE7A-76B2-424F-8C34-AFA1D95D7E5A}.Release|Any CPU.Build.0 = Release|Any CPU - {A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE}.Release|Any CPU.Build.0 = Release|Any CPU - {0B2E1C9E-092D-4E5F-BE9F-5506E689FC85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0B2E1C9E-092D-4E5F-BE9F-5506E689FC85}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0B2E1C9E-092D-4E5F-BE9F-5506E689FC85}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0B2E1C9E-092D-4E5F-BE9F-5506E689FC85}.Release|Any CPU.Build.0 = Release|Any CPU - {4A9D43A2-D08B-40E8-9C74-F2B95BF81AED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4A9D43A2-D08B-40E8-9C74-F2B95BF81AED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4A9D43A2-D08B-40E8-9C74-F2B95BF81AED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4A9D43A2-D08B-40E8-9C74-F2B95BF81AED}.Release|Any CPU.Build.0 = Release|Any CPU - {F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E}.Release|Any CPU.Build.0 = Release|Any CPU - {77090F97-BD80-4469-842F-F5769CF849E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77090F97-BD80-4469-842F-F5769CF849E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {77090F97-BD80-4469-842F-F5769CF849E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77090F97-BD80-4469-842F-F5769CF849E9}.Release|Any CPU.Build.0 = Release|Any CPU - {DF2CCF03-95D5-4BE4-8B32-742818C56F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF2CCF03-95D5-4BE4-8B32-742818C56F15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF2CCF03-95D5-4BE4-8B32-742818C56F15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF2CCF03-95D5-4BE4-8B32-742818C56F15}.Release|Any CPU.Build.0 = Release|Any CPU - {54FB9929-7D9C-40FC-A0D0-94ACBA37D20E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {54FB9929-7D9C-40FC-A0D0-94ACBA37D20E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {54FB9929-7D9C-40FC-A0D0-94ACBA37D20E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {54FB9929-7D9C-40FC-A0D0-94ACBA37D20E}.Release|Any CPU.Build.0 = Release|Any CPU - {F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB}.Release|Any CPU.Build.0 = Release|Any CPU - {B69F04FF-8505-49F6-9B60-BB800846C87C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B69F04FF-8505-49F6-9B60-BB800846C87C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B69F04FF-8505-49F6-9B60-BB800846C87C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B69F04FF-8505-49F6-9B60-BB800846C87C}.Release|Any CPU.Build.0 = Release|Any CPU - {09CA7186-DBA7-4428-A1ED-31292AC02050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {09CA7186-DBA7-4428-A1ED-31292AC02050}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09CA7186-DBA7-4428-A1ED-31292AC02050}.Release|Any CPU.ActiveCfg = Release|Any CPU - {09CA7186-DBA7-4428-A1ED-31292AC02050}.Release|Any CPU.Build.0 = Release|Any CPU - {FDB3A3E9-C072-438D-8B8D-2AA957C1167F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FDB3A3E9-C072-438D-8B8D-2AA957C1167F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FDB3A3E9-C072-438D-8B8D-2AA957C1167F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FDB3A3E9-C072-438D-8B8D-2AA957C1167F}.Release|Any CPU.Build.0 = Release|Any CPU - {8CE7C515-CD78-42D4-A9D7-39D217A3D046}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8CE7C515-CD78-42D4-A9D7-39D217A3D046}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8CE7C515-CD78-42D4-A9D7-39D217A3D046}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8CE7C515-CD78-42D4-A9D7-39D217A3D046}.Release|Any CPU.Build.0 = Release|Any CPU - {CAEB3435-A332-4FFA-BE5F-4E386FA8B19B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CAEB3435-A332-4FFA-BE5F-4E386FA8B19B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CAEB3435-A332-4FFA-BE5F-4E386FA8B19B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CAEB3435-A332-4FFA-BE5F-4E386FA8B19B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {31E33CE2-71D3-43FF-9A30-2DCC82C607AE} = {4786387C-C1C5-46F8-806F-EBC54DB0A4FA} - {9262FE7A-76B2-424F-8C34-AFA1D95D7E5A} = {A9CB1547-1C2C-4A23-82EC-C834C1626E0A} - {A0D1F8A4-3494-4E26-9E2D-DB874B93DBCE} = {A9CB1547-1C2C-4A23-82EC-C834C1626E0A} - {0B2E1C9E-092D-4E5F-BE9F-5506E689FC85} = {A9CB1547-1C2C-4A23-82EC-C834C1626E0A} - {4A9D43A2-D08B-40E8-9C74-F2B95BF81AED} = {A9CB1547-1C2C-4A23-82EC-C834C1626E0A} - {F6EE5BCD-69C7-4C8A-8B45-251AFE2BB01E} = {2BF87FAA-69E7-486E-9123-1F407A2BB633} - {77090F97-BD80-4469-842F-F5769CF849E9} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {DF2CCF03-95D5-4BE4-8B32-742818C56F15} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {54FB9929-7D9C-40FC-A0D0-94ACBA37D20E} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {F2A6182F-BCB9-4C80-947C-0A2ED1B6BFDB} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {B69F04FF-8505-49F6-9B60-BB800846C87C} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {09CA7186-DBA7-4428-A1ED-31292AC02050} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {FDB3A3E9-C072-438D-8B8D-2AA957C1167F} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {8CE7C515-CD78-42D4-A9D7-39D217A3D046} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - {CAEB3435-A332-4FFA-BE5F-4E386FA8B19B} = {4B0AD527-99B3-49A9-8A45-FD8671F8BE4D} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {62C0F185-E2C2-46A2-B4B2-5E703E25849E} - EndGlobalSection -EndGlobal diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj b/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj deleted file mode 100644 index 1b43640a4..000000000 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - net8.0 - PackageName.CompanyName.ProjectName - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd b/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd deleted file mode 100644 index 11da52550..000000000 --- a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. - - - - - A comma-separated list of error codes that can be safely ignored in assembly verification. - - - - - 'false' to turn off automatic generation of the XML Schema file. - - - - - \ No newline at end of file diff --git a/aspnet-core/templates/PackageName.CompanyName.ProjectName.csproj b/aspnet-core/templates/micro/PackageName.CompanyName.ProjectName.csproj similarity index 100% rename from aspnet-core/templates/PackageName.CompanyName.ProjectName.csproj rename to aspnet-core/templates/micro/PackageName.CompanyName.ProjectName.csproj diff --git a/aspnet-core/templates/content/.template.config/template.json b/aspnet-core/templates/micro/content/.template.config/template.json similarity index 91% rename from aspnet-core/templates/content/.template.config/template.json rename to aspnet-core/templates/micro/content/.template.config/template.json index 132f70183..d57640554 100644 --- a/aspnet-core/templates/content/.template.config/template.json +++ b/aspnet-core/templates/micro/content/.template.config/template.json @@ -1,109 +1,116 @@ -{ - "$schema": "http://json.schemastore.org/template", - "author": "colin.in@foxmail.com", - "classifications": ["micro", "webapi", "cloud"], - "name": "LINGYUN.Abp.MicroService", - "identity": "LINGYUN.Abp.MicroService", - "description": "Abp framework micro-service template", - "groupIdentity": "LINGYUN.Abp.Application", - "shortName": "lam", - "tags": { - "language": "C#", - "type": "project" - }, - "sources": [ - { - "modifiers": [ - { - "exclude": [ "**/[Bb]in/**", "**/[Oo]bj/**", "**/[Ll]ocalNuget/**" , ".template.config/**/*", ".vs/**/*"] - } - ] - } - ], - "sourceName": "ProjectName", - "preferNameDirectory": true, - "symbols": { - "AuthenticationScheme": { - "type": "parameter", - "description": "Authentication Scheme", - "datatype": "choice", - "defaultValue": "IdentityServer4", - "isRequired": false, - "choices": [ - { - "choice": "IdentityServer4", - "description": "IdentityServer4" - }, - { - "choice": "OpenIddict", - "description": "OpenIddict" - } - ] - }, - "DatabaseManagement": { - "type": "parameter", - "description": "Database Management", - "dataType": "choice", - "defaultValue": "MySQL", - "isRequired": false, - "choices": [ - { - "choice": "SqlServer", - "description": "Sql Server" - }, - { - "choice": "MySQL", - "description": "My SQL" - }, - { - "choice": "Sqlite", - "description": "Sqlite" - }, - { - "choice": "Oracle", - "description": "Oracle" - }, - { - "choice": "OracleDevart", - "description": "Oracle Devart Driver" - }, - { - "choice": "PostgreSql", - "description": "Postgre Sql" - } - ] - }, - "SqlServer": { - "type": "computed", - "value": "(DatabaseManagement == \"SqlServer\")" - }, - "MySQL": { - "type": "computed", - "value": "(DatabaseManagement == \"MySQL\")" - }, - "Sqlite": { - "type": "computed", - "value": "(DatabaseManagement == \"Sqlite\")" - }, - "Oracle": { - "type": "computed", - "value": "(DatabaseManagement == \"Oracle\")" - }, - "OracleDevart": { - "type": "computed", - "value": "(DatabaseManagement == \"Oracle.Devart\")" - }, - "PostgreSql": { - "type": "computed", - "value": "(DatabaseManagement == \"PostgreSql\")" - }, - "IdentityServer4": { - "type": "computed", - "value": "(AuthenticationScheme == \"IdentityServer4\")" - }, - "OpenIddict": { - "type": "computed", - "value": "(AuthenticationScheme == \"OpenIddict\")" - } - } -} +{ + "$schema": "http://json.schemastore.org/template", + "author": "colin.in@foxmail.com", + "classifications": ["micro", "webapi", "cloud"], + "name": "LINGYUN.Abp.MicroService", + "identity": "LINGYUN.Abp.MicroService", + "description": "Abp framework micro-service template", + "groupIdentity": "LINGYUN.Abp.Application", + "shortName": "lam", + "tags": { + "language": "C#", + "type": "project" + }, + "sources": [ + { + "modifiers": [ + { + "exclude": [ + "**/[Bb]in/**", + "**/[Oo]bj/**", + "**/[Ll]ocalNuget/**", + ".template.config/**/*", + ".vs/**/*", + "**/host/PackageName.CompanyName.ProjectName.AIO.Host/**" + ] + } + ] + } + ], + "sourceName": "ProjectName", + "preferNameDirectory": true, + "symbols": { + "AuthenticationScheme": { + "type": "parameter", + "description": "Authentication Scheme", + "datatype": "choice", + "defaultValue": "IdentityServer4", + "isRequired": false, + "choices": [ + { + "choice": "IdentityServer4", + "description": "IdentityServer4" + }, + { + "choice": "OpenIddict", + "description": "OpenIddict" + } + ] + }, + "DatabaseManagement": { + "type": "parameter", + "description": "Database Management", + "dataType": "choice", + "defaultValue": "MySQL", + "isRequired": false, + "choices": [ + { + "choice": "SqlServer", + "description": "Sql Server" + }, + { + "choice": "MySQL", + "description": "My SQL" + }, + { + "choice": "Sqlite", + "description": "Sqlite" + }, + { + "choice": "Oracle", + "description": "Oracle" + }, + { + "choice": "OracleDevart", + "description": "Oracle Devart Driver" + }, + { + "choice": "PostgreSql", + "description": "Postgre Sql" + } + ] + }, + "SqlServer": { + "type": "computed", + "value": "(DatabaseManagement == \"SqlServer\")" + }, + "MySQL": { + "type": "computed", + "value": "(DatabaseManagement == \"MySQL\")" + }, + "Sqlite": { + "type": "computed", + "value": "(DatabaseManagement == \"Sqlite\")" + }, + "Oracle": { + "type": "computed", + "value": "(DatabaseManagement == \"Oracle\")" + }, + "OracleDevart": { + "type": "computed", + "value": "(DatabaseManagement == \"Oracle.Devart\")" + }, + "PostgreSql": { + "type": "computed", + "value": "(DatabaseManagement == \"PostgreSql\")" + }, + "IdentityServer4": { + "type": "computed", + "value": "(AuthenticationScheme == \"IdentityServer4\")" + }, + "OpenIddict": { + "type": "computed", + "value": "(AuthenticationScheme == \"OpenIddict\")" + } + } +} diff --git a/aspnet-core/templates/micro/content/.template.config/template.zh-Hans.json b/aspnet-core/templates/micro/content/.template.config/template.zh-Hans.json new file mode 100644 index 000000000..f0339e4e4 --- /dev/null +++ b/aspnet-core/templates/micro/content/.template.config/template.zh-Hans.json @@ -0,0 +1,5 @@ +{ + "description": "适用于abp框架的微服务模板项目", + "symbols/AuthenticationScheme/description": "认证服务体系, 可选项为: IdentityServer4、OpenIddict, 默认使用IdentityServer4.", + "symbols/DatabaseManagement/description": "数据库管理提供者, 可选项为: SqlServer、MySQL、Sqlite、Oracle、OracleDevart、PostgreSql, 默认使用MySQL." +} diff --git a/aspnet-core/templates/micro/content/Directory.Build.props b/aspnet-core/templates/micro/content/Directory.Build.props new file mode 100644 index 000000000..6f2501679 --- /dev/null +++ b/aspnet-core/templates/micro/content/Directory.Build.props @@ -0,0 +1,13 @@ + + + true + + + + + all + runtime; build; native; contentfiles; analyzers + + + + diff --git a/aspnet-core/templates/content/Directory.Packages.props b/aspnet-core/templates/micro/content/Directory.Packages.props similarity index 59% rename from aspnet-core/templates/content/Directory.Packages.props rename to aspnet-core/templates/micro/content/Directory.Packages.props index 70ddeb357..90640add1 100644 --- a/aspnet-core/templates/content/Directory.Packages.props +++ b/aspnet-core/templates/micro/content/Directory.Packages.props @@ -2,8 +2,8 @@ 8.2.0 2.14.1 - 8.2.1 - 8.2.1 + 8.3.0 + 8.3.0 8.0.0 8.0.0 8.0.0 @@ -300,6 +300,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -320,5 +485,7 @@ + + -
\ No newline at end of file + diff --git a/aspnet-core/templates/micro/content/NuGet.Config b/aspnet-core/templates/micro/content/NuGet.Config new file mode 100644 index 000000000..ddde6944c --- /dev/null +++ b/aspnet-core/templates/micro/content/NuGet.Config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/README.md b/aspnet-core/templates/micro/content/README.md new file mode 100644 index 000000000..7b7520aef --- /dev/null +++ b/aspnet-core/templates/micro/content/README.md @@ -0,0 +1,129 @@ +# LINGYUN.Abp.Templates + +[English](README.md) | [中文](README.zh-CN.md) + +## Introduction + +LINGYUN.Abp.Templates provides two types of project templates based on ABP Framework: + +1. **Microservice Template**: A complete microservice architecture template with distributed services. +2. **All-in-One Template**: A single-application template that combines all services into one project. + +## Features + +### Common Features + +- Integrated authentication (IdentityServer4/OpenIddict) +- Database integration (multiple databases supported) +- Unified configuration management +- Distributed event bus support +- Background job processing + +### Microservice Template Features + +- Complete microservice project structure +- Service discovery and registration +- Distributed deployment support + +### All-in-One Template Features + +- Simplified deployment +- Easier maintenance +- Lower resource requirements + +## How to Use + +### Install Templates + +```bash +# Install Microservice Template +dotnet new install LINGYUN.Abp.MicroService.Templates + +# Install All-in-One Template +dotnet new install LINGYUN.Abp.AllInOne.Templates +``` + +### Create New Project + +#### For Microservice Project + +```bash +# Short name: lam (LINGYUN Abp Microservice) +dotnet new lam -n YourCompanyName.YourProjectName -pk YourPackageName -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=YourDatabase;User Id=your_user;Password=your_password;SslMode=None" --no-random-port +``` + +#### For All-in-One Project + +```bash +# Short name: laa (LINGYUN Abp AllInOne) +dotnet new laa -n YourCompanyName.YourProjectName -pk YourPackageName -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=YourDatabase;User Id=your_user;Password=your_password;SslMode=None" --no-random-port +``` + +## How to Run + +After creating your project, you can run it using the following command: + +### For Microservice Project + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.HttpApi.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +### For All-in-One Project + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## How to Package and Publish + +1. Clone the Project + +```bash +git clone +cd /aspnet-core/templates/content +``` + +2. Modify Version + Edit the project files to update versions: + - For Microservice: `../PackageName.CompanyName.ProjectName.csproj` + - For All-in-One: `../PackageName.CompanyName.ProjectName.AIO.csproj` + +```xml +8.3.0 +``` + +3. Execute Packaging Script + +```powershell +# Windows PowerShell +.\pack.ps1 + +# PowerShell Core (Windows/Linux/macOS) +pwsh pack.ps1 +``` + +The script will prompt you to choose which template to package: + +1. Microservice Template +2. All-in-One Template +3. Both Templates + +## Supported Databases + +- SqlServer +- MySQL +- PostgreSQL +- Oracle +- SQLite + +## Notes + +- Ensure .NET SDK 8.0 or higher is installed +- Choose the appropriate template based on your needs: + - Microservice Template: For large-scale distributed applications + - All-in-One Template: For smaller applications or simpler deployment requirements +- Pay attention to NuGet publish address and key when packaging +- Complete testing is recommended before publishing diff --git a/aspnet-core/templates/micro/content/README.zh-CN.md b/aspnet-core/templates/micro/content/README.zh-CN.md new file mode 100644 index 000000000..b93d76220 --- /dev/null +++ b/aspnet-core/templates/micro/content/README.zh-CN.md @@ -0,0 +1,129 @@ +# LINGYUN.Abp.Templates + +[English](README.md) | [中文](README.zh-CN.md) + +## 简介 + +LINGYUN.Abp.Templates 基于 ABP Framework 提供两种项目模板: + +1. **微服务模板**:完整的分布式微服务架构模板 +2. **单体应用模板**:将所有服务集成到一个项目中的单体应用模板 + +## 特性 + +### 共同特性 + +- 集成身份认证(支持 IdentityServer4/OpenIddict) +- 数据库集成(支持多种数据库) +- 统一配置管理 +- 分布式事件总线支持 +- 后台作业处理 + +### 微服务模板特性 + +- 完整的微服务项目结构 +- 服务发现与注册 +- 支持分布式部署 + +### 单体应用模板特性 + +- 简化的部署流程 +- 更容易的维护 +- 更低的资源需求 + +## 使用方法 + +### 安装模板 + +```bash +# 安装微服务模板 +dotnet new install LINGYUN.Abp.MicroService.Templates + +# 安装单体应用模板 +dotnet new install LINGYUN.Abp.AllInOne.Templates +``` + +### 创建新项目 + +#### 创建微服务项目 + +```bash +# 简写名称:lam (LINGYUN Abp Microservice) +dotnet new lam -n YourCompanyName.YourProjectName -pk YourPackageName -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=YourDatabase;User Id=your_user;Password=your_password;SslMode=None" --no-random-port +``` + +#### 创建单体应用项目 + +```bash +# 简写名称:laa (LINGYUN Abp AllInOne) +labp create MyCompanyName.MyProjectName -pk MyPackageName -t laa -o /Users/feijie/Projects/Tests --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +## 运行项目 + +创建项目后,可以使用以下命令运行: + +### 运行微服务项目 + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.HttpApi.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +### 运行单体应用项目 + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## 打包与发布 + +1. 克隆项目 + +```bash +git clone +cd /aspnet-core/templates/content +``` + +2. 修改版本号 + 编辑项目文件更新版本号: + - 微服务模板:`../PackageName.CompanyName.ProjectName.csproj` + - 单体应用模板:`../PackageName.CompanyName.ProjectName.AIO.csproj` + +```xml +8.3.0 +``` + +3. 执行打包脚本 + +```powershell +# Windows PowerShell +.\pack.ps1 + +# PowerShell Core (Windows/Linux/macOS) +pwsh pack.ps1 +``` + +脚本会提示您选择要打包的模板: + +1. 微服务模板 +2. 单体应用模板 +3. 两种模板都打包 + +## 支持的数据库 + +- SqlServer +- MySQL +- PostgreSQL +- Oracle +- SQLite + +## 注意事项 + +- 确保已安装 .NET SDK 8.0 或更高版本 +- 根据需求选择合适的模板: + - 微服务模板:适用于大规模分布式应用 + - 单体应用模板:适用于小型应用或简单部署需求 +- 打包时注意 NuGet 发布地址和密钥 +- 发布前建议进行完整测试 diff --git a/aspnet-core/templates/micro/content/common.props b/aspnet-core/templates/micro/content/common.props new file mode 100644 index 000000000..d7d7622cf --- /dev/null +++ b/aspnet-core/templates/micro/content/common.props @@ -0,0 +1,38 @@ + + + latest + 8.2.1 + colin + $(NoWarn);CS1591;CS0436;CS8618;NU1803 + https://github.com/colinin/abp-next-admin + $(SolutionDir)LocalNuget + 8.2.1 + MIT + git + https://github.com/colinin/abp-next-admin + true + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)LocalNuget + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/configureawait.props b/aspnet-core/templates/micro/content/configureawait.props new file mode 100644 index 000000000..3caa88c04 --- /dev/null +++ b/aspnet-core/templates/micro/content/configureawait.props @@ -0,0 +1,9 @@ + + + + + All + runtime; build; native; contentfiles; analyzers + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs index dd8a07ea4..d279fb30f 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/DbMigratorHostedService.cs @@ -1,53 +1,53 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using PackageName.CompanyName.ProjectName.EntityFrameworkCore; -using Serilog; -using Volo.Abp; -using Volo.Abp.Data; - -namespace PackageName.CompanyName.ProjectName.DbMigrator; - -public class DbMigratorHostedService : IHostedService -{ - private readonly IHostApplicationLifetime _hostApplicationLifetime; - private readonly IConfiguration _configuration; - - public DbMigratorHostedService( - IHostApplicationLifetime hostApplicationLifetime, - IConfiguration configuration) - { - _hostApplicationLifetime = hostApplicationLifetime; - _configuration = configuration; - } - - public async Task StartAsync(CancellationToken cancellationToken) - { - using var application = await AbpApplicationFactory - .CreateAsync(options => - { - options.Configuration.UserSecretsId = Environment.GetEnvironmentVariable("APPLICATION_USER_SECRETS_ID"); - options.Configuration.UserSecretsAssembly = typeof(DbMigratorHostedService).Assembly; - options.Services.ReplaceConfiguration(_configuration); - options.UseAutofac(); - options.Services.AddLogging(c => c.AddSerilog()); - options.AddDataMigrationEnvironment(); - }); - await application.InitializeAsync(); - - await application - .ServiceProvider - .GetRequiredService() - .CheckAndApplyDatabaseMigrationsAsync(); - - await application.ShutdownAsync(); - - _hostApplicationLifetime.StopApplication(); - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } -} - +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Serilog; +using Volo.Abp; +using Volo.Abp.Data; + +namespace PackageName.CompanyName.ProjectName.DbMigrator; + +public class DbMigratorHostedService : IHostedService +{ + private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IConfiguration _configuration; + + public DbMigratorHostedService( + IHostApplicationLifetime hostApplicationLifetime, + IConfiguration configuration) + { + _hostApplicationLifetime = hostApplicationLifetime; + _configuration = configuration; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + using var application = await AbpApplicationFactory + .CreateAsync(options => + { + options.Configuration.UserSecretsId = Environment.GetEnvironmentVariable("APPLICATION_USER_SECRETS_ID"); + options.Configuration.UserSecretsAssembly = typeof(DbMigratorHostedService).Assembly; + options.Services.ReplaceConfiguration(_configuration); + options.UseAutofac(); + options.Services.AddLogging(c => c.AddSerilog()); + options.AddDataMigrationEnvironment(); + }); + await application.InitializeAsync(); + + await application + .ServiceProvider + .GetRequiredService() + .CheckAndApplyDatabaseMigrationsAsync(); + + await application.ShutdownAsync(); + + _hostApplicationLifetime.StopApplication(); + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} + diff --git a/aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xml similarity index 100% rename from aspnet-core/templates/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xml diff --git a/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj index b125867ab..4d69cfc5b 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageName.CompanyName.ProjectName.DbMigrator.csproj @@ -1,42 +1,42 @@ - - - - - - - Exe - net8.0 - enable - enable - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - + + + + + + + Exe + net8.0 + enable + enable + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs index 18b109f71..fd08046e4 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/PackageNameCompanyNameProjectNameDbMigratorModule.cs @@ -1,13 +1,13 @@ -using PackageName.CompanyName.ProjectName.EntityFrameworkCore; -using Volo.Abp.Autofac; -using Volo.Abp.Modularity; - -namespace PackageName.CompanyName.ProjectName.DbMigrator; - -[DependsOn( - typeof(AbpAutofacModule), - typeof(ProjectNameEntityFrameworkCoreModule) - )] -public class PackageNameCompanyNameProjectNameDbMigratorModule : AbpModule -{ -} +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName.DbMigrator; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(ProjectNameEntityFrameworkCoreModule) + )] +public class PackageNameCompanyNameProjectNameDbMigratorModule : AbpModule +{ +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs index 087267054..e4739face 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/Program.cs @@ -1,40 +1,40 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Serilog; -using Serilog.Events; - -namespace PackageName.CompanyName.ProjectName.DbMigrator; - -public class Program -{ - public async static Task Main(string[] args) - { - Log.Logger = new LoggerConfiguration() - .MinimumLevel.Information() - .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) - .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) -#if DEBUG - .MinimumLevel.Override("PackageName.CompanyName.ProjectName", LogEventLevel.Debug) -#else - .MinimumLevel.Override("PackageName.CompanyName.ProjectName", LogEventLevel.Information) -#endif - .Enrich.FromLogContext() - .WriteTo.File("Logs/logs.txt") - .WriteTo.Console() - .CreateLogger(); - - await CreateHostBuilder(args).RunConsoleAsync(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) - { - return Host.CreateDefaultBuilder(args) - .AddAppSettingsSecretsJson() - .ConfigureLogging((context, logging) => logging.ClearProviders()) - .ConfigureServices((hostContext, services) => - { - services.AddHostedService(); - }); - } -} +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Serilog; +using Serilog.Events; + +namespace PackageName.CompanyName.ProjectName.DbMigrator; + +public class Program +{ + public async static Task Main(string[] args) + { + Log.Logger = new LoggerConfiguration() + .MinimumLevel.Information() + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Volo.Abp", LogEventLevel.Warning) +#if DEBUG + .MinimumLevel.Override("PackageName.CompanyName.ProjectName", LogEventLevel.Debug) +#else + .MinimumLevel.Override("PackageName.CompanyName.ProjectName", LogEventLevel.Information) +#endif + .Enrich.FromLogContext() + .WriteTo.File("Logs/logs.txt") + .WriteTo.Console() + .CreateLogger(); + + await CreateHostBuilder(args).RunConsoleAsync(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) + .AddAppSettingsSecretsJson() + .ConfigureLogging((context, logging) => logging.ClearProviders()) + .ConfigureServices((hostContext, services) => + { + services.AddHostedService(); + }); + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json index 17a01bb6a..19ddebe12 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.Development.json @@ -1,147 +1,147 @@ -{ - "AgileConfig": { - "IsEnabled": false, - "env": "DEV", - "appId": "PackageName.CompanyName.ProjectName", - "secret": "1q2w3E*", - "nodes": "http://127.0.0.1:15000", - "name": "PackageName.CompanyName.ProjectName", - "tag": "PackageName.CompanyName.ProjectName" - }, - "Auditing": { - "AllEntitiesSelector": true - }, - "DistributedCache": { - "HideErrors": true, - "KeyPrefix": "LINGYUN.Abp.Application", - "GlobalCacheEntryOptions": { - "SlidingExpiration": "30:00:00", - "AbsoluteExpirationRelativeToNow": "60:00:00" - } - }, - "ConnectionStrings": { - "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "ProjectName": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpSaas": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpFeatureManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpPermissionManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpSettingManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpLocalizationManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpTextTemplating": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "DistributedLock": { - "IsEnabled": true, - "Redis": { - "Configuration": "127.0.0.1,defaultDatabase=15" - } - }, - "OpenTelemetry": { - "IsEnabled": true, - "ZipKin": { - "Endpoint": "http://127.0.0.1:9411/api/v2/spans" - } - }, - "RemoteServices": {}, - "IdentityClients": { - "InternalServiceClient": { - "Authority": "http://127.0.0.1:44385", - "RequireHttps": false, - "GrantType": "client_credentials", - "Scope": "lingyun-abp-application", - "ClientId": "InternalServiceClient", - "ClientSecret": "1q2w3E*" - } - }, - "CAP": { - "EventBus": { - "DefaultGroupName": "ProjectName", - "GroupNamePrefix": "Dev", - "Version": "v1", - "FailedRetryInterval": 300, - "FailedRetryCount": 10 - }, - "MySql": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "SqlServer": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "Sqlite": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Data Source=./cap.db" - }, - "Oracle": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Data Source=ProjectName;Integrated Security=yes;" - }, - "PostgreSql": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Host=localhost;Port=5432;Database=ProjectName;User ID=root;Password=123456;" - }, - "RabbitMQ": { - "HostName": "127.0.0.1", - "Port": 5672, - "UserName": "admin", - "Password": "123456", - "ExchangeName": "LINGYUN.Abp.Application", - "VirtualHost": "/" - } - }, - "Redis": { - "Configuration": "127.0.0.1,defaultDatabase=10", - "InstanceName": "LINGYUN.Abp.Application" - }, - "AuthServer": { - "Authority": "http://127.0.0.1:44385/", - "Audience": "lingyun-abp-application", - "MapInboundClaims": false, - "RequireHttpsMetadata": false, - "SwaggerClientId": "InternalServiceClient", - "SwaggerClientSecret": "1q2w3E*" - }, - "Logging": { - "Serilog": { - "Elasticsearch": { - "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" - } - } - }, - "AuditLogging": { - "Elasticsearch": { - "IndexPrefix": "abp.dev.auditing" - } - }, - "Elasticsearch": { - "NodeUris": "http://127.0.0.1:9200" - }, - "Serilog": { - "MinimumLevel": { - "Default": "Debug", - "Override": { - "System": "Warning", - "Microsoft": "Warning", - "DotNetCore": "Debug" - } - }, - "WriteTo": [ - { - "Name": "Console", - "Args": { - "restrictedToMinimumLevel": "Debug", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "Elasticsearch", - "Args": { - "nodeUris": "http://127.0.0.1:9200", - "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", - "autoRegisterTemplate": true, - "autoRegisterTemplateVersion": "ESv7" - } - } - ] - } -} +{ + "AgileConfig": { + "IsEnabled": false, + "env": "DEV", + "appId": "PackageName.CompanyName.ProjectName", + "secret": "1q2w3E*", + "nodes": "http://127.0.0.1:15000", + "name": "PackageName.CompanyName.ProjectName", + "tag": "PackageName.CompanyName.ProjectName" + }, + "Auditing": { + "AllEntitiesSelector": true + }, + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "ProjectName": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpSaas": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpFeatureManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpPermissionManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpSettingManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpLocalizationManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpTextTemplating": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=15" + } + }, + "OpenTelemetry": { + "IsEnabled": true, + "ZipKin": { + "Endpoint": "http://127.0.0.1:9411/api/v2/spans" + } + }, + "RemoteServices": {}, + "IdentityClients": { + "InternalServiceClient": { + "Authority": "http://127.0.0.1:44385", + "RequireHttps": false, + "GrantType": "client_credentials", + "Scope": "lingyun-abp-application", + "ClientId": "InternalServiceClient", + "ClientSecret": "1q2w3E*" + } + }, + "CAP": { + "EventBus": { + "DefaultGroupName": "ProjectName", + "GroupNamePrefix": "Dev", + "Version": "v1", + "FailedRetryInterval": 300, + "FailedRetryCount": 10 + }, + "MySql": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "SqlServer": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "Sqlite": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Data Source=./cap.db" + }, + "Oracle": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Data Source=ProjectName;Integrated Security=yes;" + }, + "PostgreSql": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Host=localhost;Port=5432;Database=ProjectName;User ID=root;Password=123456;" + }, + "RabbitMQ": { + "HostName": "127.0.0.1", + "Port": 5672, + "UserName": "admin", + "Password": "123456", + "ExchangeName": "LINGYUN.Abp.Application", + "VirtualHost": "/" + } + }, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=10", + "InstanceName": "LINGYUN.Abp.Application" + }, + "AuthServer": { + "Authority": "http://127.0.0.1:44385/", + "Audience": "lingyun-abp-application", + "MapInboundClaims": false, + "RequireHttpsMetadata": false, + "SwaggerClientId": "InternalServiceClient", + "SwaggerClientSecret": "1q2w3E*" + }, + "Logging": { + "Serilog": { + "Elasticsearch": { + "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" + } + } + }, + "AuditLogging": { + "Elasticsearch": { + "IndexPrefix": "abp.dev.auditing" + } + }, + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Debug", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Debug" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "Elasticsearch", + "Args": { + "nodeUris": "http://127.0.0.1:9200", + "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", + "autoRegisterTemplate": true, + "autoRegisterTemplateVersion": "ESv7" + } + } + ] + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json index d3d63c269..2f919b2c2 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.DbMigrator/appsettings.json @@ -1,80 +1,80 @@ -{ - "StringEncryption": { - "DefaultPassPhrase": "s46c5q55nxpeS8Ra", - "InitVectorBytes": "s83ng0abvd02js84", - "DefaultSalt": "sf&5)s3#" - }, - "AllowedHosts": "*", - "Serilog": { - "MinimumLevel": { - "Default": "Debug", - "Override": { - "Microsoft.EntityFrameworkCore": "Debug", - "System": "Information", - "Microsoft": "Information" - } - }, - "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], - "WriteTo": [ - { - "Name": "Console", - "Args": { - "initialMinimumLevel": "Verbose", - "standardErrorFromLevel": "Verbose", - "restrictedToMinimumLevel": "Verbose", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Debug-.log", - "restrictedToMinimumLevel": "Debug", - "rollingInterval": "Day", - "fileSizeLimitBytes": 5242880, - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Info-.log", - "restrictedToMinimumLevel": "Information", - "rollingInterval": "Day", - "fileSizeLimitBytes": 5242880, - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Warn-.log", - "restrictedToMinimumLevel": "Warning", - "rollingInterval": "Day", - "fileSizeLimitBytes": 5242880, - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Error-.log", - "restrictedToMinimumLevel": "Error", - "rollingInterval": "Day", - "fileSizeLimitBytes": 5242880, - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Fatal-.log", - "restrictedToMinimumLevel": "Fatal", - "rollingInterval": "Day", - "fileSizeLimitBytes": 5242880, - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - } - ] - } -} +{ + "StringEncryption": { + "DefaultPassPhrase": "s46c5q55nxpeS8Ra", + "InitVectorBytes": "s83ng0abvd02js84", + "DefaultSalt": "sf&5)s3#" + }, + "AllowedHosts": "*", + "Serilog": { + "MinimumLevel": { + "Default": "Debug", + "Override": { + "Microsoft.EntityFrameworkCore": "Debug", + "System": "Information", + "Microsoft": "Information" + } + }, + "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], + "WriteTo": [ + { + "Name": "Console", + "Args": { + "initialMinimumLevel": "Verbose", + "standardErrorFromLevel": "Verbose", + "restrictedToMinimumLevel": "Verbose", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Debug-.log", + "restrictedToMinimumLevel": "Debug", + "rollingInterval": "Day", + "fileSizeLimitBytes": 5242880, + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "restrictedToMinimumLevel": "Information", + "rollingInterval": "Day", + "fileSizeLimitBytes": 5242880, + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Warn-.log", + "restrictedToMinimumLevel": "Warning", + "rollingInterval": "Day", + "fileSizeLimitBytes": 5242880, + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Error-.log", + "restrictedToMinimumLevel": "Error", + "rollingInterval": "Day", + "fileSizeLimitBytes": 5242880, + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Fatal-.log", + "restrictedToMinimumLevel": "Fatal", + "rollingInterval": "Day", + "fileSizeLimitBytes": 5242880, + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + } + ] + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs similarity index 95% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs index f38f64d84..5e1bb362a 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Controllers/HomeController.cs @@ -1,12 +1,12 @@ -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; - -namespace PackageName.CompanyName.ProjectName.Controllers; - -public class HomeController : AbpController -{ - public IActionResult Index() - { - return Redirect("/swagger/index.html"); - } -} +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName.Controllers; + +public class HomeController : AbpController +{ + public IActionResult Index() + { + return Redirect("/swagger/index.html"); + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile index b4aa6925f..012ce3615 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Dockerfile @@ -1,57 +1,57 @@ -FROM mcr.microsoft.com/dotnet/aspnet:8.0 -LABEL maintainer="colin.in@foxmail.com" -WORKDIR /app - -COPY . /app - -## 设置服务器时区. -## 建议在外部(如docker-compose.yml)中定义 -## Set server time zone. -## Suggest defining it externally (such as Docker Compose. yml) -#ENV TZ=Asia/Shanghai -#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone - - -## 解决连接SqlServer TLS版本过高问题. -## 如果数据提供者是SqlServer, 且兼容性版本在120及以下,需要手动取消注释. -## The version of connection SqlServer TLS is too high. -## If the data provider is SqlServer and the compatibility version is 120 and below, manual annotation needs to be cancelled. - -#RUN sed -i 's/\[openssl_init\]/# \[openssl_init\]/g' /etc/ssl/openssl.cnf -#RUN sed -i '$a\[openssl_init]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\providers = provider_sect' /etc/ssl/openssl.cnf -#RUN sed -i '$a\ssl_conf = ssl_sect' /etc/ssl/openssl.cnf - # -#RUN sed -i '$a\[provider_sect]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\default = default_sect' /etc/ssl/openssl.cnf -#RUN sed -i '$a\legacy = legacy_sect' /etc/ssl/openssl.cnf - # -#RUN sed -i '$a\[default_sect]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\activate = 1' /etc/ssl/openssl.cnf - # -#RUN sed -i '$a\[legacy_sect]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\activate = 1' /etc/ssl/openssl.cnf - # -#RUN sed -i '$a\[ssl_sect]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\system_default = system_default_sect' /etc/ssl/openssl.cnf - # -#RUN sed -i '$a\[system_default_sect]' /etc/ssl/openssl.cnf -#RUN sed -i '$a\CipherString = DEFAULT:@SECLEVEL=0' /etc/ssl/openssl.cnf - -## 阿里源 -#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list.d/debian.sources -#RUN apt-get clean -#RUN apt-get update - -## .NET 8.0 默认使用8080端口,变更为80端口需要环境变量ASPNETCORE_HTTP_PORTS=80 -## .NET 8.0 defaults to port 8080, changing to port 80 requires the environment variable ASPNETCORE.HTTP-PORTS=80 -# EXPOSE 8080/tcp -EXPOSE 80/tcp - -VOLUME [ "./app/Logs" ] -VOLUME [ "./app/Modules" ] - -RUN apt update -RUN apt install wget -y - -ENTRYPOINT ["dotnet", "PackageName.CompanyName.ProjectName.HttpApi.Host.dll"] +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +LABEL maintainer="colin.in@foxmail.com" +WORKDIR /app + +COPY . /app + +## 设置服务器时区. +## 建议在外部(如docker-compose.yml)中定义 +## Set server time zone. +## Suggest defining it externally (such as Docker Compose. yml) +#ENV TZ=Asia/Shanghai +#RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone + + +## 解决连接SqlServer TLS版本过高问题. +## 如果数据提供者是SqlServer, 且兼容性版本在120及以下,需要手动取消注释. +## The version of connection SqlServer TLS is too high. +## If the data provider is SqlServer and the compatibility version is 120 and below, manual annotation needs to be cancelled. + +#RUN sed -i 's/\[openssl_init\]/# \[openssl_init\]/g' /etc/ssl/openssl.cnf +#RUN sed -i '$a\[openssl_init]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\providers = provider_sect' /etc/ssl/openssl.cnf +#RUN sed -i '$a\ssl_conf = ssl_sect' /etc/ssl/openssl.cnf + # +#RUN sed -i '$a\[provider_sect]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\default = default_sect' /etc/ssl/openssl.cnf +#RUN sed -i '$a\legacy = legacy_sect' /etc/ssl/openssl.cnf + # +#RUN sed -i '$a\[default_sect]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\activate = 1' /etc/ssl/openssl.cnf + # +#RUN sed -i '$a\[legacy_sect]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\activate = 1' /etc/ssl/openssl.cnf + # +#RUN sed -i '$a\[ssl_sect]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\system_default = system_default_sect' /etc/ssl/openssl.cnf + # +#RUN sed -i '$a\[system_default_sect]' /etc/ssl/openssl.cnf +#RUN sed -i '$a\CipherString = DEFAULT:@SECLEVEL=0' /etc/ssl/openssl.cnf + +## 阿里源 +#RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list.d/debian.sources +#RUN apt-get clean +#RUN apt-get update + +## .NET 8.0 默认使用8080端口,变更为80端口需要环境变量ASPNETCORE_HTTP_PORTS=80 +## .NET 8.0 defaults to port 8080, changing to port 80 requires the environment variable ASPNETCORE.HTTP-PORTS=80 +# EXPOSE 8080/tcp +EXPOSE 80/tcp + +VOLUME [ "./app/Logs" ] +VOLUME [ "./app/Modules" ] + +RUN apt update +RUN apt install wget -y + +ENTRYPOINT ["dotnet", "PackageName.CompanyName.ProjectName.HttpApi.Host.dll"] diff --git a/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj new file mode 100644 index 000000000..01dc53a9b --- /dev/null +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj @@ -0,0 +1,157 @@ +<<<<<<< HEAD:aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj + + + + net8.0 + PackageName.CompanyName.ProjectName + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +======= + + + + net8.0 + PackageName.CompanyName.ProjectName + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> aio/main:aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/PackageName.CompanyName.ProjectName.HttpApi.Host.csproj + diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs index 69122a822..092cdeb82 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Program.cs @@ -1,65 +1,65 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Serilog; -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.IO; -using Volo.Abp.Modularity.PlugIns; - -namespace PackageName.CompanyName.ProjectName; - -public class Program -{ - public async static Task Main(string[] args) - { - try - { - Console.Title = "Web.Host"; - Log.Information("Starting web host."); - - var builder = WebApplication.CreateBuilder(args); - builder.Host.AddAppSettingsSecretsJson() - .UseAutofac() - .ConfigureAppConfiguration((context, config) => - { - var configuration = config.Build(); - var agileConfigEnabled = configuration["AgileConfig:IsEnabled"]; - if (agileConfigEnabled.IsNullOrEmpty() || bool.Parse(agileConfigEnabled)) - { - config.AddAgileConfig(new AgileConfig.Client.ConfigClient(configuration)); - } - }) - .UseSerilog((context, provider, config) => - { - config.ReadFrom.Configuration(context.Configuration); - }); - await builder.AddApplicationAsync(options => - { - ProjectNameHttpApiHostModule.ApplicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") - ?? ProjectNameHttpApiHostModule.ApplicationName; - options.ApplicationName = ProjectNameHttpApiHostModule.ApplicationName; - // 搜索 Modules 目录下所有文件作为插件 - // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 - var pluginFolder = Path.Combine( - Directory.GetCurrentDirectory(), "Modules"); - DirectoryHelper.CreateIfNotExists(pluginFolder); - options.PlugInSources.AddFolder( - pluginFolder, - SearchOption.AllDirectories); - }); - var app = builder.Build(); - await app.InitializeApplicationAsync(); - await app.RunAsync(); - return 0; - } - finally - { - Log.CloseAndFlush(); - } - } -} +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Serilog; +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.IO; +using Volo.Abp.Modularity.PlugIns; + +namespace PackageName.CompanyName.ProjectName; + +public class Program +{ + public async static Task Main(string[] args) + { + try + { + Console.Title = "Web.Host"; + Log.Information("Starting web host."); + + var builder = WebApplication.CreateBuilder(args); + builder.Host.AddAppSettingsSecretsJson() + .UseAutofac() + .ConfigureAppConfiguration((context, config) => + { + var configuration = config.Build(); + var agileConfigEnabled = configuration["AgileConfig:IsEnabled"]; + if (agileConfigEnabled.IsNullOrEmpty() || bool.Parse(agileConfigEnabled)) + { + config.AddAgileConfig(new AgileConfig.Client.ConfigClient(configuration)); + } + }) + .UseSerilog((context, provider, config) => + { + config.ReadFrom.Configuration(context.Configuration); + }); + await builder.AddApplicationAsync(options => + { + ProjectNameHttpApiHostModule.ApplicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") + ?? ProjectNameHttpApiHostModule.ApplicationName; + options.ApplicationName = ProjectNameHttpApiHostModule.ApplicationName; + // 搜索 Modules 目录下所有文件作为插件 + // 取消显示引用所有其他项目的模块,改为通过插件的形式引用 + var pluginFolder = Path.Combine( + Directory.GetCurrentDirectory(), "Modules"); + DirectoryHelper.CreateIfNotExists(pluginFolder); + options.PlugInSources.AddFolder( + pluginFolder, + SearchOption.AllDirectories); + }); + var app = builder.Build(); + await app.InitializeApplicationAsync(); + await app.RunAsync(); + return 0; + } + finally + { + Log.CloseAndFlush(); + } + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs index 74de35a22..e7920d899 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs @@ -1,445 +1,445 @@ -using DotNetCore.CAP; -using LINGYUN.Abp.Dapr.Client.ClientProxying; -using LINGYUN.Abp.Dapr.Client.DynamicProxying; -using LINGYUN.Abp.ExceptionHandling; -using LINGYUN.Abp.ExceptionHandling.Emailing; -using LINGYUN.Abp.Localization.CultureMap; -using LINGYUN.Abp.Localization.Persistence; -using LINGYUN.Abp.Serilog.Enrichers.Application; -using LINGYUN.Abp.Serilog.Enrichers.UniqueId; -using LINGYUN.Abp.Wrapper; -using Medallion.Threading; -using Medallion.Threading.Redis; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Cors; -using Microsoft.AspNetCore.DataProtection; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Caching.StackExchangeRedis; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Microsoft.OpenApi.Models; -using OpenTelemetry.Metrics; -using OpenTelemetry.Resources; -using OpenTelemetry.Trace; -using PackageName.CompanyName.ProjectName.Localization; -using StackExchange.Redis; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Encodings.Web; -using System.Text.Unicode; -using Volo.Abp; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.AntiForgery; -using Volo.Abp.Auditing; -using Volo.Abp.Caching; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.GlobalFeatures; -using Volo.Abp.Http.Client; -using Volo.Abp.Json; -using Volo.Abp.Json.SystemTextJson; -using Volo.Abp.Localization; -using Volo.Abp.MultiTenancy; -using Volo.Abp.Security.Claims; -using Volo.Abp.Threading; -using Volo.Abp.VirtualFileSystem; -using static IdentityModel.ClaimComparer; - -namespace PackageName.CompanyName.ProjectName; - -public partial class ProjectNameHttpApiHostModule -{ - public static string ApplicationName { get; set; } = "ProjectNameService"; - private const string DefaultCorsPolicyName = "Default"; - private static readonly OneTimeRunner OneTimeRunner = new(); - - private void PreConfigureFeature() - { - OneTimeRunner.Run(() => - { - GlobalFeatureManager.Instance.Modules.Editions().EnableAll(); - }); - } - - private void PreConfigureApp() - { - AbpSerilogEnrichersConsts.ApplicationName = ApplicationName; - - PreConfigure(options => - { - // 以开放端口区别 - options.SnowflakeIdOptions.WorkerId = 5; - options.SnowflakeIdOptions.WorkerIdBits = 5; - options.SnowflakeIdOptions.DatacenterId = 1; - }); - } - - private void PreConfigureCAP(IConfiguration configuration) - { - PreConfigure(options => - { - options -#if MySQL - .UseMySql(sqlOptions => - { - configuration.GetSection("CAP:MySql").Bind(sqlOptions); - }) -#elif SqlServer - .UseSqlServer(sqlOptions => - { - configuration.GetSection("CAP:SqlServer").Bind(sqlOptions); - }) -#elif Sqlite - .UseSqlite(sqlOptions => - { - configuration.GetSection("CAP:Sqlite").Bind(sqlOptions); - }) -#elif Oracle || OracleDevart - .UseOracle(sqlOptions => - { - configuration.GetSection("CAP:Oracle").Bind(sqlOptions); - }) -#elif PostgreSql - .UsePostgreSql(sqlOptions => - { - configuration.GetSection("CAP:PostgreSql").Bind(sqlOptions); - }) -#endif - .UseRabbitMQ(rabbitMQOptions => - { - configuration.GetSection("CAP:RabbitMQ").Bind(rabbitMQOptions); - }) - .UseDashboard(); - }); - } - - private void ConfigureJsonSerializer(IConfiguration configuration) - { - // 统一时间日期格式 - Configure(options => - { - var jsonConfiguration = configuration.GetSection("Json"); - if (jsonConfiguration.Exists()) - { - jsonConfiguration.Bind(options); - } - }); - // 中文序列化的编码问题 - Configure(options => - { - options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); - }); - } - - private void ConfigureDistributedLock(IServiceCollection services, IConfiguration configuration) - { - var distributedLockIsEnabled = configuration["DistributedLock:IsEnabled"]; - if (distributedLockIsEnabled.IsNullOrWhiteSpace() || bool.Parse(distributedLockIsEnabled)) - { - var redis = ConnectionMultiplexer.Connect(configuration["DistributedLock:Redis:Configuration"]); - services.AddSingleton(_ => new RedisDistributedSynchronizationProvider(redis.GetDatabase())); - } - } - - private void ConfigureOpenTelemetry(IServiceCollection services, IConfiguration configuration) - { - var openTelemetryEnabled = configuration["OpenTelemetry:IsEnabled"]; - if (openTelemetryEnabled.IsNullOrEmpty() || bool.Parse(openTelemetryEnabled)) - { - services.AddOpenTelemetry() - .ConfigureResource(resource => - { - resource.AddService(ApplicationName); - }) - .WithTracing(tracing => - { - tracing.AddHttpClientInstrumentation(); - tracing.AddAspNetCoreInstrumentation(); - tracing.AddCapInstrumentation(); - tracing.AddEntityFrameworkCoreInstrumentation(); - tracing.AddSource(ApplicationName); - - var tracingOtlpEndpoint = configuration["OpenTelemetry:Otlp:Endpoint"]; - if (!tracingOtlpEndpoint.IsNullOrWhiteSpace()) - { - tracing.AddOtlpExporter(otlpOptions => - { - otlpOptions.Endpoint = new Uri(tracingOtlpEndpoint); - }); - return; - } - - var zipkinEndpoint = configuration["OpenTelemetry:ZipKin:Endpoint"]; - if (!zipkinEndpoint.IsNullOrWhiteSpace()) - { - tracing.AddZipkinExporter(zipKinOptions => - { - zipKinOptions.Endpoint = new Uri(zipkinEndpoint); - }); - return; - } - }) - .WithMetrics(metrics => - { - metrics.AddRuntimeInstrumentation(); - metrics.AddHttpClientInstrumentation(); - metrics.AddAspNetCoreInstrumentation(); - }); - } - } - - private void ConfigureExceptionHandling() - { - // 自定义需要处理的异常 - Configure(options => - { - // 加入需要处理的异常类型 - options.Handlers.Add(); - options.Handlers.Add(); - options.Handlers.Add(); - options.Handlers.Add(); - options.Handlers.Add(); - options.Handlers.Add(); - }); - // 自定义需要发送邮件通知的异常类型 - Configure(options => - { - // 是否发送堆栈信息 - options.SendStackTrace = true; - // 未指定异常接收者的默认接收邮件 - // 指定自己的邮件地址 - }); - } - - private void ConfigureIdentity(IConfiguration configuration) - { - Configure(options => - { - options.IsDynamicClaimsEnabled = true; - var refreshClaimsUrl = configuration["App:RefreshClaimsUrl"]; - if (!refreshClaimsUrl.IsNullOrWhiteSpace()) - { - options.RemoteRefreshUrl = refreshClaimsUrl + options.RemoteRefreshUrl; - } - }); - } - - private void ConfigureAuditing(IConfiguration configuration) - { - Configure(options => - { - options.ApplicationName = ApplicationName; - // 是否启用实体变更记录 - var allEntitiesSelectorIsEnabled = configuration["Auditing:AllEntitiesSelector"]; - if (allEntitiesSelectorIsEnabled.IsNullOrWhiteSpace() || bool.Parse(allEntitiesSelectorIsEnabled)) - { - options.EntityHistorySelectors.AddAllEntities(); - } - }); - } - - private void ConfigureCaching(IConfiguration configuration) - { - Configure(options => - { - configuration.GetSection("DistributedCache").Bind(options); - }); - - Configure(options => - { - var redisConfig = ConfigurationOptions.Parse(options.Configuration); - options.ConfigurationOptions = redisConfig; - options.InstanceName = configuration["Redis:InstanceName"]; - }); - } - - private void ConfigureMvc(IServiceCollection services, IConfiguration configuration) - { - Configure(options => - { - options.ExposeIntegrationServices = true; - }); - - Configure(options => - { - options.EndpointConfigureActions.Add((builder) => - { - builder.Endpoints.MapHealthChecks(configuration["App:HealthChecks"] ?? "/healthz"); - }); - }); - - services.AddHealthChecks(); - } - - private void ConfigureVirtualFileSystem() - { - Configure(options => - { - options.FileSets.AddEmbedded("PackageName.CompanyName.ProjectName"); - }); - } - - private void ConfigureMultiTenancy(IConfiguration configuration) - { - // 多租户 - Configure(options => - { - options.IsEnabled = true; - }); - - var tenantResolveCfg = configuration.GetSection("App:Domains"); - if (tenantResolveCfg.Exists()) - { - Configure(options => - { - var domains = tenantResolveCfg.Get(); - foreach (var domain in domains) - { - options.AddDomainTenantResolver(domain); - } - }); - } - } - - private void ConfigureSwagger(IServiceCollection services) - { - // Swagger - services.AddSwaggerGen( - options => - { - options.SwaggerDoc("v1", new OpenApiInfo { Title = "ProjectName API", Version = "v1" }); - options.DocInclusionPredicate((docName, description) => true); - options.CustomSchemaIds(type => type.FullName); - options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme - { - Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", - Name = "Authorization", - In = ParameterLocation.Header, - Scheme = "bearer", - Type = SecuritySchemeType.Http, - BearerFormat = "JWT" - }); - options.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } - }, - new string[] { } - } - }); - options.OperationFilter(); - }); - } - - private void ConfigureLocalization() - { - // 支持本地化语言类型 - Configure(options => - { - options.Languages.Add(new LanguageInfo("en", "en", "English")); - options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); - }); - - Configure(options => - { - // 持久化本地化资源 - options.SaveStaticLocalizationsToPersistence = true; - options.AddPersistenceResource(); - }); - - Configure(options => - { - var zhHansCultureMapInfo = new CultureMapInfo - { - TargetCulture = "zh-Hans", - SourceCultures = new string[] { "zh", "zh_CN", "zh-CN" } - }; - - options.CulturesMaps.Add(zhHansCultureMapInfo); - options.UiCulturesMaps.Add(zhHansCultureMapInfo); - }); - } - - private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false) - { - Configure(options => - { - // options.AutoValidate = false; - // options.AutoValidateFilter = (type) => !type.Namespace.Contains("elsa", StringComparison.CurrentCultureIgnoreCase); - }); - - services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) - .AddJwtBearer(options => - { - configuration.GetSection("AuthServer").Bind(options); - }); - - if (!isDevelopment) - { - var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); - services - .AddDataProtection() - .SetApplicationName("LINGYUN.Abp.Application") - .PersistKeysToStackExchangeRedis(redis, "LINGYUN.Abp.Application:DataProtection:Protection-Keys"); - } - } - - private void ConfigureCors(IServiceCollection services, IConfiguration configuration) - { - services.AddCors(options => - { - options.AddPolicy(DefaultCorsPolicyName, builder => - { - builder - .WithOrigins( - configuration["App:CorsOrigins"] - .Split(",", StringSplitOptions.RemoveEmptyEntries) - .Select(o => o.RemovePostFix("/")) - .ToArray() - ) - .WithAbpExposedHeaders() - .WithAbpWrapExposedHeaders() - .SetIsOriginAllowedToAllowWildcardSubdomains() - .AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials(); - }); - }); - } - - private void ConfigureWrapper() - { - Configure(options => - { - // 取消注释包装结果 - options.IsEnabled = true; - }); - } - - private void PreConfigureWrapper() - { - PreConfigure(options => - { - // http服务间调用发送不需要包装结果的请求头 - options.ProxyClientActions.Add( - (_, _, client) => - { - client.DefaultRequestHeaders.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); - }); - }); - - PreConfigure(options => - { - // dapr服务间调用发送不需要包装结果的请求头 - options.ProxyRequestActions.Add( - (appId, httpRequestMessage) => - { - httpRequestMessage.Headers.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); - }); - }); - } -} +using DotNetCore.CAP; +using LINGYUN.Abp.Dapr.Client.ClientProxying; +using LINGYUN.Abp.Dapr.Client.DynamicProxying; +using LINGYUN.Abp.ExceptionHandling; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.Localization.CultureMap; +using LINGYUN.Abp.Localization.Persistence; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using LINGYUN.Abp.Wrapper; +using Medallion.Threading; +using Medallion.Threading.Redis; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Caching.StackExchangeRedis; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; +using PackageName.CompanyName.ProjectName.Localization; +using StackExchange.Redis; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Encodings.Web; +using System.Text.Unicode; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.AntiForgery; +using Volo.Abp.Auditing; +using Volo.Abp.Caching; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Http.Client; +using Volo.Abp.Json; +using Volo.Abp.Json.SystemTextJson; +using Volo.Abp.Localization; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Security.Claims; +using Volo.Abp.Threading; +using Volo.Abp.VirtualFileSystem; +using static IdentityModel.ClaimComparer; + +namespace PackageName.CompanyName.ProjectName; + +public partial class ProjectNameHttpApiHostModule +{ + public static string ApplicationName { get; set; } = "ProjectNameService"; + private const string DefaultCorsPolicyName = "Default"; + private static readonly OneTimeRunner OneTimeRunner = new(); + + private void PreConfigureFeature() + { + OneTimeRunner.Run(() => + { + GlobalFeatureManager.Instance.Modules.Editions().EnableAll(); + }); + } + + private void PreConfigureApp() + { + AbpSerilogEnrichersConsts.ApplicationName = ApplicationName; + + PreConfigure(options => + { + // 以开放端口区别 + options.SnowflakeIdOptions.WorkerId = 5; + options.SnowflakeIdOptions.WorkerIdBits = 5; + options.SnowflakeIdOptions.DatacenterId = 1; + }); + } + + private void PreConfigureCAP(IConfiguration configuration) + { + PreConfigure(options => + { + options +#if MySQL + .UseMySql(sqlOptions => + { + configuration.GetSection("CAP:MySql").Bind(sqlOptions); + }) +#elif SqlServer + .UseSqlServer(sqlOptions => + { + configuration.GetSection("CAP:SqlServer").Bind(sqlOptions); + }) +#elif Sqlite + .UseSqlite(sqlOptions => + { + configuration.GetSection("CAP:Sqlite").Bind(sqlOptions); + }) +#elif Oracle || OracleDevart + .UseOracle(sqlOptions => + { + configuration.GetSection("CAP:Oracle").Bind(sqlOptions); + }) +#elif PostgreSql + .UsePostgreSql(sqlOptions => + { + configuration.GetSection("CAP:PostgreSql").Bind(sqlOptions); + }) +#endif + .UseRabbitMQ(rabbitMQOptions => + { + configuration.GetSection("CAP:RabbitMQ").Bind(rabbitMQOptions); + }) + .UseDashboard(); + }); + } + + private void ConfigureJsonSerializer(IConfiguration configuration) + { + // 统一时间日期格式 + Configure(options => + { + var jsonConfiguration = configuration.GetSection("Json"); + if (jsonConfiguration.Exists()) + { + jsonConfiguration.Bind(options); + } + }); + // 中文序列化的编码问题 + Configure(options => + { + options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); + }); + } + + private void ConfigureDistributedLock(IServiceCollection services, IConfiguration configuration) + { + var distributedLockIsEnabled = configuration["DistributedLock:IsEnabled"]; + if (distributedLockIsEnabled.IsNullOrWhiteSpace() || bool.Parse(distributedLockIsEnabled)) + { + var redis = ConnectionMultiplexer.Connect(configuration["DistributedLock:Redis:Configuration"]); + services.AddSingleton(_ => new RedisDistributedSynchronizationProvider(redis.GetDatabase())); + } + } + + private void ConfigureOpenTelemetry(IServiceCollection services, IConfiguration configuration) + { + var openTelemetryEnabled = configuration["OpenTelemetry:IsEnabled"]; + if (openTelemetryEnabled.IsNullOrEmpty() || bool.Parse(openTelemetryEnabled)) + { + services.AddOpenTelemetry() + .ConfigureResource(resource => + { + resource.AddService(ApplicationName); + }) + .WithTracing(tracing => + { + tracing.AddHttpClientInstrumentation(); + tracing.AddAspNetCoreInstrumentation(); + tracing.AddCapInstrumentation(); + tracing.AddEntityFrameworkCoreInstrumentation(); + tracing.AddSource(ApplicationName); + + var tracingOtlpEndpoint = configuration["OpenTelemetry:Otlp:Endpoint"]; + if (!tracingOtlpEndpoint.IsNullOrWhiteSpace()) + { + tracing.AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri(tracingOtlpEndpoint); + }); + return; + } + + var zipkinEndpoint = configuration["OpenTelemetry:ZipKin:Endpoint"]; + if (!zipkinEndpoint.IsNullOrWhiteSpace()) + { + tracing.AddZipkinExporter(zipKinOptions => + { + zipKinOptions.Endpoint = new Uri(zipkinEndpoint); + }); + return; + } + }) + .WithMetrics(metrics => + { + metrics.AddRuntimeInstrumentation(); + metrics.AddHttpClientInstrumentation(); + metrics.AddAspNetCoreInstrumentation(); + }); + } + } + + private void ConfigureExceptionHandling() + { + // 自定义需要处理的异常 + Configure(options => + { + // 加入需要处理的异常类型 + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + options.Handlers.Add(); + }); + // 自定义需要发送邮件通知的异常类型 + Configure(options => + { + // 是否发送堆栈信息 + options.SendStackTrace = true; + // 未指定异常接收者的默认接收邮件 + // 指定自己的邮件地址 + }); + } + + private void ConfigureIdentity(IConfiguration configuration) + { + Configure(options => + { + options.IsDynamicClaimsEnabled = true; + var refreshClaimsUrl = configuration["App:RefreshClaimsUrl"]; + if (!refreshClaimsUrl.IsNullOrWhiteSpace()) + { + options.RemoteRefreshUrl = refreshClaimsUrl + options.RemoteRefreshUrl; + } + }); + } + + private void ConfigureAuditing(IConfiguration configuration) + { + Configure(options => + { + options.ApplicationName = ApplicationName; + // 是否启用实体变更记录 + var allEntitiesSelectorIsEnabled = configuration["Auditing:AllEntitiesSelector"]; + if (allEntitiesSelectorIsEnabled.IsNullOrWhiteSpace() || bool.Parse(allEntitiesSelectorIsEnabled)) + { + options.EntityHistorySelectors.AddAllEntities(); + } + }); + } + + private void ConfigureCaching(IConfiguration configuration) + { + Configure(options => + { + configuration.GetSection("DistributedCache").Bind(options); + }); + + Configure(options => + { + var redisConfig = ConfigurationOptions.Parse(options.Configuration); + options.ConfigurationOptions = redisConfig; + options.InstanceName = configuration["Redis:InstanceName"]; + }); + } + + private void ConfigureMvc(IServiceCollection services, IConfiguration configuration) + { + Configure(options => + { + options.ExposeIntegrationServices = true; + }); + + Configure(options => + { + options.EndpointConfigureActions.Add((builder) => + { + builder.Endpoints.MapHealthChecks(configuration["App:HealthChecks"] ?? "/healthz"); + }); + }); + + services.AddHealthChecks(); + } + + private void ConfigureVirtualFileSystem() + { + Configure(options => + { + options.FileSets.AddEmbedded("PackageName.CompanyName.ProjectName"); + }); + } + + private void ConfigureMultiTenancy(IConfiguration configuration) + { + // 多租户 + Configure(options => + { + options.IsEnabled = true; + }); + + var tenantResolveCfg = configuration.GetSection("App:Domains"); + if (tenantResolveCfg.Exists()) + { + Configure(options => + { + var domains = tenantResolveCfg.Get(); + foreach (var domain in domains) + { + options.AddDomainTenantResolver(domain); + } + }); + } + } + + private void ConfigureSwagger(IServiceCollection services) + { + // Swagger + services.AddSwaggerGen( + options => + { + options.SwaggerDoc("v1", new OpenApiInfo { Title = "ProjectName API", Version = "v1" }); + options.DocInclusionPredicate((docName, description) => true); + options.CustomSchemaIds(type => type.FullName); + options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme + { + Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + Name = "Authorization", + In = ParameterLocation.Header, + Scheme = "bearer", + Type = SecuritySchemeType.Http, + BearerFormat = "JWT" + }); + options.AddSecurityRequirement(new OpenApiSecurityRequirement + { + { + new OpenApiSecurityScheme + { + Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } + }, + new string[] { } + } + }); + options.OperationFilter(); + }); + } + + private void ConfigureLocalization() + { + // 支持本地化语言类型 + Configure(options => + { + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + }); + + Configure(options => + { + // 持久化本地化资源 + options.SaveStaticLocalizationsToPersistence = true; + options.AddPersistenceResource(); + }); + + Configure(options => + { + var zhHansCultureMapInfo = new CultureMapInfo + { + TargetCulture = "zh-Hans", + SourceCultures = new string[] { "zh", "zh_CN", "zh-CN" } + }; + + options.CulturesMaps.Add(zhHansCultureMapInfo); + options.UiCulturesMaps.Add(zhHansCultureMapInfo); + }); + } + + private void ConfigureSecurity(IServiceCollection services, IConfiguration configuration, bool isDevelopment = false) + { + Configure(options => + { + // options.AutoValidate = false; + // options.AutoValidateFilter = (type) => !type.Namespace.Contains("elsa", StringComparison.CurrentCultureIgnoreCase); + }); + + services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(options => + { + configuration.GetSection("AuthServer").Bind(options); + }); + + if (!isDevelopment) + { + var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); + services + .AddDataProtection() + .SetApplicationName("LINGYUN.Abp.Application") + .PersistKeysToStackExchangeRedis(redis, "LINGYUN.Abp.Application:DataProtection:Protection-Keys"); + } + } + + private void ConfigureCors(IServiceCollection services, IConfiguration configuration) + { + services.AddCors(options => + { + options.AddPolicy(DefaultCorsPolicyName, builder => + { + builder + .WithOrigins( + configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .WithAbpWrapExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + private void ConfigureWrapper() + { + Configure(options => + { + // 取消注释包装结果 + options.IsEnabled = true; + }); + } + + private void PreConfigureWrapper() + { + PreConfigure(options => + { + // http服务间调用发送不需要包装结果的请求头 + options.ProxyClientActions.Add( + (_, _, client) => + { + client.DefaultRequestHeaders.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + }); + }); + + PreConfigure(options => + { + // dapr服务间调用发送不需要包装结果的请求头 + options.ProxyRequestActions.Add( + (appId, httpRequestMessage) => + { + httpRequestMessage.Headers.TryAddWithoutValidation(AbpHttpWrapConsts.AbpDontWrapResult, "true"); + }); + }); + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs index c385d7b69..ea6e034c3 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs @@ -1,129 +1,129 @@ -using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; -using LINGYUN.Abp.AuditLogging.Elasticsearch; -using LINGYUN.Abp.EventBus.CAP; -using LINGYUN.Abp.ExceptionHandling.Emailing; -using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; -using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; -using LINGYUN.Abp.Saas.EntityFrameworkCore; -using LINGYUN.Abp.Serilog.Enrichers.Application; -using LINGYUN.Abp.Serilog.Enrichers.UniqueId; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using PackageName.CompanyName.ProjectName.EntityFrameworkCore; -using PackageName.CompanyName.ProjectName.SettingManagement; -using Volo.Abp; -using Volo.Abp.AspNetCore.Authentication.JwtBearer; -using Volo.Abp.AspNetCore.MultiTenancy; -using Volo.Abp.AspNetCore.Serilog; -using Volo.Abp.Autofac; -using Volo.Abp.Caching.StackExchangeRedis; -using Volo.Abp.DistributedLocking; -using Volo.Abp.FeatureManagement.EntityFrameworkCore; -using Volo.Abp.Http.Client.IdentityModel.Web; -using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement.EntityFrameworkCore; -using Volo.Abp.SettingManagement.EntityFrameworkCore; -using Volo.Abp.Swashbuckle; -using LINGYUN.Abp.AspNetCore.HttpOverrides; -using LINGYUN.Abp.Identity.Session.AspNetCore; -using Volo.Abp.MailKit; - -namespace PackageName.CompanyName.ProjectName; - -[DependsOn( - typeof(AbpSerilogEnrichersApplicationModule), - typeof(AbpSerilogEnrichersUniqueIdModule), - typeof(AbpAuditLoggingElasticsearchModule), - typeof(AbpAspNetCoreSerilogModule), - typeof(ProjectNameApplicationModule), - typeof(ProjectNameHttpApiModule), - typeof(ProjectNameEntityFrameworkCoreModule), - typeof(ProjectNameSettingManagementModule), - typeof(AbpEmailingExceptionHandlingModule), - typeof(AbpCAPEventBusModule), - typeof(AbpHttpClientIdentityModelWebModule), - typeof(AbpAspNetCoreMultiTenancyModule), - typeof(AbpSaasEntityFrameworkCoreModule), - typeof(AbpFeatureManagementEntityFrameworkCoreModule), - typeof(AbpPermissionManagementEntityFrameworkCoreModule), - typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpLocalizationManagementEntityFrameworkCoreModule), - typeof(AbpTextTemplatingEntityFrameworkCoreModule), - typeof(AbpAspNetCoreAuthenticationJwtBearerModule), - typeof(AbpCachingStackExchangeRedisModule), - typeof(AbpDistributedLockingModule), - typeof(AbpAspNetCoreMvcWrapperModule), - typeof(AbpAspNetCoreHttpOverridesModule), - typeof(AbpIdentitySessionAspNetCoreModule), - typeof(AbpMailKitModule), - typeof(AbpSwashbuckleModule), - typeof(AbpAutofacModule) - )] -public partial class ProjectNameHttpApiHostModule : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - - PreConfigureApp(); - PreConfigureWrapper(); - PreConfigureFeature(); - PreConfigureCAP(configuration); - } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - var hostingEnvironment = context.Services.GetHostingEnvironment(); - var configuration = context.Services.GetConfiguration(); - - ConfigureWrapper(); - ConfigureLocalization(); - ConfigureExceptionHandling(); - ConfigureVirtualFileSystem(); - ConfigureCaching(configuration); - ConfigureAuditing(configuration); - ConfigureIdentity(configuration); - ConfigureMultiTenancy(configuration); - ConfigureJsonSerializer(configuration); - ConfigureSwagger(context.Services); - ConfigureMvc(context.Services, configuration); - ConfigureCors(context.Services, configuration); - ConfigureOpenTelemetry(context.Services, configuration); - ConfigureDistributedLock(context.Services, configuration); - ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); - } - - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - app.UseForwardedHeaders(); - app.UseMapRequestLocalization(); - app.UseCorrelationId(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseCors(); - app.UseAuthentication(); - app.UseJwtTokenMiddleware(); - app.UseMultiTenancy(); - app.UseAbpSession(); - app.UseDynamicClaims(); - app.UseAuthorization(); - app.UseSwagger(); - app.UseAbpSwaggerUI(options => - { - options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support ProjectName API"); - - var configuration = context.GetConfiguration(); - options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); - options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); - options.OAuthScopes("ProjectName"); - }); - app.UseAuditing(); - app.UseAbpSerilogEnrichers(); - app.UseConfiguredEndpoints(); - } -} +using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; +using LINGYUN.Abp.AuditLogging.Elasticsearch; +using LINGYUN.Abp.EventBus.CAP; +using LINGYUN.Abp.ExceptionHandling.Emailing; +using LINGYUN.Abp.LocalizationManagement.EntityFrameworkCore; +using LINGYUN.Abp.TextTemplating.EntityFrameworkCore; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using LINGYUN.Abp.Serilog.Enrichers.Application; +using LINGYUN.Abp.Serilog.Enrichers.UniqueId; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using PackageName.CompanyName.ProjectName.EntityFrameworkCore; +using PackageName.CompanyName.ProjectName.SettingManagement; +using Volo.Abp; +using Volo.Abp.AspNetCore.Authentication.JwtBearer; +using Volo.Abp.AspNetCore.MultiTenancy; +using Volo.Abp.AspNetCore.Serilog; +using Volo.Abp.Autofac; +using Volo.Abp.Caching.StackExchangeRedis; +using Volo.Abp.DistributedLocking; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; +using Volo.Abp.Http.Client.IdentityModel.Web; +using Volo.Abp.Modularity; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.Swashbuckle; +using LINGYUN.Abp.AspNetCore.HttpOverrides; +using LINGYUN.Abp.Identity.Session.AspNetCore; +using Volo.Abp.MailKit; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpSerilogEnrichersApplicationModule), + typeof(AbpSerilogEnrichersUniqueIdModule), + typeof(AbpAuditLoggingElasticsearchModule), + typeof(AbpAspNetCoreSerilogModule), + typeof(ProjectNameApplicationModule), + typeof(ProjectNameHttpApiModule), + typeof(ProjectNameEntityFrameworkCoreModule), + typeof(ProjectNameSettingManagementModule), + typeof(AbpEmailingExceptionHandlingModule), + typeof(AbpCAPEventBusModule), + typeof(AbpHttpClientIdentityModelWebModule), + typeof(AbpAspNetCoreMultiTenancyModule), + typeof(AbpSaasEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpPermissionManagementEntityFrameworkCoreModule), + typeof(AbpSettingManagementEntityFrameworkCoreModule), + typeof(AbpLocalizationManagementEntityFrameworkCoreModule), + typeof(AbpTextTemplatingEntityFrameworkCoreModule), + typeof(AbpAspNetCoreAuthenticationJwtBearerModule), + typeof(AbpCachingStackExchangeRedisModule), + typeof(AbpDistributedLockingModule), + typeof(AbpAspNetCoreMvcWrapperModule), + typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpIdentitySessionAspNetCoreModule), + typeof(AbpMailKitModule), + typeof(AbpSwashbuckleModule), + typeof(AbpAutofacModule) + )] +public partial class ProjectNameHttpApiHostModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + + PreConfigureApp(); + PreConfigureWrapper(); + PreConfigureFeature(); + PreConfigureCAP(configuration); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var hostingEnvironment = context.Services.GetHostingEnvironment(); + var configuration = context.Services.GetConfiguration(); + + ConfigureWrapper(); + ConfigureLocalization(); + ConfigureExceptionHandling(); + ConfigureVirtualFileSystem(); + ConfigureCaching(configuration); + ConfigureAuditing(configuration); + ConfigureIdentity(configuration); + ConfigureMultiTenancy(configuration); + ConfigureJsonSerializer(configuration); + ConfigureSwagger(context.Services); + ConfigureMvc(context.Services, configuration); + ConfigureCors(context.Services, configuration); + ConfigureOpenTelemetry(context.Services, configuration); + ConfigureDistributedLock(context.Services, configuration); + ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var app = context.GetApplicationBuilder(); + var env = context.GetEnvironment(); + + app.UseForwardedHeaders(); + app.UseMapRequestLocalization(); + app.UseCorrelationId(); + app.UseStaticFiles(); + app.UseRouting(); + app.UseCors(); + app.UseAuthentication(); + app.UseJwtTokenMiddleware(); + app.UseMultiTenancy(); + app.UseAbpSession(); + app.UseDynamicClaims(); + app.UseAuthorization(); + app.UseSwagger(); + app.UseAbpSwaggerUI(options => + { + options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support ProjectName API"); + + var configuration = context.GetConfiguration(); + options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); + options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); + options.OAuthScopes("ProjectName"); + }); + app.UseAuditing(); + app.UseAbpSerilogEnrichers(); + app.UseConfiguredEndpoints(); + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json index bfc8f50b6..0d9c46f45 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/Properties/launchSettings.json @@ -1,28 +1,28 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:20890", - "sslPort": 0 - } - }, - "profiles": { - "PackageName.CompanyName.ProjectName.HttpApi.Host": { - "commandName": "Project", - "launchBrowser": false, - "dotnetRunMessages": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://127.0.0.1:5000" - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20890", + "sslPort": 0 + } + }, + "profiles": { + "PackageName.CompanyName.ProjectName.HttpApi.Host": { + "commandName": "Project", + "launchBrowser": false, + "dotnetRunMessages": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://127.0.0.1:5000" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } } \ No newline at end of file diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs index 265c287de..e628695db 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/TenantHeaderParamter.cs @@ -1,31 +1,31 @@ -using Microsoft.Extensions.Options; -using Microsoft.OpenApi.Models; -using Swashbuckle.AspNetCore.SwaggerGen; -using System.Collections.Generic; -using Volo.Abp.MultiTenancy; - -namespace PackageName.CompanyName.ProjectName; - -public class TenantHeaderParamter : IOperationFilter -{ - private readonly AbpMultiTenancyOptions _options; - public TenantHeaderParamter( - IOptions options) - { - _options = options.Value; - } - public void Apply(OpenApiOperation operation, OperationFilterContext context) - { - if (_options.IsEnabled) - { - operation.Parameters = operation.Parameters ?? new List(); - operation.Parameters.Add(new OpenApiParameter - { - Name = TenantResolverConsts.DefaultTenantKey, - In = ParameterLocation.Header, - Description = "Tenant Id/Name", - Required = false - }); - } - } -} +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using System.Collections.Generic; +using Volo.Abp.MultiTenancy; + +namespace PackageName.CompanyName.ProjectName; + +public class TenantHeaderParamter : IOperationFilter +{ + private readonly AbpMultiTenancyOptions _options; + public TenantHeaderParamter( + IOptions options) + { + _options = options.Value; + } + public void Apply(OpenApiOperation operation, OperationFilterContext context) + { + if (_options.IsEnabled) + { + operation.Parameters = operation.Parameters ?? new List(); + operation.Parameters.Add(new OpenApiParameter + { + Name = TenantResolverConsts.DefaultTenantKey, + In = ParameterLocation.Header, + Description = "Tenant Id/Name", + Required = false + }); + } + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json similarity index 96% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json index f1c0abd6e..9f72f9390 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json @@ -1,153 +1,153 @@ -{ - "AgileConfig": { - "IsEnabled": false, - "env": "DEV", - "appId": "PackageName.CompanyName.ProjectName", - "secret": "1q2w3E*", - "nodes": "http://127.0.0.1:15000", - "name": "PackageName.CompanyName.ProjectName", - "tag": "PackageName.CompanyName.ProjectName" - }, - "App": { - "CorsOrigins": "http://127.0.0.1:30000", - "RefreshClaimsUrl": "http://127.0.0.1:30015/", - "HealthChecks": "/healthz" - }, - "Auditing": { - "AllEntitiesSelector": true - }, - "DistributedCache": { - "HideErrors": true, - "KeyPrefix": "LINGYUN.Abp.Application", - "GlobalCacheEntryOptions": { - "SlidingExpiration": "30:00:00", - "AbsoluteExpirationRelativeToNow": "60:00:00" - } - }, - "ConnectionStrings": { - "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "ProjectName": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpSaas": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpFeatureManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpPermissionManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpSettingManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpLocalizationManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", - "AbpTextTemplating": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "DistributedLock": { - "IsEnabled": true, - "Redis": { - "Configuration": "127.0.0.1,defaultDatabase=15" - } - }, - "OpenTelemetry": { - "IsEnabled": true, - "ZipKin": { - "Endpoint": "http://127.0.0.1:9411/api/v2/spans" - } - }, - "RemoteServices": {}, - "IdentityClients": { - "InternalServiceClient": { - "Authority": "http://127.0.0.1:44385", - "RequireHttps": false, - "MapInboundClaims": false, - "GrantType": "client_credentials", - "Scope": "lingyun-abp-application", - "ClientId": "InternalServiceClient", - "ClientSecret": "1q2w3E*" - } - }, - "CAP": { - "EventBus": { - "DefaultGroupName": "ProjectName", - "GroupNamePrefix": "Dev", - "Version": "v1", - "FailedRetryInterval": 300, - "FailedRetryCount": 10 - }, - "MySql": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "SqlServer": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" - }, - "Sqlite": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Data Source=./cap.db" - }, - "Oracle": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Data Source=ProjectName;Integrated Security=yes;" - }, - "PostgreSql": { - "TableNamePrefix": "ProjectName_cap", - "ConnectionString": "Host=localhost;Port=5432;Database=ProjectName;User ID=root;Password=123456;" - }, - "RabbitMQ": { - "HostName": "127.0.0.1", - "Port": 5672, - "UserName": "admin", - "Password": "123456", - "ExchangeName": "LINGYUN.Abp.Application", - "VirtualHost": "/" - } - }, - "Redis": { - "Configuration": "127.0.0.1,defaultDatabase=10", - "InstanceName": "LINGYUN.Abp.Application" - }, - "AuthServer": { - "Authority": "http://127.0.0.1:44385/", - "Audience": "lingyun-abp-application", - "MapInboundClaims": false, - "RequireHttpsMetadata": false, - "SwaggerClientId": "InternalServiceClient", - "SwaggerClientSecret": "1q2w3E*" - }, - "Logging": { - "Serilog": { - "Elasticsearch": { - "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" - } - } - }, - "AuditLogging": { - "Elasticsearch": { - "IndexPrefix": "abp.dev.auditing" - } - }, - "Elasticsearch": { - "NodeUris": "http://127.0.0.1:9200" - }, - "Serilog": { - "MinimumLevel": { - "Default": "Debug", - "Override": { - "System": "Warning", - "Microsoft": "Warning", - "DotNetCore": "Debug" - } - }, - "WriteTo": [ - { - "Name": "Console", - "Args": { - "restrictedToMinimumLevel": "Debug", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "Elasticsearch", - "Args": { - "nodeUris": "http://127.0.0.1:9200", - "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", - "autoRegisterTemplate": true, - "autoRegisterTemplateVersion": "ESv7" - } - } - ] - } -} +{ + "AgileConfig": { + "IsEnabled": false, + "env": "DEV", + "appId": "PackageName.CompanyName.ProjectName", + "secret": "1q2w3E*", + "nodes": "http://127.0.0.1:15000", + "name": "PackageName.CompanyName.ProjectName", + "tag": "PackageName.CompanyName.ProjectName" + }, + "App": { + "CorsOrigins": "http://127.0.0.1:30000", + "RefreshClaimsUrl": "http://127.0.0.1:30015/", + "HealthChecks": "/healthz" + }, + "Auditing": { + "AllEntitiesSelector": true + }, + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + }, + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "ProjectName": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpSaas": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpFeatureManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpPermissionManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpSettingManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpLocalizationManagement": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456", + "AbpTextTemplating": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=15" + } + }, + "OpenTelemetry": { + "IsEnabled": true, + "ZipKin": { + "Endpoint": "http://127.0.0.1:9411/api/v2/spans" + } + }, + "RemoteServices": {}, + "IdentityClients": { + "InternalServiceClient": { + "Authority": "http://127.0.0.1:44385", + "RequireHttps": false, + "MapInboundClaims": false, + "GrantType": "client_credentials", + "Scope": "lingyun-abp-application", + "ClientId": "InternalServiceClient", + "ClientSecret": "1q2w3E*" + } + }, + "CAP": { + "EventBus": { + "DefaultGroupName": "ProjectName", + "GroupNamePrefix": "Dev", + "Version": "v1", + "FailedRetryInterval": 300, + "FailedRetryCount": 10 + }, + "MySql": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "SqlServer": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Server=127.0.0.1;Database=ProjectName;User Id=root;Password=123456" + }, + "Sqlite": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Data Source=./cap.db" + }, + "Oracle": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Data Source=ProjectName;Integrated Security=yes;" + }, + "PostgreSql": { + "TableNamePrefix": "ProjectName_cap", + "ConnectionString": "Host=localhost;Port=5432;Database=ProjectName;User ID=root;Password=123456;" + }, + "RabbitMQ": { + "HostName": "127.0.0.1", + "Port": 5672, + "UserName": "admin", + "Password": "123456", + "ExchangeName": "LINGYUN.Abp.Application", + "VirtualHost": "/" + } + }, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=10", + "InstanceName": "LINGYUN.Abp.Application" + }, + "AuthServer": { + "Authority": "http://127.0.0.1:44385/", + "Audience": "lingyun-abp-application", + "MapInboundClaims": false, + "RequireHttpsMetadata": false, + "SwaggerClientId": "InternalServiceClient", + "SwaggerClientSecret": "1q2w3E*" + }, + "Logging": { + "Serilog": { + "Elasticsearch": { + "IndexFormat": "abp.dev.logging-{0:yyyy.MM.dd}" + } + } + }, + "AuditLogging": { + "Elasticsearch": { + "IndexPrefix": "abp.dev.auditing" + } + }, + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + }, + "Serilog": { + "MinimumLevel": { + "Default": "Debug", + "Override": { + "System": "Warning", + "Microsoft": "Warning", + "DotNetCore": "Debug" + } + }, + "WriteTo": [ + { + "Name": "Console", + "Args": { + "restrictedToMinimumLevel": "Debug", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "Elasticsearch", + "Args": { + "nodeUris": "http://127.0.0.1:9200", + "indexFormat": "abp.dev.logging-{0:yyyy.MM.dd}", + "autoRegisterTemplate": true, + "autoRegisterTemplateVersion": "ESv7" + } + } + ] + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json similarity index 97% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json index 21ae8a60f..b9c69ab64 100644 --- a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json +++ b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.json @@ -1,88 +1,88 @@ -{ - "Clock": { - "Kind": "Local" - }, - "Forwarded": { - "ForwardedHeaders": "XForwardedFor,XForwardedProto" - }, - "StringEncryption": { - "DefaultPassPhrase": "s46c5q55nxpeS8Ra", - "InitVectorBytes": "s83ng0abvd02js84", - "DefaultSalt": "sf&5)s3#" - }, - "Json": { - "OutputDateTimeFormat": "yyyy-MM-dd HH:mm:ss", - "InputDateTimeFormats": [ - "yyyy-MM-dd HH:mm:ss", - "yyyy-MM-ddTHH:mm:ss" - ] - }, - "AllowedHosts": "*", - "Serilog": { - "MinimumLevel": { - "Default": "Debug", - "Override": { - "Microsoft.EntityFrameworkCore": "Debug", - "System": "Information", - "Microsoft": "Information" - } - }, - "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], - "WriteTo": [ - { - "Name": "Console", - "Args": { - "initialMinimumLevel": "Verbose", - "standardErrorFromLevel": "Verbose", - "restrictedToMinimumLevel": "Verbose", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Debug-.log", - "restrictedToMinimumLevel": "Debug", - "rollingInterval": "Day", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Info-.log", - "restrictedToMinimumLevel": "Information", - "rollingInterval": "Day", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Warn-.log", - "restrictedToMinimumLevel": "Warning", - "rollingInterval": "Day", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Error-.log", - "restrictedToMinimumLevel": "Error", - "rollingInterval": "Day", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "Logs/Fatal-.log", - "restrictedToMinimumLevel": "Fatal", - "rollingInterval": "Day", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" - } - } - ] - } -} +{ + "Clock": { + "Kind": "Local" + }, + "Forwarded": { + "ForwardedHeaders": "XForwardedFor,XForwardedProto" + }, + "StringEncryption": { + "DefaultPassPhrase": "s46c5q55nxpeS8Ra", + "InitVectorBytes": "s83ng0abvd02js84", + "DefaultSalt": "sf&5)s3#" + }, + "Json": { + "OutputDateTimeFormat": "yyyy-MM-dd HH:mm:ss", + "InputDateTimeFormats": [ + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-ddTHH:mm:ss" + ] + }, + "AllowedHosts": "*", + "Serilog": { + "MinimumLevel": { + "Default": "Debug", + "Override": { + "Microsoft.EntityFrameworkCore": "Debug", + "System": "Information", + "Microsoft": "Information" + } + }, + "Enrich": [ "FromLogContext", "WithProcessId", "WithThreadId", "WithEnvironmentName", "WithMachineName", "WithApplicationName", "WithUniqueId" ], + "WriteTo": [ + { + "Name": "Console", + "Args": { + "initialMinimumLevel": "Verbose", + "standardErrorFromLevel": "Verbose", + "restrictedToMinimumLevel": "Verbose", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Debug-.log", + "restrictedToMinimumLevel": "Debug", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "restrictedToMinimumLevel": "Information", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Warn-.log", + "restrictedToMinimumLevel": "Warning", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Error-.log", + "restrictedToMinimumLevel": "Error", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + }, + { + "Name": "File", + "Args": { + "path": "Logs/Fatal-.log", + "restrictedToMinimumLevel": "Fatal", + "rollingInterval": "Day", + "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{SourceContext}] [{ProcessId}] [{ThreadId}] - {Message:lj}{NewLine}{Exception}" + } + } + ] + } +} diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/dapr.sh b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/dapr.sh similarity index 100% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/dapr.sh rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/dapr.sh diff --git a/aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/generate-proxy.sh b/aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/generate-proxy.sh similarity index 100% rename from aspnet-core/templates/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/generate-proxy.sh rename to aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/generate-proxy.sh diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj new file mode 100644 index 000000000..0eaa24015 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName.CompanyName.ProjectName.Application.Contracts.csproj @@ -0,0 +1,27 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.Application.Contracts + PackageName.CompanyName.ProjectName.Application.Contracts + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs new file mode 100644 index 000000000..5fed2b916 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureDefinitionProvider.cs @@ -0,0 +1,18 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Features; +using Volo.Abp.Localization; + +namespace PackageName.CompanyName.ProjectName.Features; + +public class ProjectNameFeatureDefinitionProvider : FeatureDefinitionProvider +{ + public override void Define(IFeatureDefinitionContext context) + { + var group = context.AddGroup(ProjectNameFeatureNames.GroupName, L("Features:ProjectName")); + } + + private static ILocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs new file mode 100644 index 000000000..6389fbcf6 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Features/ProjectNameFeatureNames.cs @@ -0,0 +1,6 @@ +namespace PackageName.CompanyName.ProjectName.Features; + +public static class ProjectNameFeatureNames +{ + public const string GroupName = "ProjectName"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs new file mode 100644 index 000000000..6f132d9a3 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/IProjectNameDynamicQueryableAppService.cs @@ -0,0 +1,10 @@ +using LINGYUN.Abp.Dynamic.Queryable; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询接口定义 +/// +/// 实体dto类型 +public interface IProjectNameDynamicQueryableAppService : IDynamicQueryableAppService +{ +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs new file mode 100644 index 000000000..4a170551b --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissionDefinitionProvider.cs @@ -0,0 +1,22 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Localization; + +namespace PackageName.CompanyName.ProjectName.Permissions; + +public class ProjectNamePermissionDefinitionProvider : PermissionDefinitionProvider +{ + public override void Define(IPermissionDefinitionContext context) + { + var group = context.AddGroup(ProjectNamePermissions.GroupName, L("Permission:ProjectName")); + + group.AddPermission( + ProjectNamePermissions.ManageSettings, + L("Permission:ManageSettings")); + } + + private static LocalizableString L(string name) + { + return LocalizableString.Create(name); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs new file mode 100644 index 000000000..98a957ff9 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/Permissions/ProjectNamePermissions.cs @@ -0,0 +1,8 @@ +namespace PackageName.CompanyName.ProjectName.Permissions; + +public static class ProjectNamePermissions +{ + public const string GroupName = "ProjectName"; + + public const string ManageSettings = GroupName + ".ManageSettings"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs new file mode 100644 index 000000000..eb0b2fb15 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameApplicationContractsModule.cs @@ -0,0 +1,17 @@ +using LINGYUN.Abp.Dynamic.Queryable; +using Volo.Abp.Application; +using Volo.Abp.Authorization; +using Volo.Abp.Features; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpFeaturesModule), + typeof(AbpAuthorizationModule), + typeof(AbpDddApplicationContractsModule), + typeof(AbpDynamicQueryableApplicationContractsModule), + typeof(ProjectNameDomainSharedModule))] +public class ProjectNameApplicationContractsModule : AbpModule +{ +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs new file mode 100644 index 000000000..4b5bb260d --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application.Contracts/PackageName/CompanyName/ProjectName/ProjectNameRemoteServiceConsts.cs @@ -0,0 +1,7 @@ +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameRemoteServiceConsts +{ + public const string RemoteServiceName = "ProjectName"; + public const string ModuleName = "ProjectName"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj new file mode 100644 index 000000000..cf195e665 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName.CompanyName.ProjectName.Application.csproj @@ -0,0 +1,26 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.Application + PackageName.CompanyName.ProjectName.Application + false + false + false + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs new file mode 100644 index 000000000..496140dfe --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameAppServiceBase.cs @@ -0,0 +1,13 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Application.Services; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameAppServiceBase : ApplicationService +{ + protected ProjectNameAppServiceBase() + { + LocalizationResource = typeof(ProjectNameResource); + ObjectMapperContext = typeof(ProjectNameApplicationModule); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs new file mode 100644 index 000000000..0ace9b456 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationMapperProfile.cs @@ -0,0 +1,10 @@ +using AutoMapper; + +namespace PackageName.CompanyName.ProjectName; + +public class ProjectNameApplicationMapperProfile : Profile +{ + public ProjectNameApplicationMapperProfile() + { + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs new file mode 100644 index 000000000..6e1cf009f --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameApplicationModule.cs @@ -0,0 +1,27 @@ +using LINGYUN.Abp.Dynamic.Queryable; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Application; +using Volo.Abp.Authorization; +using Volo.Abp.AutoMapper; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAuthorizationModule), + typeof(AbpDddApplicationModule), + typeof(ProjectNameDomainModule), + typeof(ProjectNameApplicationContractsModule), + typeof(AbpDynamicQueryableApplicationModule))] +public class ProjectNameApplicationModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + + Configure(options => + { + options.AddProfile(validate: true); + }); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs new file mode 100644 index 000000000..e20348b53 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableAppServiceBase.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.Dynamic.Queryable; +using PackageName.CompanyName.ProjectName.Localization; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询接口实现 +/// +/// 实体类型 +/// 实体dto类型 +public abstract class ProjectNameDynamicQueryableAppServiceBase : + DynamicQueryableAppService, + IProjectNameDynamicQueryableAppService +{ + protected ProjectNameDynamicQueryableAppServiceBase() + { + LocalizationResource = typeof(ProjectNameResource); + ObjectMapperContext = typeof(ProjectNameApplicationModule); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs new file mode 100644 index 000000000..fd7a017ea --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Application/System/Linq/Expressions/ExpressionFuncExtensions.cs @@ -0,0 +1,32 @@ +using Volo.Abp.Specifications; + +namespace System.Linq.Expressions; + +internal static class ExpressionFuncExtensions +{ + public static Expression> AndIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.And(first, second); + } + + return first; + } + + public static Expression> OrIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.Or(first, second); + } + + return first; + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj new file mode 100644 index 000000000..aa6f4772b --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName.CompanyName.ProjectName.Dapr.Client.csproj @@ -0,0 +1,19 @@ + + + + + + + net8.0 + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs new file mode 100644 index 000000000..ca16b0bf1 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Dapr.Client/PackageName/CompanyName/ProjectName/ProjectNameDaprClientModule.cs @@ -0,0 +1,18 @@ +using LINGYUN.Abp.Dapr.Client; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpDaprClientModule), + typeof(ProjectNameApplicationContractsModule))] +public class ProjectNameDaprClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddStaticDaprClientProxies( + typeof(ProjectNameApplicationContractsModule).Assembly, + ProjectNameRemoteServiceConsts.RemoteServiceName); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj new file mode 100644 index 000000000..cd98bbcf9 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName.CompanyName.ProjectName.Domain.Shared.csproj @@ -0,0 +1,30 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.Domain.Shared + PackageName.CompanyName.ProjectName.Domain.Shared + false + false + false + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs new file mode 100644 index 000000000..b0c280d5a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/ProjectNameResource.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Localization; + +namespace PackageName.CompanyName.ProjectName.Localization; + +[LocalizationResourceName("ProjectName")] +public class ProjectNameResource +{ +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json new file mode 100644 index 000000000..d14e6f1dd --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/en.json @@ -0,0 +1,8 @@ +{ + "culture": "en", + "texts": { + "Features:ProjectName": "ProjectName", + "Permission:ProjectName": "ProjectName", + "Permission:ManageSettings": "Manage Settings" + } +} \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json new file mode 100644 index 000000000..c85b3754a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/Localization/Resources/zh-Hans.json @@ -0,0 +1,8 @@ +{ + "culture": "zh-Hans", + "texts": { + "Features:ProjectName": "ProjectName", + "Permission:ProjectName": "ProjectName", + "Permission:ManageSettings": "管理设置" + } +} \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs new file mode 100644 index 000000000..6634ceb15 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfiguration.cs @@ -0,0 +1,16 @@ +using System; +using Volo.Abp.ObjectExtending.Modularity; + +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public class ProjectNameModuleExtensionConfiguration : ModuleExtensionConfiguration +{ + public ProjectNameModuleExtensionConfiguration ConfigureProjectName( + Action configureAction) + { + return this.ConfigureEntity( + ProjectNameModuleExtensionConsts.EntityNames.Entity, + configureAction + ); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs new file mode 100644 index 000000000..fabfd40c9 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConfigurationDictionaryExtensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Volo.Abp.ObjectExtending.Modularity; + +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public static class ProjectNameModuleExtensionConfigurationDictionaryExtensions +{ + public static ModuleExtensionConfigurationDictionary ConfigureProjectName( + this ModuleExtensionConfigurationDictionary modules, + Action configureAction) + { + return modules.ConfigureModule( + ProjectNameModuleExtensionConsts.ModuleName, + configureAction + ); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs new file mode 100644 index 000000000..1973ef9b6 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ObjectExtending/ProjectNameModuleExtensionConsts.cs @@ -0,0 +1,11 @@ +namespace PackageName.CompanyName.ProjectName.ObjectExtending; + +public static class ProjectNameModuleExtensionConsts +{ + public const string ModuleName = "ProjectName"; + + public static class EntityNames + { + public const string Entity = "Entity"; + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs new file mode 100644 index 000000000..ec682b498 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameDomainSharedModule.cs @@ -0,0 +1,32 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; +using Volo.Abp.Modularity; +using Volo.Abp.VirtualFileSystem; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpLocalizationModule))] +public class ProjectNameDomainSharedModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add() + .AddVirtualJson("/PackageName/CompanyName/ProjectName/Localization/Resources"); + }); + + Configure(options => + { + options.MapCodeNamespace(ProjectNameErrorCodes.Namespace, typeof(ProjectNameResource)); + }); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs new file mode 100644 index 000000000..b2383ee40 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain.Shared/PackageName/CompanyName/ProjectName/ProjectNameErrorCodes.cs @@ -0,0 +1,6 @@ +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameErrorCodes +{ + public const string Namespace = "ProjectName"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj new file mode 100644 index 000000000..2cccd0944 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName.CompanyName.ProjectName.Domain.csproj @@ -0,0 +1,27 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.Domain + PackageName.CompanyName.ProjectName.Domain + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs new file mode 100644 index 000000000..290e09398 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/IProjectNameBasicRepository.cs @@ -0,0 +1,54 @@ +using LINGYUN.Abp.DataProtection; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Entities; +using Volo.Abp.Specifications; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 基本仓储接口 +/// +/// 实体类型 +/// 实体主键类型 +public interface IProjectNameBasicRepository : IDataProtectionRepository + where TEntity : class, IEntity +{ + /// + /// 获取过滤后的实体数量 + /// + /// + /// + /// + Task GetCountAsync( + ISpecification specification, + CancellationToken cancellationToken = default); + /// + /// 获取过滤后的实体列表(分页) + /// + /// + /// + /// + /// + /// + /// + Task> GetListAsync( + ISpecification specification, + string sorting = nameof(IEntity.Id), + int maxResultCount = 10, + int skipCount = 0, + CancellationToken cancellationToken = default); + /// + /// 获取过滤后的实体列表 + /// + /// + /// + /// + /// + /// + Task> GetListAsync( + ISpecification specification, + string sorting = nameof(IEntity.Id), + int maxResultCount = 10, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs new file mode 100644 index 000000000..a18947c6c --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDbProperties.cs @@ -0,0 +1,11 @@ +namespace PackageName.CompanyName.ProjectName; + +public static class ProjectNameDbProperties +{ + public static string DbTablePrefix { get; set; } = "ProjectName_"; + + public static string DbSchema { get; set; } = null; + + + public const string ConnectionStringName = "ProjectName"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs new file mode 100644 index 000000000..79c7af553 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainMapperProfile.cs @@ -0,0 +1,11 @@ +using AutoMapper; + +namespace PackageName.CompanyName.ProjectName; + +public class ProjectNameDomainMapperProfile : Profile +{ + public ProjectNameDomainMapperProfile() + { + + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs new file mode 100644 index 000000000..401aa849e --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/ProjectNameDomainModule.cs @@ -0,0 +1,45 @@ +using LINGYUN.Abp.DataProtection; +using Microsoft.Extensions.DependencyInjection; +using PackageName.CompanyName.ProjectName.ObjectExtending; +using Volo.Abp.AutoMapper; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.Modularity; +using Volo.Abp.ObjectExtending.Modularity; +using Volo.Abp.Threading; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAutoMapperModule), + typeof(AbpDataProtectionModule), + typeof(ProjectNameDomainSharedModule))] +public class ProjectNameDomainModule : AbpModule +{ + private static readonly OneTimeRunner OneTimeRunner = new(); + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAutoMapperObjectMapper(); + + Configure(options => + { + options.AddProfile(validate: true); + }); + + Configure(options => + { + }); + } + + public override void PostConfigureServices(ServiceConfigurationContext context) + { + OneTimeRunner.Run(() => + { + // 扩展实体配置 + //ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToEntity( + // ProjectNameModuleExtensionConsts.ModuleName, + // ProjectNameModuleExtensionConsts.EntityNames.Entity, + // typeof(Entity) + //); + }); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs new file mode 100644 index 000000000..cdfdef118 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettingDefinitionProvider.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Settings; + +namespace PackageName.CompanyName.ProjectName.Settings; + +public class ProjectNameSettingDefinitionProvider : SettingDefinitionProvider +{ + public override void Define(ISettingDefinitionContext context) + { + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs new file mode 100644 index 000000000..deb0b7b71 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/PackageName/CompanyName/ProjectName/Settings/ProjectNameSettings.cs @@ -0,0 +1,6 @@ +namespace PackageName.CompanyName.ProjectName.Settings; + +public static class ProjectNameSettings +{ + public const string GroupName = "ProjectName"; +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs new file mode 100644 index 000000000..fd7a017ea --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.Domain/System/Linq/Expressions/ExpressionFuncExtensions.cs @@ -0,0 +1,32 @@ +using Volo.Abp.Specifications; + +namespace System.Linq.Expressions; + +internal static class ExpressionFuncExtensions +{ + public static Expression> AndIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.And(first, second); + } + + return first; + } + + public static Expression> OrIf( + this Expression> first, + bool condition, + Expression> second) + { + if (condition) + { + return ExpressionFuncExtender.Or(first, second); + } + + return first; + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj new file mode 100644 index 000000000..05ba83db3 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName.CompanyName.ProjectName.EntityFrameworkCore.csproj @@ -0,0 +1,37 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.EntityFrameworkCore + PackageName.CompanyName.ProjectName.EntityFrameworkCore + false + false + false + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs new file mode 100644 index 000000000..2d68cf660 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/EfCoreProjectNameRepository.cs @@ -0,0 +1,77 @@ +using LINGYUN.Abp.DataProtection; +using LINGYUN.Abp.DataProtection.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Entities; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Specifications; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; +/// +/// 实现基本接口 +/// +/// 实体类型 +/// 实体主键类型 +public abstract class EfCoreProjectNameRepository : + EfCoreDataProtectionRepository, + IProjectNameBasicRepository + where TEntity : class, IEntity +{ + protected EfCoreProjectNameRepository( + IDbContextProvider dbContextProvider, + IDataAuthorizationService dataAuthorizationService, + IEntityTypeFilterBuilder entityTypeFilterBuilder) + : base(dbContextProvider, dataAuthorizationService, entityTypeFilterBuilder) + { + } + + public async virtual Task GetCountAsync( + ISpecification specification, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(specification.ToExpression()) + .CountAsync(GetCancellationToken(cancellationToken)); + } + + public async virtual Task> GetListAsync( + ISpecification specification, + string sorting = nameof(IEntity.Id), + int maxResultCount = 10, + int skipCount = 0, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(specification.ToExpression()) + .OrderBy(GetSortingOrDefault(sorting)) + .PageBy(skipCount, maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + public async virtual Task> GetListAsync( + ISpecification specification, + string sorting = nameof(IEntity.Id), + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(specification.ToExpression()) + .OrderBy(GetSortingOrDefault(sorting)) + .Take(maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + + protected virtual string GetSortingOrDefault(string sorting = nameof(IEntity.Id)) + { + if (sorting.IsNullOrWhiteSpace()) + { + return nameof(IEntity.Id); + } + return sorting; + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs new file mode 100644 index 000000000..c39c2923e --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/IProjectNameDbContext.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] +public interface IProjectNameDbContext : IEfCoreDbContext +{ +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs new file mode 100644 index 000000000..5cb2c015b --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContext.cs @@ -0,0 +1,21 @@ +using LINGYUN.Abp.DataProtection.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Data; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[ConnectionStringName(ProjectNameDbProperties.ConnectionStringName)] +public class ProjectNameDbContext : AbpDataProtectionDbContext, IProjectNameDbContext +{ + public ProjectNameDbContext( + DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.ConfigureProjectName(); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs new file mode 100644 index 000000000..d9ffcb9ca --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextFactory.cs @@ -0,0 +1,49 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.Extensions.Configuration; +using System.IO; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; +public class ProjectNameDbContextFactory : IDesignTimeDbContextFactory +{ + public ProjectNameDbContext CreateDbContext(string[] args) + { + var configuration = BuildConfiguration(); + var connectionString = configuration.GetConnectionString("ProjectName"); + + DbContextOptionsBuilder builder = null; + +#if MySQL + builder = new DbContextOptionsBuilder() + .UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); +#elif SqlServer + builder = new DbContextOptionsBuilder() + .UseSqlServer(connectionString); +#elif Sqlite + builder = new DbContextOptionsBuilder() + .UseSqlite(connectionString); +#elif Oracle + builder = new DbContextOptionsBuilder() + .UseOracle(connectionString); +#elif OracleDevart + builder = (DbContextOptionsBuilder) new DbContextOptionsBuilder() + .UseOracle(connectionString); +#elif PostgreSql + builder = new DbContextOptionsBuilder() + .UseNpgsql(connectionString); +#endif + + return new ProjectNameDbContext(builder!.Options); + } + + private static IConfigurationRoot BuildConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../PackageName.CompanyName.ProjectName.DbMigrator/")) + .AddJsonFile("appsettings.json", optional: false) + .AddJsonFile("appsettings.Development.json", optional: true); + + return builder.Build(); + } +} + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs new file mode 100644 index 000000000..726b4ec9a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbContextModelCreatingExtensions.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; +using System; +using Volo.Abp; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public static class ProjectNameDbContextModelCreatingExtensions +{ + public static void ConfigureProjectName( + this ModelBuilder builder, + Action optionsAction = null) + { + Check.NotNull(builder, nameof(builder)); + + var options = new ProjectNameModelBuilderConfigurationOptions( + ProjectNameDbProperties.DbTablePrefix, + ProjectNameDbProperties.DbSchema + ); + optionsAction?.Invoke(options); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs new file mode 100644 index 000000000..74a4a39bc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationEventHandler.cs @@ -0,0 +1,36 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DistributedLocking; +using Volo.Abp.EntityFrameworkCore.Migrations; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public class ProjectNameDbMigrationEventHandler : EfCoreDatabaseMigrationEventHandlerBase +{ + protected IDataSeeder DataSeeder { get; } + + public ProjectNameDbMigrationEventHandler( + IDataSeeder dataSeeder, + ITenantStore tenantStore, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory) + : base( + ConnectionStringNameAttribute.GetConnStringName(), + currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory) + { + DataSeeder = dataSeeder; + } + + protected async override Task SeedAsync(Guid? tenantId) + { + await DataSeeder.SeedAsync(tenantId); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs new file mode 100644 index 000000000..70d5d69e8 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameDbMigrationService.cs @@ -0,0 +1,58 @@ +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Saas.Tenants; +using Microsoft.Extensions.Logging; +using System; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DistributedLocking; +using Volo.Abp.EventBus.Distributed; +using Volo.Abp.MultiTenancy; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public class ProjectNameDbMigrationService : EfCoreRuntimeDbMigratorBase, ITransientDependency +{ + protected IDataSeeder DataSeeder { get; } + protected IDbSchemaMigrator DbSchemaMigrator { get; } + protected ITenantRepository TenantRepository { get; } + + public ProjectNameDbMigrationService( + IDataSeeder dataSeeder, + IDbSchemaMigrator dbSchemaMigrator, + ITenantRepository tenantRepository, + ICurrentTenant currentTenant, + IUnitOfWorkManager unitOfWorkManager, + IServiceProvider serviceProvider, + IAbpDistributedLock abpDistributedLock, + IDistributedEventBus distributedEventBus, + ILoggerFactory loggerFactory) + : base( + ConnectionStringNameAttribute.GetConnStringName(), + unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory) + { + DataSeeder = dataSeeder; + DbSchemaMigrator = dbSchemaMigrator; + TenantRepository = tenantRepository; + } + + protected async override Task LockAndApplyDatabaseMigrationsAsync() + { + await base.LockAndApplyDatabaseMigrationsAsync(); + + var tenants = await TenantRepository.GetListAsync(); + foreach (var tenant in tenants.Where(x => x.IsActive)) + { + await LockAndApplyDatabaseWithTenantMigrationsAsync(tenant.Id); + } + } + + protected async override Task SeedAsync() + { + Logger.LogInformation($"Executing {(!CurrentTenant.IsAvailable ? "host" : CurrentTenant.Name ?? CurrentTenant.GetId().ToString())} database seed..."); + + await DataSeeder.SeedAsync(CurrentTenant.Id); + } +} \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs new file mode 100644 index 000000000..90b369745 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEfCoreQueryableExtensions.cs @@ -0,0 +1,6 @@ +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public static class ProjectNameEfCoreQueryableExtensions +{ + // 在此聚合仓储服务的扩展方法 +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs new file mode 100644 index 000000000..b18f43183 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreModule.cs @@ -0,0 +1,76 @@ +using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.DataProtection.EntityFrameworkCore; +using LINGYUN.Abp.Saas.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; +#if MySQL +using Volo.Abp.EntityFrameworkCore.MySQL; +#elif SqlServer +using Volo.Abp.EntityFrameworkCore.SqlServer; +using Microsoft.EntityFrameworkCore.Infrastructure; +#elif Sqlite +using Volo.Abp.EntityFrameworkCore.Sqlite; +#elif Oracle +using Volo.Abp.EntityFrameworkCore.Oracle; +#elif OracleDevart +using Volo.Abp.EntityFrameworkCore.Oracle.Devart; +#elif PostgreSql +using Volo.Abp.EntityFrameworkCore.PostgreSql; +#endif + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[DependsOn( + typeof(ProjectNameDomainModule), + typeof(AbpDataDbMigratorModule), + typeof(AbpDataProtectionEntityFrameworkCoreModule), +#if MySQL + typeof(AbpEntityFrameworkCoreMySQLModule), +#elif SqlServer + typeof(AbpEntityFrameworkCoreSqlServerModule), +#elif Sqlite + typeof(AbpEntityFrameworkCoreSqliteModule), +#elif Oracle + typeof(AbpEntityFrameworkCoreOracleModule), +#elif OracleDevart + typeof(AbpEntityFrameworkCoreOracleDevartModule), +#elif PostgreSql + typeof(AbpEntityFrameworkCorePostgreSqlModule), +#endif + typeof(AbpSaasEntityFrameworkCoreModule))] +public class ProjectNameEntityFrameworkCoreModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + // 配置Ef + Configure(options => + { +#if MySQL + options.UseMySQL(); + options.UseMySQL(); +#elif SqlServer + options.UseSqlServer(); + options.UseSqlServer(builder => + { + // see https://learn.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-compatibility-level?view=sql-server-ver16 + // builder.UseCompatibilityLevel(150); + }); +#elif Sqlite + options.UseSqlite(); + options.UseSqlite(); +#elif Oracle || OracleDevart + options.UseOracle(); + options.UseOracle(); +#elif PostgreSql + options.UseNpgsql(); + options.UseNpgsql(); +#endif + }); + + context.Services.AddAbpDbContext(options => + { + options.AddDefaultRepositories(); + }); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs new file mode 100644 index 000000000..5849eb902 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.EntityFrameworkCore/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameModelBuilderConfigurationOptions.cs @@ -0,0 +1,17 @@ +using JetBrains.Annotations; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public class ProjectNameModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions +{ + public ProjectNameModelBuilderConfigurationOptions( + [NotNull] string tablePrefix = "", + [CanBeNull] string schema = null) + : base( + tablePrefix, + schema) + { + + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj new file mode 100644 index 000000000..30cf00fd9 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName.CompanyName.ProjectName.HttpApi.Client.csproj @@ -0,0 +1,24 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0 + PackageName.CompanyName.ProjectName.HttpApi.Client + PackageName.CompanyName.ProjectName.HttpApi.Client + false + false + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs new file mode 100644 index 000000000..831ba468a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi.Client/PackageName/CompanyName/ProjectName/ProjectNameHttpApiClientModule.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpHttpClientModule), + typeof(ProjectNameApplicationContractsModule))] +public class ProjectNameHttpApiClientModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddStaticHttpClientProxies( + typeof(ProjectNameApplicationContractsModule).Assembly, + ProjectNameRemoteServiceConsts.RemoteServiceName); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj new file mode 100644 index 000000000..0f2375f61 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName.CompanyName.ProjectName.HttpApi.csproj @@ -0,0 +1,25 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.HttpApi + PackageName.CompanyName.ProjectName.HttpApi + false + false + false + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs new file mode 100644 index 000000000..7345f99ea --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameControllerBase.cs @@ -0,0 +1,12 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Volo.Abp.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameControllerBase : AbpControllerBase +{ + protected ProjectNameControllerBase() + { + LocalizationResource = typeof(ProjectNameResource); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs new file mode 100644 index 000000000..41cfe834a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameDynamicQueryableControllerBase.cs @@ -0,0 +1,17 @@ +using LINGYUN.Abp.Dynamic.Queryable; +using PackageName.CompanyName.ProjectName.Localization; + +namespace PackageName.CompanyName.ProjectName; +/// +/// 提供动态查询控制器实现 +/// +/// 实体dto类型 +public abstract class ProjectNameDynamicQueryableControllerBase : DynamicQueryableControllerBase +{ + protected ProjectNameDynamicQueryableControllerBase( + IDynamicQueryableAppService service) + : base(service) + { + LocalizationResource = typeof(ProjectNameResource); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs new file mode 100644 index 000000000..3a68e60da --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.HttpApi/PackageName/CompanyName/ProjectName/ProjectNameHttpApiModule.cs @@ -0,0 +1,42 @@ +using PackageName.CompanyName.ProjectName.Localization; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.Localization; +using Volo.Abp.Modularity; +using Volo.Abp.Validation.Localization; +using LINGYUN.Abp.Dynamic.Queryable; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAspNetCoreMvcModule), + typeof(ProjectNameApplicationContractsModule), + typeof(AbpDynamicQueryableHttpApiModule))] +public class ProjectNameHttpApiModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameHttpApiModule).Assembly); + }); + + PreConfigure(options => + { + options.AddAssemblyResource( + typeof(ProjectNameResource), + typeof(ProjectNameApplicationContractsModule).Assembly); + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.Resources + .Get() + .AddBaseTypes(typeof(AbpValidationResource)); + }); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj new file mode 100644 index 000000000..51af57d0b --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName.CompanyName.ProjectName.SettingManagement.csproj @@ -0,0 +1,27 @@ + + + + + + + net8.0 + PackageName.CompanyName.ProjectName.SettingManagement + PackageName.CompanyName.ProjectName.SettingManagement + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs new file mode 100644 index 000000000..dff74dddb --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/IProjectNameSettingAppService.cs @@ -0,0 +1,7 @@ +using LINGYUN.Abp.SettingManagement; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +public interface IProjectNameSettingAppService : ISettingAppService, IUserSettingAppService +{ +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs new file mode 100644 index 000000000..4fab9bdd6 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingAppService.cs @@ -0,0 +1,106 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Authorization; +using PackageName.CompanyName.ProjectName.Permissions; +using PackageName.CompanyName.ProjectName.Localization; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Features; +using Volo.Abp.MultiTenancy; +using Volo.Abp.SettingManagement; +using Volo.Abp.Settings; +using Volo.Abp.Users; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +public class ProjectNameSettingAppService : ApplicationService, IProjectNameSettingAppService +{ + protected ISettingManager SettingManager { get; } + protected ISettingDefinitionManager SettingDefinitionManager { get; } + + public ProjectNameSettingAppService( + ISettingManager settingManager, + ISettingDefinitionManager settingDefinitionManager) + { + SettingManager = settingManager; + SettingDefinitionManager = settingDefinitionManager; + LocalizationResource = typeof(ProjectNameResource); + } + + public virtual async Task GetAllForCurrentTenantAsync() + { + return await GetAllForProviderAsync(TenantSettingValueProvider.ProviderName, CurrentTenant.GetId().ToString()); + } + + [Authorize] + public virtual async Task GetAllForCurrentUserAsync() + { + return await GetAllForProviderAsync(UserSettingValueProvider.ProviderName, CurrentUser.GetId().ToString()); + } + + public virtual async Task GetAllForGlobalAsync() + { + return await GetAllForProviderAsync(GlobalSettingValueProvider.ProviderName, null); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + if (CurrentTenant.IsAvailable) + { + foreach (var setting in input.Settings) + { + await SettingManager.SetForTenantAsync(CurrentTenant.GetId(), setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + } + + [Authorize] + public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + foreach (var setting in input.Settings) + { + await SettingManager.SetForCurrentUserAsync(setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + public virtual async Task SetGlobalAsync(UpdateSettingsDto input) + { + // 增加特性检查 + await CheckFeatureAsync(); + + foreach (var setting in input.Settings) + { + await SettingManager.SetGlobalAsync(setting.Name, setting.Value); + } + + await CurrentUnitOfWork.SaveChangesAsync(); + } + + + protected virtual async Task CheckFeatureAsync() + { + await FeatureChecker.CheckEnabledAsync(SettingManagementFeatures.Enable); + } + + protected virtual async Task GetAllForProviderAsync(string providerName, string providerKey) + { + var settingGroups = new SettingGroupResult(); + + //TODO: 当前项目所有配置项在此定义返回 + + await Task.CompletedTask; + + return settingGroups; + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs new file mode 100644 index 000000000..2c045ba59 --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingController.cs @@ -0,0 +1,69 @@ +using Asp.Versioning; +using LINGYUN.Abp.SettingManagement; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PackageName.CompanyName.ProjectName.Permissions; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +[RemoteService(Name = ProjectNameRemoteServiceConsts.RemoteServiceName)] +[ApiVersion("2.0")] +[Area(ProjectNameRemoteServiceConsts.ModuleName)] +[Route("api/ProjectName/settings")] +public class ProjectNameSettingController : AbpController, IProjectNameSettingAppService +{ + private readonly IProjectNameSettingAppService _settingAppService; + public ProjectNameSettingController(IProjectNameSettingAppService settingAppService) + { + _settingAppService = settingAppService; + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + [HttpPut] + [Route("by-current-tenant")] + public virtual async Task SetCurrentTenantAsync(UpdateSettingsDto input) + { + await _settingAppService.SetCurrentTenantAsync(input); + } + + [HttpGet] + [Route("by-current-tenant")] + public virtual async Task GetAllForCurrentTenantAsync() + { + return await _settingAppService.GetAllForCurrentTenantAsync(); + } + + [Authorize] + [HttpPut] + [Route("by-current-user")] + public virtual async Task SetCurrentUserAsync(UpdateSettingsDto input) + { + await _settingAppService.SetCurrentTenantAsync(input); + } + + [Authorize] + [HttpGet] + [Route("by-current-user")] + public virtual async Task GetAllForCurrentUserAsync() + { + return await _settingAppService.GetAllForCurrentTenantAsync(); + } + + [Authorize(ProjectNamePermissions.ManageSettings)] + [HttpPut] + [Route("by-global")] + public virtual async Task SetGlobalAsync(UpdateSettingsDto input) + { + await _settingAppService.SetGlobalAsync(input); + } + + [HttpGet] + [Route("by-global")] + public virtual async Task GetAllForGlobalAsync() + { + return await _settingAppService.GetAllForGlobalAsync(); + } +} diff --git a/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs new file mode 100644 index 000000000..914707f4a --- /dev/null +++ b/aspnet-core/templates/micro/content/src/PackageName.CompanyName.ProjectName.SettingManagement/PackageName/CompanyName/ProjectName/SettingManagement/ProjectNameSettingManagementModule.cs @@ -0,0 +1,22 @@ +using LINGYUN.Abp.SettingManagement; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; +using Volo.Abp.SettingManagement; + +namespace PackageName.CompanyName.ProjectName.SettingManagement; + +[DependsOn( + typeof(AbpSettingManagementApplicationContractsModule), + typeof(AbpAspNetCoreMvcModule), + typeof(AbpSettingManagementDomainModule))] +public class ProjectNameSettingManagementModule : AbpModule +{ + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(mvcBuilder => + { + mvcBuilder.AddApplicationPartIfNotExists(typeof(ProjectNameSettingManagementModule).Assembly); + }); + } +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj new file mode 100644 index 000000000..7aefab82c --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName.CompanyName.ProjectName.Application.Tests.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs new file mode 100644 index 000000000..f5ae45141 --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestBase.cs @@ -0,0 +1,5 @@ +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameApplicationTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs new file mode 100644 index 000000000..7e9fa658a --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Application.Tests/PackageName/CompanyName/ProjectName/ProjectNameApplicationTestModule.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(ProjectNameDomainTestModule), + typeof(ProjectNameApplicationModule) + )] +public class ProjectNameApplicationTestModule : AbpModule +{ +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj new file mode 100644 index 000000000..5ca01ede0 --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName.CompanyName.ProjectName.Domain.Tests.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + + false + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs new file mode 100644 index 000000000..471e0adf8 --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestBase.cs @@ -0,0 +1,5 @@ +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameDomainTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs new file mode 100644 index 000000000..f4a8a9d16 --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.Domain.Tests/PackageName/CompanyName/ProjectName/ProjectNameDomainTestModule.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(ProjectNameTestBaseModule), + typeof(ProjectNameDomainModule) + )] +public class ProjectNameDomainTestModule : AbpModule +{ +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj new file mode 100644 index 000000000..cb9c91e1f --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + + false + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs new file mode 100644 index 000000000..738149b6f --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestBase.cs @@ -0,0 +1,5 @@ +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +public abstract class ProjectNameEntityFrameworkCoreTestBase : ProjectNameTestBase +{ +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs new file mode 100644 index 000000000..da8ce7c6c --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.EntityFrameworkCore.Tests/PackageName/CompanyName/ProjectName/EntityFrameworkCore/ProjectNameEntityFrameworkCoreTestModule.cs @@ -0,0 +1,38 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName.EntityFrameworkCore; + +[DependsOn( + typeof(ProjectNameTestBaseModule), + typeof(ProjectNameEntityFrameworkCoreModule) + )] +public class ProjectNameEntityFrameworkCoreTestModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddEntityFrameworkInMemoryDatabase(); + + var databaseName = Guid.NewGuid().ToString(); + + Configure(options => + { + options.Configure(abpDbContextConfigurationContext => + { + abpDbContextConfigurationContext.DbContextOptions.EnableDetailedErrors(); + abpDbContextConfigurationContext.DbContextOptions.EnableSensitiveDataLogging(); + + abpDbContextConfigurationContext.DbContextOptions.UseInMemoryDatabase(databaseName); + }); + }); + + Configure(options => + { + options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions + }); + } +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj new file mode 100644 index 000000000..ae4b6d5bf --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName.CompanyName.ProjectName.TestBase.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + + false + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs new file mode 100644 index 000000000..08aeffccb --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBase.cs @@ -0,0 +1,58 @@ +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Modularity; +using Volo.Abp.Testing; +using Volo.Abp.Uow; + +namespace PackageName.CompanyName.ProjectName; + +public abstract class ProjectNameTestBase : AbpIntegratedTest + where TStartupModule : IAbpModule +{ + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + protected virtual Task WithUnitOfWorkAsync(Func func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func action) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + await action(); + + await uow.CompleteAsync(); + } + } + } + + protected virtual Task WithUnitOfWorkAsync(Func> func) + { + return WithUnitOfWorkAsync(new AbpUnitOfWorkOptions(), func); + } + + protected virtual async Task WithUnitOfWorkAsync(AbpUnitOfWorkOptions options, Func> func) + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(options)) + { + var result = await func(); + await uow.CompleteAsync(); + return result; + } + } + } +} diff --git a/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs new file mode 100644 index 000000000..4564d29b6 --- /dev/null +++ b/aspnet-core/templates/micro/content/tests/PackageName.CompanyName.ProjectName.TestBase/PackageName/CompanyName/ProjectName/ProjectNameTestBaseModule.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; +using Volo.Abp.Authorization; +using Volo.Abp.Autofac; +using Volo.Abp.Features; +using Volo.Abp.MemoryDb; +using Volo.Abp.Modularity; + +namespace PackageName.CompanyName.ProjectName; + +[DependsOn( + typeof(AbpAutofacModule), + typeof(AbpTestBaseModule), + typeof(AbpAuthorizationModule), + typeof(AbpFeaturesModule), + typeof(AbpMemoryDbModule) + )] +public class ProjectNameTestBaseModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAlwaysAllowAuthorization(); + } +} diff --git a/common.props b/common.props index 0a038b782..119cc175a 100644 --- a/common.props +++ b/common.props @@ -12,7 +12,7 @@ https://github.com/colinin/abp-next-admin true - + diff --git a/docs/startup-aio-readme.en.md b/docs/startup-aio-readme.en.md new file mode 100644 index 000000000..6a3871599 --- /dev/null +++ b/docs/startup-aio-readme.en.md @@ -0,0 +1,401 @@ +# Monolithic Service Startup Guide + +English | [简体中文](startup-aio-readme.md) + +## Table of Contents + +- [Quick Start with CLI](#quick-start-with-cli) + - [Requirements](#cli-requirements) + - [Install CLI Tool](#install-cli-tool) + - [Create Project](#create-project) + - [Run Project](#run-project) +- [Source Code Startup](#source-code-startup) + - [Requirements](#requirements) + - [Project Compilation](#project-compilation) + - [Environment Configuration](#environment-configuration) + - [Required Configuration](#required-configuration) + - [Optional Configuration](#optional-configuration) + - [Database Initialization](#database-initialization) + - [Service Startup](#service-startup) + - [Configuration Details](#configuration-details) +- [Common Issues](#common-issues) + +## Quick Start with CLI + +### CLI Requirements + +- .NET 8.0 SDK +- Database (support any of the following): + - MySQL + - SQL Server + - SQLite + - Oracle + - Oracle Devart + - PostgreSQL +- Redis + +### Install CLI Tool + +```bash +dotnet tool install --global LINGYUN.Abp.Cli +``` + +### Create Project + +```bash +# Short name: laa (LINGYUN Abp AllInOne) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t laa -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +Parameter Description: +- `-pk` or `--package-name`: Package name +- `-t` or `--template`: Template type, use `laa` for All-in-One template +- `-o` or `--output`: Output directory +- `--dbms`: Database type, supports MySql, SqlServer, Sqlite, Oracle, OracleDevart, PostgreSql +- `--cs`: Database connection string +- `--no-random-port`: Do not use random port + +### Run Project + +After creating the project, navigate to the project directory: + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## Source Code Startup + +### Requirements + +- .NET 8.0 SDK +- Database (support any of the following): + - PostgreSQL + - MySQL + - SQL Server (coming soon) +- Redis +- Docker (optional) + +### Project Compilation + +1. Ensure .NET 8.0 SDK is installed +2. Execute the following command in the project root directory to compile the entire project: + +```shell +./build/build-aspnetcore-release.ps1 +``` + +3. Open the `LY.MicroService.Applications.Single` solution in your IDE for debugging or publishing + +### Environment Configuration + +#### Required Configuration + +#### 1. Database Configuration + +Multiple databases are supported. Here are configuration examples for each: + +##### PostgreSQL + +```shell +# Start PostgreSQL using Docker +docker run -d --name postgres \ + -p 5432:5432 \ + -e POSTGRES_PASSWORD=postgres \ + -e PGDATA=/var/lib/postgresql/data \ + postgres:latest +``` + +##### MySQL + +```shell +# Start MySQL using Docker +docker run -d --name mysql \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=mysql \ + mysql:latest +``` + +Create database: + +```sql +CREATE DATABASE `Platform-V70`; +``` + +##### SQL Server (coming soon) + +```shell +# Start SQL Server using Docker +docker run -d --name sqlserver \ + -p 1433:1433 \ + -e "ACCEPT_EULA=Y" \ + -e "SA_PASSWORD=yourStrong(!)Password" \ + mcr.microsoft.com/mssql/server:latest +``` + +#### 2. Configuration File Modification + +Modify the database connection strings in the following configuration files according to your chosen database: + +- `migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json` +- `LY.MicroService.Applications.Single/appsettings.Development.json` + +Database connection string examples: + +PostgreSQL: + +```json +{ + "ConnectionStrings": { + "Default": "Host=127.0.0.1;Database=Platform-V70;Username=postgres;Password=123456;" + } +} +``` + +MySQL: + +```json +{ + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" + } +} +``` + +SQL Server (coming soon): + +```json +{ + "ConnectionStrings": { + "Default": "Server=localhost,1433;Database=Platform-V70;User Id=sa;Password=yourStrong(!)Password;TrustServerCertificate=True" + } +} +``` + +#### 3. Redis Service + +```shell +# Start Redis using Docker +docker run -d --name redis -p 6379:6379 redis:latest +``` + +Redis configuration example: + +```json +{ + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=14" + } + }, + "Redis": { + "IsEnabled": true, + "Configuration": "127.0.0.1,defaultDatabase=15", + "InstanceName": "LINGYUN.Abp.Application" + }, + "Features": { + "Validation": { + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=13", + "InstanceName": "LINGYUN.Abp.Application" + } + } + } +} +``` + +### Optional Configuration + +The following configurations are applicable for monolithic distributed architecture: + +#### 1. MinIO Distributed File Storage + +```json +{ + "Minio": { + "WithSSL": false, + "BucketName": "blobs", + "EndPoint": "127.0.0.1:19000", + "AccessKey": "{AccessKey}", + "SecretKey": "{SecretKey}", + "CreateBucketIfNotExists": false + } +} +``` + +#### 2. Elasticsearch Distributed Audit Logging + +```json +{ + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + } +} +``` + +### Database Initialization + +1. Run database migration script: + +Option 1 (Recommended): + +```shell +./aspnet-core/migrations/Migrate.ps1 +``` + +Follow the command line prompts to generate migration files and SQL scripts, then execute the SQL scripts to create database tables + +Option 2: +Taking PostgreSQL as an example: + +- Modify database connection information in `LY.MicroService.Applications.Single.DbMigrator/appsettings.PostgreSql.json` +- Navigate to `LY.MicroService.Applications.Single.EntityFrameworkCore.PostgreSql` project +- Run `dotnet ef database update` +- Wait for migration completion + +2. Configure data initialization: + + - Modify database connection information in `LY.MicroService.Applications.Single.DbMigrator/appsettings.json` + - Ensure the correct database provider is selected + +3. Execute data migration: + - Run the `LY.MicroService.Applications.Single.DbMigrator` project + - Wait for migration to complete, basic table data will be initialized + +### Service Startup + +1. Run the `LY.MicroService.Applications.Single` project +2. Access Swagger API documentation in your browser: + - URL: http://127.0.0.1:30000/swagger + +### Configuration Details + +#### 1. Basic Configuration + +#### Application Configuration + +```json +{ + "App": { + "ShowPii": true, + "SelfUrl": "http://127.0.0.1:30001/", + "CorsOrigins": "http://127.0.0.1:3100,http://127.0.0.1:30001" + } +} +``` + +#### Distributed Cache Configuration + +```json +{ + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + } +} +``` + +### 2. Authentication Configuration + +#### OpenIddict Configuration + +```json +{ + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + } + }, + "Lifetime": { + "AccessToken": "14:00:00", + "IdentityToken": "00:20:00", + "RefreshToken": "14:00:00" + } + } +} +``` + +#### Identity Authentication Configuration + +```json +{ + "Identity": { + "Password": { + "RequiredLength": 6, + "RequireNonAlphanumeric": false, + "RequireLowercase": false, + "RequireUppercase": false, + "RequireDigit": false + }, + "Lockout": { + "AllowedForNewUsers": false, + "LockoutDuration": 5, + "MaxFailedAccessAttempts": 5 + }, + "SignIn": { + "RequireConfirmedEmail": false, + "RequireConfirmedPhoneNumber": false + } + } +} +``` + +### 3. Feature Management Configuration + +```json +{ + "FeatureManagement": { + "IsDynamicStoreEnabled": true + }, + "SettingManagement": { + "IsDynamicStoreEnabled": true + }, + "PermissionManagement": { + "IsDynamicStoreEnabled": true + } +} +``` + +### 4. Logging Configuration + +```json +{ + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning" + } + }, + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "rollingInterval": "Day" + } + } + ] + } +} +``` + +## Common Issues + +If you encounter problems, please check: + +1. Database connection string is correct +2. Correct database provider is selected +3. Redis connection is working +4. Required ports are not occupied +5. Database migration completed successfully +6. Authentication server configuration is correct +7. CORS configuration is correct (if frontend access has cross-origin issues) diff --git a/docs/startup-aio-readme.md b/docs/startup-aio-readme.md new file mode 100644 index 000000000..d8c7ff4fb --- /dev/null +++ b/docs/startup-aio-readme.md @@ -0,0 +1,412 @@ +# 单体服务启动指南 + +[English](startup-aio-readme.en.md) | 简体中文 + +## 目录 + +- [CLI 快速启动](#cli快速启动) + - [环境要求](#cli环境要求) + - [安装命令行工具](#安装命令行工具) + - [创建项目](#创建项目) + - [运行项目](#运行项目) +- [源码启动](#源码启动) + - [环境要求](#环境要求) + - [项目编译](#项目编译) + - [环境配置](#环境配置) + - [必选配置](#必选配置) + - [可选配置](#可选配置) + - [数据库初始化](#数据库初始化) + - [服务启动](#服务启动) + - [配置说明](#配置说明) +- [常见问题](#常见问题) + +## CLI 快速启动 + +### CLI 环境要求 + +- .NET 8.0 SDK +- 数据库(支持以下任一种): + - MySQL + - SQL Server + - SQLite + - Oracle + - Oracle Devart + - PostgreSQL +- Redis + +### 安装模板 + +```bash +# 安装微服务模板:lam +dotnet new install LINGYUN.Abp.MicroService.Templates + +# 安装单体应用模板:laa +dotnet new install LINGYUN.Abp.AllInOne.Templates +``` + +### 安装 labp 命令行工具 + +```bash + dotnet tool install --global LINGYUN.Abp.Cli +``` + +### 创建项目 + +```bash +# 简写名称:laa (LINGYUN Abp AllInOne) +labp create YourCompanyName.YourProjectName -pk YourPackageName -t laa -o /path/to/output --dbms MySql --cs "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" --no-random-port +``` + +参数说明: + +- `-pk` 或 `--package-name`: 包名 +- `-t` 或 `--template`: 模板类型,使用 `laa` 表示单体应用模板 +- `-o` 或 `--output`: 输出目录 +- `--dbms`: 数据库类型,支持 MySql、SqlServer、Sqlite、Oracle、OracleDevart、PostgreSql +- `--cs`: 数据库连接字符串 +- `--no-random-port`: 不使用随机端口 + +### 运行项目 + +创建项目后,进入项目目录: + +```bash +cd /path/to/output/host/YourPackageName.YourCompanyName.YourProjectName.AIO.Host +dotnet run --launch-profile "YourPackageName.YourCompanyName.YourProjectName.Development" +``` + +## 源码启动 + +### 环境要求 + +- .NET 8.0 SDK +- 数据库(支持以下任一种): + - PostgreSQL + - MySQL + - SQL Server(即将支持) +- Redis +- Docker(可选) + +### 项目编译 + +1. 确保已安装 .NET 8.0 SDK +2. 在项目根目录执行以下命令编译整个项目: + +```shell +./build/build-aspnetcore-release.ps1 +``` + +3. 使用 IDE 打开 `LY.MicroService.Applications.Single` 解决方案进行调试或发布 + +### 环境配置 + +#### 必选配置 + +#### 1. 数据库配置 + +支持多种数据库,以下是各种数据库的配置示例: + +##### PostgreSQL + +```shell +# 使用Docker启动PostgreSQL +docker run -d --name postgres \ + -p 5432:5432 \ + -e POSTGRES_PASSWORD=postgres \ + -e PGDATA=/var/lib/postgresql/data \ + postgres:latest +``` + +##### MySQL + +```shell +# 使用Docker启动MySQL +docker run -d --name mysql \ + -p 3306:3306 \ + -e MYSQL_ROOT_PASSWORD=mysql \ + mysql:latest +``` + +创建数据库: + +```sql +CREATE DATABASE `Platform-V70`; +``` + +##### SQL Server + +```shell +# 使用Docker启动SQL Server +docker run -d --name sqlserver \ + -p 1433:1433 \ + -e "ACCEPT_EULA=Y" \ + -e "SA_PASSWORD=yourStrong(!)Password" \ + mcr.microsoft.com/mssql/server:latest +``` + +#### 2. 配置文件修改 + +需要根据选择的数据库类型修改以下配置文件中的数据库连接字符串: + +- `migrations/LY.MicroService.Applications.Single.DbMigrator/appsettings.json` +- `LY.MicroService.Applications.Single/appsettings.Development.json` + +数据库连接字符串示例: + +PostgreSQL: + +```json +{ + "ConnectionStrings": { + "Default": "Host=127.0.0.1;Database=Platform-V70;Username=postgres;Password=123456;" + } +} +``` + +MySQL: + +```json +{ + "ConnectionStrings": { + "Default": "Server=127.0.0.1;Database=Platform-V70;User Id=root;Password=123456;SslMode=None" + } +} +``` + +SQL Server: + +```json +{ + "ConnectionStrings": { + "Default": "Server=localhost,1433;Database=Platform-V70;User Id=sa;Password=yourStrong(!)Password;TrustServerCertificate=True" + } +} +``` + +#### 3. Redis 服务 + +```shell +# 使用Docker启动Redis +docker run -d --name redis -p 6379:6379 redis:latest +``` + +Redis 配置示例: + +```json +{ + "DistributedLock": { + "IsEnabled": true, + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=14" + } + }, + "Redis": { + "IsEnabled": true, + "Configuration": "127.0.0.1,defaultDatabase=15", + "InstanceName": "LINGYUN.Abp.Application" + }, + "Features": { + "Validation": { + "Redis": { + "Configuration": "127.0.0.1,defaultDatabase=13", + "InstanceName": "LINGYUN.Abp.Application" + } + } + } +} +``` + +### 可选配置 + +以下配置适用于单体分布式架构: + +#### 1. MinIO 分布式文件存储 + +```json +{ + "Minio": { + "WithSSL": false, + "BucketName": "blobs", + "EndPoint": "127.0.0.1:19000", + "AccessKey": "{AccessKey}", + "SecretKey": "{SecretKey}", + "CreateBucketIfNotExists": false + } +} +``` + +#### 2. Elasticsearch 分布式审计日志 + +```json +{ + "Elasticsearch": { + "NodeUris": "http://127.0.0.1:9200" + } +} +``` + +### 数据库初始化 + +1. 运行数据库迁移脚本: + +方案一(推荐): + +```shell +./aspnet-core/migrations/Migrate.ps1 +``` + +根据命令行提示生成迁移文件和 sql 脚本,然后执行 sql 脚本来创建数据表 + +方案二: +以 pgsql 为例 + +- 修改 `LY.MicroService.Applications.Single.DbMigrator/appsettings.PostgreSql.json` 中的数据库连接信息 +- 进入`LY.MicroService.Applications.Single.EntityFrameworkCore.PostgreSql`项目 +- 运行 `dotnet ef database update` +- 等待数据迁移完成 + +2. 配置数据初始化: + + - 修改 `LY.MicroService.Applications.Single.DbMigrator/appsettings.json` 中的数据库连接信息 + - 确保选择了正确的数据库提供程序 + +3. 执行数据迁移: + - 运行 `LY.MicroService.Applications.Single.DbMigrator` 项目 + - 等待数据迁移完成,基础表数据将被初始化 + +### 服务启动 + +1. 运行 `LY.MicroService.Applications.Single` 项目 +2. 在浏览器中访问 Swagger 接口文档: + - URL: http://127.0.0.1:30000/swagger + +### 配置说明 + +#### 基础配置 + +#### 应用程序配置 + +```json +{ + "App": { + "ShowPii": true, + "SelfUrl": "http://127.0.0.1:30001/", + "CorsOrigins": "http://127.0.0.1:3100,http://127.0.0.1:30001" + } +} +``` + +#### 分布式缓存配置 + +```json +{ + "DistributedCache": { + "HideErrors": true, + "KeyPrefix": "LINGYUN.Abp.Application", + "GlobalCacheEntryOptions": { + "SlidingExpiration": "30:00:00", + "AbsoluteExpirationRelativeToNow": "60:00:00" + } + } +} +``` + +### 认证配置 + +#### OpenIddict 配置 + +```json +{ + "OpenIddict": { + "Applications": { + "VueAdmin": { + "ClientId": "vue-admin-client", + "RootUrl": "http://127.0.0.1:3100/" + } + }, + "Lifetime": { + "AccessToken": "14:00:00", + "IdentityToken": "00:20:00", + "RefreshToken": "14:00:00" + } + } +} +``` + +#### 身份认证配置 + +```json +{ + "Identity": { + "Password": { + "RequiredLength": 6, + "RequireNonAlphanumeric": false, + "RequireLowercase": false, + "RequireUppercase": false, + "RequireDigit": false + }, + "Lockout": { + "AllowedForNewUsers": false, + "LockoutDuration": 5, + "MaxFailedAccessAttempts": 5 + }, + "SignIn": { + "RequireConfirmedEmail": false, + "RequireConfirmedPhoneNumber": false + } + } +} +``` + +### 功能开关配置 + +```json +{ + "FeatureManagement": { + "IsDynamicStoreEnabled": true + }, + "SettingManagement": { + "IsDynamicStoreEnabled": true + }, + "PermissionManagement": { + "IsDynamicStoreEnabled": true + } +} +``` + +### 日志配置 + +```json +{ + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "System": "Warning", + "Microsoft": "Warning" + } + }, + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/Info-.log", + "rollingInterval": "Day" + } + } + ] + } +} +``` + +## 常见问题 + +如果遇到问题,请检查: + +1. 数据库连接字符串是否正确 +2. 是否选择了正确的数据库提供程序 +3. Redis 连接是否正常 +4. 必要的端口是否被占用 +5. 数据库迁移是否成功完成 +6. 认证服务器配置是否正确 +7. CORS 配置是否正确(如果前端访问出现跨域问题)