聲明:本筆記是本身在學習「傳智播客」視頻中對知識點的記錄,僅供本身平時的知識積累以便往後查詢方便。該博文若有任何錯誤,請各位博友指出。以便隨時修改!!!javascript
1、項目框架及介紹java
本項目主要是學習MVC的開發方式,體會他的開發效率和便捷性,在本項目中採用ASP.NET MVC+Jquery easy UI +簡單三層架構+sqlhelper。主要使用到異步進行數據操做(增刪改)。jquery
2、系統框架搭建ajax
開發工具:vs2012sql
開發語言:c#數據庫
數據庫:sqlserver2008R2c#
框架圖:瀏覽器
說明:YPF.CMS.Common這個類庫是用來存放公共類文件。緩存
3、後臺開發網絡
通常後臺爲了開發效率和美觀性,咱們通常都會使用jQuery easy UI來進行頁面的佈局。因此後臺的開發中咱們大量使用到了它,相應的因爲大量的加入它因此頁面在訪問速度上有明顯的降低,請理解!
一、 登陸頁面
(1)先建立Login控制器,並添加index視圖。
(2)使用中美工的登陸頁面對index頁面進行替換。
注意:在這裏咱們要說明下就是這個文件夾和文件名:在mvc中是「約定大於配置」。視圖view的文件夾必須和控制器是一一對應的,視圖文件必須和控制器中的Action一致。
(3)在登陸頁面的表單中咱們使用了mvc的ajax異步對錶單進行提交。
<div id="login"> <div id="loginlogo"> </div> <div id="loginpanel"> <div class="panel-h"> </div> <div class="panel-c"> <div class="panel-c-l"> @using (Ajax.BeginForm("UserLogin", "Login", new AjaxOptions {HttpMethod = "post", OnSuccess = "afterLogin"}, new {id = "LoginForm"})) { <table cellpadding="0" cellspacing="0"> <tbody> <tr> <td align="left" colspan="2"> <h3>請使用傳智播客CMS系統帳號登陸</h3> </td> </tr> <tr> <td align="right">帳號: </td> <td align="left"> <input type="text" name="LoginCode" id="LoginCode" class="login-text" value="itcast" /> </td> </tr> <tr> <td align="right">密碼: </td> <td align="left"> <input type="password" name="LoginPwd" id="LoginPwd" value="123" class="login-text" /> </td> </tr> <tr> <td>驗證碼: </td> <td align="left"> <input type="text" class="login-text" id="code" name="vCode" /> </td> </tr> <tr> <td></td> <td> <img id="img" src="/Login/ShowValidateCode" style="float: left; height: 24px;" /> <div style="float: left; margin-left: 5px; margin-top: 10px;"> <a href="javascript:void(0)" onclick="changeCheckCode();return false;">看不清,換一張</a> </div> </td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" id="btnLogin" value="登陸" class="login-btn" /> <span id="errorMsg" style="color:red"></span> </td> </tr> </tbody> </table> } </div> <div class="panel-c-r"> <p> 請從左側輸入登陸帳號和密碼登陸 </p> <p> 若是遇到系統問題,請聯繫網絡管理員。 </p> <p> 若是沒有帳號,請聯繫網站管理員。 </p> <p> ...... </p> </div> </div> <div class="panel-f"> </div> </div> <div id="logincopyright"> Copyright © 2012 YPF.com </div> </div>
在這裏咱們須要注意的是:必需要引用下面2個js。一個是jquery,一個是mvc的異步提交表單所使用到的js
<script src="~/Scripts/jquery-1.8.2.min.js"></script> <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
下面關於mvc異步提交表單方法說明:
UserLogin:提交表單到控制器的Action
Login:提交表單到控制器
HttpMethod="post" 異步提交方式
OnSuccess="afterLogin" 異步提交的回到函數(咱們須要在js中添加該js函數)
(4)登陸的回調函數。
<script type="text/javascript"> //驗證碼更換 function changeCheckCode() { var myDate = new Date(); $("#img").attr("src", "/Login/ShowValidateCode?milliseconds=" + myDate.getMilliseconds()); } //登陸的回調函數 function afterLogin(data) { var serverData = data.split(':'); //登陸成功 if (serverData[0] == "ok") { window.location.href = "/Home/Index"; //登陸失敗 } else if (serverData[0] == "no") { $("#errorMsg").text(serverData[1]); changeCheckCode();//再次調用「驗證碼」更換目的是爲了登陸失敗後,對驗證碼進行刷新。 //登陸異常 } else { $("#errorMsg").text("系統繁忙!!"); } }
咱們能夠看到在afterLogin(data)這個回調函數中咱們對返回值進行了各類判斷:當返回ok時,對頁面進行跳轉到主頁面;當登陸失敗時進行提示和驗證碼進行更新。
驗證碼的更新,咱們須要注意的是:當咱們給<img>標籤的src屬性只賦值爲地址時候,當咱們在使用」換一張「的功能是不能實現對驗證碼圖片進行更換的。這個是因爲若是請求同一圖片的ur地址時,瀏覽器會將緩存中圖片給你。因此咱們須要在他的」src「屬性上作手腳。這裏咱們採用了:url+當前時間的毫秒數。通過這樣改造後就能夠更新圖片了。固然也有其餘不少方法能夠實現,只要明白他的原理便可。
(5)登陸後臺代碼
#region 獲取驗證碼 public ActionResult ShowValidateCode() { ValidateCode code = new ValidateCode(); string validatecode = code.CreateValidateCode(4); Session["validtaeCode"] = validatecode; byte[] bytes = code.CreateValidateGraphic(validatecode); return File(bytes, "image/jpeg"); } #endregion
#region 登陸驗證 /// <summary> /// 登陸驗證 /// </summary> /// <returns></returns> public ActionResult UserLogin() { string validateCode = Session["validtaeCode"] == null ? string.Empty : Session["validtaeCode"].ToString(); if (string.IsNullOrEmpty(validateCode)) { return Content("no:驗證碼不能爲空!"); } Session["validtaeCode"] = null; string txtcode = Request.Form["vcode"]; if (string.IsNullOrEmpty(txtcode)) { return Content("no:請輸入驗證碼!"); } else { if (!validateCode.Equals(txtcode, StringComparison.InvariantCultureIgnoreCase)) { return Content("no:驗證碼錯誤!"); } string userName = Request.Form["LoginCode"].ToString(); string LoginPwd = Request.Form["LoginPwd"].ToString(); if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(LoginPwd)) { return Content("no:用戶名或密碼不能爲空!"); } UserInfoBLL userinfoBLL = new UserInfoBLL(); UserInfo userinfo = userinfoBLL.GetUserInfo(userName, LoginPwd); if (userinfo != null) { Session["UserInfo"] = userinfo; return Content("ok:登陸成功!"); } else { return Content("no:登陸失敗!"); } } } #endregion
驗證碼類
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; using System.Threading.Tasks; using System.Web; namespace YPF.CMS.Common { /// <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>string</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="context">要輸出到的page對象</param> /// <param name="validateNum">驗證碼</param> public void CreateValidateGraphic(string validateCode, HttpContext context) { 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); //輸出圖片流 context.Response.Clear(); context.Response.ContentType = "image/jpeg"; context.Response.BinaryWrite(stream.ToArray()); } finally { g.Dispose(); image.Dispose(); } } /// <summary> /// 獲得驗證碼圖片的長度 /// </summary> /// <param name="validateNumLength">驗證碼的長度</param> /// <returns></returns> public static int GetImageWidth(int validateNumLength) { return (int)(validateNumLength * 12.0); } /// <summary> /// 獲得驗證碼的高度 /// </summary> /// <returns></returns> public static double GetImageHeight() { return 22.5; } //C# MVC 升級版 /// <summary> /// 建立驗證碼的圖片並生成byte[] /// </summary> /// <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(); } } } }