创建解决方案 Itcast.CMS
创建:Itcast.CMS.BLL类库
创建:Itcast.CMS.DAL类库
创建:Itcast.CMS.Model类库
创建:Itcast.CMS.Common类库 (阔们:工具类库,我们常用的工具类,就放到这里面)
创建:Itcast.CMS.WebApp ( ASP.NET MVC4应用程序)
Login 控制器 (UI层 调用BLL层的方法)
using Itcast.CMS.BLL; using Itcast.CMS.Model; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Itcast.CMS.WebApp.Controllers { public class LoginController : Controller { /// <summary> /// 登陆页面 /// </summary> /// <returns></returns> public ActionResult Index() { return View(); } /// <summary> /// 登陆成功后,跳转到此页面 /// </summary> /// <returns></returns> public ActionResult Login() { return View(); } /// <summary> /// 检测用户输入的用户名(Email),密码,验证码是否正确 /// </summary> /// <returns>错误的文字信息</returns> public ActionResult UserLogin() { string vCode = Session["vCode"] == null ? string.Empty : Session["vCode"].ToString(); if (string.IsNullOrWhiteSpace(vCode)) { return Content("no:没有输入验证码"); } Session["vCode"] = null;//因为前面已经给这个Session["vCode"]赋值给vCode了。所以此时系统里存的这个Session["vCode"]就没有用了,我们将它清空(需要的时候我们只要使用vCode就行了) string txtCode = Request["VCoe"]; if (!txtCode.Equals(vCode, StringComparison.InvariantCultureIgnoreCase)) //如果验证码有字母,就忽略字母的大小写进行对比 { return Content("no:验证码不正确"); } string userName = Request["UserName"]; string userMail=Request["UserName"]; //同时可以使用Email来登陆 string userPwd = Request["UserPwd"]; BLL.UserInfoService userService = new UserInfoService(); UserInfo user = userService.GetUserInfo(userName, userPwd, userMail); //调用BLL层中的方法 if (user != null) { Session["userInfo"] = user; return Content("ok:登陆成功"); } else { return Content("no:登陆失败"); } } /// <summary> /// 调用Itcast.CMS.Common类库中的ValidateCode类 来显示验证码 /// </summary> /// <param name="str">无用处的参数</param> /// <returns>图片文件</returns> public ActionResult ShowValiDataCode(string str) { Itcast.CMS.Common.ValidateCode vcode = new Common.ValidateCode(); string code= vcode.CreateValidateCode(5); Session["vCode"] = code; return File(vcode.CreateValidateGraphic(code), "image/JPEG"); } } }
Index视图
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/Scripts/jquery-1.8.2.js"></script> <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="~/Content/ie-emulation-modes-warning.js"></script> <link href="~/Content/bootstrap.min.css" rel="stylesheet" /> <link href="~/Content/signin.css" rel="stylesheet" /> <style type="text/css"> #inputVcode { width: 80px; } #inputVcode, img { float: left; } .clear { clear: both; /*-------清除浮动-----------*/ } </style> </head> <body> <div class="container"> @*OnSuccess = "afterLogin"表示:如果请求成功,就调用afterLogin函数(其实就是jquery中的 success:function afterLogin(){})*@ @*id = "form-signin" class = "form-signin" 是设置当前form表单的id和class"为form-signin"*@ @using (Ajax.BeginForm("UserLogin", new { }, new AjaxOptions { HttpMethod = "post", OnSuccess = "afterLogin" }, new { id = "form-signin", @class = "form-signin" })) { <h2 class="form-signin-heading">请登录</h2> <label for="inputEmail" class="sr-only">Email 地址</label> <input type="email" id="inputEmail" class="form-control" name="UserName" placeholder="Email 地址" required autofocus> <label for="inputPassword" class="sr-only">密码</label> <input type="password" id="inputPassword" class="form-control" name="UserPwd" placeholder="密码" required> <div><input type="text" id="inputVcode" class="form-control" name="VCoe" placeholder="验证码" required><img src="Login/ShowValiDataCode/?id=1; style="height:30px;width:70px;" id="ImageCode" class="validataCode" /><a href="#" class="validataCode">看不清,换一张</a></div> <div class="clear"></div> @*清除浮动*@ <div class="checkbox"> <label> <input type="checkbox" value="remember-me"> 记住我 </label> <label id="serverMes"></label> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button> } </div> <!-- /container --> </body> </html> <script type="text/javascript"> $(function () { $(".validataCode").click(function () { replaceVcode(); }) }) function replaceVcode() { $("#ImageCode").attr("src", $("#ImageCode").attr("src")+1); } function afterLogin(data) { // var serverData = data.split(":"); //对请求返还的出数据进行处理;例如这条数据(ok:登陆成功) if (serverData[0] == "ok") { $("#serverMes").text(serverData[1]); window.location.href = "/Login/Login"; //如果登陆成功(ok)就跳转到主页 } else if (serverData[0] == "no") { $("#serverMes").text(serverData[1]); //提示错误 replaceVcode(); //刷新验证码 } } </script>
BLL层中的UserInfoService.cs方法 (BLL层调用DAL层)
using Itcast.CMS.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Itcast.CMS.BLL { public class UserInfoService { /// <summary> /// 获取用户信息 /// </summary> /// <param name="userName">用户名</param> /// <param name="userPwd">用户密码</param> /// <returns></returns> public UserInfo GetUserInfo(string userName,string userPwd,string userMail) { Itcast.CMS.DAL.UserInfoDal userInfoDal = new DAL.UserInfoDal(); return userInfoDal.GetUserInfo(userName, userPwd, userMail); //调用DAL层中的方法 } } }
DAL层中的UserInfoDal.cs类 (DAL层访问数据库)
using Itcast.CMS.Model; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Itcast.CMS.DAL { /// <summary> /// 验证用户名与密码是否正确 /// </summary> public class UserInfoDal { /// <summary> /// 获取用户信息 /// </summary> /// <param name="userName">用户名</param> /// <param name="userPwd">用户密码</param> /// <returns>UserInfo类对象</returns> public UserInfo GetUserInfo(string userName,string userPwd,string userMail) { DbHelperSQL db = new DbHelperSQL(); SqlParameter[]param={new SqlParameter("@username",SqlDbType.NVarChar,100),new SqlParameter("@userpwd",SqlDbType.VarChar,100),new SqlParameter("@usermail",SqlDbType.VarChar,100)}; param[0].Value = userName; param[1].Value = userPwd; param[2].Value = userMail; DataTable dt = db.GetDataTable("select * from T_UserInfo where (UserName=@username or @UserMail=@usermail) and UserPwd=@userpwd ", param); UserInfo userinfo = null; if (dt.Rows.Count>0) { userinfo=new UserInfo(); DataTableToEtity(userinfo,dt); } return userinfo; } /// <summary> /// DataTable转UserInfo实体 /// </summary> /// <param name="dt">表名</param> /// <returns>UserInfo类对象</returns> public void DataTableToEtity(UserInfo user,DataTable dt) { user.Id = Convert.ToInt32(dt.Rows[0]["Id"]); user.UserName = dt.Rows[0]["UserName"].ToString(); user.UserPwd = dt.Rows[0]["UserPwd"].ToString(); user.UserMail = dt.Rows[0]["UserMail"].ToString(); user.RegTime = (DateTime)dt.Rows[0]["RegTime"]; } } }
Model层中 UserInfo.cs类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Itcast.CMS.Model { public class UserInfo { /// <summary> /// 用户编号 /// </summary> public int Id { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 用户密码 /// </summary> public string UserPwd { get; set; } /// <summary> /// 用户邮箱 /// </summary> public string UserMail { get; set; } /// <summary> /// 添加用户的时间 /// </summary> public DateTime RegTime { get; set; } } }
验证码:ValidateCode.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Drawing.Imaging; namespace bigtree.Actions { public class ValidateCode { //// <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 * 12.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", 12, (FontStyle.Bold | FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, 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(); } } } }
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.Web; using System.Web.Mvc; namespace MvcApp.Controllers { public class TestController : Controller { // // GET: /Test/ public ActionResult Index() { return View(); } //--------------一般情况我们只要调用个CreateValidateGraphic方法,传入一个验证码的长度,就可以获取验证码的的图片了 /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="length">验证码的长度</param> /// <returns>验证码图片</returns> public FileResult CreateValidateGraphic(int length) { string validateCode = EmptyResultDemo(length); Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22); Graphics g = Graphics.FromImage(image); //生成随机生成器 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", 12, (FontStyle.Bold | FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, 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); byte[] imageBuffer; //保存图片数据 using (MemoryStream stream = new MemoryStream()) { //保存的二进制写入到stream对象中 image.Save(stream, ImageFormat.Jpeg); //ms对象中的二进制数据转换成byte数组 imageBuffer = stream.ToArray(); } return File(imageBuffer, "image/jpeg"); } /// <summary> /// 产生验证码的随机数 /// </summary> /// <param name="length">验证码的长度</param> /// <returns>验证码</returns> public string EmptyResultDemo(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; } } }
这个验证码使用方法
<img src="/Test/CreateValidateGraphic?length=5"/> 这样就可以获取一副验证码了。 参数5是,验证码的长度