ASP.NET Core 2.0 MVC项目实战

来源:墨小宇

cnblogs.com/danvic712/p/9349583.html

一、前言

MVC项目是毕业设计,虽然写的比较烂,而且当时为了赶紧写完,代码的冗余程度有点高,但还是希望能给一些准备入门ASP.NET Core MVC的童鞋提供些借鉴吧。

源码地址: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中搭建完成后如下图所示。

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方法来实现对于用户是否登录的判断,实现代码如下。

public class DanvicController : Controller

{

///

/// 判断用户是否登录

///

///

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

if (CurrentUser.UserId == 0)

{

string path = filterContext.HttpContext.Request.Path;

filterContext.Result = new RedirectResult($"/Secret/Login?ReturnUrl=");

return;

}

base.OnActionExecuting(filterContext);

}

}

public static class CurrentUser

{

#region Initialize

private static IHttpContextAccessor _httpContextAccessor;

private static ISession _session => _httpContextAccessor.HttpContext.Session;

public static void Configure(IHttpContextAccessor httpContextAccessor)

{

_httpContextAccessor = httpContextAccessor;

}

#endregion

#region Attribute

///

/// 用户主键

///

public static string UserOID

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserOID");

set => _session.SetString("CurrentUser_UserOID", !string.IsNullOrEmpty(value) ? value : "");

}

///

///用户编号

///

public static long UserId

{

get => _session == null ? 0 : Convert.ToInt64(_session.GetString("CurrentUser_UserId"));

set => _session.SetString("CurrentUser_UserId", value != 0 ? value.ToString() : "0");

}

///

/// 用户姓名

///

public static string UserName

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserName");

set => _session.SetString("CurrentUser_UserName", !string.IsNullOrEmpty(value) ? value : "");

}

///

/// 用户登录账户

///

public static string UserAccount

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserAccount");

set => _session.SetString("CurrentUser_UserAccount", !string.IsNullOrEmpty(value) ? value : "");

}

///

/// 用户头像地址

///

public static string UserImage

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserImage");

set => _session.SetString("CurrentUser_UserImage", !string.IsNullOrEmpty(value) ? value : "");

}

///

/// 用户角色

///

public static string UserRole

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserRole");

set => _session.SetString("CurrentUser_UserRole", !string.IsNullOrEmpty(value) ? value : "");

}

///

/// 主页地址

///

public static string UserPage

{

get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");

set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");

}

#endregion

}

权限验证代码如下截图所示:

控制器示例图:

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

自定义验证Claim:

四、总结

接下来我要开始学习ASP.NET Core Web API和Vue了,希望可以保持住,能够不间断的在博客上分享自己的学习经历与见解。

当学的差不多的时候,争取把这个项目精简,重构,让自己在成为更好的自己的路途上前进一大步。

因为也是第一次使用ASP.NET Core MVC进行项目的开发,所以遇到了一些自己没办法解决的东西,很感谢博客园里的各位大佬以及一些帮助我的大佬,正是因为有这么多乐于分享的人在,才能更好的推动.NET Core在国内的生态发展,在写毕业设计的过程中,参考了很多位博主的博文,真的是很感谢,致敬。

项目实现图如下。

看完本文有收获?请转发分享给更多人

关注「DotNet」,提升.Net技能

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180724B0OLI100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券