@ -0,0 +1,167 @@ |
|||
<Project> |
|||
<PropertyGroup> |
|||
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> |
|||
</PropertyGroup> |
|||
<ItemGroup> |
|||
<PackageVersion Include="AlibabaCloud.SDK.Dysmsapi20170525" Version="2.0.24" /> |
|||
<PackageVersion Include="aliyun-net-sdk-sts" Version="3.1.1" /> |
|||
<PackageVersion Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" /> |
|||
<PackageVersion Include="AsyncKeyedLock" Version="6.2.2" /> |
|||
<PackageVersion Include="Autofac" Version="7.1.0" /> |
|||
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" /> |
|||
<PackageVersion Include="Autofac.Extras.DynamicProxy" Version="7.1.0" /> |
|||
<PackageVersion Include="AutoMapper" Version="12.0.1" /> |
|||
<PackageVersion Include="AWSSDK.S3" Version="3.7.205.9" /> |
|||
<PackageVersion Include="AWSSDK.SecurityToken" Version="3.7.202.4" /> |
|||
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.8.1" /> |
|||
<PackageVersion Include="Azure.Storage.Blobs" Version="12.18.0" /> |
|||
<PackageVersion Include="Blazorise" Version="1.3.1" /> |
|||
<PackageVersion Include="Blazorise.Components" Version="1.3.1" /> |
|||
<PackageVersion Include="Blazorise.DataGrid" Version="1.3.1" /> |
|||
<PackageVersion Include="Blazorise.Snackbar" Version="1.3.1" /> |
|||
<PackageVersion Include="Castle.Core" Version="5.1.1" /> |
|||
<PackageVersion Include="Castle.Core.AsyncInterceptor" Version="2.1.0" /> |
|||
<PackageVersion Include="CommonMark.NET" Version="0.15.1" /> |
|||
<PackageVersion Include="Confluent.Kafka" Version="2.2.0" /> |
|||
<PackageVersion Include="Dapper" Version="2.1.4" /> |
|||
<PackageVersion Include="Dapr.AspNetCore" Version="1.9.0" /> |
|||
<PackageVersion Include="Dapr.Client" Version="1.11.0" /> |
|||
<PackageVersion Include="Devart.Data.Oracle.EFCore" Version="10.1.134.7" /> |
|||
<PackageVersion Include="DistributedLock.Core" Version="1.0.5" /> |
|||
<PackageVersion Include="DistributedLock.Redis" Version="1.0.2" /> |
|||
<PackageVersion Include="EphemeralMongo.Core" Version="1.1.3" /> |
|||
<PackageVersion Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" /> |
|||
<PackageVersion Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" /> |
|||
<PackageVersion Include="EphemeralMongo6.runtime.win-x64" Version="1.1.3" /> |
|||
<PackageVersion Include="FluentValidation" Version="11.7.1" /> |
|||
<PackageVersion Include="Hangfire.AspNetCore" Version="1.8.5" /> |
|||
<PackageVersion Include="Hangfire.SqlServer" Version="1.8.5" /> |
|||
<PackageVersion Include="HtmlSanitizer" Version="8.0.723" /> |
|||
<PackageVersion Include="IdentityModel" Version="6.2.0" /> |
|||
<PackageVersion Include="IdentityServer4" Version="4.1.2" /> |
|||
<PackageVersion Include="IdentityServer4.AspNetIdentity" Version="4.1.2" /> |
|||
<PackageVersion Include="JetBrains.Annotations" Version="2023.2.0" /> |
|||
<PackageVersion Include="LdapForNet" Version="2.7.15" /> |
|||
<PackageVersion Include="LibGit2Sharp" Version="0.27.2" /> |
|||
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="13.3.0" /> |
|||
<PackageVersion Include="MailKit" Version="4.2.0" /> |
|||
<PackageVersion Include="Markdig.Signed" Version="0.33.0" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components.Authorization" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components.Web" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Versioning" Version="5.1.0" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.22" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" /> |
|||
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" /> |
|||
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" /> |
|||
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Proxies" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Configuration.CommandLine" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.FileProviders.Composite" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Localization" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.7.2" /> |
|||
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" /> |
|||
<PackageVersion Include="Minio" Version="6.0.0" /> |
|||
<PackageVersion Include="MongoDB.Driver" Version="2.21.0" /> |
|||
<PackageVersion Include="NEST" Version="7.17.5" /> |
|||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" /> |
|||
<PackageVersion Include="Nito.AsyncEx.Context" Version="5.1.2" /> |
|||
<PackageVersion Include="Nito.AsyncEx.Coordination" Version="5.1.2" /> |
|||
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="NSubstitute" Version="5.1.0" /> |
|||
<PackageVersion Include="NuGet.Versioning" Version="6.7.0" /> |
|||
<PackageVersion Include="NUglify" Version="1.21.0" /> |
|||
<PackageVersion Include="Nullable" Version="1.3.1" /> |
|||
<PackageVersion Include="Octokit" Version="8.0.1" /> |
|||
<PackageVersion Include="OpenIddict.Abstractions" Version="4.8.0" /> |
|||
<PackageVersion Include="OpenIddict.Core" Version="4.8.0" /> |
|||
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="4.8.0" /> |
|||
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="4.8.0" /> |
|||
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="4.8.0" /> |
|||
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="7.21.8" /> |
|||
<PackageVersion Include="Polly" Version="8.0.0" /> |
|||
<PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" /> |
|||
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.0-beta.1" /> |
|||
<PackageVersion Include="Quartz" Version="3.7.0" /> |
|||
<PackageVersion Include="Quartz.Extensions.DependencyInjection" Version="3.7.0" /> |
|||
<PackageVersion Include="Quartz.Plugins.TimeZoneConverter" Version="3.7.0" /> |
|||
<PackageVersion Include="Quartz.Serialization.Json" Version="3.3.3" /> |
|||
<PackageVersion Include="RabbitMQ.Client" Version="6.5.0" /> |
|||
<PackageVersion Include="Rebus" Version="7.2.1" /> |
|||
<PackageVersion Include="Rebus.ServiceProvider" Version="9.1.0" /> |
|||
<PackageVersion Include="Scriban" Version="5.9.0" /> |
|||
<PackageVersion Include="Serilog" Version="2.11.0" /> |
|||
<PackageVersion Include="Serilog.AspNetCore" Version="7.0.0" /> |
|||
<PackageVersion Include="Serilog.Extensions.Hosting" Version="7.0.0" /> |
|||
<PackageVersion Include="Serilog.Extensions.Logging" Version="7.0.0" /> |
|||
<PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" /> |
|||
<PackageVersion Include="Serilog.Sinks.Console" Version="4.1.0" /> |
|||
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0" /> |
|||
<PackageVersion Include="SharpZipLib" Version="1.4.2" /> |
|||
<PackageVersion Include="Shouldly" Version="4.0.3" /> |
|||
<PackageVersion Include="SixLabors.ImageSharp" Version="2.1.6" /> |
|||
<PackageVersion Include="SixLabors.ImageSharp.Drawing" Version="1.0.0" /> |
|||
<PackageVersion Include="Slugify.Core" Version="4.0.1" /> |
|||
<PackageVersion Include="Spectre.Console" Version="0.47.0" /> |
|||
<PackageVersion Include="StackExchange.Redis" Version="2.6.122" /> |
|||
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" /> |
|||
<PackageVersion Include="System.Collections.Immutable" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" /> |
|||
<PackageVersion Include="System.Linq.Async" Version="6.0.1" /> |
|||
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.3.5" /> |
|||
<PackageVersion Include="System.Linq.Queryable" Version="4.3.0" /> |
|||
<PackageVersion Include="System.Runtime.Loader" Version="4.3.0" /> |
|||
<PackageVersion Include="System.Security.Permissions" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" /> |
|||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="System.Text.Encodings.Web" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="System.Text.Json" Version="8.0.0-rc.2" /> |
|||
<PackageVersion Include="TimeZoneConverter" Version="6.1.0" /> |
|||
<PackageVersion Include="Unidecode.NET" Version="2.1.0" /> |
|||
<PackageVersion Include="xunit" Version="2.5.1" /> |
|||
<PackageVersion Include="xunit.extensibility.execution" Version="2.5.1" /> |
|||
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.1" /> |
|||
<PackageVersion Include="coverlet.collector" Version="3.1.2" /> |
|||
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2"/> |
|||
<PackageVersion Include="Fody" Version="6.8.0" /> |
|||
</ItemGroup> |
|||
</Project> |
|||
@ -0,0 +1,98 @@ |
|||
# Unleash the Power of ABP CMS Kit: A Dynamic Content Showcase |
|||
|
|||
We're excited to introduce to you [ABP](https://abp.io/)'s [CMS Kit Module](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Index) – a versatile module that empowers you to build your own dynamic content website with ease. In this introductory blog post, we'll first take a look at the **CMS Kit Module** and then we'll take you on a journey through our **CMS Kit Demo Application**, showcasing the incredible capabilities of this feature-rich module. |
|||
|
|||
## Overview of the CMS Kit Module |
|||
|
|||
At the heart of ABP's CMS Kit Module is a robust Content Management System (CMS) designed to simplify content creation and management. With the CMS Kit, you have the tools to build your own dynamic content website, complete with a range of features tailored to your specific needs. It provides core **building blocks** and fully working sub-systems to create your own website with the CMS features or use the building blocks in your websites for any purpose. |
|||
|
|||
### CMS Kit: The Building Blocks (a.k.a Features) |
|||
|
|||
The following features are currently available and ready to use: |
|||
|
|||
* **Blogging**: Create your blog and publish posts (with markdown / HTML support) |
|||
* **Dynamic Pages**: Create pages with dynamic URLs (with markdown / HTML support) |
|||
* **Dynamic Menu**: Manage your application’s main menu on the fly |
|||
* **Tagging**: Tag any kind of content, like a blog post |
|||
* **Comments**: Allow users to comment and discuss in your application |
|||
* **Reactions**: Allow users to react to your content using simple smileys |
|||
* **Rating**: Reusable component to rate other contents |
|||
* **Global Resources**: Dynamically add CSS / JavaScript to your pages or blog posts |
|||
* **Dynamic Widgets**: Build widgets and use them in dynamic content, like blog posts |
|||
|
|||
> For more information, please check the [CMS Kit Module documentation](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Index). In the documentation, you can see descriptions for each feature, learn how to install & configure the module, and much more... |
|||
|
|||
### CMS Kit Pro: The Building Blocks (a.k.a Features) |
|||
|
|||
CMS Kit Pro is a part of [ABP Commercial](https://commercial.abp.io/) and provides additional features. The following features are provided by the CMS Kit Pro Module: |
|||
|
|||
* **Contact Form**: Easily add a «contact us» form to your website |
|||
* **Newsletter**: Allow users to subscribe to your newsletter (with multiple categories) |
|||
* **URL Forwarding**: Create short URLs or redirect users to other pages (for example: [abp.io/dapr](https://abp.io/dapr)) |
|||
* **Poll**: Create quick polls for your users |
|||
* **Page Feedback**: Collect feedbacks from users for your content |
|||
|
|||
> For more information, check the [CMS Kit Pro Module documentation](https://docs.abp.io/en/commercial/latest/modules/cms-kit/index). |
|||
|
|||
## Explore the CMS Kit Demo Application |
|||
|
|||
As the core ABP development team, we've created a sample application to showcase the incredible capabilities of the ABP's CMS Kit Module. You can explore the source code of the application on our [GitHub repository](https://github.com/abpframework/cms-kit-demo) to get a deeper understanding of how the CMS Kit works under the hood. While developing the application, we aimed to build a real-world application and use almost all of the CMS Kit Features. |
|||
|
|||
In the next sections, we will provide a detailed walkthrough of the application and highlight each CMS Kit feature that has been incorporated into it. |
|||
|
|||
### Dynamic Menu Creation with CMS Kit's Menu System |
|||
|
|||
One of the standing out features of the CMS Kit is its [Menu System](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Menus), which allows for the creation and dynamic ordering of application menu items. Say goodbye to static menus; with CMS Kit, you have the power to tailor your menu structure according to your evolving content needs. |
|||
|
|||
You can see the homepage of the application in the following figure: |
|||
|
|||
 |
|||
|
|||
The application menu items in the navbar are **created & ordered dynamically** with the [CMS Kit's Menu System](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Menus): |
|||
|
|||
 |
|||
|
|||
### Custom Implementations with Comment & Reaction Features |
|||
|
|||
Our demo application goes a step further by demonstrating custom implementations, such as an **image gallery**, seamlessly integrated with CMS Kit's [Comment](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Comments) & [Reaction](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Reactions) Features: |
|||
|
|||
| Gallery | Detail Page | |
|||
|------------------------ |-----------------------| |
|||
|  |  | |
|||
|
|||
It's pretty easy to integrate CMS Kit Features such as Comments & Reactions into your existing pages. You can check the [source code of the application](https://github.com/abpframework/cms-kit-demo/blob/main/src/CmsKitDemo/Pages/Gallery/Detail.cshtml) and see how to integrate the features. |
|||
|
|||
### Robust Blogging Capabilities |
|||
|
|||
Blogging has never been easier! With the CMS Kit's [Blogging Feature](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Blogging), you can effortlessly manage your blog content, complete with [Ratings](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Ratings), [Comments](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Comments), [Tags](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Tags), and [Reactions](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Reactions) features as enabled: |
|||
|
|||
| Blog | Blog Post | |
|||
|------------------------ |-----------------------| |
|||
|  |  | |
|||
|
|||
You can enable/disable CMS Kit Features per blog on the admin side easily: |
|||
|
|||
 |
|||
|
|||
### Dynamic Pages with Style and Script Integration |
|||
|
|||
*Products* pages showcase the flexibility of the CMS Kit's [Pages Feature](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Pages), allowing for dynamic content creation, style customization, and script integration. Your website can now truly reflect your unique brand and content style. |
|||
|
|||
You can create pages with dynamic URLs on the admin side: |
|||
|
|||
 |
|||
|
|||
After you have created the page, you can access it via `/{slug}` URL on the public-web side: |
|||
|
|||
 |
|||
|
|||
## What's Next? |
|||
|
|||
Please try the CMS Kit Module now and provide [feedback](https://github.com/abpframework/abp) to help us to build a more effective content management kit! |
|||
|
|||
## Resources |
|||
|
|||
* [CMS Kit Demo: Source Code](https://github.com/abpframework/cms-kit-demo) |
|||
* [cms-kit-demo.abp.io](https://cms-kit-demo.abp.io/) |
|||
* [CMS Kit Module documentation](https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Index) |
|||
* [CMS Kit Pro Module documentation](https://docs.abp.io/en/commercial/latest/modules/cms-kit/index) |
|||
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 101 KiB |
@ -0,0 +1,80 @@ |
|||
# ABP.IO Platform 7.4 Final Has Been Released! |
|||
|
|||
[ABP Framework](https://abp.io/) and [ABP Commercial](https://commercial.abp.io/) 7.4 versions have been released today. |
|||
|
|||
## What's New With Version 7.4? |
|||
|
|||
All the new features were already explained in detail in the [7.4 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-7-4-RC-Has-Been-Published), so no need to go over them again. Check it out for more details. |
|||
|
|||
## Getting Started with 7.4 |
|||
|
|||
### Creating New Solutions |
|||
|
|||
You can create a new solution with the ABP Framework version 7.4 by either using the `abp new` command or generating the CLI command on the [get started page](https://abp.io/get-started). |
|||
|
|||
> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for more. |
|||
|
|||
### How to Upgrade an Existing Solution |
|||
|
|||
#### Install/Update the ABP CLI |
|||
|
|||
First of all, install the ABP CLI or upgrade it to the latest version. |
|||
|
|||
If you haven't installed it yet: |
|||
|
|||
```bash |
|||
dotnet tool install -g Volo.Abp.Cli |
|||
``` |
|||
|
|||
To update the existing CLI: |
|||
|
|||
```bash |
|||
dotnet tool update -g Volo.Abp.Cli |
|||
``` |
|||
|
|||
#### Upgrading Existing Solutions with the ABP Update Command |
|||
|
|||
[ABP CLI](https://docs.abp.io/en/abp/latest/CLI) provides a handy command to update all the ABP related NuGet and NPM packages in your solution with a single command: |
|||
|
|||
```bash |
|||
abp update |
|||
``` |
|||
|
|||
Run this command in the root folder of your solution. |
|||
|
|||
## Migration Guides |
|||
|
|||
There are breaking changes in this version that may affect your application. |
|||
Please see the following migration documents, if you are upgrading from v7.3: |
|||
|
|||
* [ABP Framework 7.3 to 7.4 Migration Guide](https://docs.abp.io/en/abp/7.4/Migration-Guides/Abp-7_4) |
|||
|
|||
## Community News |
|||
|
|||
### ABP Community Talks 2023.7: Build Your Content Management System with .NET |
|||
|
|||
We as the ABP team organized the [**ABP Community Talks 2023.7: Build Your Content Management System with .NET**](https://community.abp.io/events/build-your-own-cms-with-.net-a-first-look-at-abps-content-management-system-kit-3nfvm9ix) event to explore the depths of the CMS Kit Module and its real-world applications. The talk delved into the intricacies of the CMS Kit Module, providing valuable insights into its features and functionalities. Attendees had the opportunity to witness the module in action through live demonstrations and interactive Q&A sessions. |
|||
|
|||
For those who missed the live session, you can catch up on all the enriching discussions and demonstrations by watching the record below 👇: |
|||
|
|||
<iframe width="560" height="315" src="https://www.youtube.com/embed/S9__Hnu29tI?si=vrLWLI3NQX2eaSMD" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> |
|||
|
|||
### BASTA! Mainz 2023 |
|||
|
|||
 |
|||
|
|||
BASTA! Mainz 2023 has wrapped up, and what an extraordinary journey it has been! We have shared our impressions, highlights, and the incredible impact it had on the tech community in Germany and beyond in a blog post, which you can find at [https://blog.abp.io/abp/BASTA-Mainz-2023-What-a-Blast-in-Germany](https://blog.abp.io/abp/BASTA-Mainz-2023-What-a-Blast-in-Germany). |
|||
|
|||
### New ABP Community Posts |
|||
|
|||
There are exciting articles contributed by the ABP community as always. I will highlight some of them here: |
|||
|
|||
* [Moving Background Job Execution To A Separate Application](https://community.abp.io/posts/moving-background-job-execution-to-a-separate-application-my9cgo9a) by [liangshiwei](https://github.com/RealLowis). |
|||
* [Cascading Option Loading with Extensions System in ABP Angular](https://community.abp.io/posts/cascading-option-loading-with-extensions-system-in-abp-angular-gcxgp0v9) by [Masum Ulu](https://twitter.com/masumulu). |
|||
* [How to use domain-based tenant resolver in ABP with Angular and OpenIddict](https://community.abp.io/posts/how-to-use-domainbased-tenant-resolver-in-abp-with-angular-and-openiddict-v9y8da7v) by [Mahmut Gündoğdu](https://twitter.com/MahmutGundogdu). |
|||
|
|||
Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://community.abp.io/articles/submit) to the ABP Community. |
|||
|
|||
## About the Next Version |
|||
|
|||
The next feature version will be 8.0. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version. |
|||
|
After Width: | Height: | Size: 157 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 233 KiB |
@ -0,0 +1,236 @@ |
|||
# Moving Background Job Execution To A Separate Application |
|||
|
|||
In this article, I will show you how to move the background job execution to a separate application. |
|||
|
|||
Here are some benefits of doing this: |
|||
|
|||
* If your background jobs consume high system resources (CPU, RAM or Disk), then you can deploy that background application to a dedicated server so it won't affect your application's performance. |
|||
* You can scale your background job application independently from your web application. For example, you can deploy multiple instances of your background job application to a Kubernetes cluster and scale it easily. |
|||
|
|||
Here are some disadvantages of doing this: |
|||
|
|||
* You need to deploy and maintain at least two applications instead of one. |
|||
* You need to implement a mechanism to share the common code between your applications. For example, you can create a shared project and add it to your applications as a project reference. |
|||
|
|||
## Source code |
|||
|
|||
You can find the source code of the application at [abpframework/abp-samples](https://github.com/abpframework/abp-samples/tree/master/SeparateBackgroundJob). |
|||
|
|||
You can check the PR to see the changes step by step: [abpframework/abp-samples#250](https://github.com/abpframework/abp-samples/pull/250) |
|||
|
|||
## Creating the Web Application |
|||
|
|||
First, we need to create a new web application using the ABP CLI: |
|||
|
|||
```bash |
|||
abp new SeparateBackgroundJob -t app |
|||
``` |
|||
|
|||
* Create a shared project named `SeparateBackgroundJob.Common.Shared` to share the `BackgroundJob` and `BackgroundJobArgs` classes between the web and job executor applications. |
|||
* Install the `Volo.Abp.BackgroundJobs.Abstractions` package to the `SeparateBackgroundJob.Common.Shared` project. |
|||
|
|||
Add the `SeparateBackgroundJobCommonSharedModule` class to the `SeparateBackgroundJob.Common.Shared` project: |
|||
|
|||
```csharp |
|||
[DependsOn(typeof(AbpBackgroundJobsAbstractionsModule))] |
|||
public class SeparateBackgroundJobCommonSharedModule : AbpModule |
|||
{ |
|||
} |
|||
``` |
|||
|
|||
Add the `MyReportJob` and `MyReportJobArgs` classes to the `SeparateBackgroundJob.Common.Shared` project: |
|||
|
|||
```csharp |
|||
public class MyReportJob : AsyncBackgroundJob<MyReportJobArgs>, ITransientDependency |
|||
{ |
|||
public override Task ExecuteAsync(MyReportJobArgs args) |
|||
{ |
|||
Logger.LogInformation("Executing MyReportJob with args: {0}", args.Content); |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
|
|||
public class MyReportJobArgs |
|||
{ |
|||
public string? Content { get; set; } |
|||
} |
|||
``` |
|||
|
|||
Add the `SeparateBackgroundJob.Common.Shared` project reference to the `SeparateBackgroundJob.Domain` project and add `SeparateBackgroundJobCommonSharedModule` to the `DependsOn` attribute of the `SeparateBackgroundJobDomainModule` class: |
|||
|
|||
```csharp |
|||
[DependsOn( |
|||
typeof(SeparateBackgroundJobDomainSharedModule), |
|||
typeof(AbpAuditLoggingDomainModule), |
|||
typeof(AbpBackgroundJobsDomainModule), |
|||
typeof(AbpFeatureManagementDomainModule), |
|||
typeof(AbpIdentityDomainModule), |
|||
typeof(AbpOpenIddictDomainModule), |
|||
typeof(AbpPermissionManagementDomainOpenIddictModule), |
|||
typeof(AbpPermissionManagementDomainIdentityModule), |
|||
typeof(AbpSettingManagementDomainModule), |
|||
typeof(AbpTenantManagementDomainModule), |
|||
typeof(AbpEmailingModule), |
|||
typeof(SeparateBackgroundJobCommonSharedModule) //Add this line |
|||
)] |
|||
public class SeparateBackgroundJobDomainModule : AbpModule |
|||
``` |
|||
|
|||
Open the `Index.cshtml` and replace the content with the following code: |
|||
|
|||
```csharp |
|||
@page |
|||
@using Microsoft.AspNetCore.Mvc.Localization |
|||
@using SeparateBackgroundJob.Localization |
|||
@using Volo.Abp.Users |
|||
@model SeparateBackgroundJob.Web.Pages.IndexModel |
|||
@inject IHtmlLocalizer<SeparateBackgroundJobResource> L |
|||
@inject ICurrentUser CurrentUser |
|||
|
|||
@section styles { |
|||
<abp-style src="/Pages/Index.css"/> |
|||
} |
|||
|
|||
@section scripts { |
|||
<abp-script src="/Pages/Index.js"/> |
|||
} |
|||
|
|||
<div class="container"> |
|||
<abp-card> |
|||
<abp-card-header> |
|||
<abp-card-title> |
|||
Add NEW BACKGROUND JOB |
|||
</abp-card-title> |
|||
</abp-card-header> |
|||
<abp-card-body> |
|||
<form id="NewItemForm" method="post" class="row row-cols-lg-auto g-3 align-items-center"> |
|||
<div class="col-12"> |
|||
<div class="input-group"> |
|||
<input id="ReportContent" required name="ReportContent" type="text" class="form-control" placeholder="enter text..."> |
|||
</div> |
|||
</div> |
|||
<div class="col-12"> |
|||
<button type="submit" class="btn btn-primary">Add</button> |
|||
</div> |
|||
</form> |
|||
</abp-card-body> |
|||
</abp-card> |
|||
</div> |
|||
``` |
|||
|
|||
Open the `Index.cshtml.cs` and replace the content with the following code: |
|||
|
|||
```csharp |
|||
public class IndexModel : SeparateBackgroundJobPageModel |
|||
{ |
|||
private readonly IBackgroundJobManager _backgroundJobManager; |
|||
|
|||
[BindProperty(SupportsGet = true)] |
|||
public string? ReportContent { get; set; } |
|||
|
|||
public IndexModel(IBackgroundJobManager backgroundJobManager) |
|||
{ |
|||
_backgroundJobManager = backgroundJobManager; |
|||
} |
|||
|
|||
public void OnGet() |
|||
{ |
|||
|
|||
} |
|||
|
|||
public async Task OnPostAsync() |
|||
{ |
|||
await _backgroundJobManager.EnqueueAsync(new MyReportJobArgs |
|||
{ |
|||
Content = ReportContent |
|||
}); |
|||
|
|||
Alerts.Success("Job is queued!"); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Run the application and navigate to the home page. You should see the following page: |
|||
|
|||
 |
|||
|
|||
When you enter some text and click the **Add** button, the job will be queued and executed in the web application: |
|||
|
|||
## Creating the Console Application |
|||
|
|||
Now we split the background job execution to a separate console application. |
|||
|
|||
Open the `SeparateBackgroundJobWebModule` class to disable the background job execution in the web application: |
|||
|
|||
```csharp |
|||
public class SeparateBackgroundJobWebModule : AbpModule |
|||
{ |
|||
.... |
|||
|
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
... |
|||
|
|||
//Disable background job execution in the web application |
|||
Configure<AbpBackgroundJobOptions>(options => |
|||
{ |
|||
options.IsJobExecutionEnabled = false; |
|||
}); |
|||
} |
|||
|
|||
... |
|||
} |
|||
``` |
|||
|
|||
* Create a new console application using the ABP CLI: |
|||
|
|||
```bash |
|||
abp new BackgroundJobExecutor -t console |
|||
``` |
|||
|
|||
* Add the `BackgroundJobExecutor` project to the solution of the web application. |
|||
* Add the `SeparateBackgroundJob.Common.Shared` project reference to the `BackgroundJobExecutor` project. |
|||
* Install the `Volo.Abp.BackgroundJobs.EntityFrameworkCore` and `Volo.Abp.EntityFrameworkCore.SqlServer` packages to the `BackgroundJobExecutor` project. |
|||
|
|||
Update the `BackgroundJobExecutorModule` class as follows: |
|||
|
|||
```csharp |
|||
[DependsOn( |
|||
typeof(AbpAutofacModule), |
|||
typeof(AbpBackgroundJobsEntityFrameworkCoreModule), |
|||
typeof(AbpEntityFrameworkCoreSqlServerModule), |
|||
typeof(SeparateBackgroundJobCommonSharedModule) |
|||
)] |
|||
public class BackgroundJobExecutorModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
Configure<AbpDbContextOptions>(options => |
|||
{ |
|||
options.UseSqlServer(); |
|||
}); |
|||
} |
|||
|
|||
.... |
|||
} |
|||
``` |
|||
|
|||
Open the `appsettings.json` file to configure the [connection string](https://docs.abp.io/en/abp/latest/Connection-Strings#configure-the-connection-strings): |
|||
|
|||
```json |
|||
{ |
|||
"ConnectionStrings": { |
|||
"AbpBackgroundJobs": "Server=(LocalDb)\\MSSQLLocalDB;Database=SeparateBackgroundJob;Trusted_Connection=True" |
|||
} |
|||
} |
|||
``` |
|||
|
|||
> You must use the same connection string for the web application, `AbpBackgroundJobs` is the default connection string name for the background job module. |
|||
|
|||
The solution structure should look like this: |
|||
|
|||
 |
|||
|
|||
Now, run the web and console application. When you enter some text and click the **Add** button, the job will be queued and executed in the console application: |
|||
|
|||
 |
|||
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 376 KiB |
|
After Width: | Height: | Size: 102 KiB |
@ -0,0 +1,114 @@ |
|||
# How to Upload and Download Files in the ABP Framework using Angular |
|||
In this article, I will describe how to upload and download files with the ABP framework using Angular as the UI template, most of the code is compatible with all template types. In this article, I just gather some information in one post. Nothing is new. I Googled how to manage files in ABP and I didn't find anything. So I decided write a simple article as an answer to this question. |
|||
|
|||
### Creating App Service. |
|||
|
|||
An empty AppService that uses `IRemoteStreamContent` was created. ABP describes the IRemoteStreamContent as: |
|||
|
|||
> ABP Framework provides a special type, IRemoteStreamContent to be used to get or return streams in the application services. |
|||
|
|||
```csharp |
|||
public class StorageAppService: AbpFileUploadDownloadDemoAppService // <- a inherited from ApplicationService. `ProjectName`+'AppService'. |
|||
{ |
|||
public Guid UploadFile(IRemoteStreamContent file) |
|||
{ |
|||
Stream fs = file.GetStream(); |
|||
|
|||
//save your file with guid or implement your logic |
|||
var id = Guid.NewGuid(); |
|||
var filePath = "Insert your file path here/" + id.ToString(); |
|||
using var stream = new FileStream(filePath, FileMode.Create); |
|||
fs.CopyTo(stream); |
|||
return id; |
|||
} |
|||
public IRemoteStreamContent DownloadFile(Guid FileName) |
|||
{ |
|||
//find your file with guid or implement your logic |
|||
var filePath = "Insert your file path here" ; |
|||
var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); |
|||
return new RemoteStreamContent(fs); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
When you want to upload a file, app service param must be IRemoteStreamContent or RemoteStreamContent. You should be able to access a file data with the getStream method in the AppService. After that, There is no ABP spesific code. It's a c# spesific class. You can save a file system, move somewhere or serilize as base64 etc. |
|||
|
|||
when you want to download a file, A method should return IRemoteStreamContent or RemoteStreamContent. |
|||
RemoteStreamContent gets a required parameter. The parameter type must be Stream. (FileStream, MemoryStream, Custom etc...) |
|||
|
|||
For more information please read the topic in the Documentation: https://docs.abp.io/en/abp/latest/Application-Services#working-with-streams |
|||
|
|||
### Creating Angular proxy services |
|||
|
|||
ABP creates proxy files with the `abp generate-proxy -t ng` command. let's check the code. |
|||
|
|||
```javascript |
|||
|
|||
uploadFileByFile = (file: FormData, config?: Partial<Rest.Config>) => |
|||
this.restService.request<any, string>({ |
|||
method: 'POST', |
|||
responseType: 'text', |
|||
url: '/api/app/storage/upload-file', |
|||
body: file, |
|||
}, |
|||
{ apiName: this.apiName,...config }); |
|||
|
|||
``` |
|||
The function name is a little bit weird but let's focus the first parameter. The type of file param is `FormData`. FormData is a native object in JavaSript Web API. See the details. https://developer.mozilla.org/en-US/docs/Web/API/FormData . |
|||
|
|||
How to use the `uploadFileByFile` function. |
|||
|
|||
```javascript |
|||
const myFormData = new FormData(); |
|||
myFormData.append('file', inputFile); // file must match variable name in AppService |
|||
storageService.uploadFileByFile(myFormData).subscribe() |
|||
``` |
|||
The inputFile type is File. In most cases it comes from the `<input type="File">`, File belongs to the Javacsript Web Api. see the details https://developer.mozilla.org/en-US/docs/Web/API/File |
|||
|
|||
|
|||
Let's continue with "download" |
|||
|
|||
```javascript |
|||
|
|||
downloadFileByFileName = (FileName: string, config?: Partial<Rest.Config>) => |
|||
this.restService.request<any, Blob>({ |
|||
method: 'POST', |
|||
responseType: 'blob', |
|||
url: '/api/app/storage/download-file', |
|||
params: { fileName: FileName }, |
|||
}, |
|||
{ apiName: this.apiName,...config }); |
|||
|
|||
``` |
|||
|
|||
The return type of function is Blob. Blob is another javacript object. See the details: https://developer.mozilla.org/en-US/docs/Web/API/Blob. |
|||
|
|||
Now our code is not ABP Spesific. It is just javascript code. If you don't want to save the blob, here I asked my best AI friend ChatGPT. `Hello, chat! The programming lang is javascript. My variable type is Blob. How do I save file to client's machine?` |
|||
|
|||
Our the gifted friend gives us the code |
|||
```javascript |
|||
function saveBlobToFile(blob, fileName) { |
|||
// Create a blob URL |
|||
const blobURL = window.URL.createObjectURL(blob); |
|||
|
|||
// Create an anchor element for the download |
|||
const a = document.createElement("a"); |
|||
a.href = blobURL; |
|||
a.download = fileName || 'download.dat'; // Provide a default file name if none is provided |
|||
|
|||
// Append the anchor to the document |
|||
document.body.appendChild(a); |
|||
|
|||
// Simulate a click on the anchor to initiate the download |
|||
a.click(); |
|||
|
|||
// Clean up: remove the anchor and revoke the blob URL |
|||
document.body.removeChild(a); |
|||
window.URL.revokeObjectURL(blobURL); |
|||
} |
|||
|
|||
// Usage example |
|||
const blob = new Blob(['Hello, World!'], { type: 'text/plain' }); |
|||
saveBlobToFile(blob, 'hello.txt'); |
|||
``` |
|||
|
|||
@ -0,0 +1,34 @@ |
|||
# Configuring Configuring SSL certificate(HTTPS) |
|||
|
|||
A website needs an SSL certificate in order to keep user data secure, verify ownership of the website, prevent attackers from creating a fake version of the site, and gain user trust. |
|||
|
|||
This document introduces how to get and use SSL certificate(HTTPS) for your application. |
|||
|
|||
## Get a SSL Certificate from a Certificate Authority |
|||
|
|||
You can get a SSL certificate from a certificate authority (CA) such as [Let's Encrypt](https://letsencrypt.org/) or [Cloudflare](https://www.cloudflare.com/learning/ssl/what-is-an-ssl-certificate/) and so on. |
|||
|
|||
Once you have a certificate, you need to configure your web server to use it. The following references show how to configure your web server to use a certificate. |
|||
|
|||
* [Host ASP.NET Core on Linux with Apache: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache) |
|||
* [Host ASP.NET Core on Linux with Nginx: HTTPS configuration](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx) |
|||
* [How to Set Up SSL on IIS 7 or later](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis) |
|||
|
|||
## Create a Self-Signed Certificate |
|||
|
|||
You can create a self-signed certificate for testing purposes or internal use. |
|||
|
|||
There is an article about [how to create a self-signed certificate](https://learn.microsoft.com/en-us/dotnet/core/additional-tools/self-signed-certificates-guide), If you are using IIS, you can use the following this document to [obtain a Certificate](https://learn.microsoft.com/en-us/iis/manage/configuring-security/how-to-set-up-ssl-on-iis#obtain-a-certificate) |
|||
|
|||
## Common Problems |
|||
|
|||
### The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot |
|||
|
|||
This error may occur when using IIS. You need to trust your certificate by `Manage computer certificates`. |
|||
|
|||
## References |
|||
|
|||
* [ABP commercial IIS Deployment](https://docs.abp.io/en/commercial/latest/startup-templates/application/deployment-iis) |
|||
* [HTTPS in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl) |
|||
* [Let's Encrypt](https://letsencrypt.org/getting-started) |
|||
* [Cloudflare's Free SSL / TLS](https://www.cloudflare.com/application-services/products/ssl/) |
|||
@ -0,0 +1,77 @@ |
|||
# ABP Version 8.0 Migration Guide |
|||
|
|||
This document is a guide for upgrading ABP v7.4.x solutions to ABP v8.0.x. |
|||
|
|||
## Upgraded NuGet Dependencies |
|||
|
|||
The following NuGet libraries have been upgraded: |
|||
|
|||
| Package | Old Version | New Version | |
|||
| ------------------- | ----------- | ----------- | |
|||
| All Microsoft packages | 7.x | 8.x | |
|||
| Microsoft.CodeAnalysis | 4.2.0 | 4.5.0 | |
|||
| NUglify | 1.20.0 | 1.21.0 | |
|||
| Polly | 7.2.3 | 8.0.0 | |
|||
| aliyun-net-sdk-sts | 3.1.0 | 3.1.1 | |
|||
| Autofac | 7.0.0 | 7.1.0 | |
|||
| Autofac.Extras.DynamicProxy | 6.0.1 | 7.1.0 | |
|||
| AutoMapper | 12.0.0 | 12.0.1 | |
|||
| AsyncKeyedLock | 6.2.1 | 6.2.2 | |
|||
| AWSSDK.S3 | 3.7.9.2 | 3.7.205.9 | |
|||
| AWSSDK.SecurityToken | 3.7.1.151 | 3.7.202.4 | |
|||
| Azure.Storage.Blobs | 12.15.0 | 12.18.0 | |
|||
| ConfigureAwait.Fody | 3.3.1 | 3.3.2 | |
|||
| Confluent.Kafka | 1.8.2 | 2.2.0 | |
|||
| Dapper | 2.0.123 | 2.1.4 | |
|||
| Dapr.Client | 1.11.0 | 1.9.0 | |
|||
| DistributedLock.Core | 1.0.4 | 1.0.5 | |
|||
| DistributedLock.Redis | 1.0.1 | 1.0.2 | |
|||
| EphemeralMongo.Core | 1.1.0 | 1.1.3 | |
|||
| EphemeralMongo6.runtime.linux-x64 | 1.1.0 | 1.1.3 | |
|||
| EphemeralMongo6.runtime.osx-x64 | 1.1.0 | 1.1.3 | |
|||
| EphemeralMongo6.runtime.win-x64 | 1.1.0 | 1.1.3 | |
|||
| FluentValidation | 11.0.1 | 11.7.1 | |
|||
| Fody | 6.6.1 | 6.8.0 | |
|||
| Hangfire.AspNetCore | 1.8.2 | 1.8.5 | |
|||
| Hangfire.SqlServer | 1.8.2 | 1.8.5 | |
|||
| HtmlSanitizer | 5.0.331 | 8.0.723 | |
|||
| IdentityModel | 6.0.0 | 6.2.0 | |
|||
| IdentityServer4.AspNetIdentity | 4.1.1 | 4.1.2 | |
|||
| JetBrains.Annotations | 2022.1.0 | 2023.2.0 | |
|||
| LibGit2Sharp | 0.26.2 | 0.27.2 | |
|||
| Magick.NET-Q16-AnyCPU | 13.2.0 | 13.3.0 | |
|||
| MailKit | 3.2.0 | 4.2.0 | |
|||
| Markdig.Signed | 0.26.0 | 0.33.0 | |
|||
| Microsoft.AspNetCore.Mvc.Versioning | 5.0.0 | 5.1.0 | |
|||
| Microsoft.AspNetCore.Razor.Language | 6.0.8 | 6.0.22 | |
|||
| Microsoft.NET.Test.Sdk | 17.2.0 | 17.7.2 | |
|||
| Minio | 4.0.6 | 6.0.0 | |
|||
| MongoDB.Driver | 2.19.1 | 2.21.0 | |
|||
| NEST | 7.14.1 | 7.17.5 | |
|||
| Newtonsoft.Json | 13.0.1 | 13.0.3 | |
|||
| NSubstitute | 4.3.0 | 5.1.0 | |
|||
| NSubstitute.Analyzers.CSharp | 1.0.15 | 1.0.16 | |
|||
| NuGet.Versioning | 5.11.0 | 6.7.0 | |
|||
| Octokit | 0.50.0 | 8.0.1 | |
|||
| Quartz | 3.4.0 | 3.7.0 | |
|||
| Quartz.Extensions.DependencyInjection | 3.4.0 | 3.7.0 | |
|||
| Quartz.Plugins.TimeZoneConverter | 3.4.0 | 3.7.0 | |
|||
| RabbitMQ.Client | 6.3.0 | 6.5.0 | |
|||
| Rebus | 6.6.5 | 7.2.1 | |
|||
| Rebus.ServiceProvider | 7.0.0 | 9.1.0 | |
|||
| Scriban | 5.4.4 | 5.9.0 | |
|||
| Serilog.AspNetCore | 5.0.0 | 7.0.0 | |
|||
| Serilog.Extensions.Hosting | 3.1.0 | 7.0.0 | |
|||
| Serilog.Extensions.Logging | 3.1.0 | 7.0.0 | |
|||
| Serilog.Sinks.Async | 1.4.0 | 1.5.0 | |
|||
| SharpZipLib | 1.3.3 | 1.4.2 | |
|||
| Shouldly | 4.1.0 | 4.2.1 | |
|||
| SixLabors.ImageSharp | 1.0.4 | 2.1.6 | |
|||
| Slugify.Core | 3.0.0 | 4.0.1 | |
|||
| Spectre.Console | 0.46.1-preview.0.7 | 0.47.0 | |
|||
| Swashbuckle.AspNetCore | 6.2.1 | 6.5.0 | |
|||
| System.Linq.Dynamic.Core | 1.3.3 | 1.3.5 | |
|||
| TimeZoneConverter | 5.0.0 | 6.1.0 | |
|||
| xunit | 2.4.1 | 2.5.1 | |
|||
| xunit.extensibility.execution | 2.4.1 | 2.5.1 | |
|||
| xunit.runner.visualstudio | 2.4.5 | 2.5.1 | |
|||
@ -0,0 +1,41 @@ |
|||
# Abp Window Service |
|||
|
|||
|
|||
## Download Blob as File |
|||
AbpWindowService is an Angular service designed to provide utility methods related to window operations. The service has a `downloadBlob` function, which is used for downloading blobs as files within the context of a web application. |
|||
|
|||
### Usage |
|||
|
|||
To make use of the `AbpWindowService` in your Angular application, follow the steps below: |
|||
|
|||
### Injection |
|||
Firstly, ensure that the service is injected into the component or any other Angular entity where you wish to use it. |
|||
|
|||
```js |
|||
import { AbpWindowService } from '@abp/ng.core'; |
|||
|
|||
constructor(private abpWindowService: AbpWindowService) { } |
|||
// or |
|||
// private abpWindowService = inject(AbpWindowService) |
|||
``` |
|||
|
|||
### Downloading a Blob |
|||
|
|||
Once you have the service injected, you can use the downloadBlob method to initiate the download of blob data as a file. For instance: |
|||
|
|||
```js |
|||
someMethod() { |
|||
const myBlob = new Blob(["Hello, World!"], { type: "text/plain" }); |
|||
this.abpWindowService.downloadBlob(myBlob, "hello.txt"); |
|||
} |
|||
``` |
|||
|
|||
### Permissions & Considerations |
|||
|
|||
Ensure that you have appropriate permissions and user interactions before triggering a download. Since downloadBlob initiates a download programmatically, it's best to tie this action to direct user interactions, such as button clicks, to prevent unexpected behaviors or browser restrictions. |
|||
|
|||
|
|||
### DOCUMENT Token in Service |
|||
|
|||
Angular, being a platform-agnostic framework, is designed to support not only browser-based applications but also other environments like server-side rendering (SSR) through Angular Universal. This design philosophy introduces challenges when accessing global browser-specific objects like window or document directly. To address this, Angular provides a DOCUMENT token that can be used to inject the document object into Angular entities like components and services. |
|||
|
|||