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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...