第一次做登錄功能,有點缺陷,代碼比較簡單,沒有過多介紹。
一、創建一個LoginModel.cs 類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace System.Models { public class LoginModel { [Required(ErrorMessage = "請輸入用戶名")] [Display(Name = "用戶名")] public string loginName { get; set; } [Required(ErrorMessage = "請輸入密碼")] [Display(Name = "密碼")] public string pwd { get; set; } [Required(ErrorMessage = "驗證碼必須填寫")] [Display(Name = "驗證碼")] public string Vcode { get; set; } } }
二、界面
ps:因為是用layui做的,所以還需要引入layui 相關的js和樣式。
@model System.Models.LoginModel @{ if (ViewData["IsShowAlert"] != null && ViewData["IsShowAlert"].ToString() == "True") { Response.Write(" <script>alert('" + ViewData["alert"] + "'); </script>"); } }} <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>登錄--layui后台管理模板</title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="format-detection" content="telephone=no"> @Styles.Render("~/Content/layuicms/layui/css/layui.css") @Styles.Render("~/Content/layuicms/css/login.css") @Styles.Render("~/Scripts/jquery-1.10.2.js") @Scripts.Render("~/Scripts/jquery.validate.js") @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.js") <style type="text/css"> .login { height:300px !important; } </style> </head> <body> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <div class="video-player" preload="auto" autoplay="autoplay" loop="loop" data-height="1080" data-width="1920" height="1080" width="1920"> <!--背景圖片--> <img src="~/Content/layuicms/page/login/login.jpg" style="width:100%; height:100%"/> </div> <div class="login"> <h1>登錄</h1> <form class="layui-form"> <div class="layui-form-item"> @Html.TextBoxFor(m => m.loginName, new { @class = "layui-input", @placeholder= "用戶名" }) @Html.ValidationMessageFor(m => m.loginName) </div> <div class="layui-form-item"> @Html.PasswordFor(m => m.pwd, new { @class = "layui-input", @placeholder = "密碼" }) @Html.ValidationMessageFor(m => m.pwd) </div> <div class="layui-form-item form_code"> @Html.TextBoxFor(m => m.Vcode, new { @style = "height: 38px;line - height: 38px;width:126px ", placeholder = "驗證碼", id = "Vcode" }) <img src="~/Login/GetValidateCode" alt="驗證碼" id="vcodeimg" style="cursor:pointer;height:36px;width:80px" /> <a href ="javascript:changeCode()" style="text-decoration: underline;"> 換一張</a> @Html.ValidationMessageFor(m => m.Vcode) </div> <input type="submit" value="登錄" class="layui-btn login_btn" /> </form> </div> } @Scripts.Render("~/Content/layuicms/layui/layui.js") @Scripts.Render("~/Content/layuicms/page/login/login.js") <script type="text/javascript"> function changeCode() { document.getElementById('vcodeimg').src = document.getElementById('vcodeimg').src + '?'; } </script> </body> </html>
效果圖:
login還要用到的js和css
layui.config({ base : "js/" }).use(['form','layer'],function(){ var form = layui.form(), layer = parent.layer === undefined ? layui.layer : parent.layer, $ = layui.jquery; //video背景 $(window).resize(function () { if ($(".video-player").width() > $(window).width()) { $(".video-player").css({ "height": $(window).height(), "width": "auto", "left": -($(".video-player").width() - $(window).width()) / 2 }); } else { $(".video-player").css({ "width": $(window).width(), "height": "auto", "left": -($(".video-player").width() - $(window).width()) / 2 }); } }).resize(); ////登錄按鈕事件 //form.on("submit(login)", function (data) { // window.location.href = "/Home"; // return false; //}) })
//css部分 body{overflow:hidden;} .video-player{background-color: transparent;min-width: 100%;min-height: 100%;display: block;position: absolute;z-index: 1;top:0;} .video_mask{ width:100%; height:100%; position:absolute; left:0; top:0; z-index:90; background-color:rgba(0,0,0,0.5); } .login{ height:260px;width:260px;padding: 20px;background-color:rgba(0,0,0,0.5);border-radius: 4px;position:absolute;left: 50%;top: 50%; margin:-150px 0 0 -150px;z-index:99;} .login h1{ text-align:center; color:#fff; font-size:24px; margin-bottom:20px; } .form_code{ position:relative; } .form_code .code{ position:absolute; right:0; top:1px; cursor:pointer; } .login_btn{ width:100%; }
控制器部分:
using Common.Tools; using DefaultConnection; using Microsoft.Practices.Unity; using System; using System.Collections.Generic; using System.Linq; using System.Models; using System.Web; using System.Web.Mvc; using Moon.Orm; using BLL; using System.IO; using System.Drawing; using System.Drawing.Imaging; namespace WebApplication3.Controllers { public class LoginController : Controller { [Dependency] public UserBLL usBLL { get; set; } // GET: Login public ActionResult Index() { return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(LoginModel model) { try { if (ModelState.IsValid==true) { if (Session["ValidateCode"].ToString() != model.Vcode) { ViewData["IsShowAlert"] = true; ViewData["alert"] = "驗證碼錯誤"; } else{ var userinfo3 = usBLL.GetByLogin(model.loginName, model.pwd); if (userinfo3 != null) { User ss = new User() { Id = userinfo3.Id, LoginName = userinfo3.LoginName, PassWord = userinfo3.PassWord, Name = userinfo3.Name }; Session["Loginname"] = ss; return RedirectToAction("", "Home"); } else { ViewData["IsShowAlert"] = true; ViewData["alert"] = "帳號或者密碼錯誤"; } } } } catch (Exception ex) { ModelState.AddModelError("", ex.Message); } return View(); } //驗證碼 public ActionResult GetValidateCode() { ValidateCode vCode = new ValidateCode(); string code = vCode.CreateValidateCode(5); Session["ValidateCode"] = code; byte[] bytes = vCode.CreateValidateGraphic(code); return File(bytes, @"image/jpeg"); } } }
UserBLL 部分:
/// <summary> /// 登錄用 /// </summary> /// <param name="loginName"></param> /// <param name="pwd"></param> /// <returns></returns> public User GetByLogin(string loginName, string pwd) { User item = null; var mql = UserSet.SelectAll().Where( UserSet.LoginName.Equal(loginName).And( UserSet.PassWord.Equal(pwd))); List< User> list = rmsUserRoleDal.GetOwnList< User>(mql); if (list.Count == 0) { return item; } return list[0]; }
ValidateCode 類 (在網上找的)
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; namespace Common.Tools { /// <summary> /// 生成驗證碼對象 /// </summary> public class ValidateCode { public ValidateCode() { } ///<summary> /// 驗證碼的最大長度 ///</summary> public int MaxLength { get { return 10; } } ///<summary> /// 驗證碼的最小長度 ///</summary> public int MinLength { get { return 1; } } ///<summary> /// 生成驗證碼 ///</summary> ///<param name="length">指定驗證碼的長度</param> ///<returns></returns> public string CreateValidateCode(int length) { int[] randMembers = new int[length]; int[] validateNums = new int[length]; string validateNumberStr = ""; //生成起始序列值 int seekSeek = unchecked((int)DateTime.Now.Ticks); Random seekRand = new Random(seekSeek); int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000); int[] seeks = new int[length]; for (int i = 0; i < length; i++) { beginSeek += 10000; seeks[i] = beginSeek; } //生成隨機數字 for (int i = 0; i < length; i++) { Random rand = new Random(seeks[i]); int pownum = 1 * (int)Math.Pow(10, length); randMembers[i] = rand.Next(pownum, Int32.MaxValue); } //抽取隨機數字 for (int i = 0; i < length; i++) { string numStr = randMembers[i].ToString(); int numLength = numStr.Length; Random rand = new Random(); int numPosition = rand.Next(0, numLength - 1); validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); } //生成驗證碼 for (int i = 0; i < length; i++) { validateNumberStr += validateNums[i].ToString(); } return validateNumberStr; } ///<summary> /// 創建驗證碼的圖片 ///</summary> ///<param name="containsPage">要輸出到的page對象</param> ///<param name="validateNum">驗證碼</param> public byte[] CreateValidateGraphic(string validateCode) { Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 14.0), 22); Graphics g = Graphics.FromImage(image); try { //生成隨機生成器 Random random = new Random(); //清空圖片背景色 g.Clear(Color.White); //畫圖片的干擾線 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } Font font = new Font("Arial", 14, (FontStyle.Bold | FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.5f, true); g.DrawString(validateCode, font, brush, 3, 2); //畫圖片的前景干擾點 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //保存圖片數據 MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Jpeg); //輸出圖片流 return stream.ToArray(); } finally { g.Dispose(); image.Dispose(); } } } }
登錄成功后Home后台接收后將登陸人的信息顯示在界面:
using DefaultConnection; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using WebApplication3.ActionFilter; namespace WebApplication3.Controllers { public class HomeController : Controller { [LoginActionFilter] public ActionResult Index() { User user = (User)Session["Loginname"]; User ss = new User() { Id = user.Id, LoginName = user.LoginName, PassWord = user.PassWord, Name = user.Name }; ViewBag.LoginName = ss.Name; return View(); } public ActionResult Main() { return View(); } public ActionResult LoginError() { return View(); } } }
LoginActionFilter.css
using DefaultConnection; using Microsoft.Practices.Unity; using System; using System.Collections.Generic; using System.Linq; using System.Models; using System.Web; using System.Web.Mvc; namespace WebApplication3.ActionFilter { public class LoginActionFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { User userLoginedModel = (User)filterContext.RequestContext.HttpContext.Session["Loginname"]; if (userLoginedModel == null) { filterContext.Result = new RedirectResult("/Home/LoginError"); } return; } } }
效果:
LoginError錯誤提示界面:
@{ ViewBag.Title = "LoginError"; } <script type="text/javascript"> window.onload = function () { document.getElementById("error_content").innerHTML = "在線狀態超時或未登錄"; setTimeout("toLogin()", 1000); } function toLogin() { top.location.replace('/Login/Index'); } </script> <div style="position:absolute;top:50%;left:30%;"><h1 id="error_content"></h1></div>