易云开发平台(Easy Cloud Framework)简称 EaCloud(EaCloud Framework),是一个基于.Net 7开发的一个.NetCore快速开发框架。这个框架使用最新稳定版的.NetCore SDK(当前是.NET 7),对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、WebApi、身份认证、权限授权等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与代码编写操作流程,使的实际应用项目开发和运维更高效、更简单。
后端接口服务项目:
前端中后台项目:
前端移动PDA项目:
演示DEMO:
【EaCloud】核心组件,封装着框架核心及数据存储,缓存,辅助操作等功能。
【EaCloud.AspNetCore】AspNetCore 组件,提供 AspNetCore 的服务端功能的封装。
【EaCloud.AspNetCore.Diagnostics】AspNetCore 性能诊断组件,提供 AspNetCore 性能诊断功能的封装。
【EaCloud.Authorization.Datas】数据权限组件,对应用中数据权限进行授权的设计实现。
【EaCloud.Authorization.Functions】功能权限组件,API功能权限的设计实现。
【EaCloud.AutoMapper】AutoMapper 对象映射组件,封装基于 AutoMapper 的对象映射功能实现。
【EaCloud.Baidu】Baidu 组件,包含百度地图开放平台接口处理功能。
【EaCloud.EntityFrameworkCore】数据访问组件,封装 EntityFrameworkCore 数据访问功能的实现。
【EaCloud.EntityFrameworkCore.Allinone】EaCloud 一体化数据访问组件,封装 Cosmos(Azure Cosmos DB 的 SQL API)、Kdbndp(人大金仓)、MySql、Oracle、PostgreSql、SapHana、Sqlite、SqlServer 类型数据访问功能的实现。
【EaCloud.EntityFrameworkCore.Cosmos】Azure Cosmos DB 组件,封装基于 Microsoft.EntityFrameworkCore.Cosmos 的数据访问功能的实现(受限于只能使用SQL类型数据库,不建议使用)。
【EaCloud.EntityFrameworkCore.Kdbndp】Kdbndp(人大金仓) 数据库组件,封装基于 Kdbndp.EntityFrameworkCore.KingbaseES 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.MySql】MySql 数据库组件,封装基于 Pomelo.EntityFrameworkCore.MySql 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.Oracle】Oracle 数据库组件,封装基于 Oracle.EntityFrameworkCore 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.PostgreSql】PostgreSql 数据库组件,封装基于 Npgsql.EntityFrameworkCore.PostgreSQL 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.SapHana】SAP HANA 数据库组件,封装基于 CData.SAPHANA.EntityFrameworkCore 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.Sqlite】Sqlite 数据库组件,封装基于 Microsoft.EntityFrameworkCore.Sqlite 的数据访问功能的实现。
【EaCloud.EntityFrameworkCore.SqlServer】SqlServer 数据库组件,封装基于 Microsoft.EntityFrameworkCore.SqlServer 的数据访问功能的实现。
【EaCloud.Exceptionless】Exceptionless 分布式日志组件,封装基于 Exceptionless 分布式日志记录实现。
【EaCloud.FastReport】FastReport组件,封装 FastReport.OpenSource 的报表处理功能。
【EaCloud.File】文件处理组件,封装基于Web的文件资源管理服务,支持数据库、物理存储、数据存储服务三种存储方式,物理存储模式下支持静态资源URL映射。
【EaCloud.Hangfire】Hangfire 后台任务组件,封装基于 Hangfire 后台任务的服务端实现。
【EaCloud.Identity】身份认证组件,基于 AspNetCore.Identity 和 EaCloud数据仓储模型 的身份认证实现。
【EaCloud.IoT】物联网组件,封装南北向连接的自动化交换通讯的可配置化聚合功能。
【EaCloud.IoT.Core】物联网核心组件,封装着物联网模块基础核心对象,可独立引用实现南向驱动扩展等二次开发场景需求。
【EaCloud.Log4Net】Log4Net 日志组件,封装使用 Log4Net 框架实现的日志输出功能。
【EaCloud.MiniProfiler】MiniProfiler 性能监测组件,封装基于 MiniProfiler 框架实现的性能监测功能。
【EaCloud.NLog】NLog 日志组件,封装使用 Nlog 框架实现的日志输出功能。
【EaCloud.Redis】Redis 缓存组件,封装基于 Redis 客户端的缓存实现。
【EaCloud.Report】报表组件,封装打印、看板报表、表格报表处理功能。
【EaCloud.SMS】短信组件,封装阿里云、逸峰信盈通验证码、通知、推广短信处理功能。目前已完成验证码短信发送、验证的处理机制。
【EaCloud.Swagger】Swagger API 文档生成组件,封装基于 Swagger 的 API 接口文档生成及调试功能。
【EaCloud.Utils】工具组件,封装着框架常用的工具类。
【EaCloud.Workflow】工作流引擎组件,基于BPMN模型,实现办公自动化、文件审批、业务单据、请假报销等场景的流程逻辑。
【EaCloud.Pack.Audit】审计模块,包含操作审计和数据审计。
【EaCloud.Pack.Authorization】权限模块,包含数据权限和功能权限。
【EaCloud.Pack.File】文件处理模块,封装基于 EaCloud 文件处理组件的功能实现。
【EaCloud.Pack.Identity】身份认证模块,封装基于 EaCloud 身份认证组件的功能实现。
【EaCloud.Pack.IM】即时通讯模块,封装即时消息收发及消息记录管理功能。
【EaCloud.Pack.IoT】物联网模块,封装南北向连接的自动化交换通讯的可配置化聚合功能的实现。
【EaCloud.Pack.Menu】菜单模块,封装后台动态获取菜单模式下菜单管理功能。
【EaCloud.Pack.Message】消息模块,封装公告讯息收发及记录管理功能。
【EaCloud.Pack.Report】报表模块,封装基于 EaCloud 报表组件的功能实现。
【EaCloud.Pack.SMS】短信模块,封装基于 EaCloud 短信组件的功能实现。
【EaCloud.Pack.Workflow】工作流引擎模块,封装基于 EaCloud 工作流引擎组件的功能实现。
【EaCloud.Api.Audit】审计模块API,封装基于 EaCloud 审计模块的WebApi实现。
【EaCloud.Api.Authorization】权限模块API,封装基于 EaCloud 权限模块的WebApi实现。
【EaCloud.Api.Baidu】百度模块API,封装基于 EaCloud 百度模块的WebApi实现。
【EaCloud.Api.File】文件模块API,封装基于 EaCloud 文件模块的WebApi实现。
【EaCloud.Api.Identity】身份认证模块API,封装基于 EaCloud 身份认证模块的WebApi实现。
【EaCloud.Api.IM】即时通讯模块API,封装基于 EaCloud 即时通讯模块的WebApi实现。
【EaCloud.Api.IoT】EaCloud 物联网模块API,封装基于 EaCloud 物联网模块的WebApi实现。
【EaCloud.Api.Menu】菜单模块API,封装基于 EaCloud 菜单模块的WebApi实现。
【EaCloud.Api.Message】消息模块API,封装基于 EaCloud 消息模块的WebApi实现。
【EaCloud.Api.Report】报表模块API,封装基于 EaCloud 报表模块模块的WebApi实现。
【EaCloud.Api.SMS】短信模块API,封装基于 EaCloud 短信模块的WebApi实现。
【EaCloud.Api.System】系统公共API,封装图形验证码、模块信息等公共WebApi实现。
框架设计了一个模块(Pack)的系统,所有实现了模块基类(PackBase)的类都视为一个独立的模块,一个模块可以独立添加服务(AddServices),并可在初始化时应用服务(UsePack)进行模块初始化。
框架定义了ISingletonDependency
,IScopeDependency
,ITransientDependency
三个空接口对应DependencyInjection中的三种服务生命周期,系统初始化时,通过反射检索程序集的方式,检索出所有服务类型(ServiceType)与服务实现(ImplementationType)及生命周期类型(ServiceLifetime)的相关数据,对依赖注入的ServiceCollection进行全自动初始化。
实体数据模块使用了UnitOfWork + Repository
的模式来设计,设计了一个泛型的实体仓储接口IRepository<TEntity,TKey>
,避免每个实体都需实现一个仓储的繁琐操作。设计了IUnitOfWork
接口来管理事务,通过UnitOfWork模式管理DbContext的创建,使同上下文类型同数据库连接字符串的上下文使用相同DbConnection对象来创建,达到多上下文的事务同步能力。
基于API的ActionFilter
的UnitOfWorkAttribute
AOP 事务自动提交,业务中不再需要关心事务的生命周期。
系统初始化时,通过反射检索程序集的方式,检索出各个实体与上下文的映射关系,向上下文中动态添加实体类来构建上下文类型,以达到上下文类型与业务实体解耦的目的。通过统一基类EntityTypeConfigurationBase<TEntity, TKey>
的FluentAPI实体映射,自由配置每个实体与数据库映射的每一个细节。
使用AspNetCore原生的用户身份认证框架,身份认证相关操作统一使用UserManager<TUser>
,RoleManager<TRole>
两个入口,保持了原生Identity的体系强大性与功能完整性。
重新设计了用户存储UserStore
和角色存储RoleStore
,使用框架内设计的IRepository<TEntity,TKey>
数据仓储接口来实现对数据的仓储操作,使Identity身份认证系统与框架完美结合,避免了使用官方的Microsoft.AspNetCore.Identity.EntityFrameworkCore
造成多个上下文或者被强制使用Identity上下文作为系统数据上下文来实现业务造成的尴尬。
设计了组织机构存储OrganizationStore
,使用框架内设计的IRepository<TEntity,TKey>
数据仓储接口来实现对数据的仓储操作,使Identity身份认证系统与框架组织机构处理完美结合,同时支持更换登录组织后重新发放令牌,并强制原令牌过期机制。
从底层开始,自动收集了系统的所有业务点(IFunction)和数据实体(IEntityInfo),用于对系统的功能权限、数据权限、数据缓存、操作审计 等实用功能提供数据支持。
功能点Function
与API的Area/Controller/Action
一一对应,是功能权限的最小验证单位,基于功能点,可以配置:
数据实体EntityInfo
与数据库中的各个数据实体一一对应,基于数据实体,可以配置:
Function
上的同配置级别不同,如果指定实体未开放审计,则不审计当前实体。设计了一个树形结构的业务模块体系(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
的数据权限设计,通过配置实现 XX角色是否有权访问XX实体数据(的XX属性)角色-实体
的数据筛选规则缓存到内存中角色 Role
和要查询的实体 EntityInfo
,查找出所有配置的数据筛选规则FilterGroup
,转换为数据查询表达式Expression<Func<TEntity,bool>>
,各个角色的表达式之间使用Or
逻辑进行组合数据权限
数据查询表达式,使用And
逻辑组合到用户的提交的查询条件生成的表达式中,得到最终的数据查询表达式,提交到数据库中进行数据查询,从而获得数据权限限制下的合法数据数据查询筛选规则组成为 条件组FilterGroup
和条件FilterRule
,一个条件组 FilterGroup 包含 一个或多个条件 FilterRule 和 一个或多个 条件组FilterGroup
,这样就实现了条件组和条件的无限嵌套,能满足绝大多数数据筛选规则的组装需要,如下图:
EaCloud 快速启动模板的开发模式,集成了 Swagger
API 文档生成组件,方便前后端分离的开发模式中前后端开发人员的数据接口对接工作。基于Swagger
的工作原理,API的输入输出都需使用强类型
的数据类型,Swagger
才能发挥更好的作用,而EaCloud框架通过AutoMapper
的ProjectTo
对业务实体到输出DTOIOutputDto
提供了自动映射功能,能有效减轻后端开发中数据对象属性映射的工作量。
EaCloud 快速开发平台集成了 Hangfire
任务管理组件,方便后端针对任务自动执行的需求。基于Hangfire
的工作原理,支持 列队任务、延时任务、后继任务、定时任务等模式,基于服务注入的模式,任务执行逻辑可以调用系统依赖模块的所有功能,更灵活的实现业务场景。
EaCloud框架制作了一个基于dotnet cli
命令行工具的快速启动模板,下面演示如何来使用这个模板快速创建一个基于EaCloud框架的初始化项目。
EaCloud 使用了 .NET 7.0
。.NET 7.0 sdk
需要安装到版本 >=v7.0.100,.NET 7.0 runtime
需要安装到版本 >=v7.0.0。
dotnet new
项目模板在任意空白目录,打开 cmd
或powershell
Shift+空白处鼠标右击+在此处打开Powershell窗口(S) 命令行窗口,执行命令
dotnet new install EaCloud.Template
执行后,将能看到EaCloud.Template
命令已安装到列表中
EaCloud.Template
命令,获取项目一键项目安装脚本dotnet new EaCloud.Template
执行后,将得到一个名为eacloud.cmd
的批处理脚本文件
直接执行eacloud.cmd
脚本代码,将会提示 请输入项目名称,推荐形如 “公司.项目”的模式:
,此名称将用作后端解决方案名称、工程名称起始部分、代码中的namespace
起始部分。
例如输入SanQing.Test
,然后根据提示步骤操作。当所有确认选项选择Y
时,将生成如下结构:
注:由于 EaCloud 基于最新的 .NET 7.0
框架,IDE工具需要安装 Visual Studio 2022 及以上版本,否则有可能会出现未知的异常。
打开解决方案后,各个工程之间的引用关系已配置好,eacloud框架的类库已引用 nuget.org 上的相应版本,并将自动还原好。项目结构如图所示:
Dtos
、实体类型Entities
、事件处理Events
等,业务接口IXXXContract与业务实现IXXXService放在外边,如果文件数量多的话也可以建文件夹存放。services
目录下XXX.Svc
项目为启动项目,XXX.Svc
中XXX
为运行生成项目脚本文件时输入的项目名称。appsettings.Development.json
、Release:appsettings.json
)中的EaCloud:DbContexts:[MySql|Oracle|PostgreSql|Sqlite|SqlServer]
中的配置信息,ConnectionString
为数据库连接串,AutoMigrationEnabled
为是否开启自动迁移。EF Core
框架,默认Code First
模式,需要在nuget 控制台
执行Add-Migration [-Name] <String>
命令生成迁移代码文件,示例如下:add-migration -Name InitialCreate
Startups\README.EntityFrameworkCore.Migration.md
或访问 Entity Framework Core 。AutoMigrationEnabled
的自动迁移功能,还需要在nuget 控制台
手动执行迁移操作,命令如下:update-database
38062
的项目,启动后追加路由 “/swagger(名称可配置)”将进入Swagger
的后端Api接口的文档页。appsettings.Development.json
、Release:appsettings.json
)下EaCloud:Host
节点。注:后端项目参考借鉴了 OSharp
开源项目,详情链接 https://github.com/dotnetcore/osharp。
前端项目使用了Vue-Vben-Admin
和Ant-Design-Vue
作为UI进行开发的,需要熟悉NodeJS
、Vue3.0
、Vite
、Ant-Design-Vue
、TypeScript
等主流技术。
Vben Admin 官方文档,Ant Design Vue 官方文档
本地环境需要安装 Git、NodeJS 和 pnpm(官方目前使用方式) 或者 Yarn
pnpm常用命令:
# 全局安装最新版本
npm i -g pnpm
# 查看版本
pnpm --version
# 安装默认添加至 dependencies
pnpm install [package]
# 安装并添加至 devDependencies
pnpm install [package] -D
# 安装并添加至 dependencies
pnpm install [package] -S
pnpm update
pnpm uninstall [package]
yarn常用命令:
# 全局安装最新版本
npm install -g yarn
# 查看版本
yarn --version
# 在当前的项目中添加一个依赖包,会自动更新到package.json和yarn.lock文件中
yarn add [package]
# 安装指定版本,这里指的是主要版本,如果需要精确到小版本,使用-E参数
yarn add [package]@[version]
# 安装某个tag(比如beta,next或者latest)
yarn add [package]@[tag]
# 不指定依赖类型默认安装到dependencies里,你也可以指定依赖类型:
yarn add --dev/-D # 加到 devDependencies
yarn add --peer/-P # 加到 peerDependencies
yarn add --optional/-O # 加到 optionalDependencies
yarn upgrade [package]
yarn remove [package]
如果您使用的 IDE 是 Visual Studio Code(推荐,前端最好用的IDE) 的话,可以安装以下工具来提高开发效率及代码格式化:
注:注意存放代码的目录及所有父级目录不能存在中文、韩文、日文以及空格,否则安装依赖后启动会出错。
front-end\background-gui\vben-admin
,在空白处点右键,使用 VS Code 打开项目,可看到如下结构:按 Ctrl+Shift+` 调出VS Code的终端,按步骤执行以下命令:
# pnpm方式:
pnpm install
# yarn方式:
yarn
# OR
yarn install
# pnpm方式:
pnpm dev
# yarn方式:
yarn dev
# pnpm方式:
pnpm build
# yarn方式:
yarn build
至此,项目启动完成,最终效果如下图所示:
注:前端项目使用了 Vben Admin
作为前端框架,更多资料详见 官方文档。
附:nginx下载链接。
移动端项目使用了DCloud
的uni-app
作为框架进行开发的,IDE工具为HBuilder X
,需要熟悉NodeJS
、Vue
、JavaScript
等主流技术。
DCloud 官网,uni-app 官方文档,HBuilder X 官方文档
移动端项目使用的 IDE 是 HBuilder X(推荐,其他IDE请自行百度)。
注:注意存放代码的目录及所有父级目录不能存在中文、韩文、日文以及空格,否则可能存在未知的问题。
app\pda
,可看到如下结构:若项目结构中不存在node_modules
目录,请检查并删除package-lock.json
或者pnpm-lock.yaml
文件后执行以下命令:
# npm方式:
npm install
# pnpm方式:
pnpm install
# yarn方式:
yarn
# OR
yarn install
运行项目
至此,移动端项目启动完成,最终效果如下图所示:
注:移动端项目使用了 uni app
作为开发框架,更多资料详见 官方文档。
EaCloud框架现已集成基于FastReport开源的自定义打印功能、以及IoT平台、大屏看板平台等功能,具体如下所示:
注:IoT物联网平台参考借鉴了 IoTGateway
开源项目,详情链接 http://iotgateway.net。
注:大屏看板平台参考借鉴了 GoView
开源项目,详情链接 https://www.mtruning.club。
截止到目前,EaCloud 框架的计划中的功能点均已得到较高水准的实现,结构概述如下所示:
app.UseEaCloud()
,调用Pack模块管理器EaCloudPackManager
启动各个功能模块(PackBase)ApiControllerBase
,AreaApiControllerBase
,ControllerBase
- [x] 实现MVC功能点处理器
- [x] 实现MVC业务模块处理器
- [x] 定义Cors跨源资源共享服务
- [x] 定义Kestrel宿主配置处理,可通过在启动程序Program.cs --> CreateHostBuilder 方法中设置 Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults --> webBuilder.ConfigureKestrel 中 加入 options.SetHost(); 实现自宿主的相关参数设置
- [x] 实现基于MVC的功能权限AOP拦截验证
- [x] 实现基于MVC的事务提交AOP拦截提交角色-实体
,用户-实体
的数据权限配置角色-实体
,用户-实体
的数据权限过滤角色-功能点
,用户-功能点
的功能权限验证Profile
来实现映射注册IMapTuple
接口的Profile
来自动注册映射策略MapToAttribute
,MapFromAttribute
类型,用以标注Mapping的Source与Target类型,使用时在要映射的类型上标注如[MapTo(typeof(TTarget))]
或[MapFrom(typeof(TSource))]
特性,框架初始化时自动查找相应的类型进行CreateMap映射注册IUserClaimsProvider
微信
、钉钉
、抖音
、QQ
、Microsoft
、Github
三方登录功能用户角色
、用户组织机构
的绑定管理用户角色
、角色组织机构
的绑定管理QQ群号:863605868 | 微信号:SeonHu |