畢業後入職如今的公司快有一個月了,公司主要的產品用的是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
畢業論文的課題是一個大學生的一個報名系統,主要是爲了完成大學生報名過程當中的一些數據維護,固然最後由於實在來不及了,好多都沒作。。。項目主要使用到的相關技術以下所示:前端
項目架構採用的是多層架構,經過拆分不一樣的功能領域,實現各個功能間的相對獨立,項目在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 }
權限驗證代碼以下截圖所示:
控制器示例圖:後端
基於策略的權限驗證明現:前端框架
自定義驗證Claim:session
接下來我要開始學習ASP.NET Core Web API和Vue了,但願能夠保持住,可以不間斷的在博客上分享本身的學習經歷與看法。當學的差很少的時候,爭取把這個項目精簡,重構,讓本身在成爲更好的本身的路途上前進一大步。
由於也是第一次使用ASP.NET Core MVC進行項目的開發,因此遇到了一些本身沒辦法解決的東西,很感謝博客園裏的各位大佬以及一些幫助個人大佬,正是由於有這麼多樂於分享的人在,才能更好的推進.NET Core在國內的生態發展,在寫畢業設計的過程當中,參考了不少位博主的博文,真的是很感謝,致敬。架構
仍是要推廣下本身的我的博客啊,點擊這裏,去看看個人博客啊~~~框架
項目實現圖以下。