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.Linq;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Linq.Expressions;
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 Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Linq;
@ -41,7 +42,7 @@ namespace UserCenter.Controllers
var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == model.UserName);
if (user == null)
{
ModelState.AddModelError("", "用户名或密码错误");
return BadRequest(ModelState.AddModelError("用户名或密码错误"));
}
else
{
@ -73,11 +74,11 @@ namespace UserCenter.Controllers
if (user.AccessFailedCount >= maxAccessFailedCount)
{
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
{
ModelState.AddModelError(nameof(model.UserName), $"密码错误,再错误{maxAccessFailedCount - user.AccessFailedCount}次后将锁定用户{lockoutEndMinutes}分钟");
return BadRequest(ModelState.AddModelError(o => model.UserName, $"密码错误,再错误{maxAccessFailedCount - user.AccessFailedCount}次后将锁定用户{lockoutEndMinutes}分钟", 2));
}
}
this._userRepo.SaveChanges();
@ -85,28 +86,17 @@ namespace UserCenter.Controllers
}
else//对未启用登录锁定的用户进行验证
{
if (user.PasswordHash == this._encryptionService.CreatePasswordHash(model.Password, user.SecurityStamp))
if (user.PasswordHash != this._encryptionService.CreatePasswordHash(model.Password, user.SecurityStamp))
{
success = true;
}
else
{
ModelState.AddModelError("", "用户名或密码错误");
return BadRequest(ModelState.AddModelError("用户名或密码错误"));
}
}
}
if (success)
{
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 Ok(new
{
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)
{
@ -153,7 +143,10 @@ namespace UserCenter.Controllers
}
var userName = User.Identity.Name;
var model = this._userRepo.ReadOnlyTable()
.Include(o => o.UserRoles)
.ThenInclude(o => o.Role)
.Where(o => o.UserName == userName)
.ToList()
.Select(o => new
{
o.UserName,
@ -165,8 +158,9 @@ namespace UserCenter.Controllers
o.Birthday,
o.Email,
o.PhoneNumber,
Roles = o.UserRoles.SelectMany(o => o.Role.Name)
});
Roles = o.UserRoles.Select(o => o.Role.Name)
})
.FirstOrDefault();
if (model == null)
{
ModelState.AddModelError("", "用户不存在");

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

@ -25,22 +25,32 @@
methods: {
submit: function () {
weui.form.validate('#form', function (error) {
console.log(error);
if (!error) {
var loading = weui.loading('提交中...');
var form = $("#form");
var url = form.attr('action');
$.ajax({
url: url,
type: "POST",
data: form.serializeJSON(),
contentType: "application/json",
success: function (response) {
loading.hide();
weui.toast(response, 3000);
var data = form.serializeJSON();
axios.post(url, data).then(function (response) {
token = response.data.accessToken;
localStorage.setItem("accessToken", token);
refreshToken = response.data.refreshToken;
localStorage.setItem("refreshToken", refreshToken);
router.push('/');
}).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);
}
}

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

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

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

Loading…
Cancel
Save