首先先加个区域,名为Admin
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的控制器
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
然后我再添加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">© 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>
效果如下
验证码的代码如下:
#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">© 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>
然后再建立一个类,这个类是专门用来与数据层进行交互的。
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; }
然后在这个类中添加如下代码:
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获取地址的这个也是在网上查找的。
然后就可以去登录了。调试结果如下
好了登录页面就这样了。可能中间讲的很乱。有疑问的或者有觉得不好的请指出来哈。