Former-commit-id: 5f0eddcf4e1723fc03f88fd55e0c06a8d961de7b
TangShanKaiPing
wanggang 6 years ago
parent 711fdead4b
commit 66f8c3e313

@ -1,7 +1,9 @@
using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.ModelBinding;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Mvc.ModelBinding; using System.Linq.Expressions;
namespace Infrastructure.Extensions namespace Infrastructure.Extensions
{ {
@ -24,5 +26,21 @@ namespace Infrastructure.Extensions
} }
} }
} }
public static object AddModelError(this ModelStateDictionary modelState, string message, string key = "", int code = 0)
{
modelState.AddModelError(key, message);
return new
{
code,
key = string.IsNullOrEmpty(key) ? key : key.Substring(0, 1).ToLower() + key.Substring(1),
message
};
}
public static object AddModelError(this ModelStateDictionary modelState, Expression<Func<object, object>> expression, string message, int code = 0)
{
return modelState.AddModelError(message, expression.GetPropertyName(), code);
}
} }
} }

@ -5,6 +5,7 @@ using Infrastructure.Extensions;
using Infrastructure.Security; using Infrastructure.Security;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using System; using System;
using System.Linq; using System.Linq;
@ -41,7 +42,7 @@ namespace UserCenter.Controllers
var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == model.UserName); var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == model.UserName);
if (user == null) if (user == null)
{ {
ModelState.AddModelError("", "用户名或密码错误"); return BadRequest(ModelState.AddModelError("用户名或密码错误"));
} }
else else
{ {
@ -73,11 +74,11 @@ namespace UserCenter.Controllers
if (user.AccessFailedCount >= maxAccessFailedCount) if (user.AccessFailedCount >= maxAccessFailedCount)
{ {
user.LockoutEnd = DateTime.UtcNow.AddMinutes(lockoutEndMinutes); user.LockoutEnd = DateTime.UtcNow.AddMinutes(lockoutEndMinutes);
ModelState.AddModelError(nameof(model.UserName), $"用户被锁定,请于{user.LockoutEnd.Value.ToLocalTime().ToString("HH:mm")}后重试"); return BadRequest(ModelState.AddModelError(o => model.UserName, $"用户被锁定,请于{user.LockoutEnd.Value.ToLocalTime().ToString("HH:mm")}后重试", 1));
} }
else else
{ {
ModelState.AddModelError(nameof(model.UserName), $"密码错误,再错误{maxAccessFailedCount - user.AccessFailedCount}次后将锁定用户{lockoutEndMinutes}分钟"); return BadRequest(ModelState.AddModelError(o => model.UserName, $"密码错误,再错误{maxAccessFailedCount - user.AccessFailedCount}次后将锁定用户{lockoutEndMinutes}分钟", 2));
} }
} }
this._userRepo.SaveChanges(); this._userRepo.SaveChanges();
@ -85,28 +86,17 @@ namespace UserCenter.Controllers
} }
else//对未启用登录锁定的用户进行验证 else//对未启用登录锁定的用户进行验证
{ {
if (user.PasswordHash == this._encryptionService.CreatePasswordHash(model.Password, user.SecurityStamp)) if (user.PasswordHash != this._encryptionService.CreatePasswordHash(model.Password, user.SecurityStamp))
{ {
success = true; return BadRequest(ModelState.AddModelError("用户名或密码错误"));
}
else
{
ModelState.AddModelError("", "用户名或密码错误");
} }
} }
} }
if (success) return Ok(new
{
return Ok(new
{
AccessToken = Request.HttpContext.GetToken(model.UserName, _cfg, DateTime.Now.AddHours(_cfg.GetValue<double>("AccessTokenHours", 0.5))),
RefreshToken = Request.HttpContext.GetToken(model.UserName, _cfg, DateTime.Now.AddHours(_cfg.GetValue<double>("AccessTokenHours", 720))),
});
}
else
{ {
return Unauthorized(ModelState); AccessToken = Request.HttpContext.GetToken(model.UserName, _cfg, DateTime.Now.AddHours(_cfg.GetValue<double>("AccessTokenHours", 0.5))),
} RefreshToken = Request.HttpContext.GetToken(model.UserName, _cfg, DateTime.Now.AddHours(_cfg.GetValue<double>("RefreshToken", 720))),
});
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -153,7 +143,10 @@ namespace UserCenter.Controllers
} }
var userName = User.Identity.Name; var userName = User.Identity.Name;
var model = this._userRepo.ReadOnlyTable() var model = this._userRepo.ReadOnlyTable()
.Include(o => o.UserRoles)
.ThenInclude(o => o.Role)
.Where(o => o.UserName == userName) .Where(o => o.UserName == userName)
.ToList()
.Select(o => new .Select(o => new
{ {
o.UserName, o.UserName,
@ -165,8 +158,9 @@ namespace UserCenter.Controllers
o.Birthday, o.Birthday,
o.Email, o.Email,
o.PhoneNumber, o.PhoneNumber,
Roles = o.UserRoles.SelectMany(o => o.Role.Name) Roles = o.UserRoles.Select(o => o.Role.Name)
}); })
.FirstOrDefault();
if (model == null) if (model == null)
{ {
ModelState.AddModelError("", "用户不存在"); ModelState.AddModelError("", "用户不存在");

@ -5,21 +5,17 @@
<div class="weui-form__text-area"> <div class="weui-form__text-area">
<h2 class="weui-form__title">登录</h2> <h2 class="weui-form__title">登录</h2>
</div> </div>
<div class="weui-form__control-area"> <div class="weui-cells weui-cells_form">
<div class="weui-cells__group weui-cells__group_form"> <div class="weui-cell">
<div class="weui-cells weui-cells_form"> <div class="weui-cell__hd"><label class="weui-label">用户名</label></div>
<div class="weui-cell"> <div class="weui-cell__bd">
<div class="weui-cell__hd"><label class="weui-label">用户名</label></div> <input class="weui-input" type="text" name="userName" placeholder="用户名" maxlength="100" required pattern="REG_userName" emptytips="请输入用户名" notmatchtips="用户名输入不合法">
<div class="weui-cell__bd"> </div>
<input class="weui-input" type="text" name="userName" placeholder="用户名" maxlength="100" required pattern="REG_userName" emptytips="请输入用户名" notmatchtips="用户名输入不合法"> </div>
</div> <div class="weui-cell">
</div> <div class="weui-cell__hd"><label class="weui-label">密码</label></div>
<div class="weui-cell"> <div class="weui-cell__bd">
<div class="weui-cell__hd"><label class="weui-label">密码</label></div> <input class="weui-input" type="password" name="password" placeholder="密码" maxlength="100" required pattern="REG_password" tips="请输入密码" notmatchtips="密码输入不合法">
<div class="weui-cell__bd">
<input class="weui-input" type="password" name="password" placeholder="密码" maxlength="100" required pattern="REG_password" tips="请输入密码" notmatchtips="密码输入不合法">
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

@ -25,22 +25,32 @@
methods: { methods: {
submit: function () { submit: function () {
weui.form.validate('#form', function (error) { weui.form.validate('#form', function (error) {
console.log(error);
if (!error) { if (!error) {
var loading = weui.loading('提交中...'); var loading = weui.loading('提交中...');
var form = $("#form"); var form = $("#form");
var url = form.attr('action'); var url = form.attr('action');
$.ajax({ var data = form.serializeJSON();
url: url, axios.post(url, data).then(function (response) {
type: "POST", token = response.data.accessToken;
data: form.serializeJSON(), localStorage.setItem("accessToken", token);
contentType: "application/json", refreshToken = response.data.refreshToken;
success: function (response) { localStorage.setItem("refreshToken", refreshToken);
loading.hide(); router.push('/');
weui.toast(response, 3000); }).catch(function (error) {
console.log(error.response);
var data = error.response.data;
var key = error.response.data.key;
if (key) {
$("[name='" + key + "']").parents('.weui-cell').addClass('weui-cell_warn');
} }
weui.topTips(data.message, { duration: 3000 });
}).finally(function () {
loading.hide();
}); });
} }
else {
console.log(error);
}
}, this.regexp); }, this.regexp);
} }
} }

@ -17,7 +17,7 @@
<div class="weui-mask_transparent"></div> <div class="weui-mask_transparent"></div>
<div class="weui-toast"> <div class="weui-toast">
<i class="weui-loading weui-icon_toast"></i> <i class="weui-loading weui-icon_toast"></i>
<p class="weui-toast__content">加载中</p> <p class="weui-toast__content">页面加载中</p>
</div> </div>
</div> </div>
<script src="lib/jquery/jquery.min.js"></script> <script src="lib/jquery/jquery.min.js"></script>

@ -30,6 +30,7 @@ const router = new VueRouter({
routes routes
}); });
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
$('#loadingToast').show();
if (!token && to.path !== '/login') { if (!token && to.path !== '/login') {
router.push('/login'); router.push('/login');
return; return;
@ -62,9 +63,12 @@ router.beforeEach((to, from, next) => {
console.log('route from:'+from.path +' to:'+to.path); console.log('route from:'+from.path +' to:'+to.path);
next(); next();
} }
}); });
router.afterEach((route, redirect) => {
Vue.nextTick(() => {
$('#loadingToast').fadeOut(100);
})
})
/// ///
const app = new Vue({ const app = new Vue({
router, router,
@ -72,7 +76,6 @@ const app = new Vue({
}, },
mounted: function () { mounted: function () {
console.log('mounted:app'); console.log('mounted:app');
$('#loadingToast').fadeOut(100);
}, },
methods: { methods: {
} }

@ -1,16 +1,17 @@
function pchome() { function pchome() {
return Vue.component('home', function (resolve, reject) { return Vue.component('pchome', function (resolve, reject) {
axios.get("/home.html").then(function (response) { axios.get("/pchome.html").then(function (response) {
resolve({ resolve({
template: response.data, template: response.data,
data() { data() {
return { return {
name: 'home' model:null
}; };
}, },
mounted: function () { mounted: function () {
console.log('mounted:home'); console.log('mounted:home');
weui.tab('#tab', { defaultIndex: 1 }); weui.tab('#tab', { defaultIndex: 1 });
}, },
methods: { methods: {
} }

Loading…
Cancel
Save