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,欢迎大神们拍砖,指出不足处。前端

 2、项目介绍

        毕业论文的课题是一个大学生的一个报名系统,主要是为了完成大学生报名过程当中的一些数据维护,固然最后由于实在来不及了,好多都没作。。。项目主要使用到的相关技术以下所示:git

  • 项目框架: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中搭建完成后以下图所示。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 }    
CurrentUser类

        权限验证代码以下截图所示:
        控制器示例图:前端框架


        基于策略的权限验证明现:session


        自定义验证Claim:架构

 4、总结

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

   仍是要推广下本身的我的博客啊,点击这里,去看看个人博客啊~~~ide

        项目实现图以下。

相关文章
相关标签/搜索