什么是OSharp
OSharpNS全稱OSharp Framework with .NetStandard2.0,是一個基於.NetStandard2.0
開發的一個.NetCore
快速開發框架。這個框架使用最新穩定版的.NetCore SDK
(當前是.NET Core 2.2),對 AspNetCore 的配置、依賴注入、日志、緩存、實體框架、Mvc(WebApi)、身份認證、權限授權等模塊進行更高一級的自動化封裝,並規范了一套業務實現的代碼結構與操作流程,使 .Net Core 框架更易於應用到實際項目開發中。
- 開源地址:https://github.com/i66soft/osharp
- 官方示例:https://www.osharp.org
- 文檔中心:https://docs.osharp.org
- VS 插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
- 系列示例:https://github.com/i66soft/osharp-docs-samples
概述
本系列教程中,我們將一步一步實現一個博客(BlogsPack)的業務模塊,並對使用OSharp框架進行業務實現的過程涉及的框架知識進行全面的講解。
通過學習本系列教程,你將對OSharp框架的業務實現有個較全面的了解,你將學習到框架的如下知識點:
- 框架推薦的項目文件組織方式
- 實體類設計,並將實體類加載到數據上下文
- 模塊化的業務層服務設計
- 基於WebAPI的角色 功能權限 控制
- 基於 角色-實體 的 數據權限 控制
- Angular前端 菜單/按鈕權限 控制
Pack模塊簡介
Pack模塊是應用程序中的一個高內聚的子系統,負責完成一類功能或者一系列相關聯的業務處理,是構建 OSharp 應用程序的基本功能單元。一系列低耦合的Pack模塊共同組合在一起創建一個 OSharp 應用程序。每個 Pack模塊是以一個實現了模塊基類(OsharpPack)的類作為入口的,這個類完成本模塊的服務添加(AddService)和模塊初始化工作(UsePack)。
OsharpPack 基類定義如下:
/// <summary>
/// OSharp模塊基類
/// </summary>
public abstract class OsharpPack
{
/// <summary>
/// 獲取 模塊級別,級別越小越先啟動
/// </summary>
public virtual PackLevel Level => PackLevel.Business;
/// <summary>
/// 獲取 模塊啟動順序,模塊啟動的順序先按級別啟動,同一級別內部再按此順序啟動,
/// 級別默認為0,表示無依賴,需要在同級別有依賴順序的時候,再重寫為>0的順序值
/// </summary>
public virtual int Order => 0;
/// <summary>
/// 獲取 是否已可用
/// </summary>
public bool IsEnabled { get; protected set; }
/// <summary>
/// 將模塊服務添加到依賴注入服務容器中
/// </summary>
/// <param name="services">依賴注入服務容器</param>
/// <returns></returns>
public virtual IServiceCollection AddServices(IServiceCollection services)
{
return services;
}
/// <summary>
/// 應用模塊服務,初始化模塊
/// </summary>
/// <param name="provider">服務提供者</param>
public virtual void UsePack(IServiceProvider provider)
{
IsEnabled = true;
}
/// <summary>
/// 獲取當前模塊的依賴模塊類型
/// </summary>
/// <returns></returns>
internal Type[] GetDependPackTypes(Type packType = null)
{
// ...
}
}
業務模塊包含什么
一個完整的業務模塊,要實現一系列相關聯的業務功能,需要一個完整的 數據層 - 服務層 - WebAPI層 - 前端UI層 的代碼鏈的支持,各個層次各司其職,共同來完成當前模塊的業務處理。
業務模塊文件夾結構布局
OSharp框架有一套推薦的模塊文件夾布局方案,根據該方案,博客Blogs
模塊的 后端文件夾 結構推薦如下:
src # 源代碼文件夾
├─Liuliu.Blogs.Core # 項目核心工程
│ └─Blogs # 博客模塊文件夾
│ ├─BlogsPack.cs # 博客模塊入口類
│ ├─BlogsService.cs # 博客服務類
│ ├─BlogsService.Blog.cs # 博客模塊-博客服務類
│ ├─BlogsService.Post.cs # 博客模塊-文章服務類
│ ├─IBlogsContract.cs # 博客模塊服務接口
│ ├─Dtos # 博客模塊DTO文件夾
│ │ ├─BlogInputDto.cs # 博客輸入DTO
│ │ ├─BlogOutputDto.cs # 博客輸出DTO
│ │ ├─PostInputDto.cs # 文章輸入DTO
│ │ └─PostOutputDto.cs # 文章輸出DTO
│ ├─Entities # 博客模塊實體類文件夾
│ │ ├─Blog.cs # 博客實體類
│ │ └─Post.cs # 文章實體類
│ └─Events # 業務事件文件夾
│ ├─VerifyBlogEventData.cs # 審核博客事件數據
│ └─VerifyBlogEventHandler.cs # 審核博客事件處理器
├─Liuliu.Blogs.EntityConfiguration # 實體映射配置工程
│ └─Blogs # 博客模塊文件夾
│ ├─BlogConfiguration.cs # 博客實體映射配置類
│ └─PostConfiguration.cs # 文章實體映射配置類
└─Liuliu.Blogs.Web # 項目Web工程
└─Areas # 區域文件夾
└─Admin # 管理區域文件夾
└─Controllers # 管理控制器文件夾
└─Blogs # 博客模塊文件夾
├─BlogController.cs # 博客管理控制器
└─PostController.cs # 文章管理控制器
博客Blogs
模塊相應的 Angular 前端文件夾 結構推薦如下:
src # 源代碼文件夾
└─app # APP文件夾
└─routes # 路由文件夾
└─blogs # 博客模塊文件夾
├─blogs.module.ts # 博客模塊文件
├─blogs.routing.ts # 博客模塊路由文件
├─blog # 博客組件文件夾
│ ├─blog.component.html # 博客組件模板文件
│ └─blog.component.ts # 博客組件文件
└─post # 文章組件文件夾
├─post.component.html # 文章組件模板文件
└─post.component.ts # 文章組件文件
博客業務需求分析
- 已登錄 並且未開通博客的用戶,可以向系統申請開通博客
- 博客管理員 審核並開通博客,並給相應用戶分配 博主 角色,同時發郵件通知用戶(如果郵件可用)
- 博客管理員 可以對博客、文章進行 更新、刪除 的管理操作
- 博主 可以對博客進行更新操作
- 博主 可以對文章進行 新增、更新、刪除 操作
- 博客、文章均開啟 邏輯刪除 功能,保留歷史數據
數據層
OSharp的數據層,主要是 數據實體 的定義,只要數據實體定義好,並做好 數據實體映射,再配合框架中已定義好的數據倉儲 IRepository<TEntity, TKey>,即可輕松完成數據的數據庫存取操作。
一個最簡單的博客系統,需要有 作者、博客、文章 三個數據實體。
-
作者 - User
博客系統的作者就是OSharp框架的 用戶(User),直接使用即可。
-
博客 - Blog
字段 數據類型 描述 備注 InputDto OutputDto Id int 博客編號 主鍵,唯一 是 是 Url string 博客地址 唯一 是 是 Display string 博客顯示名稱 是 是 IsEnabled boolean 已開通 否 是 CreatedTime DateTime 創建時間 否 是 DeletedTime DateTime 邏輯刪除時間 可空 否 否 UserId int 博主編號 外鍵,一對一 否 是 -
文章 - Post
字段 數據類型 描述 備注 InputDto OutputDto Id int 文章編號 主鍵,唯一 是 是 Title string 文章標題 是 是 Content string 文章內容 是 是 CreatedTime DateTime 創建時間 否 是 DeletedTime DateTime 邏輯刪除時間 可空 否 否 BlogId int 博客Id 外鍵,多對一 否 是 UserId int 作者編號 外鍵,多對一 否 是
服務層
服務層負責實現模塊的業務處理,是整個系統的最核心部分,一個系統有什么功能,能對外提供什么樣的服務,都是在服務層實現的。
實體 | 業務操作 |
---|---|
博客 | 申請開通、開通審核、更新、刪除 |
文章 | 新增、更新、刪除 |
WebAPI層
WebAPI層負責對外提供數據操作API,並對API進行授權約束。
-
博客管理 - Blog
操作 訪問類型 操作角色 申請開通 登錄訪問 已登錄未開通博客的用戶 讀取 角色訪問 博客管理員、博主 開通審核 角色訪問 博客管理員 更新 角色訪問 博客管理員、博主 -
文章管理 - Post
操作 訪問類型 操作角色 讀取 角色訪問 博客管理員、博主 新增 角色訪問 博主 更新 角色訪問 博客管理員、博主 刪除 角色訪問 博客管理員、博主
前端UI層
前端UI層是整個系統的對外操作界面,是直面最終用戶的終端,整個系統最終表現形式全靠前端展現出現。
博客模塊UI設計如下:
- 統一使用后台管理界面來提供 博客、文章 的管理
- 博客管理列表
- 博主
- 已登錄未開通博客,顯示開通按鈕
- 申請之后,博客處理未審核狀態
- 博客更新可用
- 博客管理員
- 可以對博客進行審核、更新、刪除操作
- 博主
- 文章管理列表
- 博主可以新增文章
- 博主、博客管理員可以更新、刪除文章
至此,博客模塊的詳細設計設計完畢,后面我們將一步一步來實現這個業務需求。