學用MVC4做網站六后台管理:6.1管理員(續)


接6.1

首先在~/Areas/Admin/Models文件夾添加管理員模型Administrator.cs

using System.ComponentModel.DataAnnotations;

namespace Ninesky.Areas.Admin.Models
{
    /// <summary>
    /// 管理員模型
    /// </summary>
    public class Administrator
    {
        [Key]
        public int AdministratorId { get; set; }
        [Display(Name = "系統賬號")]
        [Required(ErrorMessage = "×")]
        public bool IsPreset { get; set; }
        [Display(Name="用戶名",Description="(必填) 4-20個字符。")]
        [Required(ErrorMessage="×")]
        [StringLength(20,MinimumLength=4,ErrorMessage="×")]
        public string AdminName { get; set; }
        [Display(Name = "密碼", Description = "(必填) 6-20個字符。")]
        [Required(ErrorMessage = "×")]
        [StringLength(256, MinimumLength = 6, ErrorMessage = "×")]
        public string PassWord { get; set; }
        [Display(Name = "姓名", Description = "填寫姓名可以更容易識別管理員。")]
        [StringLength(20, ErrorMessage = "×")]
        public string Name { get; set; }
        [Display(Name = "電子郵件", Description = "(必填) 不多於255個字符。")]
        [Required(ErrorMessage = "×")]
        [EmailAddress()]
        [StringLength(256, ErrorMessage = "×")]
        public string Email { get; set; }
    }
}

在~/Areas/Admin/Repository文件夾 添加接口IAdministrator(為的實現所謂的Repository模式)

接口中有管理員的添加、刪除、修改、查找、驗證等。基本上就這些差不多了。

using Ninesky.Areas.Admin.Models;
using System.Collections.Generic;

namespace Ninesky.Areas.Admin.Repository
{
    public interface IAdministrator
    {
        /// <summary>
        /// 添加管理員
        /// </summary>
        /// <param name="admin">管理員</param>
        /// <returns></returns>
        bool Add(Administrator admin);
        /// <summary>
        /// 更改管理員信息
        /// </summary>
        /// <param name="admin">管理員</param>
        bool Modify(Administrator admin);
        /// <summary>
        /// 刪除管理員
        /// </summary>
        /// <param name="adminId">管理員Id</param>
        bool Delete(int adminId);
        /// <summary>
        /// 刪除管理員
        /// </summary>
        /// <param name="admin">管理員</param>
        bool Delete(Administrator admin);
        /// <summary>
        /// 驗證管理員賬號、密碼【返回值-1此管理員不存在,0密碼錯誤,1驗證通過】
        /// </summary>
        /// <param name="adminName">用戶名</param>
        /// <param name="passWord">密碼【加密】</param>
        int Authentication(string userName, string passWord);
        /// <summary>
        /// 查找管理員
        /// </summary>
        /// <param name="adminId">管理員Id</param>
        Administrator Find(int adminId);
        /// <summary>
        /// 查找管理員
        /// </summary>
        /// <param name="adminName">管理員名稱</param>
        /// <returns></returns>
        Administrator Find(string adminName);
        /// <summary>
        /// 查找全部管理員
        /// </summary>
        List<Administrator> Find();
    }
}

再添加接口的實現類AdministratorRepository.cs

using Ninesky.Areas.Admin.Models;
using Ninesky.Repository;
using System.Collections.Generic;
using System.Linq;

namespace Ninesky.Areas.Admin.Repository
{
    public class AdministratorRepository:IAdministrator
    {
        private NineskyContext db;
        public bool Add(Administrator admin)
        {
            using (db = new NineskyContext())
            {
                if (db.Administrators.Any(a => a.AdminName == admin.AdminName)) return false;
                db.Administrators.Add(admin);
                return db.SaveChanges() > 0;
            }
            
        }
        public int Authentication(string adminName, string passWord)
        {
            using (db = new NineskyContext())
            {
                if (db.Administrators.Any(a => a.AdminName == adminName))
                {
                    var _admin = db.Administrators.SingleOrDefault(a => a.AdminName == adminName);
                    if (_admin.PassWord == passWord) return 1;
                    else return 0;
                }
                else return -1;
            }
        }
        public bool Delete(int adminId)
        {
            using (db = new NineskyContext())
            {
                db.Administrators.Remove(db.Administrators.SingleOrDefault(a => a.AdministratorId == adminId));
                return db.SaveChanges() > 0;
            }
        }
        public bool Delete(Administrator admin)
        {
            using (db = new NineskyContext())
            {
                db.Administrators.Remove(admin);
                return db.SaveChanges() > 0;
            }
        }
        public Administrator Find(int adminId)
        {
            using (db = new NineskyContext())
            {
                return db.Administrators.SingleOrDefault(a => a.AdministratorId == adminId);
            }
        }
        public Administrator Find(string adminName)
        {
            using (db = new NineskyContext())
            {
                return db.Administrators.SingleOrDefault(a => a.AdminName == adminName);
            }
        }
        public List<Administrator> Find()
        {
            using (db = new NineskyContext())
            {
                return db.Administrators.ToList();
            }
        }
        public bool Modify(Administrator admin)
        {
            using (db = new NineskyContext())
            {
                db.Administrators.Attach(admin);
                db.Entry<Administrator>(admin).State = System.Data.EntityState.Modified;
                return db.SaveChanges() > 0;
            }
        }
    }
}

在~/Areas/Admin/Controllers文件夾添加管理員控制器【AdministratorController】

using Ninesky.Areas.Admin.Extensions;
using Ninesky.Areas.Admin.Models;
using Ninesky.Areas.Admin.Repository;
using Ninesky.Models;
using System.Linq;
using System.Web.Mvc;

namespace Ninesky.Areas.Admin.Controllers
{
    public class AdministratorController : Controller
    {
        private IAdministrator adminRsy;
        public AdministratorController()
        {
            adminRsy = new AdministratorRepository();
        }
}
}

這里用Repository模式。其實就是先聲明接口IAdministrator adminRsy,然后在初始化函數中具體實例化(new AdministratorRepository(); )。

為了方便使用,再寫兩個靜態變量AdminName與AdminInfo。

AdminName—獲取設置登錄的管理員名稱

AdminInfo—獲取登錄的管理員信息。

代碼如下:

#region 靜態屬性
        /// <summary>
        /// 管理員登錄名
        /// </summary>
        public static string AdminName
        {
            get
            {
                string _adminName = string.Empty;
                if (System.Web.HttpContext.Current.Session["AdminName"] != null) _adminName = System.Web.HttpContext.Current.Session["AdminName"].ToString();
                return _adminName;
            }
            set
            {
                if (string.IsNullOrEmpty(value)) System.Web.HttpContext.Current.Session.Remove("AdminName");
                else
                {
                    System.Web.HttpContext.Current.Session.Timeout = 60;
                    System.Web.HttpContext.Current.Session.Add("AdminName", value);
                }
            }
        }
        /// <summary>
        /// 管理員信息
        /// </summary>
        public static Administrator AdminInfo
        {
            get
            {
                AdministratorRepository _adminRsy = new AdministratorRepository();
                return _adminRsy.Find(AdministratorController.AdminName);
            }
        }
        #endregion
    }

再寫一個管理員是否登錄的Attribute。

這個比較簡單,繼承自AuthorizeAttribute。需要重寫兩個函數:

1、AuthorizeCore函數,通過檢查AdminName屬性是否為空,來判斷管理員是否登錄。

2、HandleUnauthorizedRequest函數,失敗后跳轉到的頁面。

先在~/Areas/Admin/添加Extensions文件夾,然后在文件夾內添加類AdminAuthorizeAttribute.cs。內容如下:

using Ninesky.Areas.Admin.Controllers;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Ninesky.Areas.Admin.Extensions
{
    /// <summary>
    ///  管理員權限驗證
    /// </summary>
    public class AdminAuthorizeAttribute:AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (string.IsNullOrEmpty(AdministratorController.AdminName)) return false;
            else return true;
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.Result = new RedirectToRouteResult("Admin_default", new RouteValueDictionary(new { controller = "Administrator", action = "Login" }));
        }
    }
}

 

到這差不多了,明天具體寫Controller和view。 待續!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM