【无私分享:从入门到精通ASP.NET MVC】从0开始,一块儿搭框架、作项目 (16)源码分享二:登陆功能以及UI、数据库、仓储源码分享

索引

 

  

【无私分享:从入门到精通ASP.NET MVC】从0开始,一块儿搭框架、作项目 目录索引

  

 

前言

  

  前面尚未下载到UI和数据库的,这里再次给你们提供一下:百度网盘  提取码:fuuv ,UI是参照H+,可是H+是收费受权的(¥998RMB),价格有点贵,因此 咱们的 UI 跟H+ 虽然是一个风格,可是你们能够看到,CSS基本用的都是Bootstrap,JS 基本都是 最新的开源插件和本身重写的,不存在版权问题。html

 

  咱们前一章已经重写了咱们的仓储类,文章中接口都已列出,实现类也说的很明白,引入 uow 后,你们修改一下原先的提交,就能够。可是不少朋友 总感受 不给你文件 是由于 有些东西没有放给你,那么 就再次给你们 下载一下 个人仓储,你们能够对比一下,是否是博客中故意少些东西。修改后的仓储:百度网盘 提取码:qw64 git

其实,只是想让你们本身动手一下,修改方法很简单,就是把咱们以前的方法加上个条件: bool IsCommit=true,当咱们只进行一项操做的时候,默认直接提交,当咱们进行多项操做的时候,能够传入false,不提交,而后经过uow 统一提交。你们能够看一下,使用的例子:github

  

 

 

 

卖源码?

 

  不少朋友都在牢骚,说博主终于仍是商业化了...算法

 

  首先呢,到目前为止,我没有卖一套源码,若是你在咱们的交流群里,你能够问问你们,不少私聊我买源码的朋友,我都是跟他们说先按照博客园的文章本身作,学会才是目的,单纯的源代码是没有任何意义的,博客园贴出的源码跟我项目中源码的惟一区别就是,我项目中的源码没有注释,实在不行再来找我。数据库

 

  第二呢,有些源码出售网站惊现 果冻博客源码... 这让我很吃惊,首先是受宠若惊,巧合的是,有个源码网站是我朋友的,要不是他发给我我还真不知道,我是不反对这种行为的,你学会了就是你的,卖或不卖是你的事,可是扒下来的代码,都没有通过测试,这么多错误,都跑不起来,就拿来出售,是很不地道的。json

 

  第三呢,我上面说过了,博客园贴出的源码 跟我源码的惟一区别就是,我项目中源码是没有这么多注释的。若是单纯是分享源代码,大能够放到GitHub上,难道一步一步贴出源代码不就分享源码,只有把完整的打个包发给每一个人才叫分享源码吗?那博客园的意义是?博客园不是GitHub,两个站的目的是不同的。对于一样是新手的我来讲,github上的纯粹的源代码,若是ReadMe 写的不详细,是很难看懂的,更不用说理解运用了,若是一篇一篇文章,一步一步解释,一条一条注释,而后贴出整体的,都不能理解的话,直接一个完整的源码就能看懂吗?cookie

 

  伤不起。。。框架

 

 

 

登陆

  该正事了异步

  登陆控制器 /Areas/SysManage/AccountController,一共有一个视图,两个方法:登陆页面、登陆验证、验证码ide

  

  

  首先,咱们这个控制器跟区域里其它控制器的一个区别就是,咱们没有继承 BaseController,咱们能够看下咱们的 BaseController 都干了些什么:

  ① 公用变量:主要就是用于试图页传递一些公用变量,例如:查询关键字、分页页码、分页条数等。

  ② 用户对象:网站后台的管理员,咱们首先从Session中获取用户,若是Session 失效,那么咱们从Cookies中获取用户信息,模拟登陆从新赋值 Session 并获取用户,若是Cookies也失效,那么从新登陆。

  ③ 邮箱域名:这个是内部邮件用的,咱们这里不用。

  ④ 登陆验证

  ⑤ log4net日志封装方法

  ⑥ 输出消息

  ⑦ 模块权限验证:咱们对每个模块都有独立的权限,而且监控Action和Method,在前面咱们已经完成了对模块权限的初始化和自定义权限扩展,这里咱们就须要验证当前用户,对此模块的Action 是否有相应的操做权限(例如:添加、修改、删除、列表以及自定义的诸如 审核、打印、下载等),而且输出权限到视图,同时在视图页对没有相应权限的按钮Remove掉。通俗的讲,就是咱们Remove掉视图页中没有权限的按钮,而且监控后台Action的操做,因此即使你本身添加上相应的按钮和方法,提交到后台时也不会经过验证。

  

 

  经过上面详细的解释,咱们能够发现,登陆页是不须要这些的,可是后台操做的其它控制器都须要,因此它们都继承了BaseController 可是,登陆控制器不须要。

 

  咱们再回头看咱们的AccountController:

 

   Index 这个没什么可解释的,就是登录页面,咱们只是执行了移除Session和Cookies操做。

 

  咱们来看下登陆验证方法:

 

  首先,咱们是要验证验证码。(不区分大小写)if (!string.IsNullOrEmpty(code) && code.ToLower() == Session["gif"].ToString().ToLower())

  而后,咱们经过用户输入的帐号和密码验证用户,这里,咱们经过匹配帐号和密码返回用户的实体类 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());

  值得注意的是:由于咱们用的加密算法是动态密钥的,因此对相同的字符串每次加密后的密文都是不同的,所以咱们不能经过对用户输入的密码进行加密后与数据匹配,而是经过帐号取出密码,对密码进行解密与用户输入匹配的方式验证:

  

  

  若是返回正常,咱们首先还要验证用户是否被禁止登陆

  

  

  若是这一步验证也经过,咱们经过 var acconut = this.UserManage.GetAccountByUser(users); 获取ViewModel:Account 类

  

 1 public class Account
 2     {
 3         #region Attribute
 4         /// <summary>
 5         /// 主键
 6         /// </summary>
 7         public int Id { get; set; }
 8         /// <summary>
 9         /// 姓名
10         /// </summary>
11         public string Name { get; set; }
12         /// <summary>
13         /// 登陆的用户名
14         /// </summary>
15         public string LogName { get; set; }
16         /// <summary>
17         /// 姓名拼音
18         /// </summary>
19         public string PinYin { get; set; }
20         /// <summary>
21         /// 登陆密码
22         /// </summary>
23         public string PassWord { get; set; }
24         /// <summary>
25         /// 是否管理员
26         /// </summary>
27         public bool IsAdmin { get; set; }
28         /// <summary>
29         /// 用户头像
30         /// </summary>
31         public string Face_Img { get; set; }
32         /// <summary>
33         /// 部门职务
34         /// </summary>
35 
36         public string Levels { get; set; }
37         /// <summary>
38         /// 用户所属系统Id
39         /// </summary>
40         public List<string> System_Id { get; set; }
41         /// <summary>
42         /// 用户主部门
43         /// </summary>
44         public Domain.SYS_DEPARTMENT DptInfo { get; set; }
45         /// <summary>
46         /// 权限集合
47         /// </summary>
48         public List<Domain.SYS_PERMISSION> Permissions { get; set; }
49         /// <summary>
50         /// 角色的集合
51         /// </summary>
52         public List<Domain.SYS_ROLE> Roles { get; set; }
53         /// <summary>
54         /// 用户岗位集合
55         /// </summary>
56         public List<Domain.SYS_POST_USER> PostUser { get; set; }
57         /// <summary>
58         /// 用户可操做的模块集合
59         /// </summary>
60         public List<Domain.SYS_MODULE> Modules { get; set; }
61         #endregion
62     }

 

  这个类里面包含了用户的基本信息和可操做的系统、模块以及相应的权限信息。

 

   下一步,咱们先来验证一下,用户可操做的系统(这里起名有些误导了,应该叫Systems,System_Id给人的印象是系统ID,而不是系统集合): if (acconut.System_Id.Count > 0)

  

 

单点登陆

 

  若是可操做系统验证经过,咱们检测一下配置文件是否开启了单点登陆:单点登陆的实现方式其实很简单,这里大致跟你们说一下思路

  首先,咱们有个用户在线状态表 UserOnlie

  

  当咱们建立用户的时候,这里也会建立一个 一对一 的用户在线状态记录。

  咱们在最外层的后台主页面中,有个 SignalR-Hubs ,也是与内部聊天室一体的,当用户登陆后或从新链接时,咱们便更新用户的在线状态:

  

  当用户离线时,咱们更新用户的在线状态为离线:

  

 

  经过这个简单的方式,很简陋的实现单用户登陆模式。

 

 

  OK,这样基本的步骤就算完成了,若是用户不在线或没有开启单用户登陆,那么咱们记录Session和Cookies,若是开启了单用户模式,而且用户已在线,那么咱们登陆失败,提示当前用户,用户已登陆

  json.Msg = "当前用户已登陆,系统不容许重复登陆!登陆IP:" + UserOnline.UserIP;

 

  这个Login方法你们能够修改一些串行的方法为异步并行,提升效率。登陆页的UI 在以前的文章以及本文顶部 已经给你们分享,源码 在前面的文章中也有,可是没有加入单点登陆,这个是后来加上的,这里再给你们贴一下完整的登陆控制器:

  

  1 using Common;
  2 using Service.IService;
  3 using System;
  4 using System.Collections.Generic;
  5 using System.Linq;
  6 using System.Web;
  7 using System.Web.Mvc;
  8 
  9 namespace WebPage.Areas.SysManage.Controllers
 10 {
 11     public class AccountController : Controller
 12     {
 13         #region 声明容器
 14         /// <summary>
 15         /// 用户管理
 16         /// add yuangang by 2016-05-16
 17         /// </summary>
 18         IUserManage UserManage { get; set; }
 19         /// <summary>
 20         /// 用户在线管理
 21         /// </summary>
 22         IUserOnlineManage UserOnlineManage { get; set; }
 23         /// <summary>
 24         /// 日志记录
 25         /// </summary>
 26         log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");
 27         #endregion
 28 
 29         #region 基本视图
 30         public ActionResult Index()
 31         {
 32             //移除Session
 33             SessionHelper.Remove("CurrentUser");
 34             CookieHelper.ClearCookie("cookie_rememberme");   
 35             return View();
 36         }
 37         /// <summary>
 38         /// 登陆验证
 39         /// add yuangang by 2016-05-16
 40         /// </summary>
 41         [ValidateAntiForgeryToken]
 42         public ActionResult Login(Domain.SYS_USER item)
 43         {
 44             var json = new JsonHelper() { Msg = "登陆成功", Status = "n" };
 45             try
 46             {
 47                 //获取表单验证码
 48                 var code = Request.Form["code"];
 49                 if (Session["gif"] != null)
 50                 {
 51                     //判断用户输入的验证码是否正确
 52                     if (!string.IsNullOrEmpty(code) && code.ToLower() == Session["gif"].ToString().ToLower())
 53                     {
 54                         //调用登陆验证接口 返回用户实体类
 55                         var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());
 56                         if (users != null)
 57                         {
 58                             //是否锁定
 59                             if (users.ISCANLOGIN)
 60                             {
 61                                 json.Msg = "用户已锁定,禁止登陆,请联系管理员进行解锁";
 62                                 log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
 63                                 return Json(json);
 64                             }
 65 
 66                             var acconut = this.UserManage.GetAccountByUser(users);
 67 
 68                             //系统访问正常
 69                             if (acconut.System_Id.Count > 0)
 70                             {
 71                                 //是否启用单用户登陆
 72                                 if (System.Configuration.ConfigurationManager.AppSettings["IsSingleLogin"] == "True" )
 73                                 {
 74                                     var UserOnline = UserOnlineManage.LoadListAll(p => p.FK_UserId == users.ID).FirstOrDefault();
 75                                     if(UserOnline!=null && UserOnline.IsOnline)
 76                                     {
 77                                         json.Msg = "当前用户已登陆,系统不容许重复登陆!登陆IP:" + UserOnline.UserIP;
 78                                         log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "重复登陆:" + json.Msg);
 79                                     }
 80                                     else
 81                                     {
 82                                         //写入Session 当前登陆用户
 83                                         SessionHelper.SetSession("CurrentUser", acconut);
 84 
 85                                         //记录用户信息到Cookies
 86                                         string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
 87                                                              "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
 88                                                              Session.SessionID + "\"}";
 89                                         CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),
 90                                             null);
 91 
 92                                         json.Status = "y";
 93                                         json.ReUrl = "/Sys/Home/Index";
 94                                         log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
 95                                     }
 96                                 }
 97                                 else
 98                                 {
 99                                     //写入Session 当前登陆用户
100                                     SessionHelper.SetSession("CurrentUser", acconut);
101 
102                                     //记录用户信息到Cookies
103                                     string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
104                                                          "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
105                                                          Session.SessionID + "\"}";
106                                     CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),
107                                         null);
108 
109                                     json.Status = "y";
110                                     json.ReUrl = "/Sys/Home/Index";
111                                     log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
112                                 }
113                             }
114                             else
115                             {
116                                 json.Msg = "站点来源不可信,系统拒绝登陆";
117                                 log.Warn(Utils.GetIP(), "其余系统访问者", "", "Login", "其余系统登陆失败,缘由:系统验证错误,系统拒绝登陆");
118                             }
119 
120                         }
121                         else
122                         {
123                             json.Msg = "用户名或密码不正确";
124                             log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
125                         }
126                     }
127                     else
128                     {
129                         json.Msg = "验证码不正确";
130                         log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
131                     }                    
132                 }
133                 else
134                 {
135                     json.Msg = "验证码已过时,请刷新验证码";
136                     log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
137                 }              
138             }
139             catch (Exception e)
140             {
141                 json.Msg = e.Message;
142                 log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登陆,登陆结果:" + json.Msg);
143             }
144             return Json(json, JsonRequestBehavior.AllowGet);
145         }
146         #endregion
147 
148         #region 帮助方法
149         /// <summary>
150         /// 验证码
151         /// </summary>
152         public FileContentResult ValidateCode()
153         {
154             string code = "";
155             System.IO.MemoryStream ms = new Models.verify_code().Create(out code);
156             Session["gif"] = code;//验证码存储在Session中,供验证。  
157             Response.ClearContent();//清空输出流 
158             return File(ms.ToArray(), @"image/png");
159         }
160         #endregion
161     }
162 }
View Code
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息