企業管理系統開發筆記(1)---後臺登陸

聲明:本筆記是本身在學習「傳智播客」視頻中對知識點的記錄,僅供本身平時的知識積累以便往後查詢方便。該博文若有任何錯誤,請各位博友指出。以便隨時修改!!!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 &copy; 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();
            }
        }
    }
}
相關文章
相關標籤/搜索