开源]OSharpNS 步步为营系列 - 1. 业务模块设计

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

本系列教程中,我们将一步一步实现一个博客(BlogsPack)的业务模块,并对使用OSharp框架进行业务实现的过程涉及的框架知识进行全面的讲解。
通过学习本系列教程,你将对OSharp框架的业务实现有个较全面的了解,你将学习到框架的如下知识点:

  1. 框架推荐的项目文件组织方式

  2. 实体类设计,并将实体类加载到数据上下文

  3. 模块化的业务层服务设计

  4. 基于WebAPI的角色 功能权限 控制

  5. 基于 角色-实体 的 数据权限 控制

  6. Angular前端 菜单/按钮权限 控制

Pack模块是应用程序中的一个高内聚的子系统,负责完成一类功能或者一系列相关联的业务处理,是构建 OSharp 应用程序的基本功能单元。一系列低耦合的Pack模块共同组合在一起创建一个 OSharp 应用程序。每个 Pack模块是以一个实现了模块基类(OsharpPack)的类作为入口的,这个类完成本模块的服务添加(AddService)和模块初始化工作(UsePack)。

OsharpPack 基类定义如下:

public abstract class OsharpPack
{
public virtual PackLevel Level => PackLevel.Business;

public virtual int Order => 0;

public bool IsEnabled { get; protected set; }


public virtual IServiceCollection AddServices(IServiceCollection services)
{
return services;
}

public virtual void UsePack(IServiceProvider provider)
{
IsEnabled = true;
}

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
│ │ ├─BlogInputDto.cs
│ │ ├─BlogOutputDto.cs
│ │ ├─PostInputDto.cs
│ │ └─PostOutputDto.cs
│ └─Entities
│ ├─Blog.cs
│ └─Post.cs
├─Liuliu.Blogs.EntityConfiguration
│ └─Blogs
│ ├─BlogConfiguration.cs
│ └─PostConfiguration.cs
└─Liuliu.Blogs.Web
└─Areas
└─Admin
└─Controllers
└─Blogs
├─BlogController.cs
└─PostController.cs

博客Blogs模块相应的 Angular 前端文件夹 结构推荐如下:

src                                         
└─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

    Idint博客编号主键,唯一
    Urlstring博客地址唯一
    Displaystring博客显示名称
    IsEnabledboolean已开通
    CreatedTimeDateTime创建时间
    DeletedTimeDateTime逻辑删除时间可空
    UserIdint博主编号外键,一对一
  • 文章 - Post

    Idint文章编号主键,唯一
    Titlestring文章标题
    Contentstring文章内容
    CreatedTimeDateTime创建时间
    DeletedTimeDateTime逻辑删除时间可空
    BlogIdint博客Id外键,多对一
    UserIdint作者编号外键,多对一

服务层

服务层负责实现模块的业务处理,是整个系统的最核心部分,一个系统有什么功能,能对外提供什么样的服务,都是在服务层实现的。

博客申请开通、开通审核、更新、删除
文章新增、更新、删除

WebAPI层

WebAPI层负责对外提供数据操作API,并对API进行授权约束。

  • 博客管理 - Blog

    申请开通登录访问已登录未开通博客的用户
    读取角色访问博客管理员、博主
    开通审核角色访问博客管理员
    更新角色访问博客管理员、博主
    删除角色访问博客管理员
  • 文章管理 - Post

    读取角色访问博客管理员、博主
    新增角色访问博主
    更新角色访问博客管理员、博主
    删除角色访问博客管理员、博主

前端UI层

前端UI层是整个系统的对外操作界面,是直面最终用户的终端,整个系统最终表现形式全靠前端展现出现。
博客模块UI设计如下:

  • 统一使用后台管理界面来提供 博客、文章 的管理

  • 博客管理列表

    • 可以对博客进行审核、更新、删除操作

    • 已登录未开通博客,显示开通按钮

    • 申请之后,博客处理未审核状态

    • 博客更新可用

    • 博主

    • 博客管理员

  • 文章管理列表

    • 博主可以新增文章

    • 博主、博客管理员可以更新、删除文章

至此,博客模块的详细设计设计完毕,后面我们将一步一步来实现这个业务需求。

原文地址:https://www.cnblogs.com/guomingfeng/p/osharpns-steps-index.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF1479A Searching Local Minimum

CF1479A Searching Local Minimum 题意&#xff1a; 题解&#xff1a; 先说结论&#xff1a; 若l&#xff0c;r满足&#xff1a; al−1>al,ar<ar1a_{l-1}>a_{l},a_{r}<a_{r1}al−1​>al​,ar​<ar1​al,al1,....,ara_{l},a_{l1},....,a_{r}al​,al1​,....…

C#8.0的两个有趣的新特性以及gRPC

最近每天忙着跑很多地方&#xff0c;回家就不想动了&#xff0c;没什么心情写东西。今天有空&#xff0c;稍微写一点。下文中&#xff1a;关于C#语法特性的部分需要Visual Studio 2019支持。关于.NET Core的部分需要安装.NET 3.0 Preview4&#xff0c;低版本或许也可以但我没实…

CF1479B Painting the Array

CF1479B1 Painting the Array I CF1479B1 Painting the Array II 题意&#xff1a; 本题与 CF1480D2 的唯一区别是本题询问最大可能解. 给定一个数组a,你将ai染为bi色,其中b是由你指定的一个01数组.将a数组中被染成0色的数字取出来并依在a中出现的顺序排列,组成数组a(0).同理…

在 ASP.NET Core 中安装 MVC

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 视频课程效果更佳&#xff1a;从零开始学 Asp.Net Core MVC 在ASP.NET Core 中安装 MVC在本视频中&#xff0c;我们将讨论在 ASP.NET Core 应用程序中设置 MVC。到目前为止&#xff0c;我们在本系列视频中使用的 ASP.NET Core…

CF1479C Continuous City

CF1479C Continuous City 题意&#xff1a; 给定 L, R. 构造一个有向带权图, 其中点数不大于 32, 且所有边都是从较小的点指向较大的点. 假设这个有向图有 n 个点, 你需要保证从 1到n 的所有路径的权值都在 [L, R]内且不存在 x∈[L,R], 使得不存在或存在多于一条从 1 到 n 的…

Office转PDF,Aspose太贵,怎么办?

在程序开发中经常需要将Office文件转换成PDF&#xff0c;著名的Aspose的三大组件可以很容易完成这个功能&#xff0c;但是Aspose的每个组件都单独收费&#xff0c;而且每个都卖的不便宜。在老大的提示下&#xff0c;换了一种思路来解决这个问题。环境dotNetCore:2.1CentOS:7.5D…

Codeforces Round #541 (Div. 2)

Codeforces Round #541 (Div. 2) 题号题目知识点ASea Battle思维BDraw!贪心模拟CBirthday思维DGourmet choiceEString MultiplicationFAsya And KittensGMost Dangerous Shark

收起.NET程序的dll来

作为上床后需要下床检查好几次门关了没有的资深强迫症患者&#xff0c;有一个及其搞我的问题&#xff0c;就是dll问题。曾几何时&#xff0c;在没有nuget的年代&#xff0c;当有依赖项需要引用的时候&#xff0c;只能通过文件引用来管理引用问题&#xff0c;版本问题&#xff0…

CF1479D Odd Mineral Resource

CF1479D Odd Mineral Resource 题意&#xff1a; 给定一棵树&#xff0c;每个点有颜色 cic_ici​&#xff0c;多次查询&#xff0c;每次给定 u,v,l,r&#xff0c;你需要给出一个颜色 x&#xff0c;使得 x 满足&#xff1a; x∈[l,r]x\in [l,r]x∈[l,r] x在u到v的路径上出现了…

从壹开始 [ Ids4实战 ] 之三║ 详解授权持久化 用户数据迁移

哈喽大家周三好&#xff0c;今天终于又重新开启 IdentityServer4 的落地教程了&#xff0c;不多说&#xff0c;既然开始了&#xff0c;就要努力做好?。书接上文&#xff0c;在很久之前的上篇文章《二║ 基础知识集合 & 项目搭建一》中&#xff0c;我们简单的说了说 Identi…

Codeforces Round #516 (Div. 2Div.1)

Codeforces Round #516 (Div. 2&&Div.1) (Div.1) 题号题目知识点AMake a triangle!贪心题BEquations of Mathematical Magic推公式COh Those Palindromes推导题(猜结论)DLabyrinthbfs剪枝EDwarves, Hats and Extrasensory Abilities思维构造FCandies for ChildrenGLas…

微软XAML Studio - WPF, UWP, Xamarin等技术开发者的福音

最近在继续倒腾WPF的项目&#xff0c;继续使用Caliburn.Micro和Xceed来堆代码。每次调试xaml上的binding&#xff0c;都有种要疯的赶脚。今天路过 https://channel9.msdn.com/ 浏览 WPF相关的学习视频时&#xff0c;遇到微软推荐的相关视频 - XAML sutdio简介https://channel9.…

CF1063A Oh Those Palindromes

CF1063A Oh Those Palindromes 题意&#xff1a; 一个非空字符串叫做回文串。如果它从左到右&#xff0c;从右到左读相同&#xff0c;那么它就是回文串。 例如&#xff0c;“ABCBA”,“A”和“ABBA”都是回文串&#xff0c;而“ABAB”和“XY”则不是。 如果可以通过从字符串…

AddMvc 和 AddMvcCore 的区别

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 视频课程效果更佳&#xff1a;从零开始学 Asp.Net Core MVC ASP.NET Core 为什么有 AddMvc 和 AddMvcCore 他们是什么关系&#xff1f;在本视频中&#xff0c;我们将讨论 AddMvc()和 AddMvcCore()方法之间的区别。要在 ASP.NE…

CF1063B Labyrinth

CF1063B Labyrinth 题意&#xff1a; 你正在玩一款电脑游戏。在其中一关&#xff0c;你位于一个 n 行 m 列的迷宫。每个格子要么是可以通过的空地&#xff0c;要么是障碍。迷宫的起点位于第 r 行第 c 列。你每一步可以向上、下、左、右中的一个方向移动一格&#xff0c;前提是…

浅谈容量规划

俗话说&#xff0c;”人无远虑&#xff0c;必有近忧”&#xff0c;容量规划就是”远虑”。所谓容量规划&#xff0c;是一个产品满足用户目标需求而决定生产能力的过程。当产品发展到一个较为稳定成熟的阶段&#xff0c;产品的整体处理能力的把控自然是不可或缺&#xff0c;尽管…

CF1063C Dwarves, Hats and Extrasensory Abilities

CF1063C Dwarves, Hats and Extrasensory Abilities 题意&#xff1a; 首先题目会给出 n &#xff0c;表示要输入多少点。 然后你输出n 个点的坐标&#xff0c;每输出一个点会告诉你这个点的颜色是黑色或者白色。 最后你需要输出两个点的坐标代表一条直线&#xff0c;这条直线…

Blazor——Asp.net core的新前端框架

Blazor是微软在Asp.net core 3.0中推出的一个前端MVVM模型&#xff0c;它可以利用Razor页面引擎和C#作为脚本语言来构建WEB页面&#xff0c;如下代码简单演示了它的基本功能&#xff1a;和Angular JS和VUE的模型非常类似&#xff0c;Blazor 支持大多数应用所需的核心方案&#…

CF1149B Three Religions

CF1149B Three Religions 题意&#xff1a; 给定长度为 n 的母串和三个子串s1,s2,s3s_1,s_2,s_3s1​,s2​,s3​ 。初始时子串均为空。有 q 次询问。你需要支持两种操作&#xff1a;向某个子串末尾添加一个字母&#xff0c;或者删去某个子串末尾的字母。在每次操作后&#xff…

【译文】领域模型的五个特征

我在这篇博客文章中&#xff0c;我试图给领域模型下一个非常合适的定义&#xff0c;我发现我的这些定义都不太妥当&#xff0c;不过&#xff0c;我们还是可以先来看一下wiki百科对领域驱动模型下的定义&#xff1a;问题解决和软件工程中的领域模型可以被认为是感兴趣的领域&…