Web后台快速开发框架(支持.NET Core2.1,.NET452,.NET40)

Web后台快速开发框架使用说明书前端

Coldairarrowgit

目录

简介

本框架旨在为.NET开发人员提供一个Web后台快速开发框架,采用本框架,可以极大的提升项目开发效率。程序员

整个框架包括三个版本:github

.NET新版,采用.NET452,GitHub地址为:https://github.com/Coldairarrow/Coldairarrow.Fx.Net.Easyui.GitHub算法

.NET40版,采用.NET40,GitHub地址为:https://github.com/Coldairarrow/Coldairarrow.Fx.Net40.Easyui.GitHubsql

.NET Core版,采用.NET Core2.1, GitHub地址为:https://github.com/Coldairarrow/Coldairarrow.Fx.Core.Easyui.GitHub数据库

以上三个版本中,.NET新版,主要支持最新的技术方案,做为主要生产版本;.NET40版是为了兼容Windows 2003服务器而降级的版本,功能正常。.NET Core 版本是将来的发展方向,可以跨平台,而且涉及Linux、Docker、Nginx、微服务等概念,已完成移植。编程

基础准备

开发环境要求

操做系统:Windows 10后端

开发工具:Visual Studio 2017设计模式

SDK:安装.NET4.52及以上

数据库:SQLServer2008 R2及以上

基础数据库构建

使用本框架须要构建基础数据库,具体步骤以下:

建立基础数据库的Sql脚本文件在:/docs/初始化文件/db.sql,在数据库中运行db.sql脚本便可建立数据库:Coldairarrow.Fx.Net.Easyui.Git

若Sql运行出错,请直接使用同目录下的Coldairarrow.Fx.Net.Easyui.GitHub.bak还原数据库

打开src目录下Coldairarrow.Fx.Net.Easyui.Git.sln的解决方案,以下图

以下图所示依次展开05.Coldairarrow.Web=>Config=>database.config,配置数据库链接字符串,name不用修改,connectionString改成上述建立的数据库(若不清楚数据库链接字符串请自行百度搜索教程)

自此基础数据库配置完成。

运行

请先还原Nuget包

而后将05.Coldairarrow.Web设为启动项目,成功运行便可进入如下页面

详细教程

代码架构

整体架构

WEB后台快速开发框架系统架构设计 (4)

框架组成结构一共分为5层,如上图所示,分别以下:

基础设施层:此层为最底层,能够为其他全部层服务。主要提供了项目开发所需的各类帮助类:数据库访问帮助类、文件操做帮助类、二维码生成帮助类、分拣压缩帮助类等等其他帮助类;拓展类:字符串拓展类、集合操做拓展类、表达式树拓展类等等其他拓展类;还集成了我的编写的Socket通信框架,WCF拓展使用框架,Windows服务容器。这些丰富的类库都是为开发人员提供了开发中经常使用的功能,为快速开发提供强有力的保障。

数据仓储层:这层主要为对数据库操做CRUD的简单封装,以EntityFramework为核心,采用简单工厂、抽象工厂、工厂方法、三个工厂设计模式,使开发人员进行CRUD只须要极为简单的代码便可完成。本层还提供了数据库事务的支持,更是提供了分布式事务支持,为数据库操做提供必备的保障。使用本层提供的接口,无需关心具体的数据库类型,好比是采用SQLServer数据库或者MySQL数据库,开发人员只须要关心具体的业务逻辑实现,哪怕更换数据库,也无需更改业务逻辑代码,只须要更改简单的数据库配置便可。总之,本层为开发人员对数据库的操做提供了简单高效的操做接口,能够极大的提升开发效率。

实体层:这层主要为ORM框架数据库表对应的实体类,为业务逻辑层和应用层服务。

业务逻辑层:本层是开发人员主要编写层,经过调用数据仓储层操做数据库,并为应用层提供所需的接口,处理具体操做的业务逻辑,能够说是最为复杂的一层。

应用层:本层在本框架中表现形式为ASP.NET MVC网站,其实也能够泛指其他的表现形式:控制台程序、Windows服务程序、WinForm程序、WPF程序等等。本层为具体的应用,负责系统功能的实现。

基础设施层

此层为最底层,能够为其他全部层服务。主要提供了项目开发所需的各类类库,主要为如下几种类库:

  1. 拓展帮助类

利用C#的语法糖(是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并无影响,可是更方便程序员使用),能够在类上拓展自定义方法,这样开发人员在使用的时候就能够十分的方便,既能减小重复的代码又能加快开发效率。具体包含但不限于如下类:

Object拓展:Object是全部类的基类。如今先后端数据交互中,采用JSON是选择,所以对象JSON序列化与反序列化的使用就十分的频繁,经过给Object拓展ToJson方法,就能够将数据对象直接转为对应的JSON字符串,可以极大的简化JSON序列化所须要的代码。

Byte拓展:Byte,即字节,一个字节是8个比特位,十进制数值范围在0-255。因为Byte与二进制是直接对应的,而计算机中一切数据都是二进制,因此关于Byte与其余数据类型之间的转换就显得尤其重要,编写Byte相关的拓展方法可以方便Byte的使用。例如,拓展将Byte数组转为16进制字符串的方法,可以将字节数组直接转为对应的16进制字符串,如今物联网的发展也十分的迅速,在物联网开发中,关键是创建与硬件之间的通讯,可是因为硬件的配置通常都不高,所以与硬件之间的通讯大多以字节为单位,这种状况下,使用该拓展方法就能够提升开发效率。

Expression拓展:Expression,即表达式树,在LINQ查询中常用。在平常使用中,Where筛选估计是用得最多的,可是大多数开发人员都是使用最原始的Where筛选,当筛选条件增多,筛选条件变复杂的时候,原始的Where虽然也能够胜任,可是就会致使代码重复,不够简洁雅观,此时能够为Expression<Func<T, bool>>类拓展And与Or方法,其中And是“与”操做,Or是“或”操做,这样就能够将多个筛选条件拼接在一块儿,十分的实用。

IQueryable<T>拓展:IQueryable<T>是提供针对特定数据源(其中数据类型未未知)评估查询的功能接口,其在EntityFramework中发挥着重要的做用。例如,在后台管理系统中,数据表格的使用最为广泛,前端向后台请求表格数据时,不外乎须要如下几个参数:当前请求页码、每页记录数、排序列与排序类型,这些参数在每一个请求表格数据请求中都须要处理,这时,经过给IQueryable<T>拓展GetPagination<T>方法,只须要传入分页参数,就能够获取所需的数据表格数据,十分的方便高效。

  1. 工具帮助类

主要提供了经常使用的一些帮助类,包含但不限于:

Office办公文档导入导出帮助类:当今,随着人们环保意识的加强,以及各行业对办公模式需求的不断升级,现代化、信息化建设步伐的加快,无纸化办公已经由概念逐渐应用到多个行业领域中,办公中,各类办公文件,尤为是Excel文件与Word文件常常须要导入与导出,可是C#操做Excel与Word文件并不简单,常常困扰着开发者,由此,本框架提供了Office文档操做帮助类,封装简化了对办公文档的经常使用操做,可以下降开发难度,提升开发效率。

HTTP请求模拟帮助类:在传统网站开发中,通常都是前端浏览器向后台发起请求,可是,如今的系统与系统之间的合做愈来愈紧密,常常须要后端向后端发起请求,即须要后端模拟HTTP请求,但编写一个完整的HTTP请求并非那么容易,所以本框架提供HTTP请求帮助类,开发人员只须要传入须要请求的URL地址与参数便可完成HTTP请求操做,使用起来简单高效,可以极大的提升开发效率。

  1. 缓存操做帮助类

在现代化系统开发中,随着业务量的增大,系统性能就难以知足要求,要达到性能要求,一方面能够采用更好的硬件,可是成本较高,而另外一方面就是使用缓存,有效使用缓存可以提升吞吐量与并发量,所需成本较低,是绝大多数用户的首选。

.NET Framework框架提供了系统缓存,虽然使用简单方便,可是不支持分布式,所以大多选择诸如Redis和Memcached缓存,可是不一样的缓存为开发者提供的接口不同,当使用不一样的缓存时开发人员又须要去学习别的缓存操做接口,十分的麻烦,为解决这个问题,本框架提供了缓存操做帮助类。缓存操做帮助类将缓存核心操做抽象定义成操做接口:添加缓存、删除缓存、设置缓存过时时间,而后再用Redis与系统缓存实现抽象接口,当使用缓存时可使用一样的操做接口操做不一样的缓存,可以下降开发人员学习成本,提升开发效率。

  1. 数据库操做帮助类

不管什么网站,只要须要对数据进行操做,那么大多离不开数据库。数据库目前使用最多的就是三大关系型数据库:SQLServer、MySQL与Oracle,访问数据库须要一系列的程序:首先须要建立数据库链接对象,紧接着打开数据库,其次传入数据库操做命令,而后执行命令,最后获得数据结果,若每次访问数据库都要写一遍这些流程,那么将会极大的阻碍开发效率,所以,本框架提供了数据库操做帮助类,将数据库操做所须要的流程封装,开发人员只须要关心具体的SQL语句的编写便可,而且支持三大关系型数据库,适合不一样的开发人员使用。

数据仓储层

在后端开发中,数据库操做是最频繁的,每个后端开发人员或多或少都会接触,甚至很多开发人员天天的工做就是与数据库打交道,因此可见数据库操做是多么的重要。在如今开发的过程当中,绝大多数开发人员只是以编写SQL语句的方式操做数据库,这种方式是操做数据库最基本最原始的方式,简单高效,可是在编写SQL语句的过程当中,极容易因马虎大意而编写错误,就会出现一个现象:开发人员面对着一堆SQL语句在DEBUG,并且每次都须要开发人员本身去手写SQL语句,其开发效率极低。哪怕开发人员足够出色,可以保证编写的SQL语句较低的出错率,可是,不一样的数据库所须要的SQL语句仍是有差别的,这就须要开发人员学习不一样的数据库SQL语法,添加学习成本。并且在项目开发中不免会遇到更换数据库的状况,这时还须要花费大量的精力去进行修改SQL语句。

在本框架的数据仓储层中,上述问题便可迎刃而解。数据仓储层,不一样于传统三层架构中的数据层,其核心继承关系图以下图所示(图6-1):

数据仓储层类图

图6-1 数据仓储类图

如上图所示,首先定义了数据操做接口IRepository,该接口包含了增、删、改、查、事物控制等数据库经常使用核心操做,可以知足对数据库的经常使用操做,DbRepository类实现了IRepository接口,主要以ORM框架Entity Framework为基础,封装实现了大部分IRepository所需的操做,SqlServerRepository、MySqlRepository和PostgreSqlRepository分别实现具体数据库对应的数据仓储,并且继承自同一个数据操做接口IRepository,所以在具体的使用上,能够实现以同一个操做方法访问不一样的数据库,当遇到须要更换数据库的状况时,采用本框架开发的系统可以不改代码而正常运行,这一点可以极大的下降软件开发成本。而且以Entity Framework为核心,不须要编写SQL语句就可以完成绝大部分的数据库操做,再加上简洁的LINQ配合,完全将开发人员从SQL语句中解放出来,让开发人员可以更加专一于业务逻辑的实现,可以极大的提升软件开发效率。

IRepository代码以下:

using System;

using System.Collections.Generic;

using System.Data;

using System.Data.Common;

using System.Data.Entity;

using System.Linq;

using System.Linq.Expressions;

namespace Coldairarrow.DataRepository

{

public interface IRepository

{

#region 数据库链接相关方法

DbContext GetDbContext();

#endregion

#region 事物提交

/// <summary>

/// 开始单库事物

/// 注意:若要使用跨库事务,请使用DistributedTransaction

/// </summary>

void BeginTransaction();

bool EndTransaction();

#endregion

#region 增长数据

void Insert<T>(T entity) where T : class, new();

void Insert<T>(List<T> entities) where T : class, new();

void BulkInsert<T>(List<T> entities) where T : class, new();

#endregion

#region 删除数据

void DeleteAll<T>() where T : class, new();

void Delete<T>(string key) where T : class, new();

void Delete<T>(List<string> keys) where T : class, new();

void Delete<T>(T entity) where T : class, new();

void Delete<T>(List<T> entities) where T : class, new();

void Delete<T>(Expression<Func<T, bool>> condition) where T : class, new();

#endregion

#region 更新数据

void Update<T>(T entity) where T : class, new();

void Update<T>(List<T> entities) where T : class, new();

void UpdateAny<T>(T entity, List<string> properties) where T : class, new();

void UpdateAny<T>(List<T> entities, List<string> properties) where T : class, new();

#endregion

#region 查询数据

T GetEntity<T>(object keyValue) where T : class, new();

List<T> GetList<T>() where T : class, new();

IQueryable<T> GetIQueryable<T>() where T : class, new();

DataTable GetDataTableWithSql(string sql);

DataTable GetDataTableWithSql(string sql, List<DbParameter> parameters);

List<T> GetListBySql<T>(string sqlStr) where T : class, new();

List<T> GetListBySql<T>(string sqlStr, List<DbParameter> parameters) where T : class, new();

#endregion

#region 执行Sql语句

void ExecuteSql(string sql);

void ExecuteSql(string sql, List<DbParameter> parameters);

#endregion

}

}

数据实体层

因为框架主要采用了Entity Framework做为ORM框架,这其中数据库实体映射必不可少,须要将数据库中每张表映射到类中,而且一张表一个类。这些实体类即可以做为数据库操做中的实体,还可以做为DTO(Data Transfer Object),将这些实体类划分为独立的一层,可以方便对实体的管理,易于开发与维护。

业务逻辑层

在整个后端开发中,业务逻辑的处理是最复杂的,由于从技术角度来说,不少技术都可以实现代码复用,即无需重复造轮子(重造轮子是重复创造一个已经存在的基本方法或者被其余人优化),并且只要会使用了就可以快速投入生产中,虽然技术能够从设计上实现代码重用,下降学习成本,可是不一样的系统其业务逻辑一般是不可复制的,所以开发人员能够不关心具体数据仓储的实现技术,可是不得不关心具体业务逻辑的实现,既然业务逻辑没法避免又那么复杂,那么设计出合理的业务逻辑架构来加快开发效率就显得尤其重要。

本框架将业务逻辑独立一层,其核心继承关系以下图(图6-2)所示:

业务逻辑层类图

图6-2 业务逻层次图

如上图所示:首先定义了一个业务逻辑基类BaseBusiness<T>,该基类实现了全部调用数据仓储的方法,其他全部业务处理类都须要继承自基类BaseBusiness<T>,其中泛型T为数据库实体,通常默认操做但张表,但在实际运用中连表操做十分的广泛,所以在BaseBusiness中提供了Service属性,该属性为IRepository类型,所以能够操做泛型接口,传入不一样的实体类型便可对应到所需表的操做,故而支持联表操做,方便开发人员操做数据库。基类还提供了通用业务逻辑返回数据,Success和Error分别对应成功请求返回和失败请求返回,统一数据格式,方便先后端开发对接。

应用展现层

这层也能够称之为应用层,其他的层表现形式都是类库,而这一层负责具体项目应用的实施,好比可使用控制台程序、Windows服务程序、WinForm程序、WCF程序等等,在本项目中使用了ASP.NET MVC网站项目负责具体功能的实现。

AOP(Aspect Oriented Programming)使用:AOP,即面向切片编程,利用AOP可以将系统各个部分进行隔离,从而下降模块之间的耦合度,提升程序可用性,同时提升开发效率。本框架中主要使用了如下AOP:

管理员登陆校验CheckLoginAttribute:在后台管理系统中,管理员只有登陆后才可以进行相关操做,通常经过Session来记录管理员登陆信息,最简单直接就是在每个请求中都须要判断一遍管理员是否登陆,这无疑将会致使不少的重复代码,此时,经过将登录校验做为一个特性,只须要在须要登陆的控制器或方法上添加该特性便可完成管理员登陆校验,这样就可以减小大量的重复代码,加快开发效率。

签名校验CheckSignAttribute:当后端接口须要给外部系统调用时,若不对接口访问进行限制,那么就会面临恶意请求攻击的风险,轻则影响系统性能,重则致使系统瘫痪,数据被恶意串改,此时,保证接口的安全性就十分关键。保证接口的安全性,主要就是按照必定的签名算法,对请求者传入的参数进行签名校验,只有经过才可以正常访问,原始作法就是在每一个请求中去进行签名校验,这一样会致使大量的重复代码,这时经过引入签名校验特性,只须要在须要签名校验的控制器或方法中加入特性便可,使用简单方便,开发效率也高。

应用层还在视图中使用了通用布局模板,并统一了代码规范,再集成了JQuery以及一些其它经常使用的JS类库,以Layui为主要前端UI框架,界面风格统一,开发效率高。

功能架构

全局配置

在01.Coldairarrow.Util中的GlobalSwitch类中,设置了各个参数,其中RunModel须要重点关注一下,若RunModel==RunModel.LocalTest,则系统会直接跳过登陆,默认使用Admin超级管理员登陆,其它参数请看注释。

快速开发

使用此功能请确保GlobalSwitch.RunModel= RunModel.LocalTest

此功能为本框架的核心功能,可以自动生产完整的可运行代码,具体使用以下:

首选须要有数据库源,由于代码生成是根据数据库表来生成的。

菜单:开发=>快速开发=>数据库链接管理

若列表中没有目标数据源,则添加数据库链接

数据链接名、链接字符串、数据库类型(目前不支持Oracle,有空余时间再研究)便可。添加完成后便可看到链接字符串信息。

有了数据库链接以后,便可进行代码生成。

菜单:开发=>快速开发=>代码生成

选择数据库,而后勾选须要生成代码的数据库表,点击生成代码会弹出生成选项(这里暂时只能勾选Dev_Project,其他表全是系统基础表,不要勾选,不然会被覆盖,致使异常,请勾选本身的业务表进行生成):

生成选项中能够选择须要生成的类型,能够默认生成实体层、业务逻辑层、控制器和视图。

生成区域对应MVC中的Areas,请按需填入(必填)

这里示例填写ProjectManage,点击生成按钮,便可完成代码生成。生成后的代码在项目解决方案中,将代码文件包括进入项目

默认生成后的文件是隐藏的,须要点击显示全部文件按钮,便可看到生成后的新文件

右键新的文件夹,包括在项目中

因为是新生成的代码,因此才配置新的菜单

如上图,在Web项目中的Config/SystemMenu.config中配置菜单,模仿原有菜单便可,其中Url是指页面的路径,Permission是指若须要访问此菜单须要的权限(对应权限配置),若没有此权限,则菜单也中不会显示此菜单,修改完成后从新编译生成(权限相关模块进行了缓存,从新生成会清缓存),从新运行便可看到新的项目菜单以下:

整个代码生成过程,无需编写代码便可完成一张表的CRUD,固然须要根据具体业务中进行相应的修改,本次示例中字段比较少,可是当一张表的字段不少时,那么此功能可以将开发效率提升几个档次。

管理员登陆

若要使用登陆功能,请将GlobalSwitch中的RunModel改成RunModel.Publish

默认超级管理员帐号为:Admin

密码为:123456

系统用户管理

管理系统登陆的用户

菜单:系统=>系统管理=>用户管理,以下页面

点击右侧设置权限,能够设置用户权限,详情见<权限管理>模块

具体权限相关配置见权限管理模块

系统角色管理

管理系统角色,角色是权限的载体,合理分配角色有利于权限管理

菜单:系统=>系统管理=>角色管理

操做中能够设置角色的权限,详情见<权限管理>模块

权限管理

通常状况下,后台管理系统多少会涉及权限管理,所以本框架提供了一个灵活、高效、简洁的权限管理系统。

首先,权限分为两种,即操做权限和数据权限,其中操做权限报货系统用户权限和AppId权限,系统用户权限就是指操做用户具有哪些权限,而当对外提供Api接口时,为了保证接口的安全性(若不在乎可忽略),一般会提供接口签名算法,其中AppId和AppSecret是必备的,经过对AppId设置权限,便可控制接口的权限。数据权限比较复杂,若采用纯SQL方式,那么会更加复杂,本框架全程采用EF做为ORM框架,经过对IQueryable<T>进行过滤,便可完成数据权限控制。

用户权限:若对每一个用户都设置对应的权限,那么工做量无疑是十分巨大的,所以引入了角色的概念,角色是权限的集合载体,那么属于此角色的用户就继承了角色的权限,固然某些特殊用户须要拥有本身的不属于角色的特殊权限,所以最终用户拥有的权限就是本身的权限和所属角色权限的并集。

权限使用:

权限定义:

如上图,在Permission.config中定义了各个权限

权限配置:

在系统用户管理和系统角色管理中能够设置用户和角色的权限,把须要的权限勾选便可。

权限使用:

如上图所示,在须要控制权限的页面中,调用方法:PermissionManage.OperatorHasPermissionValue("sysuser.manage")

这个方法是判断操做者用户是否含有sysuser.manage权限值,其中sysuser是指Permission.config中定义的module的value属性,manage是指permission中的value属性,用.链接便是最终权限值。

更详细的使用方式,请参考源代码。

接口秘钥管理

菜单:系统=>系统管理=>接口秘钥管理

系统日志

菜单:系统=>系统管理=>系统日志

结语

欢迎使用本框架,若以为不错,请比心

https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536642906843&di=1a0e84336a3b4c068deab1a2d2fc342d&imgtype=0&src=http%3A%2F%2Fwww.ghost64.com%2Fqqtupian%2FzixunImg%2Flocal%2F2017%2F05%2F25%2F14956980289595.jpg

Github:https://github.com/Coldairarrow,请Statrt

博客园:https://www.cnblogs.com/coldairarrow/

QQ群:373144077

本人将会对这个快速开发框架不断完善与维护,但愿可以帮助到各位

若遇到任何问题或须要技术支持,请联系我。

---------------------学习永无止境,技术永无上限,代码就是艺术-----------------------