点击上方“程序员大咖”,选择“置顶公众号”
先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。
“这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。
“哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。
“何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。
这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。
不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。
“你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。
巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”
“不是挑战你,是要宰了你。”楚枫冷声笑道。
“好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。
如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。
不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。
“我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。
“这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。
“钟离长老?可是那位性情古怪的钟离一护?”
“没错,就是他。”
“天哪,巫九竟然拜入了他的门下?”
人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。
只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。
“恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。
一、前言
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
{
/// <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
}
权限验证代码如下截图所示:
控制器示例图:
基于策略的权限验证实现:
自定义验证Claim:
四、总结
接下来我要开始学习ASP.NET Core Web API和Vue了,希望可以保持住,能够不间断的在博客上分享自己的学习经历与见解。
当学的差不多的时候,争取把这个项目精简,重构,让自己在成为更好的自己的路途上前进一大步。
因为也是第一次使用ASP.NET Core MVC进行项目的开发,所以遇到了一些自己没办法解决的东西,很感谢博客园里的各位大佬以及一些帮助我的大佬,正是因为有这么多乐于分享的人在,才能更好的推动.NET Core在国内的生态发展,在写毕业设计的过程中,参考了很多位博主的博文,真的是很感谢,致敬。
项目实现图如下。
源码:https://github.com/Lanesra712/Danvic.PSU
来源:墨小宇
cnblogs.com/danvic712/p/9349583.html
程序员大咖整理发布,转载请联系作者获得授权