Web後臺快速開發框架
Web後臺快速開發框架
Coldairarrow
-
目錄
目錄
第3章 基礎準備 4
3.1 開發環境要求 4
3.2 基礎資料庫構建 4
第4章 詳細教程 6
4.1.4 資料實體層 13
4.1.5 業務邏輯層 14
4.1.6 應用展示層 16
4.2 功能架構 17
4.2.3 管理員登入 23
4.2.4 系統使用者管理 24
4.2.5 系統角色管理 25
4.2.7 介面祕鑰管理 28
-
簡介
本框架旨在為.NET開發人員提供一個Web後臺快速開發框架,採用本框架,能夠極大的提高專案開發效率。
整個框架包括三個版本:
.NET新版,採用.NET452,GitHub地址為: GitHub" rel="nofollow,noindex" target="_blank">https://github.com/Coldairarrow/Coldairarrow.Fx.Net.Easyui.GitHub
.NET40版,採用.NET40,GitHub地址為: https://github.com/Coldairarrow/Coldairarrow.Fx.Net40.Easyui.GitHub
.NET Core版,採用.NET Core2.1,正在移植中,敬請期待。。。
以上三個版本中,.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
開啟src目錄下Coldairarrow.Fx.Net.Easyui.Git.sln的解決方案,如下圖
如下圖所示依次展開05.Coldairarrow.Web=>Config=>database.config,配置資料庫連線字串,name不用修改,connectionString改為上述建立的資料庫(若不清楚資料庫連線字串請自行百度搜尋教程)
自此基礎資料庫配置完成。
-
執行
將05.Coldairarrow.Web設為啟動專案,成功執行即可進入以下頁面
-
詳細教程
-
程式碼架構
-
總體架構
框架組成結構一共分為5層,如上圖所示,分別如下:
基礎設施層:此層為最底層,可以為其餘所有層服務。主要提供了專案開發所需的各種幫助類:資料庫訪問幫助類、檔案操作幫助類、二維碼生成幫助類、分揀壓縮幫助類等等其餘幫助類;拓展類:字串拓展類、集合操作拓展類、表示式樹拓展類等等其餘拓展類;還集成了個人編寫的Socket通訊框架,WCF拓展使用框架,Windows服務容器。這些豐富的類庫都是為開發人員提供了開發中常用的功能,為快速開發提供強有力的保障。
資料倉儲層:這層主要為對資料庫操作CRUD的簡單封裝,以EntityFramework為核心,採用簡單工廠、抽象工廠、工廠方法、三個工廠設計模式,使開發人員進行CRUD只需要極為簡單的程式碼即可完成。本層還提供了資料庫事務的支援,更是提供了分散式事務支援,為資料庫操作提供必備的保障。使用本層提供的介面,無需關心具體的資料庫型別,比如是採用SQLServer資料庫或者MySQL資料庫,開發人員只需要關心具體的業務邏輯實現,哪怕更換資料庫,也無需更改業務邏輯程式碼,只需要更改簡單的資料庫配置即可。總之,本層為開發人員對資料庫的操作提供了簡單高效的操作介面,可以極大的提高開發效率。
實體層:這層主要為ORM框架資料庫表對應的實體類,為業務邏輯層和應用層服務。
業務邏輯層:本層是開發人員主要編寫層,通過呼叫資料倉儲層操作資料庫,併為應用層提供所需的介面,處理具體操作的業務邏輯,可以說是最為複雜的一層。
應用層:本層在本框架中表現形式為ASP.NET MVC網站,其實也可以泛指其餘的表現形式:控制檯程式、Windows服務程式、WinForm程式、WPF程式等等。本層為具體的應用,負責系統功能的實現。
-
基礎設施層
此層為最底層,可以為其餘所有層服務。主要提供了專案開發所需的各種類庫,主要為以下幾種類庫:
-
拓展幫助類
利用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>方法,只需要傳入分頁引數,就可以獲取所需的資料表格資料,十分的方便高效。
-
工具幫助類
主要提供了常用的一些幫助類,包含但不限於:
Office辦公文件匯入匯出幫助類:當今,隨著人們環保意識的增強,以及各行業對辦公模式需求的不斷升級,現代化、資訊化建設步伐的加快,無紙化辦公已經由概念逐漸應用到多個行業領域中,辦公中,各種辦公檔案,尤其是Excel檔案與Word檔案經常需要匯入與匯出,但是C#操作Excel與Word檔案並不簡單,經常困擾著開發者,由此,本框架提供了Office文件操作幫助類,封裝簡化了對辦公文件的常用操作,能夠降低開發難度,提高開發效率。
HTTP請求模擬幫助類:在傳統網站開發中,一般都是前端瀏覽器向後臺發起請求,但是,現在的系統與系統之間的合作越來越緊密,經常需要後端向後端發起請求,即需要後端模擬HTTP請求,但編寫一個完整的HTTP請求並不是那麼容易,因此本框架提供HTTP請求幫助類,開發人員只需要傳入需要請求的URL地址與引數即可完成HTTP請求操作,使用起來簡單高效,能夠極大的提高開發效率。
-
快取操作幫助類
在現代化系統開發中,隨著業務量的增大,系統性能就難以滿足要求,要達到效能要求,一方面可以採用更好的硬體,但是成本較高,而另一方面就是使用快取,有效使用快取能夠提高吞吐量與併發量,所需成本較低,是絕大多數使用者的首選。
.NET Framework框架提供了系統快取,雖然使用簡單方便,但是不支援分散式,因此大多選擇諸如Redis和Memcached快取,但是不同的快取為開發者提供的介面不一樣,當使用不同的快取時開發人員又需要去學習別的快取操作介面,十分的麻煩,為解決這個問題,本框架提供了快取操作幫助類。快取操作幫助類將快取核心操作抽象定義成操作介面:新增快取、刪除快取、設定快取過期時間,然後再用Redis與系統快取實現抽象介面,當使用快取時可以使用同樣的操作介面操作不同的快取,能夠降低開發人員學習成本,提高開發效率。
-
資料庫操作幫助類
無論什麼網站,只要需要對資料進行操作,那麼大多離不開資料庫。資料庫目前使用最多的就是三大關係型資料庫: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屬性,用.連線即是最終許可權值。
更詳細的使用方式,請參考原始碼。
-
介面祕鑰管理
選單:系統=>系統管理=>介面祕鑰管理
-
系統日誌
選單:系統=>系統管理=>系統日誌
-
結語
歡迎使用本框架,若覺得不錯,請比心
Github: https://github.com/Coldairarrow ,請Statrt
部落格園: https://www.cnblogs.com/coldairarrow/
QQ群:373144077
本人將會對這個快速開發框架不斷完善與維護,希望能夠幫助到各位
若遇到任何問題或需要技術支援,請聯絡我。
---------------------學習永無止境,技術永無上限,程式碼就是藝術-----------------------