.NET Core前後端分離快速開發框架(Core.3.0+AntdVue)

来源:https://www.cnblogs.com/coldairarrow/archive/2019/11/18/11870993.html
-Advertisement-
Play Games

.NET Core前後端分離快速開發框架(Core.3.0+AntdVue) 目錄 "引言" "簡介" "環境搭建" "開發環境要求" "基礎資料庫構建" "資料庫設計規範" "運行" "使用教程" "全局配置" "快速開發" "管理員登錄" "系統用戶管理" "系統角色管理" "許可權管理" "介面 ...


.NET Core前後端分離快速開發框架(Core.3.0+AntdVue)

目錄

引言

時間真快,轉眼今年又要過去了。回想今年,依次開源發佈了Colder.Fx.Net.AdminLTE(254Star)Colder.Fx.Core.AdminLTE(335Star)DotNettySocket(82Star)IdHelper(47Star),這些框架及組件都是本著以實際出發,實事求是的態度,力求提高開發效率(我自己都是第一個使用者),目前來看反響不錯。但是隨著前端和後端技術的不斷變革,尤其是前端,目前大環境已經是前後端完全分離為主的開發模式,在這樣的大環境和必然趨勢之下,傳統的MVC就顯得有些落伍了。在這樣的背景下,一款前後端分離的.NET開發框架就顯得尤為必要,由此便定了框架的升級目標:前後端分離

首先後端技術的選擇,從目前的數據來看,.NET Core的發展遠遠快於.NET Framework,最簡單的分析就是Colder.Fx.Core.AdminLTE發佈比Colder.Fx.Net.AdminLTE晚,但是星星卻後來居上而且比前者多30%,並且這個差距在不斷擴大,由點及面的分析可以看出我們廣大.NET開發人員學習的熱情和積極向上的態度,並不是某些人所認為的那麼不堪(走自己的路,讓別人說去吧)。大環境上微軟積極擁抱開源,大力發展.NET Core, 可以說前途一片光明。因此後端決定採用 .NET Core3.0 ,不再浪費精力去支持.NET Framework。

然後是前端技術選擇,首選是三大js框架選擇,也是從實際出發,Vue相對其它而言更加容易上手,並且功能也毫不遜色,深得各種大小公司喜歡,如果偏要說缺點的話,那就是對TS支持不行,但是即將發佈Vue3.0肯定會改變這一缺陷。選擇了Vue之後,然後就是UI框架的選擇了,這裡的選擇更多了,我選擇了Ant Design Vue,理由便是簡潔方便,十分符合我的設計理念。

技術選型完畢之後便進入研發,由於鄙人前端比較菜,因此需要從頭學Vue2.x全家桶,從開始到現在差不多經歷3個月,在預期之內。其實學習並使用前端的Vue2.x全家桶並不難,還是比較容易上手的,所以在此給沒有前後端分離開發經驗的老哥打一記預防針,不要退縮,要知難而上,學習永無止境。

某些老哥可能比較直接粗暴,嫌我BBB嘮叨,下麵直接上地址
代碼(GitHub):https://github.com/Coldairarrow/Colder.Admin.AntdVue
文檔(GitHub):https://github.com/Coldairarrow/Colder.Admin.AntdVue/wiki
代碼(碼雲鏡像):https://gitee.com/Coldairarrow/Colder.Admin.AntdVue
文檔(碼雲鏡像):https://gitee.com/Coldairarrow/Colder.Admin.AntdVue/wikis
線上預覽地址http://coldairarrow.gitee.io/coler.antdvue.preview/#/Home/Introduce
由於伺服器是阿裡雲的86伺服器,帶寬1M小水管,因此將前端部署到碼雲上了,在此多謝碼雲,後端部署在阿裡雲86伺服器CentOS7上。整個技術棧使用.NET Core + PostggreSQL+ Ant Design Vue + CentOS7+Nginx+Dokcer+jenkins,囊括了從快速開發到自動化部署一條龍,開源免費並具有高性能、高移植性、高拓展性(小公司創業選型+個人接單利器

簡介

本框架為.NET Core3.0+Ant Design Vue版

本框架旨在極大的提高開發效率

使用技術棧:
後端:採用.NET Core平臺,ASP.NET Core3.0,C#語言(使用反射等高級技術),Entity FrameworkCore(資料庫ORM框架)。
使用數據倉儲模式,抽象化資料庫操作(CRUD等)、支持事務處理以及分散式事務處理(跨庫)
支持資料庫讀寫分離、分庫分表及事務(僅支持單表操作,不支持多表) 全面採用Autofac作為IOC容器,面向介面編程,全面解耦
集成多種工具類庫以及操作拓展
資料庫:支持SqlServer,PostgreSQL,MySQL,Oracle(框架使用簡單工廠,工廠方法,抽象工廠,可輕鬆更換資料庫),Redis作為分散式緩存
前端:Vue2.x全家桶+Ant Design Vue,其中集成常用組件,力求方便項目開發。

具體技術實施:
項目採用前後端完全分離模式,並採用嚴格分層模式,極大的增加聚合度,降低耦合度,
提高代碼的健壯性,可維護性。
前後端通過JWT進行身份驗證,通過數據介面操作數據,統一使用JSON作為數據格式,並使用預設介面簽名演算法保證介面的安全性。

功能架構部分詳解:
快速開發:此功能為框架的核心,通過選擇資料庫中的表,就能自動生成對應的實體層、業務邏輯層、控制器、前端頁面Vue文件,無需編寫代碼即可生成基本的CRUD操作。
介面密鑰管理:管理介面的密鑰,若開啟介面簽名的規則,則前端需要通過給介面簽名才能夠正常訪問後臺介面。
許可權管理:使用基本的RBAC許可權控制,支持操作許可權、介面許可權以及數據許可權

框架主要功能及特色如下

功能 詳細描述
用戶登錄 用戶登錄、密碼修改
系統用戶管理 系統用戶管理
角1色管理 角色管理
部門管理 部門管理、天然多級
許可權管理 使用RBAC許可權體系,基於角色的許可權管理,支持菜單許可權、操作許可權(按鈕許可權)、介面許可權、數據許可權
系統日誌 支持多彩控制台、文件、資料庫和ElasticSearch記錄日誌,框架全局異常自動捕捉,多級別記錄
快速開發 通過資料庫直接生成實體層、業務邏輯層、控制器層以及前端頁面Vue代碼,無需編碼即可實現CURD
資料庫操作封裝 使用基於EF的倉儲模式、封裝常用的CURD,支持單庫事物和分散式事物
多資料庫支持 使用基於EF的倉儲模式,支持各大主流關係型資料庫(SQLServer、MySQL、PostgreSQL和Oracle)
超強移植性 使用抽象工廠封裝資料庫操作層,切換資料庫0代碼修改
支持軟刪除 一鍵切換刪除模式,支持物理刪除和軟刪除,對業務操作透明
緩存支持 支持系統自帶緩存和Redis緩存、封裝操作介面、簡單易用
前後端完全分離 前端使用Vue2.x全家桶+Ant Design Vue,界面簡潔美觀,組件化開發
集成JWT驗證 框架使用JWT作為身份驗證,擺脫Cookie苦海,分散式拓展毫無壓力
集成對外介面簽名演算法 框架對外介面可以開啟超強嚴格簽名校驗(防抵賴、防偽造、防重覆調用),保障系統安全性
頁面響應式 前端為單頁應用,無iframe,各大主流瀏覽器支持友好
拓展 其它各種幫助類庫及插件

其相關版本請看下表:

.NET版本 前端UI 地址
Core3.0 Ant Design Vue https://github.com/Coldairarrow/Colder.Admin.AntdVue
Core2.2 AdminLTE https://github.com/Coldairarrow/Colder.Fx.Core.AdminLTE
.NET4.72 AdminLTE https://github.com/Coldairarrow/Colder.Fx.Net.AdminLTE
.NET4.52 Easyui https://github.com/Coldairarrow/Coldairarrow.Fx.Net.Easyui.GitHub
Core2.1 Easyui https://github.com/Coldairarrow/Coldairarrow.Fx.Core.Easyui.GitHub
.NET4.0 Easyui https://github.com/Coldairarrow/Coldairarrow.Fx.Net40.Easyui.GitHub

後臺效果展示如下:
MG22Bd.png

環境搭建

開發環境要求:

操作系統:Windows 10
後端開發工具:Visual Studio 2019+
前端開發工具:Visual Studio Code,安裝nodejs,yarn
SDK:安裝.NET Core SKD 3.0 及以上
資料庫:SQLServer2008 R2及以上

基礎資料庫構建:

  • 資料庫創建
    目錄"/docs/初始化文件"中有所需的資料庫資料
    MGo70U.png
    先手動創建資料庫,然後執行對應的SQL腳本即可

  • 連接字元串配置
    打開src目錄下Colder.Admin.AntdVue的解決方案,如下圖

MGTuB8.png

如下圖所示依次展開05.Coldairarrow.Api/appsettings.json,配置資料庫連接字元串,name不用修改,connectionString改為上述創建的資料庫(若不清楚資料庫連接字元串請自行百度搜索教程)

資料庫設計規範

由於本框架支持自動生成代碼的核心功能,此功能是根據資料庫的表結構來生成代碼的
因此規定每張表都有一個主鍵,列名為Id,類型為字元串,實際添加數據時預設使用SnowflakeId(雪花Id,Twitter設計的分散式趨勢自增Id,若不清楚請自行百度相關資料),表中的每個列都需要有描述信息(建議這樣操作,若不按照這個標準則需要一些額外的改動才能夠成功運行)。每張表都需要Id、CreateTime、CreatorId、CreatorRealName這幾個必帶欄位

MG7p2n.png

運行

後端:打開解決方案=>還原nuget包=>配置資料庫=>運行(05.Coldairarrow.Api設為啟動項目)
後臺成功運行後會自動打開swagger
MGHcTO.png
前端: 確保已安裝nodejsyarn
用VS Code 打開文件夾src\Coldairarrow.Web
MGHEOP.png
輸入命令:yarn
輸入命令:yarn run serve
成功運行後即可打開登錄頁面
MGH56I.png
輸入賬號:Admin,密碼:123456進入後臺主頁
MG22Bd.png

使用教程

全局配置

在01.Coldairarrow.Util中的GlobalSwitch類中,設置了各個參數,其中RunModelDatabaseType需要重點關註一下,其它參數請看註釋。

快速開發

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

  • 配置數據源

首選需要有資料庫源,因為代碼生成是根據資料庫表來生成的。
菜單:開發=>資料庫連接
MYpg8P.png
若列表中沒有目標數據源,則添加資料庫連接
MYphDg.png
數據連接名、連接字元串、資料庫類型即可。添加完成後即可看到連接字元串信息。

  • 生成代碼

有了資料庫連接之後,即可進行代碼生成。
菜單:開發=>代碼生成

MYpb80.png

選擇資料庫,然後勾選需要生成代碼的資料庫表,點擊生成代碼會彈出生成選項(這裡演示勾選 Base_BuildTest,其餘表全是系統基礎表,不要勾選,否則會被覆蓋,導致異常,請勾選自己的業務表進行生成):

MYi3M6.png

生成選項中可以選擇需要生成的類型,預設生成全部:實體層、業務層、介面層(即控制器)和頁面(Vue前端頁面代碼)。
生成區域請輸入業務模塊名(例如系統叫Base_Manage),請按具體業務填入(必填)
這裡示例填寫TestManage,點擊生成按鈕,即可完成代碼生成。生成後的代碼在項目解決方案中,將代碼文件包括進入項目

預設生成後的文件會被自動包括到解決方案中,若沒有則需要點擊顯示所有文件按鈕,即可看到生成後的新文件

生成的實體層、業務邏輯層、控制器層代碼:
MYiWJs.png
MYFAfA.png
前端生成的代碼:
MYiXWR.png

後端代碼添加後需要重新編譯下(F7),編譯後好可以看到有新的介面
MYQYcD.png
前端生成代碼後會自動保存並編譯(別的文件修改保存也會自動編譯,畢竟編譯一次挺慢的),不放心可以Ctrl+C停止,然後再yarn run serve重新運行

代碼生成完畢,但是要展示到菜單上需要進行配置,並且所有業務菜單都是動態的(許可權控制)
打開菜單:系統管理=>許可權管理=>新建
MYPsUJ.png
MYFUmT.png
菜單名:即需要顯示的菜單名
上級菜單:菜單是多級樹狀的,可以放在某個菜單下麵
類型:可以選擇菜單或頁面,這裡是具體的頁面,所以選頁面
路徑:頁面的路徑,菜單可以不配置,這裡配置為/TestManage/Base_BuildTest/List,這裡設置規則為:views文件夾為根路徑(即"/"),向下展開依次為/TestManage/Base_BuildTest/List,最後真正的列表頁為List.vue文件,表單頁為EditForm.vue文件
是否需要許可權:若為“否”,則此頁面不限制許可權,即所有人都能看
圖標:菜單顯示圖標,具體到開發=>圖標選擇頁進行選擇
排序:若需要需要對菜單進行排序則設置,預設0,類型為int
頁面許可權:頁面擁有的許可權(許可權值唯一,作為操作許可權即介面許可權的依據),詳見許可權管理

確認保存,然後刷新整個頁面(F5),即可看到全新生成的菜單“生成測試”
MYkvqK.png
MYAFxI.png
MYAVqf.png

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

管理員登錄

MGH56I.png
預設超級管理員賬號為:Admin
密碼為:123456

系統用戶管理

管理系統登錄的用戶
菜單:系統=>用戶管理
點擊右側設置許可權

系統角色管理

管理系統角色,角色是許可權的載體,合理分配角色有利於許可權管理
菜單:系統=>角色管理
操作中可以設置角色的許可權,詳情見<許可權管理>模塊

許可權管理

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

首先,許可權分為兩種,即操作許可權數據許可權,其中操作許可權主要包括菜單許可權和按鈕許可權,在角色編輯表單中,給角色勾選需要的許可權即可,用戶可以分配多個角色,繼承所有角色的許可權。
MYET39.png
如上圖,按需勾選,有人會疑問為什麼只有增、改和刪的許可權而沒有查的許可權,其實這裡考慮到了當勾選“用戶管理”時,就已經預設擁有“查”的許可權了,這裡再設置“查”許可權豈不是多此一舉,可以根據實際業務需求添加諸如申請、審核等許可權,靈活應用。
這裡的樹狀是和菜單一一對應的,勾選哪些菜單就擁有哪些菜單

下麵介紹下最常用的按鈕許可權
MYVTIS.png

如上圖,在需要控制許可權的按鈕使用v-if="hasPerm('Base_User.Add')",表示只有當用戶擁有許可權值Base_User.Add才顯示此按鈕,許可權值就是許可權表單中配置的許可權值

這裡的按鈕級許可權控制只能夠在前端控制操作入口,若系統對安全性要求較高,則需要控制介面許可權
MYZNo8.png

如上圖,在需要許可權控制的介面加上ApiPermission特性即可,參數也為許可權值,只有擁有此許可權才能訪問此介面

數據許可權比較複雜,若採用純SQL方式,那麼會更加複雜,本框架全程採用EF作為ORM框架,通過對IQueryable< T >進行過濾,即可完成數據許可權控制,詳細使用方式見用戶管理

更詳細的使用方式,請參考源代碼中的用戶管理模塊(菜單許可權、操作許可權、數據許可權、聯表查詢、業務層AOP等使用方式均可參考此模塊)

介面秘鑰管理

作為對外介面簽名的AppId和AppSecret管理
菜單:系統=>介面秘鑰管理

系統日誌

菜單:系統=>系統日誌

單庫事務

使用方式如下:

BaseBusiness<Base_UnitTest> _baseBus  = new BaseBusiness<Base_UnitTest>();
/*RunTransaction傳入執行具體資料庫操作的Action,操作中若出現異常會自動回滾事務,業務只需根據返回的transActionRes進行處理,返回類型為元組(bool Success, Exception ex),Success表示事務是否成功,ex為事務失敗異常信息*/
var transActionRes = _baseBus.RunTransaction(() =>
{
    var newData = _newData.DeepClone();
    newData.Id = Guid.NewGuid().ToString();
    newData.UserId = IdHelper.GetId();
    newData.UserName = IdHelper.GetId();
    _baseBus.Insert(_newData);
    _baseBus.Insert(newData);
});

跨庫事務

使用方式如下:

//第一個資料庫
IRepository _bus1 = DbFactory.GetRepository();
//另一個資料庫
IRepository _bus2 = DbFactory.GetRepository("BaseDb_Test");
_bus1.DeleteAll<Base_UnitTest>();
_bus2.DeleteAll<Base_UnitTest>();
Base_UnitTest data1 = new Base_UnitTest
{
    Id = Guid.NewGuid().ToString(),
    UserId = "1",
    UserName = Guid.NewGuid().ToString()
};
Base_UnitTest data2 = new Base_UnitTest
{
    Id = data1.Id,
    UserId = "1",
    UserName = Guid.NewGuid().ToString()
};
Base_UnitTest data3 = new Base_UnitTest
{
    Id = Guid.NewGuid().ToString(),
    UserId = "2",
    UserName = Guid.NewGuid().ToString()
};

new Action(() =>
{
    //創建並執行事務,使用方式與單庫一致
    var succcess = DistributedTransactionFactory.GetDistributedTransaction(_bus1, _bus2)
        .RunTransaction(() =>
        {
            _bus1.ExecuteSql("insert into Base_UnitTest(Id) values('10') ");
            _bus1.Insert(data1);
            _bus1.Insert(data2);
            _bus2.Insert(data1);
            _bus2.Insert(data3);
        });
    Assert.AreEqual(succcess.Success, false);
    Assert.AreEqual(_bus1.GetIQueryable<Base_UnitTest>().Count(), 0);
    Assert.AreEqual(_bus2.GetIQueryable<Base_UnitTest>().Count(), 0);
})();

讀寫分離分庫分表

本框架支持資料庫讀寫分離分庫分表(即Sharding),並且支持主流關係型資料庫(SQLServer、Oracle、MySQL、PostgreSQL),理論上只要EF支持那麼本框架支持。
由於技術原因以及結合實際情況,目前本框架僅支持單表的Sharding,即支持單表的CRUD、分頁、統計(數量、最大值、最小值、平均值),支持跨庫(表分散在不同的資料庫中,不同類型資料庫也支持)。具體如何使用如下:

  • Sharding配置
    首先、要進行分庫分表操作,那麼必要的配置必不可少。配置代碼如下:
ShardingConfigBootstrapper.Bootstrap()
    //添加數據源
    .AddDataSource("BaseDb", DatabaseType.SqlServer, dbBuilder =>
    {
        //添加物理資料庫
        dbBuilder.AddPhsicDb("BaseDb", ReadWriteType.ReadAndWrite);
    })
    //添加抽象資料庫
    .AddAbsDb("BaseDb", absTableBuilder =>
    {
        //添加抽象數據表
        absTableBuilder.AddAbsTable("Base_UnitTest", tableBuilder =>
        {
            //添加物理數據表
            tableBuilder.AddPhsicTable("Base_UnitTest_0", "BaseDb");
            tableBuilder.AddPhsicTable("Base_UnitTest_1", "BaseDb");
            tableBuilder.AddPhsicTable("Base_UnitTest_2", "BaseDb");
        }, new ModShardingRule("Base_UnitTest", "Id", 3));
    });

上述代碼中完成了Sharding的配置:
ShardingConfigBootstrapper.Bootstrap()在一個項目中只能執行一次,所以建議放到Application_Start中(ASP.NET Core中的Startup)
AddDataSource是指添加數據源,數據源可以看做抽象資料庫,一個數據源包含了一組同類型的物理資料庫,即實際的資料庫。一個數據源至少包含一個物理資料庫,多個物理資料庫需要開啟主從複製或主主複製,通過ReadWriteType(寫、讀、寫和讀)參數來指定資料庫的操作類型,通常將寫庫作為主庫,讀庫作為從庫。同一個數據源中的物理資料庫類型相同,表結構也相同。
配置好數據源後就可以通過AddAbsDb來添加抽象資料庫,抽象資料庫中需要添加抽象數據表。如上抽象表Base_UnitTest對應的物理表就是Base_UnitTest_0、Base_UnitTest_1與Base_UnitTest_2,並且這三張表都屬於數據源BaseDb。分表配置當然需要分表規則(即通過一種規則找到具體數據在哪張表中)。
上述代碼中使用了最簡單的取模分片規則
源碼如下:

可以看到其使用方式及優缺點。
另外還有一致性HASH分片規則

雪花Id的mod分片規則

上述的分片規則各有優劣,都實現IShardingRule介面,實際上只需要實現FindTable方法即可實現自定義分片規則。
實際使用中個人推薦使用雪花Id的mod分片規,這也是為什麼前面資料庫設計規範中預設使用雪花Id作為資料庫主鍵的原因(PS,之前版本使用GUID作為主鍵被各種嫌棄,這次看你們怎麼說)

  • 使用方式
    配置完成,下麵開始使用,使用方式非常簡單,與平常使用基本一致
    首先獲取分片倉儲介面IShardingRepository
IShardingRepository _db = DbFactory.GetRepository().ToSharding();

然後即可進行數據操作:

Base_UnitTest _newData  = new Base_UnitTest
{
    Id = Guid.NewGuid().ToString(),
    UserId = "Admin",
    UserName = "超級管理員",
    Age = 22
};
List<Base_UnitTest> _insertList = new List<Base_UnitTest>
{
    new Base_UnitTest
    {
        Id = Guid.NewGuid().ToString(),
        UserId = "Admin1",
        UserName = "超級管理員1",
        Age = 22
    },
    new Base_UnitTest
    {
        Id = Guid.NewGuid().ToString(),
        UserId = "Admin2",
        UserName = "超級管理員2",
        Age = 22
    }
};
//添加單條數據
_db.Insert(_newData);
//添加多條數據
_db.Insert(_insertList);
//清空表
_db.DeleteAll<Base_UnitTest>();
//刪除單條數據
_db.Delete(_newData);
//刪除多條數據
_db.Delete(_insertList);
//刪除指定數據
_db.Delete<Base_UnitTest>(x => x.UserId == "Admin2");
//更新單條數據
_db.Update(_newData);
//更新多條數據
_db.Update(_insertList);
//更新單條數據指定屬性
_db.UpdateAny(_newData, new List<string> { "UserName", "Age" });
//更新多條數據指定屬性
_db.UpdateAny(_insertList, new List<string> { "UserName", "Age" });
//更新指定條件數據
_db.UpdateWhere<Base_UnitTest>(x => x.UserId == "Admin", x =>
{
    x.UserId = "Admin2";
});
//GetList獲取表的所有數據
var list=_db.GetList<Base_UnitTest>();
//GetIQPagination獲取分頁後的數據
var list=_db.GetIShardingQueryable<Base_UnitTest>().GetPagination(pagination);
//Max
var max=_db.GetIShardingQueryable<Base_UnitTest>().Max(x => x.Age);
//Min
var min=_db.GetIShardingQueryable<Base_UnitTest>().Min(x => x.Age);
//Average
var min=_db.GetIShardingQueryable<Base_UnitTest>().Average(x => x.Age);
//Count
var min=_db.GetIShardingQueryable<Base_UnitTest>().Count();
//事務,使用方式與普通事務一致
bool succcess = _db.RunTransaction(() =>
{
    _db.Insert(_newData);
    var newData2 = _newData.DeepClone();
    _db.Insert(newData2);
}).Success;
Assert.AreEqual(succcess, false);

上述操作中錶面上是操作Base_UnitTest表,實際上卻在按照一定規則使用Base_UnitTest_0~2三張表,使分片對業務操作透明,極大提高開發效率
具體使用方式請參考單元測試源碼:
"\src\Coldairarrow.UnitTests\DataRepository\ShardingTest.cs"

常見疑問

如何進行聯表查詢

框架使用EF+LINQ進行聯表操作,核心在於對IQueryable< T >的使用,另可網上搜EF+LINQ的相關教程。

示例如下:
Base_User表左連接Base_Department表獲取DepartmentName屬性

//定義數據模型類
public class Base_UserTestDTO : Base_User
{
    public string DepartmentName { get; set; }
}

//即BaseBusiness中的Service
var db = DbFactory.GetRepository();
Expression<Func<Base_User, Base_Department, Base_UserTestDTO>> select = (a, b) => new Base_UserTestDTO
{
    DepartmentName = b.Name
};
select = select.BuildExtendSelectExpre();
var q = from a in db.GetIQueryable<Base_User>().AsExpandable()
        join b in db.GetIQueryable<Base_Department>() on a.DepartmentId equals b.Id into ab
        from b in ab.DefaultIfEmpty()
        select @select.Invoke(a, b);
//篩選
var where = LinqHelper.True<Base_UserTestDTO>();
where = where.And(x => x.UserName == "Admin");

//篩選並獲取分頁數據
var list = q.Where(where).GetPagination(new Pagination()).ToList();

源碼可參考Base_UserBusiness.GetDataList

如何切換資料庫類型

在01.Coldairarrow.Util項目中的GlobalSwitch,將DatabaseType改為需要的即可,對應的資料庫連接字元串當然也要改為對應資料庫的
MYK1bR.png

如何使用多個資料庫

在具體的Business類中重寫父類BaseBusiness的構造函數即可,按照自己的需求重寫對應的構造函數,同時需要確保資料庫連接字元串已添加

MYMFzD.png

MYMVLd.png

若需要同時使用多個資料庫,或者需要多線程操作資料庫,需要使用
MYMsOJ.png

結語

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

Github歡迎星星:https://github.com/Coldairarrow

博客園歡迎點贊:https://www.cnblogs.com/coldairarrow/

QQ群2:579202910
個人QQ:862520575(歡迎技術支持及商務合作,提供.NET Core + Linux + Nginx+ jenkins + git整套持續集成快速開發平臺

本人將會對這個快速開發框架不斷完善與維護,希望能夠幫助到各位

若遇到任何問題或需要技術支持,請聯繫我。

------學習永無止境,技術永無上限,代碼就是藝術------


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 在使用ZedGraph進行添加曲線時,曲線數量如果很多的情況下,速度會比較慢。 所 ...
  • 場景 在Winform中實現彈窗式進度條 就是新建一個窗體,然後在窗體中加入進度條控制項,然後在觸發進度條的事件中將載入進度報告給 進度條控制項。 註: 博客主頁: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送 ...
  • Aspose.Cells for .NET是Excel電子錶格編程API,可加快電子錶格管理和處理任務,同時支持構建具有生成,修改,轉換,呈現和列印電子錶格功能的跨平臺應用程式。 近日,.NET版Aspose.Cells迎來了11月更新,支持隱藏所選範圍並對數據透視表的顯示結果進行排序,支持在XLS ...
  • 首先向各位介紹一下什麼是駝峰命名法: 駱駝式命名法就是當變數名或函數名是由一個或多個單詞連結在一起,而構成的唯一識別字時,第一個單詞以小寫字母開始;從第二個單詞開始以後的每個單詞的首字母都採用大寫字母,例如:myFirstName、myLastName,這樣的變數名看上去就像駱駝峰一樣此起彼伏,故得 ...
  • 1、進度條作用 當我們進行一個耗時操作的時候,界面不能靜止在那邊,要給用戶一個提示,表示程式是在跑的,需要用戶等待一會。就像坐電梯的時候,要顯示電梯現在在哪一層了。 2、實際的場景 有時我們程式需要操作的時間實際很難估計出來,不像電梯那樣可以精確的顯示在哪一層了,但是我們又要給客戶一個友好的提示。是 ...
  • 反射有個典型的應用,就是菜單的動態載入,原理就是通過反射調用某個窗體(類)。下麵演示一下通過反射調用類及方法: 1、新建一個類,命名為:ReflectionHelper,代碼如下: #region 創建對象實例 /// <summary> /// 創建對象實例 /// </summary> /// ...
  • 目 錄 1. 概述... 1 2. 登陸信息... 2 3. 設備驅動... 3 4. 組態建模... 3 5. 手機APP. 5 6. 視頻演示... 6 1. 概述 此次我們團隊人員對iNeuOS進行了全面升級,主要升級內容包括: (1) 設備容器增加設備驅動,包括:西門子(S7-200smar ...
  • 1. WPF有,而UWP沒有的圖片平鋪功能 在WPF中只要將ImageSource的 屬性設置為 即可實現圖片的平鋪,具體可見WPF的這些文檔: "ImageBrush 類 (System.Windows.Media) _ Microsoft Docs" "TileBrush 類 (System.W ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...