毕业后入职如今的公司快有一个月了,公司主要的产品用的是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,欢迎大神们拍砖,指出不足处。前端
毕业论文的课题是一个大学生的一个报名系统,主要是为了完成大学生报名过程当中的一些数据维护,固然最后由于实在来不及了,好多都没作。。。项目主要使用到的相关技术以下所示:git
项目架构采用的是多层架构,经过拆分不一样的功能领域,实现各个功能间的相对独立,项目在VS中搭建完成后以下图所示。github
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 }
权限验证代码以下截图所示:
控制器示例图:前端框架
基于策略的权限验证明现:session
自定义验证Claim:架构
接下来我要开始学习ASP.NET Core Web API和Vue了,但愿能够保持住,可以不间断的在博客上分享本身的学习经历与看法。当学的差很少的时候,争取把这个项目精简,重构,让本身在成为更好的本身的路途上前进一大步。
由于也是第一次使用ASP.NET Core MVC进行项目的开发,因此遇到了一些本身没办法解决的东西,很感谢博客园里的各位大佬以及一些帮助个人大佬,正是由于有这么多乐于分享的人在,才能更好的推进.NET Core在国内的生态发展,在写毕业设计的过程当中,参考了不少位博主的博文,真的是很感谢,致敬。框架
仍是要推广下本身的我的博客啊,点击这里,去看看个人博客啊~~~ide
项目实现图以下。