mirror of https://github.com/abpframework/abp.git
1 changed files with 172 additions and 0 deletions
@ -0,0 +1,172 @@ |
|||
```json |
|||
//[doc-seo] |
|||
{ |
|||
"Description": "Learn how to install and configure the standalone ABP Blogging module, including its MVC UI, routes, permissions, files and database providers." |
|||
} |
|||
``` |
|||
|
|||
# Blogging Module |
|||
|
|||
The Blogging module is a free and open-source application module for creating one or more blogs. It provides an MVC / Razor Pages user interface, application services, HTTP APIs and Entity Framework Core and MongoDB integrations for blogs, posts, tags, comments and member profiles. |
|||
|
|||
> This page documents the standalone `Volo.Blogging` module. [CMS Kit: Blogging](cms-kit/blogging.md) is a different feature family with different entities, configuration and UI. |
|||
|
|||
## How to Install |
|||
|
|||
Use the ABP CLI to add the module to an existing solution: |
|||
|
|||
```bash |
|||
abp add-module Volo.Blogging |
|||
``` |
|||
|
|||
The command adds the module packages and dependencies to the compatible projects in your solution. Apply the generated database migration after adding the module. |
|||
|
|||
### The Source Code |
|||
|
|||
The source code of this module is available in the [ABP repository](https://github.com/abpframework/abp/tree/dev/modules/blogging). It is licensed with [MIT](https://choosealicense.com/licenses/mit/), so you can use and customize it. |
|||
|
|||
## User Interface and Content Workflow |
|||
|
|||
The module provides two MVC / Razor Pages surfaces: |
|||
|
|||
* The public site lists blogs, posts and popular tags, renders post content as Markdown, displays member profiles and allows authenticated users to add comments. |
|||
* The administration page manages blogs. Post creation and editing are available from the public blog UI to users with the corresponding permissions. |
|||
|
|||
When the application has one blog, the blog index redirects directly to that blog. With multiple blogs, the index displays the available blogs. |
|||
|
|||
Creating a post makes it available to the public list and reading APIs immediately. The standalone module does not add a draft, review or scheduled-publication state. If a post URL is already used in the same blog, the application service appends a generated suffix and returns the resulting URL. |
|||
|
|||
Tags are entered with a post. The application service normalizes tag names to lowercase, removes duplicates and maintains their usage counts. |
|||
|
|||
### Member Profiles |
|||
|
|||
The module keeps a local `BlogUser` record for post and comment authors. It uses ABP's [user lookup and synchronization](identity/user-synchronization.md) infrastructure to obtain Identity user data. The public member page lists an active user's posts and profile information; the current user can edit the Blogging-specific fields on their own profile. |
|||
|
|||
## Permissions |
|||
|
|||
The administration menu is visible with the `Blogging.Blog.Management` permission. Blog operations use separate child permissions: |
|||
|
|||
* `Blogging.Blog.Create` |
|||
* `Blogging.Blog.Update` |
|||
* `Blogging.Blog.Delete` |
|||
* `Blogging.Blog.ClearCache` |
|||
|
|||
Post creation, update and deletion require `Blogging.Post.Create`, `Blogging.Post.Update` and `Blogging.Post.Delete`, respectively. |
|||
|
|||
Any authenticated user can create a comment. A comment can be updated or deleted by its creator or by a user with `Blogging.Comment.Update` or `Blogging.Comment.Delete`. |
|||
|
|||
See the [Authorization](../framework/fundamentals/authorization/index.md) documentation to learn how to grant permissions to roles and users. |
|||
|
|||
## Routing |
|||
|
|||
`BloggingUrlOptions.RoutePrefix` controls the public URL prefix. Its default value produces URLs under `/blog/`. The following example moves the public blog under `/articles/` and enables single-blog mode for the blog whose short name is `engineering`: |
|||
|
|||
```csharp |
|||
Configure<BloggingUrlOptions>(options => |
|||
{ |
|||
options.RoutePrefix = "articles"; |
|||
options.SingleBlogMode.Enabled = true; |
|||
options.SingleBlogMode.BlogName = "engineering"; |
|||
}); |
|||
``` |
|||
|
|||
Single-blog mode removes the blog short-name segment from post URLs. If the application contains multiple blogs, set `SingleBlogMode.BlogName` to the short name of the blog to expose. If it contains exactly one blog, the module can select it without setting `BlogName`. |
|||
|
|||
Set `RoutePrefix` to an empty string to serve the blog from `/`. In this mode the route constraint uses `IgnoredPaths` to avoid capturing other top-level application routes. The module already adds its framework endpoints, bundle folder and member route; add application-specific top-level paths when needed: |
|||
|
|||
```csharp |
|||
Configure<BloggingUrlOptions>(options => |
|||
{ |
|||
options.RoutePrefix = ""; |
|||
options.IgnoredPaths.Add("health"); |
|||
}); |
|||
``` |
|||
|
|||
## Post Images |
|||
|
|||
Post images are saved through the [BLOB Storing](../framework/infrastructure/blob-storing) system in the `blogging-files` container. Configure a BLOB provider for this container as you would for any other typed container. |
|||
|
|||
The upload service accepts JPEG, PNG, GIF and BMP images. The maximum file size is 5 MiB by default. `BloggingWebConsts.FileUploading.MaxFileSize` is a process-wide static value, so set it once during application startup, before the application begins accepting uploads: |
|||
|
|||
```csharp |
|||
BloggingWebConsts.FileUploading.MaxFileSize = 10 * 1024 * 1024; |
|||
``` |
|||
|
|||
## Social Media Metadata |
|||
|
|||
The post page emits Twitter card metadata. Configure the site handle with `BloggingTwitterOptions`: |
|||
|
|||
```csharp |
|||
Configure<BloggingTwitterOptions>(options => |
|||
{ |
|||
options.Site = "@myblog"; |
|||
}); |
|||
``` |
|||
|
|||
## Post List Cache |
|||
|
|||
The time-ordered post list is cached per blog for one hour. Creating, updating or deleting posts through `IPostAppService` invalidates that cache within the current unit of work. The blog administration page also provides a **Clear Cache** action to users with the `Blogging.Blog.ClearCache` permission. |
|||
|
|||
If custom code changes posts directly through `IPostRepository`, publish the module's `PostChangedEvent` with the affected blog ID. The built-in event handler then removes that blog's cached list as part of the current unit of work. |
|||
|
|||
## Internals |
|||
|
|||
### Domain Layer |
|||
|
|||
The main aggregates are: |
|||
|
|||
* `Blog`: A named blog identified in public URLs by its short name. |
|||
* `Post`: Markdown content, cover image, URL, tags and read count for a blog. |
|||
* `Comment`: A comment or direct reply attached to a post. |
|||
* `Tag`: A normalized tag and its usage count within a blog. |
|||
* `BlogUser`: The module-local representation of an Identity user and Blogging profile. |
|||
|
|||
### Application Layer |
|||
|
|||
The public application-service contracts are `IBlogAppService`, `IPostAppService`, `ICommentAppService`, `ITagAppService` and `IFileAppService`. `IBlogManagementAppService` provides blog administration operations. |
|||
|
|||
The HTTP API uses the `Blogging` remote-service name for public operations and `BloggingAdmin` for administration operations. Add `BloggingHttpApiClientModule` or `BloggingAdminHttpApiClientModule` to a client application when these services run remotely. |
|||
|
|||
### Database Providers |
|||
|
|||
#### Common |
|||
|
|||
The module uses `Blogging` as its connection string name and falls back to `Default` when that connection is not configured. See the [Connection Strings](../framework/fundamentals/connection-strings.md) documentation. |
|||
|
|||
Tables and collections use the `Blg` prefix by default. Set `AbpBloggingDbProperties.DbTablePrefix` and, for providers that support schemas, `AbpBloggingDbProperties.DbSchema` before the database model is created: |
|||
|
|||
```csharp |
|||
AbpBloggingDbProperties.DbTablePrefix = "MyBlog"; |
|||
AbpBloggingDbProperties.DbSchema = "blogging"; |
|||
``` |
|||
|
|||
#### Entity Framework Core |
|||
|
|||
The Entity Framework Core provider uses these tables: |
|||
|
|||
* `BlgUsers` |
|||
* `BlgBlogs` |
|||
* `BlgPosts` |
|||
* `BlgComments` |
|||
* `BlgTags` |
|||
* `BlgPostTags` |
|||
|
|||
Call `ConfigureBlogging()` from your migration DbContext when integrating the module manually. |
|||
|
|||
#### MongoDB |
|||
|
|||
The MongoDB provider uses these collections: |
|||
|
|||
* `BlgUsers` |
|||
* `BlgBlogs` |
|||
* `BlgPosts` |
|||
* `BlgComments` |
|||
* `BlgTags` |
|||
|
|||
Post-tag links are stored with the post documents, so MongoDB does not use a separate `BlgPostTags` collection. |
|||
|
|||
## See Also |
|||
|
|||
* [CMS Kit: Blogging](cms-kit/blogging.md) |
|||
* [BLOB Storing](../framework/infrastructure/blob-storing) |
|||
* [User Lookup and Synchronization](identity/user-synchronization.md) |
|||
Loading…
Reference in new issue