作者:寒空飛箭;
來源:http://www.cnblogs.com/coldairarrow/p/9626691.html

一、簡介

本框架旨在爲.NET開發人員提供一個Web後臺快速開發框架,採用本框架,能夠極大的提高項目開發效率。

整個框架包括三個版本:

.NET新版,採用.NET4.52,GitHub地址爲:https://github.com/Coldairarrow/Coldairarrow.Fx.Net.Easyui.GitHub

.NET4.0版,採用.NET4.0,GitHub地址爲:https://github.com/Coldairarrow/Coldairarrow.Fx.Net40.Easyui.GitHub

.NET Core版,採用.NET Core 2.1,正在移植中,敬請期待。。。

以上三個版本中,.NET新版,主要支持最新的技術方案,作爲主要生產版本;.NET4.0版是爲了兼容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的解決方案,如下圖

.NET版Web後臺快速開發框架 Coldairarrow


如下圖所示依次展開05.Coldairarrow.Web=>Config=>database.config,配置數據庫連接字符串,name不用修改,connectionString改爲上述創建的數據庫(若不清楚數據庫連接字符串請自行百度搜索教程)

.NET版Web後臺快速開發框架 Coldairarrow


自此基礎數據庫配置完成。

四、運行

將05.Coldairarrow.Web設爲啓動項目,成功運行即可進入以下頁面

.NET版Web後臺快速開發框架 Coldairarrow


五、詳細教程

代碼架構

總體架構

.NET版Web後臺快速開發框架 Coldairarrow


框架組成結構一共分爲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>類拓展And與Or方法,其中And是"與"操作,Or是"或"操作,這樣就可以將多個篩選條件拼接在一起,十分的實用。

IQueryable拓展:IQueryable是提供針對特定數據源(其中數據類型未未知)評估查詢的功能接口,其在EntityFramework中發揮着重要的作用。例如,在後臺管理系統中,數據表格的使用最爲普遍,前端向後臺請求表格數據時,不外乎需要以下幾個參數:當前請求頁碼、每頁記錄數、排序列與排序類型,這些參數在每個請求表格數據請求中都需要處理,這時,通過給IQueryable拓展GetPagination方法,只需要傳入分頁參數,就可以獲取所需的數據表格數據,十分的方便高效。

  • 工具幫助類


主要提供了常用的一些幫助類,包含但不限於:

Office辦公文檔導入導出幫助類:當今,隨着人們環保意識的增強,以及各行業對辦公模式需求的不斷升級,現代化、信息化建設步伐的加快,無紙化辦公已經由概念逐漸應用到多個行業領域中,辦公中,各種辦公文件,尤其是Excel文件與Word文件經常需要導入與導出,但是C#操作Excel與Word文件並不簡單,經常困擾着開發者,由此,本框架提供了Office文檔操作幫助類,封裝簡化了對辦公文檔的常用操作,能夠降低開發難度,提高開發效率。

HTTP請求模擬幫助類:在傳統網站開發中,一般都是前端瀏覽器向後臺發起請求,但是,現在的系統與系統之間的合作越來越緊密,經常需要後端向後端發起請求,即需要後端模擬HTTP請求,但編寫一個完整的HTTP請求並不是那麼容易,因此本框架提供HTTP請求幫助類,開發人員只需要傳入需要請求的URL地址與參數即可完成HTTP請求操作,使用起來簡單高效,能夠極大的提高開發效率。

  • 緩存操作幫助類


在現代化系統開發中,隨着業務量的增大,系統性能就難以滿足要求,要達到性能要求,一方面可以採用更好的硬件,但是成本較高,而另一方面就是使用緩存,有效使用緩存能夠提高吞吐量與併發量,所需成本較低,是絕大多數用戶的首選。

.NET Framework框架提供了系統緩存,雖然使用簡單方便,但是不支持分佈式,因此大多選擇諸如Redis和Memcached緩存,但是不同的緩存爲開發者提供的接口不一樣,當使用不同的緩存時開發人員又需要去學習別的緩存操作接口,十分的麻煩,爲解決這個問題,本框架提供了緩存操作幫助類。緩存操作幫助類將緩存核心操作抽象定義成操作接口:添加緩存、刪除緩存、設置緩存過期時間,然後再用Redis與系統緩存實現抽象接口,當使用緩存時可以使用同樣的操作接口操作不同的緩存,能夠降低開發人員學習成本,提高開發效率。

  • 數據庫操作幫助類


無論什麼網站,只要需要對數據進行操作,那麼大多離不開數據庫。數據庫目前使用最多的就是三大關係型數據庫:SQLServer、MySQL與Oracle,訪問數據庫需要一系列的程序:首先需要創建數據庫連接對象,緊接着打開數據庫,其次傳入數據庫操作命令,然後執行命令,最後得到數據結果,若每次訪問數據庫都要寫一遍這些流程,那麼將會極大的阻礙開發效率,因此,本框架提供了數據庫操作幫助類,將數據庫操作所需要的流程封裝,開發人員只需要關心具體的SQL語句的編寫即可,並且支持三大關係型數據庫,適合不同的開發人員使用。

2、數據倉儲層

在後端開發中,數據庫操作是最頻繁的,每一個後端開發人員或多或少都會接觸,甚至不少開發人員每天的工作就是與數據庫打交道,所以可見數據庫操作是多麼的重要。

在現在開發的過程中,絕大多數開發人員只是以編寫SQL語句的方式操作數據庫,這種方式是操作數據庫最基本最原始的方式,簡單高效,但是在編寫SQL語句的過程中,極容易因馬虎大意而編寫錯誤,就會出現一個現象:開發人員面對着一堆SQL語句在DEBUG,而且每次都需要開發人員自己去手寫SQL語句,其開發效率極低。

哪怕開發人員足夠出色,能夠保證編寫的SQL語句較低的出錯率,但是,不同的數據庫所需要的SQL語句還是有差異的,這就需要開發人員學習不同的數據庫SQL語法,添加學習成本。

而且在項目開發中難免會遇到更換數據庫的情況,這時還需要花費大量的精力去進行修改SQL語句。

在本框架的數據倉儲層中,上述問題即可迎刃而解。數據倉儲層,不同於傳統三層架構中的數據層,其核心繼承關係圖如下圖所示(圖6-1):

.NET版Web後臺快速開發框架 Coldairarrow


圖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 事物提交/// /// 開始單庫事物/// 注意:若要使用跨庫事務,請使用DistributedTransaction/// void BeginTransaction();bool EndTransaction();#endregion#region 增加數據void Insert(T entity) where T : class, new();void Insert(List entities) where T : class, new();void BulkInsert(List entities) where T : class, new();#endregion#region 刪除數據void DeleteAll() where T : class, new();void Delete(string key) where T : class, new();void Delete(List keys) where T : class, new();void Delete(T entity) where T : class, new();void Delete(List entities) where T : class, new();void Delete(Expression> condition) where T : class, new();#endregion#region 更新數據void Update(T entity) where T : class, new();void Update(List entities) where T : class, new();void UpdateAny(T entity, List properties) where T : class, new();void UpdateAny(List entities, List properties) where T : class, new();#endregion#region 查詢數據T GetEntity(object keyValue) where T : class, new();List GetList() where T : class, new();IQueryable GetIQueryable() where T : class, new();DataTable GetDataTableWithSql(string sql);DataTable GetDataTableWithSql(string sql, List parameters);List GetListBySql(string sqlStr) where T : class, new();List GetListBySql(string sqlStr, List parameters) where T : class, new();#endregion#region 執行Sql語句void ExecuteSql(string sql);void ExecuteSql(string sql, List parameters);#endregion}}


3、數據實體層

由於框架主要採用了Entity Framework作爲ORM框架,這其中數據庫實體映射必不可少,需要將數據庫中每張表映射到類中,並且一張表一個類。

這些實體類即能夠作爲數據庫操作中的實體,還能夠作爲DTO(Data Transfer Object),將這些實體類劃分爲獨立的一層,能夠方便對實體的管理,易於開發與維護。

4、業務邏輯層

在整個後端開發中,業務邏輯的處理是最複雜的,因爲從技術角度來講,很多技術都能夠實現代碼複用,即無需重複造輪子(重造輪子是重複創造一個已經存在的基本方法或者被其他人優化),而且只要會使用了就能夠快速投入生產中,雖然技術可以從設計上實現代碼重用,降低學習成本,但是不同的系統其業務邏輯通常是不可複製的,因此開發人員可以不關心具體數據倉儲的實現技術,但是不得不關心具體業務邏輯的實現,既然業務邏輯無法避免又那麼複雜,那麼設計出合理的業務邏輯架構來加快開發效率就顯得尤爲重要。

本框架將業務邏輯獨立一層,其核心繼承關係如下圖(圖6-2)所示:

.NET版Web後臺快速開發框架 Coldairarrow


圖6-2 業務邏層次圖


如上圖所示:首先定義了一個業務邏輯基類BaseBusiness,該基類實現了所有調用數據倉儲的方法,其餘所有業務處理類都需要繼承自基類BaseBusiness,其中泛型T爲數據庫實體,一般默認操作但張表,但在實際運用中連表操作十分的普遍,因此在BaseBusiness中提供了Service屬性,該屬性爲IRepository類型,因此可以操作泛型接口,傳入不同的實體類型即可對應到所需表的操作,故而支持聯表操作,方便開發人員操作數據庫。基類還提供了通用業務邏輯返回數據,Success和Error分別對應成功請求返回和失敗請求返回,統一數據格式,方便前後端開發對接。

5、應用展示層

這層也可以稱之爲應用層,其餘的層表現形式都是類庫,而這一層負責具體項目應用的實施,比如可以使用控制檯程序、Windows服務程序、WinForm程序、WCF程序等等,在本項目中使用了ASP.NET MVC網站項目負責具體功能的實現。

AOP(Aspect Oriented Programming)使用:AOP,即面向切片編程,利用AOP能夠將系統各個部分進行隔離,從而降低模塊之間的耦合度,提高程序可用性,同時提高開發效率。本框架中主要使用了以下AOP:

管理員登錄校驗CheckLoginAttribute:在後臺管理系統中,管理員只有登錄後纔能夠進行相關操作,一般通過Session來記錄管理員登錄信息,最簡單直接就是在每一個請求中都需要判斷一遍管理員是否登錄,這無疑將會導致很多的重複代碼,此時,通過將登陸校驗作爲一個特性,只需要在需要登錄的控制器或方法上添加該特性即可完成管理員登錄校驗,這樣就能夠減少大量的重複代碼,加快開發效率。

簽名校驗CheckSignAttribute:當後端接口需要給外部系統調用時,若不對接口訪問進行限制,那麼就會面臨惡意請求攻擊的風險,輕則影響系統性能,重則導致系統癱瘓,數據被惡意串改,此時,保證接口的安全性就十分關鍵。保證接口的安全性,主要就是按照一定的簽名算法,對請求者傳入的參數進行簽名校驗,只有通過纔能夠正常訪問,原始做法就是在每個請求中去進行簽名校驗,這同樣會導致大量的重複代碼,這時通過引入簽名校驗特性,只需要在需要簽名校驗的控制器或方法中加入特性即可,使用簡單方便,開發效率也高。

應用層還在視圖中使用了通用佈局模板,並統一了代碼規範,再集成了JQuery以及一些其它常用的JS類庫,以Layui爲主要前端UI框架,界面風格統一,開發效率高。

六、功能架構

1、全局配置

在01.Coldairarrow.Util中的GlobalSwitch類中,設置了各個參數,其中RunModel需要重點關注一下,若RunModel==RunModel.LocalTest,則系統會直接跳過登錄,默認使用Admin超級管理員登錄,其它參數請看註釋。

2、快速開發

使用此功能請確保GlobalSwitch.RunModel= RunModel.LocalTest

此功能爲本框架的核心功能,能夠自動生產完整的可運行代碼,具體使用如下:

首選需要有數據庫源,因爲代碼生成是根據數據庫表來生成的。

菜單:開發=>快速開發=>數據庫連接管理

.NET版Web後臺快速開發框架 Coldairarrow


若列表中沒有目標數據源,則添加數據庫連接

.NET版Web後臺快速開發框架 Coldairarrow


數據連接名、連接字符串、數據庫類型(目前不支持Oracle,有空餘時間再研究)即可。添加完成後即可看到連接字符串信息。

有了數據庫連接之後,即可進行代碼生成。

菜單:開發=>快速開發=>代碼生成

.NET版Web後臺快速開發框架 Coldairarrow


選擇數據庫,然後勾選需要生成代碼的數據庫表,點擊生成代碼會彈出生成選項(這裏暫時只能勾選Dev_Project,其餘表全是系統基礎表,不要勾選,否則會被覆蓋,導致異常,請勾選自己的業務表進行生成):

.NET版Web後臺快速開發框架 Coldairarrow


生成選項中可以選擇需要生成的類型,可以默認生成實體層、業務邏輯層、控制器和視圖。

生成區域對應MVC中的Areas,請按需填入(必填)

.NET版Web後臺快速開發框架 Coldairarrow


這裏示例填寫ProjectManage,點擊生成按鈕,即可完成代碼生成。生成後的代碼在項目解決方案中,將代碼文件包括進入項目

.NET版Web後臺快速開發框架 Coldairarrow


默認生成後的文件是隱藏的,需要點擊顯示所有文件按鈕,即可看到生成後的新文件

.NET版Web後臺快速開發框架 Coldairarrow


.NET版Web後臺快速開發框架 Coldairarrow


右鍵新的文件夾,包括在項目中

由於是新生成的代碼,所以才配置新的菜單

.NET版Web後臺快速開發框架 Coldairarrow


如上圖,在Web項目中的Config/SystemMenu.config中配置菜單,模仿原有菜單即可,其中Url是指頁面的路徑,Permission是指若需要訪問此菜單需要的權限(對應權限配置),若沒有此權限,則菜單也中不會顯示此菜單,修改完成後重新編譯生成(權限相關模塊進行了緩存,重新生成會清緩存),重新運行即可看到新的項目菜單如下:

.NET版Web後臺快速開發框架 Coldairarrow


.NET版Web後臺快速開發框架 Coldairarrow


整個代碼生成過程,無需編寫代碼即可完成一張表的CRUD,當然需要根據具體業務中進行相應的修改,本次示例中字段比較少,但是當一張表的字段很多時,那麼此功能能夠將開發效率提高几個檔次。

3、管理員登錄

若要使用登錄功能,請將GlobalSwitch中的RunModel改爲RunModel.Publish

.NET版Web後臺快速開發框架 Coldairarrow


.NET版Web後臺快速開發框架 Coldairarrow


默認超級管理員賬號爲:Admin

密碼爲:123456

4、系統用戶管理

管理系統登錄的用戶

菜單:系統=>系統管理=>用戶管理,如下頁面

.NET版Web後臺快速開發框架 Coldairarrow


點擊右側設置權限,可以設置用戶權限,詳情見模塊

.NET版Web後臺快速開發框架 Coldairarrow


具體權限相關配置見權限管理模塊

5、系統角色管理

管理系統角色,角色是權限的載體,合理分配角色有利於權限管理

菜單:系統=>系統管理=>角色管理

.NET版Web後臺快速開發框架 Coldairarrow


操作中可以設置角色的權限,詳情見模塊

6、權限管理

一般情況下,後臺管理系統多少會涉及權限管理,因此本框架提供了一個靈活、高效、簡潔的權限管理系統。

首先,權限分爲兩種,即操作權限和數據權限,其中操作權限報貨系統用戶權限和AppId權限,系統用戶權限就是指操作用戶具備哪些權限,而當對外提供Api接口時,爲了保證接口的安全性(若不在意可忽略),通常會提供接口簽名算法,其中AppId和AppSecret是必備的,通過對AppId設置權限,即可控制接口的權限。數據權限比較複雜,若採用純SQL方式,那麼會更加複雜,本框架全程採用EF作爲ORM框架,通過對IQueryable進行過濾,即可完成數據權限控制。

用戶權限:若對每個用戶都設置對應的權限,那麼工作量無疑是十分巨大的,因此引入了角色的概念,角色是權限的集合載體,那麼屬於此角色的用戶就繼承了角色的權限,當然某些特殊用戶需要擁有自己的不屬於角色的特殊權限,因此最終用戶擁有的權限就是自己的權限和所屬角色權限的並集。

權限使用:

權限定義:

.NET版Web後臺快速開發框架 Coldairarrow


如上圖,在Permission.config中定義了各個權限

權限配置:

在系統用戶管理和系統角色管理中可以設置用戶和角色的權限,把需要的權限勾選即可。

權限使用:

.NET版Web後臺快速開發框架 Coldairarrow


如上圖所示,在需要控制權限的頁面中,調用方法:PermissionManage.OperatorHasPermissionValue("sysuser.manage")

這個方法是判斷操作者用戶是否含有sysuser.manage權限值,其中sysuser是指Permission.config中定義的module的value屬性,manage是指permission中的value屬性,用.連接即是最終權限值。

更詳細的使用方式,請參考源代碼。

7、接口祕鑰管理

菜單:系統=>系統管理=>接口祕鑰管理

.NET版Web後臺快速開發框架 Coldairarrow


8、系統日誌

菜單:系統=>系統管理=>系統日誌

.NET版Web後臺快速開發框架 Coldairarrow


結語

歡迎使用本框架,若覺得不錯,請比心

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

相關文章