ASP.NET Core 2.0 MVC项目实战

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!640?640?wx_fmt=gif















































































































































































































































































































    先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。


    “这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。


    “哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。


    “何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。


    这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。


    不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。


    “你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。


    巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”


    “不是挑战你,是要宰了你。”楚枫冷声笑道。


    “好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。


    如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。


    不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。


    “我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。


    “这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。


    “钟离长老?可是那位性情古怪的钟离一护?”


    “没错,就是他。”


    “天哪,巫九竟然拜入了他的门下?”


    人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。


    只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。


    “恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。































































































一、前言


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


640?wx_fmt=png


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

{

    /// <summary>

    /// 判断用户是否登录

    /// </summary>

    /// <param name="filterContext"></param>

    public override void OnActionExecuting(ActionExecutingContext filterContext)

    {

        if (CurrentUser.UserId == 0)

        {

            string path = filterContext.HttpContext.Request.Path;

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

            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


        /// <summary>

        /// 用户主键

        /// </summary>

        public static string UserOID

        {

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

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

        }


        /// <summary>

        ///用户编号 

        /// </summary>

        public static long UserId

        {

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

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

        }


        /// <summary>

        /// 用户姓名

        /// </summary>

        public static string UserName

        {

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

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

        }


        /// <summary>

        /// 用户登录账户

        /// </summary>

        public static string UserAccount

        {

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

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

        }


        /// <summary>

        /// 用户头像地址

        /// </summary>

        public static string UserImage

        {

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

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

        }


        /// <summary>

        /// 用户角色

        /// </summary>

        public static string UserRole

        {

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

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

        }


        /// <summary>

        /// 主页地址

        /// </summary>

        public static string UserPage

        {

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

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

        }

        #endregion

}    


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


控制器示例图:


640?wx_fmt=png


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


640?wx_fmt=png


自定义验证Claim:


640?wx_fmt=png


四、总结


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


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


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


项目实现图如下。


640?wx_fmt=png


640?wx_fmt=png


640?wx_fmt=png

源码:https://github.com/Lanesra712/Danvic.PSU


640.jpeg

  • 来源:墨小宇

  • cnblogs.com/danvic712/p/9349583.html

  • 程序员大咖整理发布,转载请联系作者获得授权

640?wx_fmt=gif640?【点击成为源码大神】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值