同步操作将从 柳柳软件/osharp 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
OSharp是一个基于.Net6.0+开发的一个.Net快速开发框架。这个框架使用最新稳定版的.Net SDK(当前是.NET 6.0),对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、权限授权等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net Core 框架更易于应用到实际项目开发中。
框架设计了一个模块(Pack)的系统,所有实现了模块基类(OsharpPack)的类都视为一个独立的模块,一个模块可以独立添加服务(AddServices),并可在初始化时应用服务(UsePack)进行模块初始化。
框架定义了ISingletonDependency
,IScopeDependency
,ITransientDependency
三个空接口对应 DependencyInjection 中的三种服务生命周期,系统初始化时,通过反射检索程序集的方式,检索出所有服务类型(ServiceType)与服务实现(ImplementationType)及生命周期类型(ServiceLifetime)的相关数据,对依赖注入的 ServiceCollection 进行全自动初始化。
数据模块使用了UnitOfWork-Repository
的模式来设计,设计了一个泛型的实体仓储接口IRepository<TEntity,TKey>
,避免每个实体都需实现一个仓储的繁琐操作。设计了IUnitOfWork
接口来管理事务,通过 UnitOfWork 模式管理 DbContext 的创建,使同上下文类型同数据库连接字符串的上下文使用相同 DbConnection对象来创建,达到多上下文的事务同步能力。
基于 MVC 的ActionFilter
的UnitOfWorkAttribute
AOP 事务自动提交,业务中不再需要关心事务的生命周期。
系统初始化时,通过反射检索程序集的方式,检索出各个实体与上下文的映射关系,向上下文中动态添加实体类来构建上下文类型,以达到上下文类型与业务实体解耦的目的。通过统一基类EntityTypeConfigurationBase<TEntity, TKey>
的 FluentAPI 实体映射,自由配置每个实体与数据库映射的每一个细节。
使用 AspNetCore 原生的用户身份认证框架,身份认证相关操作统一使用UserManager<TUser>
,RoleManager<TRole>
两个入口,保持了原生 Identity 的体系强大性与功能完整性。
重新设计了用户存储UserStore
和角色存储RoleStore
,使用框架内设计的IRepository<TEntity,TKey>
数据仓储接口来实现对数据的仓储操作,使 Identity身份认证系统与框架完美结合,避免了使用官方的Microsoft.AspNetCore.Identity.EntityFrameworkCore
造成多个上下文或者被强制使用 Identity 上下文作为系统数据上下文来实现业务造成的尴尬。
从底层开始,自动收集了系统的所有业务点(IFunction)和数据实体(IEntityInfo),用于对系统的功能权限、数据权限、数据缓存、操作审计 等实用功能提供数据支持。
功能点Function
与 MVC 的Area/Controller/Action
一一对应,是功能权限的最小验证单位,基于功能点,可以配置:
数据实体EntityInfo
与数据库中的各个数据实体一一对应,基于数据实体,可以配置:
Function
上的同配置级别不同,如果指定实体未开放审计,则不审计当前实体。角色 - 实体
的数据权限设计,通过配置实现 XXX 角色是否有权访问 XXX 实体数据(的 XX 属性)设计了一个树形结构的业务模块体系(Module),对应着后端向前端开放的操作点(菜单/按钮),一个模块可由一个或多个功能点构成,模块是对外开放的特殊功能点,是进行角色/用户功能授权的单位。把一个模块授权给角色,角色即拥有了一个或多个功能点的操作权限。
Area/Controller/Action
的功能点Function
信息,存储到数据库Module
信息,并创建模块与功能点(一个或多个)的分配关系,存储到数据库Module
分配给角色Role
Role
分配给用户User
Module
分配给用户User
,解决特权问题Role
分配到的模块Module
,自动初始化每个 角色 Role - Function[]
的权限对应关系并缓存FunctionAccessType.Anonymouse
的模块信息并缓存到浏览器,浏览器根据这个缓存的模块集合,对前端页面的各个操作点(菜单/按钮)进行是否隐藏/禁用的状态控制FunctionAccessType.Anonymouse
、登录的FunctionAccessType.Logined
、指定角色的FunctionAccessType.RoleLimit
)的模块信息并缓存到浏览器,浏览器根据这个缓存的模块集合,对前端页面的各个操作点(菜单/按钮)进行是否隐藏/禁用的状态控制User
执行一个功能点Function
时,验证流程如下:
FunctionAccessType.Anonymouse
验证通过FunctionAccessType.Logined
时,用户未登录,返回 401,已登录则验证通过FunctionAccessType.RoleLimit
时,流程如下:
Role
,根据角色从缓存中取出Role-Function[]
缓存项,Function[]
包含要验证的功能点时,验证通过Module
对应的功能点,获取到User-Function[]
(并缓存),Function[]
包含要验证的功能点时,验证通过Role
-实体EntityInfo
的一一对应关系,配置指定角色对指定数据实体的数据查询筛选规则,并持久化到数据库中FilterGroup
和条件FilterRule
,一个条件组 FilterGroup 包含 一个或多个条件 FilterRule 和 一个或多个 条件组FilterGroup
,这样就实现了条件组和条件的无限嵌套,能满足绝大多数数据筛选规则的组装需要,如下图:角色-实体
的数据筛选规则缓存到内存中角色 Role
和要查询的实体 EntityInfo
,查找出所有配置的数据筛选规则FilterGroup
,转换为数据查询表达式Expression<Func<TEntity,bool>>
,各个角色的表达式之间使用Or
逻辑进行组合数据权限
数据查询表达式,使用And
逻辑组合到用户的提交的查询条件生成的表达式中,得到最终的数据查询表达式,提交到数据库中进行数据查询,从而获得数据权限限制下的合法数据OSharp 快速启动模板的开发模式,集成了Swagger
API 文档生成组件,更方便了前后端分离的开发模式中前后端开发人员的数据接口对接工作。基于Swagger
的工作原理,API 的输入输出都需使用强类型
的数据类型,Swagger
才能发挥更好的作用,而 OSharp 框架通过AutoMapper
的ProjectTo
对业务实体到输出 DTOIOutputDto
提供了自动映射功能,能有效减轻后端开发中数据对象属性映射的工作量。
OSharp 框架制作了一个基于dotnet cli
命令行工具的快速启动模板,下面演示如何来使用这个模板快速创建一个基于 OSharp 框架的初始化项目。
dotnetcore sdk
OSharp 当前版本(6.0.0)使用了 .net
当前最新版本 6.0.0
,所以对应的 net sdk
需要安装到对应版本 >=v6.0.0。
dotnet new
项目模板在任意空白目录,打开 cmd
或powershell
命令行窗口,执行命令
dotnet new -i OSharp.Template.WebApi
执行后,将能看到osharp_xxx
系列的命令已安装到列表中
osharp
命令,获取项目一键项目安装脚本dotnet new osharp
执行后,将得到一个名为osharp.bat
的批处理脚本文件
直接执行osharp.bat
脚本代码,将会提示 请输入项目名称,推荐形如 “公司.项目”的模式:
,此名称将用作解决方案名称、工程名称起始部分、代码中的namespace
起始部分。例如输入Liuliu.Demo
,将生成如下代码结构:
打开解决方案后,各个工程之间的引用关系已配置好,osharp 框架的类库已引用 nuget.org 上的相应版本,并将自动还原好。项目结构如图所示:
Dtos
、实体类型Entities
、事件处理Events
等,业务接口 IXXXContract 与业务实现 IXXXService 放在外边,如果文件数量多的话也可以建文件夹存放。appsetting.Development.json
中的OSharp:DbContexts:[SqlServer|MySql]
中的配置信息,ConnectionString
为数据库连接串,AutoMigrationEnabled
为是否开启自动迁移AutoMigrationEnabled
的自动迁移功能,还需要在nuget 控制台
手动执行迁移操作Update-Database
7001
的项目,启动后开发模式将进入Swagger
的后端 Api 接口的文档页。前端项目使用了ng-alain
和kendoui
作为 UI 进行开发的,需要熟悉nodejs
,angular7
等技术。
NodeJS
,搭建前端技术环境安装最新版本 NodeJS:angular7 需要最新版本(node 10.x 和 npm 6.x 以上的版本)的 NodeJS,请到 NodeJS 官方网站 下载最新版本的 NodeJS 进行安装。
设置 npm 的淘宝镜像仓库:由于 npm 的国外仓储会很慢,所以最好把 npm 仓库地址指定国内镜像,推荐淘宝镜像:
npm config set registry https://registry.npm.taobao.org
安装全局 Angular/Cli:如果 Angular/Cli 没有安装,执行如下命令全局安装 Angular Angular 的快速启动,请参考Angular 官方文档
npm install -g @angular/cli
下载安装 Visual Studio Code:前端最好用的 IDE,官方下载
src/ui/ng-alain
,在空白处点右键,使用 VS Code 打开项目,可看到如下结构:按Ctrl+Tab
快捷键,调出 VS Code 的命令行控制台,输入 NodeJS 包安装命令:
npm install
包安装完成后,输入项目启动命令:
npm start
此命令将会执行如下命令:ng serve --port 4201 --proxy-config proxy.config.json --open
,其中--proxy-config proxy.config.json
对前端项目发起的 API 请求进行了代理,所有以 /api/
开头的请求,都会转发到服务端项目中进行处理,代理的实际配置如下:
{
"/api": {
"target": "http://localhost:7001",
"secure": false
}
}
至此,项目启动完成,最终效果如下图所示:
截止到目前,OSharp 框架的完成程度已经很高了,计划中的功能点,均已得到较高水准的实现,具体功能点完成进度如下所示:
Profile
来实现映射注册IMapTuple
接口的Profile
来自动注册映射策略MapToAttribute
,MapFromAttribute
类型,用以标注 Mapping 的 Source 与 Target 类型,使用时在要映射的类型上标注如[MapTo(typeof(TTarget))]
或[MapFrom(typeof(TSource))]
特性,框架初始化时自动查找相应的类型进行 CreateMap 映射注册app.UseOSharp()
,调用 Pack 模块管理器OSharpPackManager
启动各个功能模块(OSharpPack)ApiController
,AreaApiController
- [x] 实现 MVC 功能点处理器 - [x] 实现 MVC 业务模块处理器 - [x] 实现基于 MVC 的功能权限 AOP 拦截验证 - [x] 实现基于 MVC 的事务提交 AOP 拦截提交IUserClaimsProvider
NickName
属性,并添加默认验证器角色-功能点
,用户-功能点
的功能权限验证角色-实体
,用户-实体
的数据权限配置角色-实体
,用户-实体
的数据权限过滤此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。