Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

时间:2022-09-18 22:18:51

首先先加个区域,名为Admin

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

using System.Web.Mvc;

namespace AuthorDesign.Web.Areas.Admin {
public class AdminAreaRegistration : AreaRegistration {
public override string AreaName {
get {
return "Admin";
}
} public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}

更改下区域里面里的路由配置代码为:

using System.Web.Mvc;

namespace AuthorDesign.Web.Areas.Admin {
public class AdminAreaRegistration : AreaRegistration {
public override string AreaName {
get {
return "Admin";
}
} public override void RegisterArea(AreaRegistrationContext context) {
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller= "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "AuthorDesign.Web.Areas.Admin.Controllers" }
);
}
}
}

然后再区域下的Controllers文件下添加一个名为Account的控制器

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace AuthorDesign.Web.Areas.Admin.Controllers
{
public class AccountController : Controller
{
//
// GET: /Admin/Account/ public ActionResult Index()
{
return View();
} }
}

将Index改为Login

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

然后我再添加Login的视图。点击添加之后就会在对应的Views。

页面模板就是找bootstrap的模板了。http://pan.baidu.com/s/1mgs7hWG这里是分享的模板链接。

首先是登录页面的html代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>权限管理后台-登陆</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- basic styles --> <link href="/Content/assets/css/bootstrap.min.css" rel="stylesheet" />
<link rel="stylesheet" href="/Content/assets/css/font-awesome.min.css" /> <!--[if IE ]>
<link rel="stylesheet" href="/Content/assets/css/font-awesome-ie7.min.css" />
<![endif]-->
<!-- page specific plugin styles -->
<!-- fonts --> <!-- ace styles --> <link rel="stylesheet" href="/Content/assets/css/ace.min.css" />
<link rel="stylesheet" href="/Content/assets/css/ace-rtl.min.css" /> <!--[if lte IE ]>
<link rel="stylesheet" href="/Content/assets/css/ace-ie.min.css" />
<![endif]-->
<!-- inline styles related to this page -->
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE ]>
<script src="/Content/assets/js/html5shiv.js"></script>
<script src="/Content/assets/js/respond.min.js"></script>
<![endif]-->
</head> <body class="login-layout">
<div class="main-container">
<div class="main-content">
<div class="row">
<div class="col-sm-10 col-sm-offset-1">
<div class="login-container">
<div class="center">
<h1>
<i class="icon-leaf green"></i>
<span class="red">权限</span>
<span class="white">管理后台</span>
</h1>
<h4 class="blue">&copy; yjq/h4>
</div> <div class="space-6"></div> <div class="position-relative">
<div id="login-box" class="login-box visible widget-box no-border">
<div class="widget-body">
<div class="widget-main">
<h4 class="header blue lighter bigger">
<i class="icon-coffee green"></i>
请输入您的用户名和密码
</h4> <div class="space-6"></div> <form>
<fieldset>
<label class="block clearfix">
<span class="block input-icon input-icon-right">
<input type="text" class="form-control" placeholder="用户名" />
<i class="icon-user"></i>
</span>
</label> <label class="block clearfix">
<span class="block input-icon input-icon-right">
<input type="password" class="form-control" placeholder="密码" />
<i class="icon-lock"></i>
</span>
</label>
<label class="block clearfix">
<span class="block input-icon input-icon-right">
<input type="text" class="col-xs-10 col-sm-5" style="height:34px;" placeholder="6位数的验证码" /><img src="/Admin/account/ValidateImg" id="validimg" height="" alt="验证码" title="看不清?,换一张" style="cursor:pointer;" onclick="ShowValidate()" />
<i class="icon-lock"></i>
</span>
</label>
<div class="space"></div> <div class="clearfix">
<label class="inline">
<input type="checkbox" class="ace" />
<span class="lbl"> 记住密码</span>
</label> <button type="button" class="width-35 pull-right btn btn-sm btn-primary">
<i class="icon-key"></i>
登录
</button>
</div> <div class="space-4"></div>
</fieldset>
</form>
</div><!-- /widget-main -->
</div><!-- /widget-body -->
</div><!-- /login-box -->
</div><!-- /position-relative -->
</div>
</div><!-- /.col -->
</div><!-- /.row -->
</div>
</div><!-- /.main-container -->
<!-- basic scripts -->
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
window.jQuery || document.write("<script src='/Content/assets/js/jquery-2.0.3.min.js'>" + "<" + "/script>");
</script> <!-- <![endif]-->
<!--[if IE]>
<script type="text/javascript">
window.jQuery || document.write("<script src='/Content/assets/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
</script>
<![endif]--> <script type="text/javascript">
if ("ontouchend" in document) document.write("<script src='/Content/assets/js/jquery.mobile.custom.min.js'>" + "<" + "/script>");
</script> <!-- inline scripts related to this page --> <script type="text/javascript">
function show_box(id) {
jQuery('.widget-box.visible').removeClass('visible');
jQuery('#' + id).addClass('visible');
}
function ShowValidate() {
$("#validimg").get().src = '/Admin/Account/ValidateImg?time=' + (new Date()).getTime();
}
</script>
</body>
</html>

效果如下Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

验证码的代码如下:

#region 验证码
/// <summary>
/// 功能:返回验证码图片
/// </summary>
/// <returns></returns>
public ActionResult ValidateImg() {
Color color1 = new Color();
//---------产生随机6位字符串
Random ran = new Random();
char[] c = new char[];
char[] ou = new char[];
int n = ;
for (int i = ; i < ; i++) {
c[n] = (char)i;
n++;
}
for (int j = ; j < ; j++) {
c[n] = (char)j;
n++;
}
for (int k = ; k < ; k++) {
c[n] = (char)k;
n++;
}
foreach (char ch in c) {
Console.WriteLine(ch);
}
string outcode = "";
for (int h = ; h < ; h++) {
ou[h] = c[ran.Next()];
outcode += ou[h].ToString();
}
//
Session["ValidateImgCode"] = outcode; //1.创建一个新的图片,大小为(输入的字符串的长度*12),22
System.Drawing.Bitmap bmap = new System.Drawing.Bitmap(outcode.Length * , ); //2.定义画图面板,基于创建的新图片来创建
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmap); //3.由于默认的画图面板背景是黑色,所有使用clear方法把背景清除,同时把背景颜色设置为白色
g.Clear(System.Drawing.Color.White); // 画图片的背景噪音线
for (int i = ; i < ; i++) {
int x1 = ran.Next(bmap.Width);
int x2 = ran.Next(bmap.Width);
int y1 = ran.Next(bmap.Height);
int y2 = ran.Next(bmap.Height);
g.DrawLine(new Pen(color1), x1, y1, x2, y2);
} // 画图片的前景噪音线
for (int i = ; i < ; i++) {
int x = ran.Next(bmap.Width);
int y = ran.Next(bmap.Height);
bmap.SetPixel(x, y, Color.FromArgb(ran.Next()));
} //4.使用DrawString 方法把要输出的字符串输出到画板上。输出的字符从参数(outcode)内获得。
Font font = new Font("Arial", , FontStyle.Bold | FontStyle.Italic);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(, , bmap.Width, bmap.Height), Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(outcode, font, brush, , ); //5.定义一个内存流,把新创建的图片保存到内存流内,这样就不用保存到磁盘上,提高了速度。
System.IO.MemoryStream ms = new System.IO.MemoryStream(); //6.把新创建的图片保存到内存流中,格式为jpeg的类型
bmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //7.输出这张图片,由于此页面的 ContentType="image/jpeg" 所以会输出图片到客户端。同时输出是以字节输出,所以要把内存流转换为字节序列,使用ToArray()方法。
Response.BinaryWrite(ms.ToArray());
return View();
}
#endregion

注意验证码要建个个分布视图用来输出图片用的。

然后再Model文件夹下建立LoginModel

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web; namespace AuthorDesign.Web.Areas.Admin.Models {
/// <summary>
/// 登录类
/// </summary>
public class LoginModel {
/// <summary>
/// 用户名
/// </summary>
[Required(ErrorMessage="请输入用户名")]
[StringLength(,MinimumLength=,ErrorMessage="请输入正确的用户名")]
public string UserName { get; set; }
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "请输入用密码")]
[StringLength(, MinimumLength = , ErrorMessage = "请输入正确的密码")]
public string Password { get; set; }
/// <summary>
/// 验证码
/// </summary>
[Required(ErrorMessage="请输入验证码")]
[StringLength(,MinimumLength=,ErrorMessage="验证码错误")]
public string ValidateCode { get; set; }
/// <summary>
/// 是否记住密码
/// </summary>
public bool IsRemind { get; set; }
}
}

然后更改登录页面的Html代码

@model AuthorDesign.Web.Areas.Admin.Models.LoginModel
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>权限管理后台-登陆</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- basic styles --> <link href="/Content/assets/css/bootstrap.min.css" rel="stylesheet" />
<link rel="stylesheet" href="/Content/assets/css/font-awesome.min.css" /> <!--[if IE ]>
<link rel="stylesheet" href="/Content/assets/css/font-awesome-ie7.min.css" />
<![endif]-->
<!-- page specific plugin styles -->
<!-- fonts -->
<!-- ace styles --> <link rel="stylesheet" href="/Content/assets/css/ace.min.css" />
<link rel="stylesheet" href="/Content/assets/css/ace-rtl.min.css" /> <!--[if lte IE ]>
<link rel="stylesheet" href="/Content/assets/css/ace-ie.min.css" />
<![endif]-->
<!-- inline styles related to this page -->
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE ]>
<script src="/Content/assets/js/html5shiv.js"></script>
<script src="/Content/assets/js/respond.min.js"></script>
<![endif]-->
<style type="text/css">
.field-validation-error {
color: red;
}
</style>
</head> <body class="login-layout">
<div class="main-container">
<div class="main-content">
<div class="row">
<div class="col-sm-10 col-sm-offset-1">
<div class="login-container">
<div class="center">
<h1>
<i class="icon-leaf green"></i>
<span class="red">权限</span>
<span class="white">管理后台</span>
</h1>
<h4 class="blue">&copy; yjq</h4>
</div> <div class="space-6"></div> <div class="position-relative">
<div id="login-box" class="login-box visible widget-box no-border">
<div class="widget-body">
<div class="widget-main">
<h4 class="header blue lighter bigger">
<i class="icon-coffee green"></i>
请输入您的用户名和密码
</h4>
<form id="LoginForm">
<div class="space-6"></div>
<fieldset>
<label class="block clearfix">
<span class="block input-icon input-icon-right">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", @placeholder = "用户名" })
<i class="icon-user"></i>
</span>
<span>
@Html.ValidationMessageFor(m => m.UserName)
</span>
</label> <label class="block clearfix">
<span class="block input-icon input-icon-right">
@Html.PasswordFor(m => m.Password, new { @class = "form-control", @placeholder = "密码" })
<i class="icon-lock"></i>
</span>
<span>
@Html.ValidationMessageFor(m => m.Password)
</span>
</label>
<label class="block clearfix">
<span class="block input-icon input-icon-right">
@Html.TextBoxFor(m => m.ValidateCode, new { @class = "col-xs-10 col-sm-5", @style = "height:34px;", @placeholder = "6位数的验证码" })<img src="/Admin/account/ValidateImg" id="validimg" height="" alt="验证码" title="看不清?,换一张" style="cursor:pointer;" onclick="ShowValidate()" />
<i class="con-inbox"></i>
</span>
<span>
@Html.ValidationMessageFor(m => m.ValidateCode)
</span>
</label>
<div class="space"></div> <div class="clearfix">
<label class="inline">
<input type="checkbox" name="IsRemind" id="IsRemind" class="ace" value="false" />
<span class="lbl"> 记住密码</span>
</label> <button type="submit" class="width-35 pull-right btn btn-sm btn-primary">
<i class="icon-key"></i>
登录
</button>
</div> <div class="space-4"></div>
</fieldset>
</form>
</div><!-- /widget-main -->
</div><!-- /widget-body -->
</div><!-- /login-box -->
</div><!-- /position-relative -->
</div>
</div><!-- /.col -->
</div><!-- /.row -->
</div>
</div><!-- /.main-container -->
<!-- basic scripts -->
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> <script type="text/javascript">
window.jQuery || document.write("<script src='/Content/assets/js/jquery-2.0.3.min.js'>" + "<" + "/script>");
</script> <!-- <![endif]-->
<!--[if IE]>
<script type="text/javascript">
window.jQuery || document.write("<script src='/Content/assets/js/jquery-1.10.2.min.js'>"+"<"+"/script>");
</script>
<![endif]--> <script type="text/javascript">
if ("ontouchend" in document) document.write("<script src='/Content/assets/js/jquery.mobile.custom.min.js'>" + "<" + "/script>");
</script> <!-- inline scripts related to this page -->
<script src="~/Content/assets/js/bootstrap.min.js"></script>
<script src="/Content/assets/js/bootbox.min.js"></script>
<script type="text/javascript">
function show_box(id) {
jQuery('.widget-box.visible').removeClass('visible');
jQuery('#' + id).addClass('visible');
}
function ShowValidate() {
$("#validimg").get().src = '/Admin/Account/ValidateImg?time=' + (new Date()).getTime();
}
$("#LoginForm").submit(function () {
if ($("#LoginForm").valid()) {
if ($("#IsRemind").is(":checked")) {
$("#IsRemind").val(true);
} else {
$("#IsRemind").val(false);
}
$.ajax({
type: "post",
url: "/Admin/Account/Login",
data: $("#LoginForm").serialize(),
success: function (result) {
if (result.state == "success") {
alert("登录成功了!");
} else {
bootbox.alert({
buttons: {
ok: {
label: '我知道了',
className: 'btn btn-primary'
}
}, callback: function () {
},
message:result.message
});
}
}
})
return false;
} else {
return false;
}
})
</script> </body>
</html>

然后再Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4建立一个类,这个类是专门用来与数据层进行交互的。

using AuthorDesign.DAL;
using AuthorDesign.IDAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Web; namespace AuthorDesign.Web.App_Start.Common {
public class EnterRepository {
/// <summary>
/// 获取DAL入口类
/// </summary>
/// <returns></returns>
public static IRepositoryEnter GetRepositoryEnter() {
IRepositoryEnter _enter = CallContext.GetData("CurrentRepositoryEnter") as RepositoryEnter;
if (_enter == null) {
_enter = new RepositoryEnter();
CallContext.SetData("CurrentRepositoryEnter", _enter);
}
return _enter;
}
}
}

在后台添加登录的方法:

在写方法的时候我发现Admin这个类少了个是否可登录这字段,那么就先去加上这个字段

/// <summary>
/// 是否可登录
/// </summary>
public Byte IsLogin { get; set; }

然后在Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4这个类中添加如下代码:

        protected override void Seed(AuthorDesign.DAL.AuthorDesignContext context)
{
// This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data. E.g.
//
context.Admins.AddOrUpdate(
p => p.AdminName,
new Admin() { AdminName = "admin", CreateTime = DateTime.Now, IsLogin = , Salt = "", Password = "42C224B3C8899047460F5A6D1C041411", LastLoginAddress = "大中国", LastLoginIp = "192.168.254.23", LastLoginTime = DateTime.Now, IsSuperAdmin = }
);
//
}

这个的作用就是像数据库中加入一条数据,我这条加入的数据是一个用户名为admin 密码为123456的数据

然后执行控制台指令 add-migration AddAdminIsLogin  执行完成之后再执行 update-database 数据库就更新了,然后admin的这条默认数据也加进去了。

然我在写这个方法的是去DAL中把原先的增删改的方法修改了下,

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks; namespace AuthorDesign.DAL {
public class BaseRepository<T> where T : class,new() { public DbContext db = DbContextFactory.GetCurrentDbContext(); /// <summary>
/// 添加一条记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T AddEntity(T entity) {
db.Entry<T>(entity).State = EntityState.Added;
//db.SaveChanges();
return entity;
}
/// <summary>
/// 修改一条记录
/// </summary>
/// <param name="entity"></param>
/// <param name="property">需要修改的字段名称</param>
/// <returns></returns>
public bool EditEntity(T entity, string[] property) {
DbEntityEntry<T> entry = db.Entry<T>(entity);
entry.State = EntityState.Unchanged;
foreach (var item in property) {
entry.Property(item).IsModified = true;
}
//return db.SaveChanges() > 0;
return true;
}
/// <summary>
/// 删除一条记录
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool DeleteEntity(T entity) {
DbEntityEntry<T> entry = db.Entry<T>(entity);
entry.State = EntityState.Deleted;
//return db.SaveChanges() > 0;
return true;
}
/// <summary>
/// 查询列表
/// </summary>
/// <returns></returns>
public IQueryable<T> LoadEntities() {
return db.Set<T>();
}
/// <summary>
/// 查询
/// </summary>
/// <param name="whereLamda">查询条件</param>
/// <returns></returns>
public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda) {
return db.Set<T>().Where<T>(whereLamda);
}
/// <summary>
/// 对查询结果进行升序排序
/// </summary>
/// <typeparam name="S">排序字段类型</typeparam>
/// <param name="queryable">查询结果</param>
/// <param name="orderLamda">排序表达式</param>
/// <returns>根据排序条件排序好之后的排序结果</returns>
public IOrderedQueryable<T> Order<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
return queryable.OrderBy(orderLamda);
}
/// <summary>
/// 对排序结果再次进行升序排序
/// </summary>
/// <typeparam name="S">排序字段类型</typeparam>
/// <param name="queryable">根据排序条件排序好之后的排序结果</param>
/// <param name="orderLamda">排序表达式</param>
/// <returns>根据排序条件排序好之后的排序结果</returns>
public IOrderedQueryable<T> ThenOrder<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
return queryable.ThenBy(orderLamda);
}
/// <summary>
/// 对查询结果进行降序排序
/// </summary>
/// <typeparam name="S">排序字段类型</typeparam>
/// <param name="queryable">查询结果</param>
/// <param name="orderLamda">排序表达式</param>
/// <returns>根据排序条件排序好之后的排序结果</returns>
public IOrderedQueryable<T> OrderDesc<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
return queryable.OrderByDescending(orderLamda);
}
/// <summary>
/// 对排序结果再次进行降序排序
/// </summary>
/// <typeparam name="S">排序字段类型</typeparam>
/// <param name="queryable">根据排序条件排序好之后的排序结果</param>
/// <param name="orderLamda">排序表达式</param>
/// <returns>根据排序条件排序好之后的排序结果</returns>
public IOrderedQueryable<T> ThenOrderDesc<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
return queryable.ThenByDescending(orderLamda);
}
/// <summary>
/// 对排序结果进行分页操作
/// </summary>
/// <param name="queryable">根据排序条件排序好之后的排序结果</param>
/// <param name="nowNum">跳过序列中指定数量的元素</param>
/// <param name="pageSize">从序列的开头返回指定数量的连续元素</param>
/// <returns>指定长度的列表</returns>
public IQueryable<T> LoadPageEnties(IOrderedQueryable<T> queryable, int nowNum, int pageSize) {
return queryable.Skip<T>(nowNum + ).Take<T>(pageSize);
}
/// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="S">排序类型</typeparam>
/// <param name="whereLamda">查询条件</param>
/// <param name="orderLamda">排序条件</param>
/// <param name="isDesc">是否倒序</param>
/// <param name="pageIndex">第几页</param>
/// <param name="pageSize">页长</param>
/// <param name="rowCount"></param>
/// <returns></returns>
public IQueryable<T> LoadEntities<S>(Expression<Func<T, bool>> whereLamda, Expression<Func<T, S>> orderLamda, bool isDesc, int pageIndex, int pageSize, out int rowCount) {
var temp = db.Set<T>().Where<T>(whereLamda);
rowCount = temp.Count();
if (isDesc)
temp = temp.OrderByDescending<T, S>(orderLamda).Skip<T>(pageSize * (pageIndex - ) + ).Take<T>(pageSize);
else
temp = temp.OrderBy<T, S>(orderLamda).Skip<T>(pageSize * (pageIndex - ) + ).Take<T>(pageSize);
return temp;
}
}
}

我把savechange的方法都注释掉了,因为我把这方法都放到web层来操作了。在ef中增删改方法只有在调用savechange方法之后他才会和数据库进行交互的。把savechange方法提出来有利于控制。

然后再Account控制器下面添加一个登录的方法。

        [HttpPost]
public JsonResult Login(Models.LoginModel model) {
if (ModelState.IsValid) {
//首先判断下验证码是否正确
if (Session["ValidateImgCode"] != null && string.Equals(Session["ValidateImgCode"].ToString(),
model.ValidateCode, StringComparison.OrdinalIgnoreCase)) {
Model.Admin adminModel = new Model.Admin();
if (new Regex("1[3|5|7|8|][0-9]{9}").IsMatch(model.UserName)) {//匹配手机号码
adminModel = EnterRepository.GetRepositoryEnter().GetAdminRepository.LoadEntities(m => m.Mobile == model.UserName && m.IsLogin == ).FirstOrDefault();
}
else if (new Regex(@"[A-Za-z0-9.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}").IsMatch(model.UserName)) {//匹配邮箱
adminModel = EnterRepository.GetRepositoryEnter().GetAdminRepository.LoadEntities(m => m.Email == model.UserName && m.IsLogin == ).FirstOrDefault();
}
else {//匹配用户名
adminModel = EnterRepository.GetRepositoryEnter().GetAdminRepository.LoadEntities(m => m.AdminName == model.UserName&&m.IsLogin==).FirstOrDefault();
}
if (adminModel == null) {
return Json(new {
state = "error",
message = "用户名不存在"
});
}
else {
//判断密码是否正确
if (adminModel.Password == MD5Helper.CreatePasswordMd5(model.Password, adminModel.Salt)) {
adminModel.LastLoginTime = DateTime.Now;
adminModel.LastLoginIp = IpHelper.GetRealIP();
adminModel.LastLoginAddress = IpHelper.GetAdrByIp(adminModel.LastLoginIp);
adminModel.LastLoginInfo = IpHelper.GetBrowerVersion();
//添加登录日志并修改上次登录信息
EnterRepository.GetRepositoryEnter().GetAdminLoginLogRepository.AddEntity(new Model.AdminLoginLog() {
AdminId = adminModel.Id,
AdminLoginAddress = adminModel.LastLoginAddress,
AdminLoginIP = adminModel.LastLoginIp,
AdminLoginTime = adminModel.LastLoginTime,
AdminLoginInfo = adminModel.LastLoginInfo
});
if (EnterRepository.GetRepositoryEnter().SaveChange() > ) {
//登录成功,保存cookie
WebCookieHelper.SetCookie(adminModel.Id, model.UserName, adminModel.LastLoginTime, adminModel.LastLoginIp, adminModel.LastLoginAddress, adminModel.IsSuperAdmin, adminModel.AuthoryId, (model.IsRemind!=null&&model.IsRemind )? : );
return Json(new {
state = "success",
message = "登录成功"
});
}
else {
return Json(new {
state = "success",
message = "服务器泡妞去了"
});
}
}
else {
return Json(new {
state = "error",
message = "密码错误"
});
}
}
}
else {
return Json(new {
state = "error",
message = "验证码错误"
});
}
}
else {
return Json(new {
state = "error",
message = "输入信息不完整"
});
}
}
 

这里在登录的时候使用了cookie来存储信息,和加入了一条用户登录日志。对于cookie的存储,我会放源码到百度云分享去的,昨天看了下github好像出了点问题。

获取用户的登录Ip和浏览器信息的之类的都是在网上查到的,根据ip获取地址的这个也是在网上查找的。

然后就可以去登录了。调试结果如下Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

好了登录页面就这样了。可能中间讲的很乱。有疑问的或者有觉得不好的请指出来哈。

百度源码下载地址

Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4的更多相关文章

  1. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  2. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理10

    今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...

  3. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理9

    前两天因有事就没来得及写.今天刚刚好空了.这次写的是对角色和管理员对页面按钮之间的控制.先看页面效果 说明:先根据角色设置好角色的权限,然后管理员在对应的角色下的权限去设置其权限. 在设置角色权限的时 ...

  4. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理6

    接下来先做角色这一板块的(增删改查),首先要新建一个Role控制器,在添加一个RoleList的视图.表格打算采用的是bootstrap的表格. using System; using System. ...

  5. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理5

    我们先直接拷贝下blank.html这个页面的代码,顺带先建立一个Home控制器,并添加Index视图.将代码拷贝进去. <!DOCTYPE html> <html lang=&qu ...

  6. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理7

    做完角色之后接下来做先做页面按钮的增加.删除.修改.这里用到的功能和角色那边是一样的.就不多说了.直接上代码. 后台控制器代码 using AuthorDesign.Web.App_Start.Com ...

  7. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理8

    接下来做的是对页面的增删改查与页面与页面按钮之间的联系.先上代码和页面效果 using AuthorDesign.Web.App_Start.Common; using System; using S ...

  8. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理1

    首先给上项目的整体框架图:,这里我没有使用BLL,因为感觉太烦了就没有去使用. 那么接下来我们首先先去Model层中添加Model. 管理员类: using System; using System. ...

  9. Asp&period;Net MVC&plus;BootStrap&plus;EF6&period;0实现简单的用户角色权限管理3

    首先在webconfig中加入下面这句代码,这个主要是用来生成数据库的连接字符串 <connectionStrings> <add name="AuthorDesignCo ...

随机推荐

  1. WCF 学习篇

    写在前面 自从运用了.NET Remoting 之后,就想系统的学习下WCF,因为WCF是对现有分布式通信技术的整合.主要以 <WCF全面解析> 这本书为主,园子的资料和网上资料为辅,来学 ...

  2. Timer的故事----Jdk源码解读

    咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...

  3. 【转】websocket协议规范

    在线版目录: 1.引言——WebSocket协议翻译 2.一致性要求——WebSocket协议翻译 3.WebSocket URI——WebSocket协议翻译 4.打开阶段握手——WebSocket ...

  4. java环境搭建的问题

    本人用eclipse开发,首先在java官网中下载最新版本的jdk,jdk的版本一定要与eclipse版本位数相同,否则会提示错误“Java was started but returned exit ...

  5. Appium介绍

    Appium介绍 Appium是一个移动端的自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且是跨平台的.可用于IOS和Android以及firefox的操作系统.原生的应用是指用andro ...

  6. Java中关于quartz定时任务时间设置

    每天凌晨2点 0 0 2 * * ?和每天隔一小时 0 * */1 * * ? 例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ?在26分.29分. ...

  7. HDU-1160&period;FatMouse&&num;39&semi;sSpeed&period;&lpar;LIS变形 &plus; 路径打印&rpar;

    本题大意:给定一定数量的数对,每个数保存着一只老鼠的质量和速度,让你求出一个最长序列,这个序列按照质量严格递增,速度严格递减排列,让你输出这个序列的最长长度,并且输出组成这个最长长度的序列的对应的老鼠 ...

  8. Lua 5&period;3 参考手册

    转自:http://www.runoob.com/manual/lua53doc/manual.html 1 – 简介 Lua 是一门扩展式程序设计语言,被设计成支持通用过程式编程,并有相关数据描述设 ...

  9. &lbrack;AHOI2009&rsqb;中国象棋 DP,递推,组合数

    DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...

  10. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——DirectInput&amp&semi;纹理映射

    第15章 DirectInput接口 DirectInput作为DirectX的组件之一,依然是一些COM对象的集合.DirectInput由IDirectinput8.IDirectInputDev ...