MVC5 網站開發之六 管理員 一、登陸、驗證和註銷

上次業務邏輯和展現層的架構都寫了,能夠開始進行具體功能的實現,此次先實現管理員的登陸、驗證和註銷功能。

 

目錄css

奔跑吧,代碼小哥!html

MVC5網站開發之一 整體概述jquery

MVC5 網站開發之二 建立項目架構

MVC5 網站開發之三 數據存儲層功能實現ide

MVC5 網站開發之四 業務邏輯層的架構和基本功能測試

MVC5 網站開發之五 展現層架構網站

MVC5 網站開發之六 管理員 一、登陸、驗證和註銷ui

MVC5 網站開發之六 管理員 二、添加、刪除、重置密碼、修改密碼、列表瀏覽加密

MVC5 網站開發之七 用戶功能 一、角色的後臺管理spa

 

 

1、業務邏輯層

一、實現256散列加密方法。

Ninesky.Core【右鍵】-> 添加->文件夾,輸入文件夾名General。

General文件夾【右鍵】->添加->類,輸入類名Security。

引用System.Security.Cryptography命名空間(1),並實現SHA256靜態加密方法。

image

二、Administrator模型類

image

Ninesky.Core【右鍵】-> 添加->,輸入類名Administrator。

添加引用System.ComponentModel.DataAnnotations; 完成的類代碼

using System;
using System.ComponentModel.DataAnnotations;

namespace Ninesky.Core
{
    /// <summary>
    /// 管理員模型
    /// </summary>
    public class Administrator
    {
        [Key]
        public int AdministratorID { get; set; }

        /// <summary>
        /// 賬號
        /// </summary>
        [Required(ErrorMessage = "必須輸入{0}")]
        [StringLength(30, MinimumLength = 4, ErrorMessage ="{0}長度爲{2}-{1}個字符")]
        [Display(Name ="賬號")]
        public string Accounts { get; set; }

        /// <summary>
        /// 密碼
        /// </summary>
        [DataType(DataType.Password)]
        [Required(ErrorMessage = "必須輸入{0}")]
        [StringLength(256,ErrorMessage = "{0}長度少於{1}個字符")]
        [Display(Name = "密碼")]
        public string Password { get; set; }

        /// <summary>
        /// 登陸IP
        /// </summary>
        [Display(Name = "登陸IP")]
        public string LoginIP { get; set; }

        /// <summary>
        /// 登陸時間
        /// </summary>
        [Display(Name = "登陸時間")]
        public Nullable<DateTime> LoginTime { get; set; }

        /// <summary>
        /// 建立時間
        /// </summary>
        [Display(Name = "建立時間")]
        public DateTime CreateTime { get; set; }
    }
}

三、數據上下文

打開Ninesky.Core->NineskyContext.cs 添加Administrators屬性

image

紅框內爲添加內容。

四、AdministratorManager管理類

image

 

Ninesky.Core【右鍵】-> 添加->,輸入類名AdministratorManager。

類繼承自BaseManager<Administrator>。

爲類添加Ninesky.Core.Types引用。

using Ninesky.Core.Types;
using System;

namespace Ninesky.Core
{
    public class AdministratorManager : BaseManager<Administrator>
    {
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="admin">管理員實體</param>
        /// <returns></returns>
        public override Response Add(Administrator admin)
        {
            Response _resp = new Response();
            if (HasAccounts(admin.Accounts))
            {
                _resp.Code = 0;
                _resp.Message = "賬號已存在";
            }
            else _resp = base.Add(admin);
            return _resp;
        }

        /// <summary>
        /// 修改密碼
        /// </summary>
        /// <param name="administratorID">主鍵</param>
        /// <param name="password">新密碼【密文】</param>
        /// <returns></returns>
        public Response ChangePassword(int administratorID, string password)
        {
            Response _resp = new Response();
            var _admin = Find(administratorID);
            if (_admin == null)
            {
                _resp.Code = 0;
                _resp.Message = "該主鍵的管理員不存在";
            }
            else
            {
                _admin.Password = password;
                _resp = Update(_admin);
            }
            return _resp;
        }

        /// <summary>
        /// 刪除
        /// </summary>
        /// <param name="administratorID">主鍵</param>
        /// <returns></returns>
        public override Response Delete(int administratorID)
        {
            Response _resp = new Response();
            if (Count() == 1)
            {
                _resp.Code = 0;
                _resp.Message = "不能刪除惟一的管理員賬號";
            }
            else _resp = base.Delete(administratorID);
            return _resp;
        }

        /// <summary>
        /// 查找
        /// </summary>
        /// <param name="accounts">賬號</param>
        /// <returns></returns>
        public Administrator Find(string accounts)
        {
            return base.Repository.Find(a => a.Accounts == accounts);
        }

        /// <summary>
        /// 賬號是否存在
        /// </summary>
        /// <param name="accounts">賬號</param>
        /// <returns></returns>
        public bool HasAccounts(string accounts)
        {
            return base.Repository.IsContains(a => a.Accounts.ToUpper() == accounts.ToUpper());
        }

        /// <summary>
        /// 更新登陸信息
        /// </summary>
        /// <param name="administratorID">主鍵</param>
        /// <param name="ip">IP地址</param>
        /// <param name="time">時間</param>
        /// <returns></returns>
        public Response UpadateLoginInfo(int administratorID, string ip, DateTime time)
        {
            Response _resp = new Response();
            var _admin = Find(administratorID);
            if (_admin == null)
            {
                _resp.Code = 0;
                _resp.Message = "該主鍵的管理員不存在";
            }
            else
            {
                _admin.LoginIP = ip;
                _admin.LoginTime = time;
                _resp = Update(_admin);
            }
            return _resp;
        }

        /// <summary>
        /// 驗證
        /// </summary>
        /// <param name="accounts">賬號</param>
        /// <param name="password">密碼【密文】</param>
        /// <returns>Code:1-成功;2-賬號不存在;3-密碼錯誤</returns>
        public Response Verify(string accounts, string password)
        {
            Response _resp = new Response();
            var _admin = base.Repository.Find(a => a.Accounts == accounts);
            if (_admin == null)
            {
                _resp.Code = 2;
                _resp.Message = "賬號爲:【" + accounts + "】的管理員不存在";
            }
            else if (_admin.Password == password)
            {
                _resp.Code = 1;
                _resp.Message = "驗證經過";
            }
            else
            {
                _resp.Code = 3;
                _resp.Message = "賬號密碼錯誤";
            }
            return _resp;
        }
    }
}

2、展現層實現

首先,添加css。

Ninesky.Web->Content【右鍵】->添加->試樣表,輸入名稱StyleControl。

打開Ninesky.Web->App_Start->BundleConfig.cs。

image

添加紅框內代碼。StyleControl.css具體內容這裏省略了。

其次,添加對Ninesky.Core的引用。

Ninesky.Web->引用【右鍵】->添加引用.。在引用管理器中選擇 項目->解決方案->Ninesky.Core.

處理完這兩項內容就繼續具體內容了:

一、管理員身份驗證類AdminAuthorizeAttribute

AdminAuthorizeAttribute繼承自AuthorizeAttribute,重寫AuthorizeCore方法,經過Session["AdminID"]來判斷管理員是否已經登陸,重寫HandleUnauthorizedRequest方法來處理未登陸時的頁面跳轉。

using System.Web;
using System.Web.Mvc;

namespace Ninesky.Web.Areas.Control
{
    /// <summary>
    /// 管理員身份驗證類
    /// </summary>
    public class AdminAuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 重寫自定義受權檢查
        /// </summary>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Session["AdminID"] == null) return false;
            else return true;
        }
        /// <summary>
        /// 重寫未受權的 HTTP 請求處理
        /// </summary>
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectResult("~/Control/Admin/Login");
        }
    }
}

Ninesky.Web->Areas->Control【右鍵】->添加->,輸入控制器名稱HomeController。

HomeController添加[AdminAuthorize]

image

二、管理員控制器

Ninesky.Web->Areas->Control->Controllers【右鍵】->添加->控制器。選擇 MVC5 控制器 – 空, 輸入控制器名稱Admin。

在控制器中引用Ninesky.Core、Ninesky.Core.GeneralNinesky.Web.Areas.Control.Models命名空間。

添加私有變量private AdministratorManager adminManager = new AdministratorManager();

爲AdminController添加[AdminAuthorize]

3.1 管理員登陸

3.1.1 登陸視圖模型

Ninesky.Web->Areas->Control->Models【右鍵】->添加->類,輸入類名LoginViewModel。

namespace Ninesky.Web.Areas.Control.Models
{
    /// <summary>
    /// 登陸模型
    /// </summary>
    public class LoginViewModel
    {
        /// <summary>
        /// 賬號
        /// </summary>
        [Required(ErrorMessage = "必須輸入{0}")]
        [StringLength(30, MinimumLength = 4, ErrorMessage = "{0}長度爲{2}-{1}個字符")]
        [Display(Name = "賬號")]
        public string Accounts { get; set; }

        /// <summary>
        /// 密碼
        /// </summary>
        [DataType(DataType.Password)]
        [Required(ErrorMessage = "必須輸入{0}")]
        [StringLength(20,MinimumLength =6, ErrorMessage = "{0}長度{2}-{1}個字符")]
        [Display(Name = "密碼")]
        public string Password { get; set; }
    }
}

3.1.2 登陸方法

在AdminController中添加Login()方法

/// <summary>
        /// 登陸
        /// </summary>
        /// <returns></returns>
        [AllowAnonymous]
        public ActionResult Login()
        {
            return View();
        }

3.1.3 登陸視圖

Login()方法上點【右鍵】->添加視圖

image

模板選Create,模型類選LoginViewModel ,選項選中引用腳本庫。完成後代碼

@model Ninesky.Web.Areas.Control.Models.LoginViewModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>登陸</title>
    @Styles.Render("~/Content/controlcss")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryval")

    <div class="loginform">


        <div class="form-horizontal">
            <h2 class="text-primary">登陸</h2>
            @using (Html.BeginForm())
            {
                @Html.AntiForgeryToken()
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group form-group-lg">
                    @Html.EditorFor(model => model.Accounts, new { htmlAttributes = new { @class = "form-control", placeholder = "賬號" } })
                    @Html.ValidationMessageFor(model => model.Accounts, "", new { @class = "text-danger" })
                </div>
                <div class="form-group form-group-lg">
                    @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control", placeholder = "密碼" } })
                    @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
                </div>
                <div class="form-group form-group-lg">
                    <input type="submit" value="登陸" class="btn btn-default pull-right" />
                </div>
            }
        </div>

    </div>
</body>
</html>

在AdminController中添加登陸的處理方法public ActionResult Login(LoginViewModel loginViewModel)

[AllowAnonymous]
        [ValidateAntiForgeryToken]
        [HttpPost]
        public ActionResult Login(LoginViewModel loginViewModel)
        {
            if(ModelState.IsValid)
            {
                string _passowrd = Security.SHA256(loginViewModel.Password);
                var _response = adminManager.Verify(loginViewModel.Accounts, _passowrd);
                if (_response.Code == 1)
                {
                    var _admin = adminManager.Find(loginViewModel.Accounts);
                    Session.Add("AdminID", _admin.AdministratorID);
                    Session.Add("Accounts", _admin.Accounts);
                    _admin.LoginTime = DateTime.Now;
                    _admin.LoginIP = Request.UserHostAddress;
                    adminManager.Update(_admin);
                    return RedirectToAction("Index", "Home");
                }
                else if (_response.Code == 2) ModelState.AddModelError("Accounts", _response.Message);
                else if (_response.Code == 3) ModelState.AddModelError("Password", _response.Message);
                else ModelState.AddModelError("",_response.Message);
            }
            return View(loginViewModel);
        }

四、註銷

在AdminController中添加註銷的處理方法public ActionResult Logout()

/// <summary>
        /// 註銷
        /// </summary>
        /// <returns></returns>
        public ActionResult Logout()
        {
            Session.Clear();
            return RedirectToAction("Login");
        }

完工能夠按F5測試了。

 

image

登陸界面,輸入賬號mzwhj 密碼123456,登陸成功。

image

登陸成功界面。

 

=====================================================

代碼見:https://ninesky.codeplex.com/SourceControl/latest

代碼下載:https://ninesky.codeplex.com 點擊SOURCE CODE 點擊Download下載源文件。

相關文章
相關標籤/搜索