ASP.NET Core 2.0 MVC項目實戰

来源:https://www.cnblogs.com/danvic712/archive/2018/07/22/9349583.html
-Advertisement-
Play Games

一、前言 畢業後入職現在的公司快有一個月了,公司主要的產品用的是C/S架構,再加上自己現在還在學習維護很老的delphi項目,還是有很多不情願的。之前實習時主要是做.NET的B/S架構的項目,主要還是用的那種傳統的開發模式,只有一個項目用到了Web API,自己負責後端的介面功能實現。既然現在沒辦法 ...


 一、前言

        畢業後入職現在的公司快有一個月了,公司主要的產品用的是C/S架構,再加上自己現在還在學習維護很老的delphi項目,還是有很多不情願的。之前實習時主要是做.NET的B/S架構的項目,主要還是用的那種傳統的開發模式,只有一個項目用到了Web API,自己負責後端的介面功能實現。既然現在沒辦法改變現狀,那就先改變自己吧。定了個計劃,下班後慢慢的開始學習ASP.NET Core Web API和Vue,準備從前端到後端自己寫一個小項目玩玩,畢竟代碼這個東西,時間長了是會忘的。
        嗯,有點扯遠了。這個MVC項目是我的畢業設計,雖然寫的比較爛,而且當時為了趕緊寫完,代碼的冗餘程度有點高,但還是希望能給一些準備入門ASP.NET Core MVC的童鞋提供些借鑒吧。代碼我放到Github上了,源碼地址https://github.com/Lanesra712/Danvic.PSU,歡迎大神們拍磚,指出不足處。

 二、項目介紹

        畢業論文的課題是一個大學生的一個報名系統,主要是為了完成大學生報名過程中的一些數據維護,當然最後因為實在來不及了,好多都沒做。。。項目主要使用到的相關技術如下所示:

  • 項目框架:ASP.NET Core 2.0 MVC
  • ORM:Entity Framework Core(使用Code First)
  • 資料庫引擎:MySQL SERVER 5.7
  • 許可權驗證:基於策略的許可權驗證(Policy-Based Authorization)
  • 前端框架:AdminLte(一個基於Bootstrap的開源前端UI)
  • 表格控制項:Jquery Datatables
  • 數據可視化組件:Echarts
  • 日誌記錄:nlog

 三、設計與實現介紹

        項目架構採用的是多層架構,通過拆分不同的功能領域,實現各個功能間的相對獨立,項目在VS中搭建完成後如下圖所示。

        01_Entity:實體層,包含PSU.Entity這一個系統組件,用於存儲資料庫中表所對應的C#對象實體。
        02_Infrastructure:基礎架構層,包含PSU.EFCore、PSU.Utility兩個系統組件。PSU.EFCore類庫通過引用Entity Framework Core來完成對於資料庫的操作。PSU.Utility類庫中包含系統開發過程中可能用到的幫助類文件。
        03_Logic:邏輯層,包含PSU.Domain、PSU.Repository兩個系統組件。PSU.Domain用於繼承每個領域的介面類庫(PSU.IService),實現領域介面中的功能。PSU.Repository用來實現PSU.Domain類庫中所包含的對於資料庫的操作。
        04_Rule:規則層,包含PSU.IService、PSU.Model這兩個系統組件。PSU.IService為系統領域功能介面類庫,PSU.Model為視圖所對應的數據充血模型,對應MVC模式中的實體Model。
        Controller.PSU:控制器層,.NET Core類庫,用來存放MVC模式中的各種控制器文件。
        PSU.Site:表現層,ASP.NET Core MVC項目,項目主程式。

        系統許可權驗證設計:
        整個系統分為三種角色,分別為管理員、教職工、學生用戶,通過使用Area搭建每個角色的頁面,通過在Controller上添加Area特性,指定當前Controller屬於的角色。在創建用戶時,會指定用戶的角色欄位,當用戶登錄成功後,會根據用戶角色進行Claim的創建,通過自定義的AuthorizztionHandler來實現對於當前系統的角色許可權控制。
        當用戶登錄成功後,會將當前的用戶信息賦值給一個靜態類(使用Session進行存儲),對於判斷用戶是否登錄,則是通過自定義一個控制器的基類,重寫OnActionExecuting方法來實現對於用戶是否登錄的判斷,實現代碼如下。

 1 public class DanvicController : Controller
 2 {
 3     /// <summary>
 4     /// 判斷用戶是否登錄
 5     /// </summary>
 6     /// <param name="filterContext"></param>
 7     public override void OnActionExecuting(ActionExecutingContext filterContext)
 8     {
 9         if (CurrentUser.UserId == 0)
10         {
11             string path = filterContext.HttpContext.Request.Path;
12             filterContext.Result = new RedirectResult($"/Secret/Login?ReturnUrl={path}");
13             return;
14         }
15         base.OnActionExecuting(filterContext);
16     }
17 }        
自定義控制器基類
 1 public static class CurrentUser
 2 {
 3         #region Initialize
 4 
 5         private static IHttpContextAccessor _httpContextAccessor;
 6 
 7         private static ISession _session => _httpContextAccessor.HttpContext.Session;
 8 
 9         public static void Configure(IHttpContextAccessor httpContextAccessor)
10         {
11             _httpContextAccessor = httpContextAccessor;
12         }
13 
14         #endregion
15 
16         #region Attribute
17 
18         /// <summary>
19         /// 用戶主鍵
20         /// </summary>
21         public static string UserOID
22         {
23             get => _session == null ? "" : _session.GetString("CurrentUser_UserOID");
24             set => _session.SetString("CurrentUser_UserOID", !string.IsNullOrEmpty(value) ? value : "");
25         }
26 
27         /// <summary>
28         ///用戶編號 
29         /// </summary>
30         public static long UserId
31         {
32             get => _session == null ? 0 : Convert.ToInt64(_session.GetString("CurrentUser_UserId"));
33             set => _session.SetString("CurrentUser_UserId", value != 0 ? value.ToString() : "0");
34         }
35 
36         /// <summary>
37         /// 用戶姓名
38         /// </summary>
39         public static string UserName
40         {
41             get => _session == null ? "" : _session.GetString("CurrentUser_UserName");
42             set => _session.SetString("CurrentUser_UserName", !string.IsNullOrEmpty(value) ? value : "");
43         }
44 
45         /// <summary>
46         /// 用戶登錄賬戶
47         /// </summary>
48         public static string UserAccount
49         {
50             get => _session == null ? "" : _session.GetString("CurrentUser_UserAccount");
51             set => _session.SetString("CurrentUser_UserAccount", !string.IsNullOrEmpty(value) ? value : "");
52         }
53 
54         /// <summary>
55         /// 用戶頭像地址
56         /// </summary>
57         public static string UserImage
58         {
59             get => _session == null ? "" : _session.GetString("CurrentUser_UserImage");
60             set => _session.SetString("CurrentUser_UserImage", !string.IsNullOrEmpty(value) ? value : "");
61         }
62 
63         /// <summary>
64         /// 用戶角色
65         /// </summary>
66         public static string UserRole
67         {
68             get => _session == null ? "" : _session.GetString("CurrentUser_UserRole");
69             set => _session.SetString("CurrentUser_UserRole", !string.IsNullOrEmpty(value) ? value : "");
70         }
71 
72         /// <summary>
73         /// 主頁地址
74         /// </summary>
75         public static string UserPage
76         {
77             get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");
78             set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");
79         }
80 
81         #endregion
82 }    
CurrentUser類

        許可權驗證代碼如下截圖所示:
        控制器示例圖:


        基於策略的許可權驗證實現:


        自定義驗證Claim:

 四、總結

        接下來我要開始學習ASP.NET Core Web API和Vue了,希望可以保持住,能夠不間斷的在博客上分享自己的學習經歷與見解。當學的差不多的時候,爭取把這個項目精簡,重構,讓自己在成為更好的自己的路途上前進一大步。
        因為也是第一次使用ASP.NET Core MVC進行項目的開發,所以遇到了一些自己沒辦法解決的東西,很感謝博客園裡的各位大佬以及一些幫助我的大佬,正是因為有這麼多樂於分享的人在,才能更好的推動.NET Core在國內的生態發展,在寫畢業設計的過程中,參考了很多位博主的博文,真的是很感謝,致敬。

   還是要推廣下自己的個人博客啊,點擊這裡,去看看我的博客啊~~~

        項目實現圖如下。


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

-Advertisement-
Play Games
更多相關文章
  • 發現一個奇怪的現象,我以Python入門為題的隨筆文章莫名其妙有幾十的閱讀量,讓我有點尷尬,其實大家如果想學Python的話,可以關註一些公眾號,比如「一個程式員的日常」和「痴海」等等,他們都有Python方面的學習資源,而且他們也會推薦一些優質的公眾號供大家學習,關註一下,如果之後感覺不怎樣,取關 ...
  • IO流和Properties IO流 IO流是指電腦與外部世界或者一個程式與電腦的其餘部分的之間的介面。它對於任何電腦系統都非常關鍵, 因而所有 I/O 的主體實際上是內置在操作系統中的。單獨的程式一般是讓系統為它們完成大部分的工作。 在 Java 編程中,一直使用流的方式完成 I/O。所有 ...
  • 註:希望與各位讀者相互交流,共同學習進步。 ...
  • 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 三大結構 順序 分支 迴圈 分支 分支的基本語法 if 條件表達式: 語句1 ...
  • 本篇文章主要介紹委托的應用。 委托是大家最常見的語法了,但會用與精通之間的差距是巨大的。 一個程式員如果不能精通委托,那麼,他永遠無法成為高級程式員。 所以,讓我們把委托刻到血液里吧。 這樣,你才能稱為Developer。 ...
  • --> public class OtherConfigInfo : ConfigurationSection { /// /// 獲取配置信息 /// /// public static OtherConfigInfo GetConfig() { ... ...
  • 最近比較忙,博客很久沒更新了,很多博友問何時更新博文,因此,今天就花了點時間,寫了本篇文章,但願大家喜歡。 本篇文章不適合初學者,需要對ASP.NET MVC具有一定基礎。 本篇文章主要從ASP.NET MVC 基架角度去分析MVC框架是如何實現資源過濾,資源授權,感興趣的,歡迎閱讀。 相關文章,請 ...
  • 本篇介紹異常處理的知識。由於異常處理的技術應用並不複雜,本篇更多討論異常處理的一些理論知識,包括一些原則、約定和建議。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...