为了账号安全,请及时绑定邮箱和手机立即绑定

ASP.NET Core 2.0 MVC项目实战

标签:
C#

 一、前言

        毕业后入职现在的公司快有一个月了,公司主要的产品用的是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中搭建完成后如下图所示。

https://img1.sycdn.imooc.com//5b548d730001d35413360618.jpg

        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         #endregion15 16         #region Attribute17 18         /// <summary>19         /// 用户主键20         /// </summary>21         public static string UserOID22         {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 UserId31         {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 UserName40         {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 UserAccount49         {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 UserImage58         {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 UserRole67         {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 UserPage76         {77             get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");78             set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");79         }80 81         #endregion82 }

        权限验证代码如下截图所示:
        控制器示例图:

https://img1.sycdn.imooc.com//5b548db10001a72005350200.jpg


        基于策略的权限验证实现:

https://img1.sycdn.imooc.com//5b548db700015f3006630442.jpg


        自定义验证Claim:

https://img1.sycdn.imooc.com//5b548dc500017ea209440488.jpg

 四、总结

        接下来我要开始学习ASP.NET Core Web API和Vue了,希望可以保持住,能够不间断的在博客上分享自己的学习经历与见解。当学的差不多的时候,争取把这个项目精简,重构,让自己在成为更好的自己的路途上前进一大步。
        因为也是第一次使用ASP.NET Core MVC进行项目的开发,所以遇到了一些自己没办法解决的东西,很感谢博客园里的各位大佬以及一些帮助我的大佬,正是因为有这么多乐于分享的人在,才能更好的推动.NET Core在国内的生态发展,在写毕业设计的过程中,参考了很多位博主的博文,真的是很感谢,致敬。

   还是要推广下自己的个人博客啊,点击这里,去看看我的博客啊~~~

        项目实现图如下。

https://img1.sycdn.imooc.com//5b548dd800017f2b13610636.jpg

https://img1.sycdn.imooc.com//5b548de10001992c13660914.jpg

https://img1.sycdn.imooc.com//5b548df10001a9a513661015.jpg

原文出处:ASP.NET Core 2.0 MVC项目实战


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消