diff --git a/doc/article/article.html b/doc/article/article.html index 63e4133..2003911 100644 --- a/doc/article/article.html +++ b/doc/article/article.html @@ -90,7 +90,8 @@

Creating Application From Template

Event Cloud Project

In this article, I will show key parts of the project and explain it. So, please download the sample project, open in Visual Studio 2013+ and run -migrations just like above before reading rest of the article. I will follow +migrations just like above before reading rest of the article (Be sure that +there is no database named EventCloud before running the migrations). I will follow some DDD (Domain Driven Design) techniques to create domain (business) layer and application layer.

Event Cloud is a free SaaS (multi-tenant) application. We can create a tenant diff --git a/src/EventCloud.Application/EventCloud.Application.csproj b/src/EventCloud.Application/EventCloud.Application.csproj index 1cec9ed..2c0b950 100644 --- a/src/EventCloud.Application/EventCloud.Application.csproj +++ b/src/EventCloud.Application/EventCloud.Application.csproj @@ -115,6 +115,8 @@ + + diff --git a/src/EventCloud.Application/Statistics/IStatisticsAppService.cs b/src/EventCloud.Application/Statistics/IStatisticsAppService.cs new file mode 100644 index 0000000..232ba86 --- /dev/null +++ b/src/EventCloud.Application/Statistics/IStatisticsAppService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Abp.Application.Services; +using Abp.Application.Services.Dto; + +namespace EventCloud.Statistics +{ + public interface IStatisticsAppService : IApplicationService + { + Task> GetStatistics(); + } +} \ No newline at end of file diff --git a/src/EventCloud.Application/Statistics/StatisticsAppService.cs b/src/EventCloud.Application/Statistics/StatisticsAppService.cs new file mode 100644 index 0000000..fc4df96 --- /dev/null +++ b/src/EventCloud.Application/Statistics/StatisticsAppService.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Abp.Application.Services.Dto; +using Abp.Domain.Repositories; +using Abp.Domain.Uow; +using EventCloud.Events; +using EventCloud.MultiTenancy; +using EventCloud.Users; + +namespace EventCloud.Statistics +{ + public class StatisticsAppService : EventCloudAppServiceBase, IStatisticsAppService + { + private readonly IRepository _tenantRepository; + private readonly IRepository _userRepository; + private readonly IRepository _eventRepository; + private readonly IRepository _eventRegistrationRepository; + + public StatisticsAppService( + IRepository tenantRepository, + IRepository userRepository, + IRepository eventRepository, + IRepository eventRegistrationRepository) + { + _tenantRepository = tenantRepository; + _userRepository = userRepository; + _eventRepository = eventRepository; + _eventRegistrationRepository = eventRegistrationRepository; + } + + public async Task> GetStatistics() + { + //Disabled MayHaveTenant filter to access to all tenant's data, not for only current tenant. + using (CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant)) + { + var statisticItems = new List + { + new NameValueDto( + "Tenants", + (await _tenantRepository.CountAsync()).ToString() + ), + new NameValueDto( + "Users", + (await _userRepository.CountAsync()).ToString() + ), + new NameValueDto( + "Events", + (await _eventRepository.CountAsync()).ToString() + ), + new NameValueDto( + "Registrations", + (await _eventRegistrationRepository.CountAsync()).ToString() + ) + }; + + return new ListResultOutput(statisticItems); + } + } + } +} diff --git a/src/EventCloud.EntityFramework/EventCloud.EntityFramework.csproj b/src/EventCloud.EntityFramework/EventCloud.EntityFramework.csproj index 3c35b7d..d9a85cb 100644 --- a/src/EventCloud.EntityFramework/EventCloud.EntityFramework.csproj +++ b/src/EventCloud.EntityFramework/EventCloud.EntityFramework.csproj @@ -136,6 +136,10 @@ 201510210723116_Removed_BirthYear_From_User.cs + + + 201510231926262_UpgradeTo_ModuleZero_0_7_3.cs + @@ -174,6 +178,9 @@ 201510210723116_Removed_BirthYear_From_User.cs + + 201510231926262_UpgradeTo_ModuleZero_0_7_3.cs + diff --git a/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.Designer.cs b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.Designer.cs new file mode 100644 index 0000000..6134326 --- /dev/null +++ b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.Designer.cs @@ -0,0 +1,29 @@ +// +namespace EventCloud.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] + public sealed partial class UpgradeTo_ModuleZero_0_7_3 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(UpgradeTo_ModuleZero_0_7_3)); + + string IMigrationMetadata.Id + { + get { return "201510231926262_UpgradeTo_ModuleZero_0_7_3"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.cs b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.cs new file mode 100644 index 0000000..751a6a3 --- /dev/null +++ b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.cs @@ -0,0 +1,70 @@ +namespace EventCloud.Migrations +{ + using System; + using System.Collections.Generic; + using System.Data.Entity.Infrastructure.Annotations; + using System.Data.Entity.Migrations; + + public partial class UpgradeTo_ModuleZero_0_7_3 : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.AbpFeatures", + c => new + { + Id = c.Long(nullable: false, identity: true), + Name = c.String(nullable: false, maxLength: 128), + Value = c.String(nullable: false, maxLength: 2000), + CreationTime = c.DateTime(nullable: false), + CreatorUserId = c.Long(), + EditionId = c.Int(), + TenantId = c.Int(), + Discriminator = c.String(nullable: false, maxLength: 128), + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo.AbpEditions", t => t.EditionId) + .Index(t => t.EditionId); + + CreateTable( + "dbo.AbpEditions", + c => new + { + Id = c.Int(nullable: false, identity: true), + Name = c.String(nullable: false, maxLength: 32), + DisplayName = c.String(nullable: false, maxLength: 64), + IsDeleted = c.Boolean(nullable: false), + DeleterUserId = c.Long(), + DeletionTime = c.DateTime(), + LastModificationTime = c.DateTime(), + LastModifierUserId = c.Long(), + CreationTime = c.DateTime(nullable: false), + CreatorUserId = c.Long(), + }, + annotations: new Dictionary + { + { "DynamicFilter_Edition_SoftDelete", "EntityFramework.DynamicFilters.DynamicFilterDefinition" }, + }) + .PrimaryKey(t => t.Id); + + AddColumn("dbo.AbpTenants", "EditionId", c => c.Int()); + CreateIndex("dbo.AbpTenants", "EditionId"); + AddForeignKey("dbo.AbpTenants", "EditionId", "dbo.AbpEditions", "Id"); + } + + public override void Down() + { + DropForeignKey("dbo.AbpTenants", "EditionId", "dbo.AbpEditions"); + DropForeignKey("dbo.AbpFeatures", "EditionId", "dbo.AbpEditions"); + DropIndex("dbo.AbpTenants", new[] { "EditionId" }); + DropIndex("dbo.AbpFeatures", new[] { "EditionId" }); + DropColumn("dbo.AbpTenants", "EditionId"); + DropTable("dbo.AbpEditions", + removedAnnotations: new Dictionary + { + { "DynamicFilter_Edition_SoftDelete", "EntityFramework.DynamicFilters.DynamicFilterDefinition" }, + }); + DropTable("dbo.AbpFeatures"); + } + } +} diff --git a/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.resx b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.resx new file mode 100644 index 0000000..04737ff --- /dev/null +++ b/src/EventCloud.EntityFramework/Migrations/201510231926262_UpgradeTo_ModuleZero_0_7_3.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO09224cu5HvC+w/DOYpCZyZkex4TwwpgSzJJ8KxbMHjBIt9MageSmqcnu5Jd48s7SJflod8Un5hyb7yUrz1dUYeGDA0TbJYLBarisUq8t///NfJn5/WweQRx4kfhafTo9liOsGhF6388P50uk3vfv/T9M9/+s//OLlcrZ8mfyvrvab1SMswOZ0+pOnm3XyeeA94jZLZ2vfiKInu0pkXredoFc2PF4s/zo+O5piAmBJYk8nJl22Y+muc/SA/z6PQw5t0i4LraIWDpPhOSpYZ1MkntMbJBnn4dHr5iMP0PIi2q9klAZI+f4hJ4fco/nU6OQt8RDBa4uBuOkFhGKUoJfi++2uCl2kchffLDfmAgq/PG0zq3aEgwcU43tXVbYe0OKZDmtcNS1DeNkmjtSPAo9cFjeZi80aUnlY0JFTMCUVHnVHydHq2Xfnpx+h+OhE7e3cexLQiqXO7mWX1CCvMygavJvTz/+A4elVxw2L2XzPCEK8m59sg3cb4NMTbNEbBq8nN9jbwvV/w89foVxyehtsgYPEimJEy7gP5dBNHGxynz1/wXYHt1Wo6mfPt5mLDqhnTJh/HVZi+fTOdfCKdo9sAV9POjHmZRjH+GYc4Rile3aA0xXFIYeCMcFLvQl9fcYjClOvx9bGpEeHJWEJS32SJ40ffw/RH2Y6wNZme6eQaPX3E4X36cDo9/sPb6eSD/4RX5ZdiwH8NfbKwSaM03mJTX9c4fYhWg3R1g+gKJiRPNF0dLY7fdNDX5RP2tnTOv/r1yC7IrOe/JSaxhHaxjYulynGAI7jzwCcMd7U5W61inOio8bYLWuTdGab46PinDrp6H0ffKb+Hd1Hv7HT5RHUJMxlQT4vFooOurtbkVxKFiMiPBuuZbd5IhpxnwpuwL9KMlfzpPNSTea0ytIrkkuqHKPyAEZX8S5ymWfcGrbLZELWQFcyKlskMhNRe3UzeowQXtCFmwUzAVM9JOUrSpJiW9Sf06N9nw4MBTidfcJCVJw/+pkAMHP+3qsWHOFp/iQIVycuK35bRNvbogo5san9F8T1O2829y2wXTarZ3k9zAuSB7swJg0SmvVssZ0fdc+EnmwA9G/q21DuOfV8lFzggBkBF4/cR4V0Uug8iA9NEFGctlWaBvu1HlKRk3+LfFVzeDkYj9M9jrOna1QyhwCwUmr2goFu2L/jeT9LSTFKLDHZ/R/9MZlLzVxOm0jlZa7XwIBtY+u/HFR4KO8LVsKX0rYH8vPVXzjBA/mnCikPztVaDU8LA+puWfGPZNOG0tlxcad9KVwN1Sn1uiyAdnRo/Fva3vKqAolRDtijgau1MiZyszlJhfyVBoyXVzeL+6qdBF1s+Z+WceLFv3pm96WLDSYVEa4FxlZyj0MNB0N4yISNkl8x5tKX83mYWD0bTXhpNOtktKI9ulAwovhWKqJHsztWIleimVZPs//0V3DvqTj7bpg8UfL6aqknv1YE4ykZ1uY3DMfqlXDvKgG9QknyP4tXwGvtyjfzA7Iy2dds6K7is//MovPPjdXs9x0IrlPCqf893OXtfcIJTQ4+vO+mRasWP0b3fSKVeJWde6j/itsQ+WCcvzjphYIC2SbYL5CrVholYJlklUgXIJNFhx/CJGjuukoAdUwZjx1ZwxU7kBTWKck0BT7ECjKxUyxljKkFgIzTvoCgXscs+K3DKy1wxucHx2k8SpU2cweYqCTgxZTBibAVX7CgYDV5FsYBR9hXGJS9yxaI419EgUtcQcCkLYHSqUleMciNWjU9ZLmCTf4ZxKcpab1YyPjRHvqQPUez/b35uVW9cssb7eWzV87alC39vRl3y7dFfUdE3tMFb9kzI2re968SxtYCyPWFXcK8EqPsDdhnXjrnGiXJUfDQlFm17WOk9rXRK3LaO7N0+9bRcqtmO9L6IH5t1tixfINsNFWbZUdCjI//9DQVbbbfdhKz9qDtb62VbGqZWDu1rshT9rIX3PMtb7rVne4jgBG+cICNVMF8rWdCTHXrwwv3QsqqNF67YJCv8cHKptNUGqnTtiyu6UHjj5FIVjm08crpQ3AI8EHvLl6jw0kXXtvYSFn3o/ISKKip0W/sKtd6n0qMD+J+EIhV+Wh+UtV7vIES989j0s1t6Bu+lhZp4gTb7OPqzM1v6RW1I8+Xktg4AA3eXMjSaBMRZ06ul160PX9tBYPRlcP8cE0ZqbyjvtgSgarUlV2fnUzMQ0Oi+ZHefohPlLH0CKnodHAPqvhq59kaJxho3T2pJye114Ra4Q4TVDv6Fg3/B0b9AJZnKuyCWSRs6qULXnoWsA4VfQSyDses9yifrRbd7ByvAyLbeuZtia7JeFLE1YhmMYpvYGk0MSQZbjiFhPsPoNIghOUuSyPMzBHjfkSJVmx/cZbiaOOVt19aPIrc+25JR7wTB9XT6O4mctj1W2WdSj2IfR1PRwvgc5utkQv3U9IKbc5R4aCVLKELTFf+FGCU4plYBosG4dDvjh6lswfih529Q4DISAYilIUSRrLoTSy7wBofUhnGZQxs8mNMIGZ2qV4GWJtKdzBleNbAwkEiiZCNdVgnDPHkOX4+so0cJ4mc58di0epqxp5pCQzClmhhWrFjm+o7CiFLUsGrK1SHE9XznqtReQCqjjg0wF7PZUTeco8JgALZREdSma8HSHI9zWFtPO8ug4deScyBbcVjOATAYinMAgtp0Lez0xuMcyQTXTrXaHm/JQ0oTflhGUqExFDep6GvTP7QFH5Gv8sQI/aQLWRL6qe7JhoJyMgRMikj5XmwmgBCDMRs3aJtex2crdhOunVFwRz4eg0H7fwEd4ESiP44DyDMU2wGk2A/ey5OYtNMsZDSNx298/pSASH6K0x9zcVQYiq24Ee8HQ1XBQNqplOOCGphEKpgAhwwgfcQhDcUj4rB3nk2AMEbVvOpiGuvJLX3F9ua5JhByMNtcjcMAnKMm7L64CIBAU8NsG9wEjbloVFeBGofhuGiP3QVCOLBhpjUHOo25x/3IpnPmGf6sBaanlUd75MMVVYi2YZZtfEyNWWh8P5MBkeE46kX4msSwesP062xpmKcM1rQqNn8we1oxsOHYqIlNXce5jbf5KqZbu00SQyhaOrmFqItmvNd818V3P9Sei6fhHnCH4oZg1cyargtudQxv7MZSfe1A6IoW/wGYUT9PO+8JkAIOVYyijj6sWcTOAaiBObjVpMJgAMZREXRfdv9SMKh2lg07/0acM+quX4XBUJyzxzt+OEZXO9U2m7dGPDT+xk2LxlDc9CI2bVI4tXbmDSe5EDf1dLKmjOQW0BnqJFdFnqGYseFJLm07Lu8Z9n5g+HxL+TXe3g/ofigG2fG9X57oQNqkpAWO2f1flp54cUvL8BN0DRIRoEXWYwJmIeewyfovoJYvxybTSZ1fUXBA/QytxEM8kPLdOABG5QA3gRC3QSAweadqA1YJyticqiOoda7RLRqX9/CCEIr4LQsweYgHDCVf9gYg9f0eEoxKFxhA5EsAglBKCgMAPi0DAiTm0hgAcplPEjBA2xngqagMUphZu9JCUL0SybSxelZSFDWu2UrVAAHiS3LMNTGJAV6vf9Fq4alkQ0HoCRWAbqYEGdlJpUiRYYdRCAsdaTSZLSIkYRCtSSNmBEB0keqoh6JKMGDHUcg/DUEkKAA1QChNCcCljyoIoPQqyKhDfgV3AkCehL4IICenKqig3yHLg1Dukd3podwV90aUQs+qSAFEfQNY83HfDYbNh2sLAEocuxkxp/wUw1buZWXUod2sOwGgTSgDhcO5GzIUOltBACA0VkaaD451HzQf0yq0L/DrZrC19laMFz5vllGWzpvdRy0dLTMgVFZGg3FDFybKgzfFI3LoayISmTFU5q6GEJoYxB4EHXQvo5IUdipQE1bXjBQDKULxCkglGcyWtCIurNnwh7GRlXdMKsngYAqYop2aEWZIg0C60lJJFgtxqQrQaUaGgYQmG0iiUhWQr1GW8oK30V1NCP5FM9ma7hmBt5MV20ZDDIW831NHUTht+WwA97gspJN6gD7603zZe2zQoaDxo4fSNwEM2lN/KC2jbtCclgQYSGvC56YqKjjoDP0Rqzs9htQW0qGfih52mynl0aA7FQbdTLHnTyoKGFUGdEDlPu4uVUZ5a1R1mFKVncyX3gNeo+LDyZxU8fAm3aKAsB4OkrLgGm02VC/XLYsvk+UGeTSY5vfL6eRpHYTJ6fQhTTfv5vMkA53M1r4XR0l0l868aD1Hq2h+vFj8cX50NF/nMOYex0zi0U/VExGP6B4LpaRrgukHP07SC5SiW0TvoDtfraVq0NGRwhVe9iieDslzVjrJyxb0b/GkapZX+xCT79+j+Nf6SEk+dCvgkLr3a3pel91ZyUy+uilpvPRQgGLgiszzKNiuQ/XRobp1feTHwlAfBKohlUENLBxVoIMayhLHj76H86stWVBcgT28a5w+RCsZHPvdHtoNonOcZjKZhcZ+t4d2+YS9LV3N+UWLLEChqAHMi215eAjCrYvtYZ8HPmHZq031GjMLWSp0hSvPEfvdHtr7OPpO2S68i3hwXIELRanABChZfbaHdbUmv5IoZMMSubULlDeDDq9ruIbDTGUH8VQMCzPFfJehncwFqScFF0hyVtB8ouC2EuviYWBHwh2+EdFd0psA9CPvmbQ0jpvV2WoZLKJP8xqT7FkDxekpD/PCT7zYX/sZt/XBF4Y5vEro35/vfqOZTB7/3+7NNMrC0lVMFs9TsCCKTw7igLs4mBMIXIkjRFg2GqK5e2cnDReBj1rsCys1sgAleQC/6zGoOGioJiqXdbf6ocH8K1vuqgzh7qEX5roucDBg6qvcuWHVnx1w40P4Oez00f0GmKC840vsIcK3v7OQ4RpNeoCJYROXrob+sjRAUwkiO8W7kiVSKGgDqWKGsUOKBTZay9uBOZNVdWWwGk43LooDz+MqirBLPm/K2/vHz1/9NBBYp/jkoouoOQU4JrgCB3goFXVa9sVFe5+j0MNBIOtvpsDBdYeeWLF1Hm2p155z4oE1DvaGGuLB3ngBsjc/FOxI9EKHnhaSF26264KXPotGRlOwdnl4x0KFawy5qVpu41ACUn10M3ZkbOqvLqceSUJ4RaB//dXBkFsjPwCPD/gSFxGetTyPwjs/XsuSXCx1xLVoWaiXlXhKA1dxp+wXnOBUhg8UuwniLBgblvFMkQu1yzfheSqXXw+qVz8fB9X7AlSvMs2isf7NUySbKWFF2340cTcb6Axl8u3RX9HILI5F+SIHSVq0+QU/CzKULdgZPtKHWTVmJDkb1J2pLGDsCHNJhxAwCfbuUFIaQpNzydGmsb0FzDyEzdsG1ecfVWs1lw7wzSh7xFblvSUsBNVdJhkUSTooLofZhzPKOseuQ2WRJfw3MzrgpjuiFrphnx9AmjRkxq4DqpoLo32IlOiRp9tr2i6CgA772hewpsucg46WNJxDYbGiVQ17XNAeEL/CFfQeXNmbGX1w1h2cdT+wUOvUYm5oLQ9pKXdnn7QXPt2HBi7p3X+eKIHKr27C7A5tg1QWZsXng2BUQzwIxr0RjFJWqFil6r34Uv2uskKLjEwuVTSjA038zMafFNmhYopmXmU6Kd3vZLP2nKR4PaMVZsu/B3lyV13hGoX+HU7Sr9GvODydHi+OjqeTs8BHSZ6cWySfvhPvArXKRj16TbNR8Wo9F5u757RSKEmyCoCMVjpNVaRBeauodHnpxXOICPgPfkDW9Ley4rdr9PwX9IhzcU1UkaB/uFYJ/5NILj+EHgb7BT+LHFVyr+6u2ZO52PAEUFT53ZG3/r1P5zFTfD9jwmaICL4blBK8QloRZwOZTj5tgwDd0vznOxQk8lWTSmWW95N1UsPILn01gCjXHY+oGwwu7TQHFD6i2HtA9LJz9PQRh/fpA+HXP7x1Bc2moHYLmU1H1UA+Why/cQUtJKbm0FdkytPst+MkA+mo4GxbAZMyUDVDf+s8cDYZVUfT459cIXN5qd0yApOkqgO8WCxcIUOZqm3WGZyZ2njpswmp/Mh/s0ZPv9WDY7WuVsjrErb2Wfa6crkV0MKx6MCHdqueM9tayiPBYGvD0IzTh+FiyRi4Clf46XT6f1mrd5Or//5WNXw1+RwTw+jdZDH5h2vvHSwh4SysFTdYr6jqrjuD1VRfZHeX5ruj/bGYxlmyr4+dYXJbdWtlagWa2SGXi8xd4Qvb4jarld8Oq6WIDSx4A9wVzG7GuxtS014syE8imASEdPPcNWmwjxusMXZXdsZ7mYCXg9iG/t+32M8womxqp+xyGCpVZ4UHzHcWnecNW/W9j+vIbu10tV7sOttHPS4z/AiLsMgb7NhW53IItRb7G+ftbp5W2HKpcCmFzS0IOIGw+WwczJqDWeMgjvObSQ0CMrsatBvnsFVX+yiKB3VCW1gWZbs2W3g4E7FTn2Yfm8YqU7FbsHXeYrdw6yzGjlUon9Bo79a11DNiXmNzdaNIYuzWxw1kMmrn0bkDIaWxnVqqY6Sak7V/U8BCDnHt2wij/TckLKglA2lDsuFsEYuhce3tR+VkyQCZiPus+8d0KwhpkB2rphs2JbKVZrLmDznv5sXwSS+HZUyuW3PtsRu7ocFWlk3XZcqPmzmft2qlP8c4TIMztfZ5rY0pkwHW2cv1aM0+L05Sj7mbH1HmGRVUkx2oezTH7m4NdtWu72QVl6/dGFx/1Xs2++f8609WeL3EPowbGdSTuXpwmBwcJgeHib1Yzuxyk1DOHgob5ugn6+og/XfAUuzjlKPXSL4yBa+d6C9y7w7646A/DvpD0h/M04+8FcmnIMAvgbMP8pbx1fmA8ueCy2/XZAX6m8D3CAKn08VsdiQlT38Ocw6fUHuPJt+do8RD8sWkdBwrFRLiKzEMLmIRj9LvpG6IFsExFfKIHmHSOB5fTqK8if3Q8zcoEIgg1LNUTnRwFUSx5AJvcEi1DjxUmx41t0WczCv4ArVNdOAeDzUwVhaQp3nOQnzfmWem/As/bz3xERAVLGLCl/bDTYq3CzrnJZvHQAB2Uj2TMQgzZRFFyqe2hWfUuenLPwAiSZw0HkaeKmyA09HMK65O73ziq3HZ9GXIOR9u1pXvix9mvftZN9wQMdys699TP0x991Nvcx/GgPMPXI7tOus9mQt1jIqIQPF173lGdY+43Nn4jHKjugG7kYzohWHkoBUWF6B0rxnIEKKzs4wE3PK1QwIn9/MK/ecf95pbNBcI7yKTwHfWdmyOQFLiZciGvZEIxTH2UDvO8nCdgVJ+2uv5Vt7fupv7zWLWh9pxHmZ9J/abxax37fLenXkf0E/tMPVj+6eLaR/U0XBY8bvjZigj1UwWnfWc7ZxV5zArA9p16nuEhzPjIcr0MOVWImPvJttaqIw80/LVPe3l+4s+gRxKWzQ7gBxVWWRhbUPtBiVfzwvw81j7eHZhH5jN9lC7wB96tndh/5fN9qDbgB96yndmA5DNu83xkdV0vfTjI+v5HeX4SPUE33CMNNCWYkjRMdyWwpq5Bt1SXPLPXpQGivhEhTTnxUsaRf36BYc6JLeYu7oof+bidLq6pXe351G9Z7ebskICcATfixjwKvUlVlD0WFQzd1i5PqWeqhJFF0W5RRfyvkfuTK4DdrvZSDUtEVB1qu/IDDy3GyTY+WcF6WihHeQiFAUEX5Rp+iiib0wdAbpH6hCoo+iYVcU2Q8wlHzjCvEgzwPyw39SLelSmsVReRVMXpRKQeigLFB2UDy2a4CuIpCUQTBxGSEpSQJE9MGHa8MLBJt2A95Dw4iZ7E636JukCdY4A01wsEk0yfsA2xAAi3iESmALjZdcQP+z8i2bQSsFZt+dLWw9dis8Gxq2P4QY2WQzO+QfNkOsQTkOrpoNj3QGqwSldBrs+OGn3qxqhfpu888Ms1JpqcEDMaQdD4lRx1az42s3AONWpGJ1yp9tyiEojIGsOlHYz5EJJKQYLBPN1MJOsMuXfsO9oULXZoBiX5s305kOD5q272QJCqYDRmQKuWg6RN7PYJ6I7G6BBQZhii3Z/gBqrThdC04kZN8DwbHSgVczI7s+kTsxowyKaITqgsGFP91UyFHZrtR6Y1Uw33VXIx9iqjYXhwLslcw6/s5BOXoGB609nWw5ZUvodKXzpkFE1sL5URq8Ds5GmFgdvuzxEg9GtP15yR3Nko5s95FCNtifJ2nYWpQesq7KTee4CKz6Qn9JD1SfzL9uQXv2R/7rAiX9fgzghMEPscScHVR36Emt5hCFgVFYRbgu5xilaoRSdxal/h7yUFHuYTCSdweymRHrN/i1eXYWft+lmm5Ih4/Vt8MwSgx6E6Po/mUs4n3zOnuhJuhgCQdOnt6V8Dt9v/WBV4f0BuIBWAYKesBSXMNG5pLoE3z9XkD5FoSWggnzVwdBXvN4EBFjyOVwiesucO25E5HzE98h7rm/VVgExTwRP9pMLH93HaJ0UMOr25Cfh4dX66U//D1GNYh3mSAEA + + + dbo + + \ No newline at end of file diff --git a/src/EventCloud.Web/App/Main/views/about/about.cshtml b/src/EventCloud.Web/App/Main/views/about/about.cshtml index 0a7ac02..d41c06f 100644 --- a/src/EventCloud.Web/App/Main/views/about/about.cshtml +++ b/src/EventCloud.Web/App/Main/views/about/about.cshtml @@ -3,7 +3,21 @@

This is an example multi-tenant application built using ASP.NET Boilerplate framework.

-

Links:

+ +

Some Statistics

+ +
+
+
+ {{statisticItem.value}} + {{statisticItem.name}} +
+
+
+ +

Note: These statistics include all tenants, not only current tenant.

+ +

Links