ASP.NET Core 2.0 MVC項目實戰

原文: ASP.NET Core 2.0 MVC項目實戰

 1、前言

        畢業後入職如今的公司快有一個月了,公司主要的產品用的是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,歡迎大神們拍磚,指出不足處。html

 2、項目介紹

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

  • 項目框架: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

 3、設計與實現介紹

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

        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項目,項目主程序。github

        系統權限驗證設計:
        整個系統分爲三種角色,分別爲管理員、教職工、學生用戶,經過使用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:session

 4、總結

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

   仍是要推廣下本身的我的博客啊,點擊這裏,去看看個人博客啊~~~框架

        項目實現圖以下。

相關文章
相關標籤/搜索