[開源]OSharpNS 步步為營系列 - 1. 業務模塊設計


什么是OSharp

OSharpNS全稱OSharp Framework with .NetStandard2.0,是一個基於.NetStandard2.0開發的一個.NetCore快速開發框架。這個框架使用最新穩定版的.NetCore SDK(當前是.NET Core 2.2),對 AspNetCore 的配置、依賴注入、日志、緩存、實體框架、Mvc(WebApi)、身份認證、權限授權等模塊進行更高一級的自動化封裝,並規范了一套業務實現的代碼結構與操作流程,使 .Net Core 框架更易於應用到實際項目開發中。

概述

本系列教程中,我們將一步一步實現一個博客(BlogsPack)的業務模塊,並對使用OSharp框架進行業務實現的過程涉及的框架知識進行全面的講解。
通過學習本系列教程,你將對OSharp框架的業務實現有個較全面的了解,你將學習到框架的如下知識點:

  1. 框架推薦的項目文件組織方式
  2. 實體類設計,並將實體類加載到數據上下文
  3. 模塊化的業務層服務設計
  4. 基於WebAPI的角色 功能權限 控制
  5. 基於 角色-實體 的 數據權限 控制
  6. 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設計如下:

  • 統一使用后台管理界面來提供 博客、文章 的管理
  • 博客管理列表
    • 博主
      • 已登錄未開通博客,顯示開通按鈕
      • 申請之后,博客處理未審核狀態
      • 博客更新可用
    • 博客管理員
      • 可以對博客進行審核、更新、刪除操作
  • 文章管理列表
    • 博主可以新增文章
    • 博主、博客管理員可以更新、刪除文章

至此,博客模塊的詳細設計設計完畢,后面我們將一步一步來實現這個業務需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM