[开源]OSharpNS 步步为营系列 - 1. 业务模块设计
什么是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设计如下:
- 统一使用后台管理界面来提供 博客、文章 的管理
- 博客管理列表
- 博主
- 已登录未开通博客,显示开通按钮
- 申请之后,博客处理未审核状态
- 博客更新可用
- 博客管理员
- 可以对博客进行审核、更新、删除操作
- 博主
- 文章管理列表
- 博主可以新增文章
- 博主、博客管理员可以更新、删除文章
至此,博客模块的详细设计设计完毕,后面我们将一步一步来实现这个业务需求。
[开源]OSharpNS 步步为营系列 - 1. 业务模块设计的更多相关文章
- [开源]OSharpNS 步步为营系列 - 3. 添加业务服务层
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- [开源]OSharpNS 步步为营系列 - 4. 添加业务对外API
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- [开源]OSharpNS 步步为营系列 - 2. 添加业务数据层
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- [开源]OSharpNS 步步为营系列 - 5. 添加前端Angular模块[完结]
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- Java开源生鲜电商平台-通知模块设计与架构(源码可下载)
Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式: 1. 消息推送:(采用极光推送) ...
- Java开源生鲜电商平台-支付模块的设计与架构(源码可下载)
Java开源生鲜电商平台-支付模块的设计与架构(源码可下载) 开源生鲜电商平台支付目前支持支付宝与微信.针对的是APP端(android or IOS) 1. 数据库表设计. 说明:无论是支付宝还 ...
- Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...
- Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)
Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...
- Java开源生鲜电商平台-团购模块设计与架构(源码可下载)
Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...
随机推荐
- 全网趣味网站分享:今日热榜/Pixiv高级搜索/win10激活工具/songtaste复活/sharesome汤不热替代者
1.回形针手册 由科普类视频节目“回形针PaperClip”近期提出的一个实用百科工具计划,计划名称是回形针手册. 包含了当下科技,农业等等各行各业的各种相关信息,计划刚刚开始! 关于回形针手册的详细 ...
- git 清除远程仓库已经删除的本地分支 清除已经合并到master的本地分支
在gitlab中执行deleted merged.也是可以在本地看到这些分支的 查看本地分支和追踪情况: git remote show origin 可以发现远程分支已被删除的分支,根据提示可以使用 ...
- MySQL 联表查询
关系型数据库,免不了表之间存在各种引用与关联.这些关联是通过主键与外键搭配来形成的.所以,取数据时,很大情况下单张表无法满足需求,额外的数据则需要将其他表加入到查询中来,这便是 JOIN 关键字完成的 ...
- 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏
Windbg的一些简单使用命令 一.崩溃 1. 输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2. 查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame 0,切到第0 ...
- 用AI思维给成本降温,腾讯WeTest兼容性测试直击底价!
WeTest 导读 当AI成为各行业提高产业效率的动能,很多人开始疑惑,这架智能化的“无人机”何时在移动应用测试中真正落地?在今年的国际数码互动娱乐博览会(ChinaJoy)上,腾讯WeTest给出了 ...
- Android 网络加载通用Loading
为了用户体验用好,App在网络请求时通常都会显示个进度显示圈圈,提示用户耐心等待,最脍炙人口的莫过于登录啦. 接下来我们就通过Dialog来实现,然后在BaseActivity,BaseFragmen ...
- 查找树ADT--二叉查找树
二叉树的一个重要应用是它们在查找中的使用. 二叉查找树的性质:对于树中的每个节点X,它的左子树中所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项.这意味着该树所有的元素可以用某种一致的方式 ...
- Python格式化输出和深浅复制
字符串的四种拼接方法,常用格式化 deepcopy(深复制) bytes 和 bytearray 的基本用法 字符串拼接 使用 + 格式化字符串 使用join 用单引号内的字符来拼接,参数填一个整体 ...
- 爬虫scrapy模块
首先下载scrapy模块 这里有惊喜 https://www.cnblogs.com/bobo-zhang/p/10068997.html 创建一个scrapy文件 首先在终端找到一个文件夹 输入 s ...
- 攻防世界web-unserialize3
漏洞编号CVE-2016-7124 详情 https://xz.aliyun.com/t/378 题目源码 class xctf{ '; public function __wakeup(){ ex ...