新增上传的onUploadProgress和onUploadComplete事件

新增后台Auth类getError和setError方法
修复组权限管理在特殊情况下无法加载权限的BUG
修复Upload.api.send无法上传至第三方存储的BUG
优化Layer.msg的样式显示
pull/45/head
Karson 2018-02-27 15:24:59 +08:00
parent e67192a2d7
commit 3ea5689a0b
13 changed files with 208 additions and 90 deletions

View File

@ -86,7 +86,9 @@ class Index extends Backend
} }
else else
{ {
$this->error(__('Username or password is incorrect'), $url, ['token' => $this->request->token()]); $msg = $this->auth->getError();
$msg = $msg ? $msg : __('Username or password is incorrect');
$this->error($msg, $url, ['token' => $this->request->token()]);
} }
} }

View File

@ -242,28 +242,28 @@ class Group extends Backend
$model = model('AuthGroup'); $model = model('AuthGroup');
$id = $this->request->post("id"); $id = $this->request->post("id");
$pid = $this->request->post("pid"); $pid = $this->request->post("pid");
$parentgroupmodel = $model->get($pid); $parentGroupModel = $model->get($pid);
$currentgroupmodel = NULL; $currentGroupModel = NULL;
if ($id) if ($id)
{ {
$currentgroupmodel = $model->get($id); $currentGroupModel = $model->get($id);
} }
if (($pid || $parentgroupmodel) && (!$id || $currentgroupmodel)) if (($pid || $parentGroupModel) && (!$id || $currentGroupModel))
{ {
$id = $id ? $id : NULL; $id = $id ? $id : NULL;
$ruleList = collection(model('AuthRule')->order('weigh', 'desc')->select())->toArray(); $ruleList = collection(model('AuthRule')->order('weigh', 'desc')->select())->toArray();
//读取父类角色所有节点列表 //读取父类角色所有节点列表
$parentRuleList = []; $parentRuleList = [];
if (in_array('*', explode(',', $parentgroupmodel->rules))) if (in_array('*', explode(',', $parentGroupModel->rules)))
{ {
$parentRuleList = $ruleList; $parentRuleList = $ruleList;
} }
else else
{ {
$parent_rule_ids = explode(',', $parentgroupmodel->rules); $parentRuleIds = explode(',', $parentGroupModel->rules);
foreach ($ruleList as $k => $v) foreach ($ruleList as $k => $v)
{ {
if (in_array($v['id'], $parent_rule_ids)) if (in_array($v['id'], $parentRuleIds))
{ {
$parentRuleList[] = $v; $parentRuleList[] = $v;
} }
@ -271,33 +271,38 @@ class Group extends Backend
} }
//当前所有正常规则列表 //当前所有正常规则列表
Tree::instance()->init($ruleList); Tree::instance()->init($parentRuleList);
//读取当前角色下规则ID集合 //读取当前角色下规则ID集合
$admin_rule_ids = $this->auth->getRuleIds(); $adminRuleIds = $this->auth->getRuleIds();
//是否是超级管理员 //是否是超级管理员
$superadmin = $this->auth->isSuperAdmin(); $superadmin = $this->auth->isSuperAdmin();
//当前拥有的规则ID集合 //当前拥有的规则ID集合
$current_rule_ids = $id ? explode(',', $currentgroupmodel->rules) : []; $currentRuleIds = $id ? explode(',', $currentGroupModel->rules) : [];
if (!$id || !in_array($pid, Tree::instance()->getChildrenIds($id, TRUE))) if (!$id || !in_array($pid, Tree::instance()->getChildrenIds($id, TRUE)))
{ {
$ruleList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name'); $parentRuleList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');
$hasChildrens = []; $hasChildrens = [];
foreach ($ruleList as $k => $v) foreach ($parentRuleList as $k => $v)
{ {
if ($v['haschild']) if ($v['haschild'])
$hasChildrens[] = $v['id']; $hasChildrens[] = $v['id'];
} }
$nodelist = []; $parentRuleIds = array_map(function($item) {
return $item['id'];
}, $parentRuleList);
$nodeList = [];
foreach ($parentRuleList as $k => $v) foreach ($parentRuleList as $k => $v)
{ {
if (!$superadmin && !in_array($v['id'], $admin_rule_ids)) if (!$superadmin && !in_array($v['id'], $adminRuleIds))
continue; continue;
$state = array('selected' => in_array($v['id'], $current_rule_ids) && !in_array($v['id'], $hasChildrens)); if ($v['pid'] && !in_array($v['pid'], $parentRuleIds))
$nodelist[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => __($v['title']), 'type' => 'menu', 'state' => $state); continue;
$state = array('selected' => in_array($v['id'], $currentRuleIds) && !in_array($v['id'], $hasChildrens));
$nodeList[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => __($v['title']), 'type' => 'menu', 'state' => $state);
} }
$this->success('', null, $nodelist); $this->success('', null, $nodeList);
} }
else else
{ {

View File

@ -72,6 +72,7 @@ return [
'Recommend' => '推荐', 'Recommend' => '推荐',
'Dashboard' => '控制台', 'Dashboard' => '控制台',
'Upload' => '上传', 'Upload' => '上传',
'Uploading' => '上传中',
'Code' => '编号', 'Code' => '编号',
'Message' => '内容', 'Message' => '内容',
'Line' => '行号', 'Line' => '行号',

View File

@ -1,6 +1,7 @@
<?php <?php
return [ return [
'Group' => '所属组别', 'Group' => '所属组别',
'Login time' => '最后登录', 'Loginfailure' => '登录失败次数',
'Login time' => '最后登录',
]; ];

View File

@ -26,6 +26,7 @@ return [
'Username or password is incorrect' => '用户名或密码不正确', 'Username or password is incorrect' => '用户名或密码不正确',
'Username is incorrect' => '用户名不正确', 'Username is incorrect' => '用户名不正确',
'Password is incorrect' => '密码不正确', 'Password is incorrect' => '密码不正确',
'Please try again after 1 day' => '请于1天后再尝试登录',
'Login successful' => '登录成功!', 'Login successful' => '登录成功!',
'Logout successful' => '退出成功!', 'Logout successful' => '退出成功!',
'Verification code is incorrect' => '验证码不正确', 'Verification code is incorrect' => '验证码不正确',

View File

@ -13,6 +13,7 @@ use think\Session;
class Auth extends \fast\Auth class Auth extends \fast\Auth
{ {
protected $_error = '';
protected $requestUri = ''; protected $requestUri = '';
protected $breadcrumb = []; protected $breadcrumb = [];
protected $logined = false; //登录状态 protected $logined = false; //登录状态
@ -40,16 +41,19 @@ class Auth extends \fast\Auth
$admin = Admin::get(['username' => $username]); $admin = Admin::get(['username' => $username]);
if (!$admin) if (!$admin)
{ {
$this->setError('Username is incorrect');
return false; return false;
} }
if ($admin->loginfailure >= 3 && time() - $admin->updatetime < 86400) if ($admin->loginfailure >= 3 && time() - $admin->updatetime < 86400)
{ {
$this->setError('Please try again after 1 day');
return false; return false;
} }
if ($admin->password != md5(md5($password) . $admin->salt)) if ($admin->password != md5(md5($password) . $admin->salt))
{ {
$admin->loginfailure++; $admin->loginfailure++;
$admin->save(); $admin->save();
$this->setError('Password is incorrect');
return false; return false;
} }
$admin->loginfailure = 0; $admin->loginfailure = 0;
@ -424,4 +428,24 @@ class Auth extends \fast\Auth
return $menu; return $menu;
} }
/**
* 设置错误信息
*
* @param $error 错误信息
*/
public function setError($error)
{
$this->_error = $error;
return $this;
}
/**
* 获取错误信息
* @return string
*/
public function getError()
{
return $this->_error ? __($this->_error) : '';
}
} }

View File

@ -29,6 +29,12 @@
<input type="password" class="form-control" id="password" name="row[password]" autocomplete="new-password" value="" data-rule="password" /> <input type="password" class="form-control" id="password" name="row[password]" autocomplete="new-password" value="" data-rule="password" />
</div> </div>
</div> </div>
<div class="form-group">
<label for="loginfailure" class="control-label col-xs-12 col-sm-2">{:__('Loginfailure')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="number" class="form-control" id="loginfailure" name="row[loginfailure]" value="{$row.loginfailure}" data-rule="required" />
</div>
</div>
<div class="form-group"> <div class="form-group">
<label for="content" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label> <label for="content" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8"> <div class="col-xs-12 col-sm-8">

View File

@ -1,14 +1,14 @@
<table class="table table-striped"> <table class="table table-striped">
<thead> <thead>
<tr> <tr>
<th>标题</th> <th>{:__('Title')}</th>
<th>内容</th> <th>{:__('Content')}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{volist name="row" id="vo" } {volist name="row" id="vo" }
<tr> <tr>
<td>{$key}</td> <td>{:__($key)}</td>
<td>{$vo}</td> <td>{$vo}</td>
</tr> </tr>
{/volist} {/volist}

View File

@ -715,6 +715,19 @@ form.form-horizontal .control-label {
.layui-layer-fast .layui-layer-setwin .layui-layer-close2:hover:after { .layui-layer-fast .layui-layer-setwin .layui-layer-close2:hover:after {
display: none; display: none;
} }
.layui-layer-content {
clear: both;
}
.layui-layer-fast-msg {
min-width: 100px;
border-radius: 2px;
background-color: rgba(0, 0, 0, 0.6);
color: #fff;
}
.layui-layer-fast-msg .layui-layer-content {
padding: 12px 25px;
text-align: center;
}
.n-bootstrap .input-group > .n-right { .n-bootstrap .input-group > .n-right {
position: absolute; position: absolute;
} }

File diff suppressed because one or more lines are too long

View File

@ -10200,11 +10200,18 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
up.start(); up.start();
}, 1); }, 1);
}, },
//上传进行中的回调
onUploadProgress: function (up, file) {
},
//上传之前的回调
onBeforeUpload: function (up, file) { onBeforeUpload: function (up, file) {
console.log("before", up.settings);
}, },
//上传成功的回调 //上传成功的回调
onUploadSuccess: function (ret, onUploadSuccess, button) { onUploadSuccess: function (up, ret) {
var button = up.settings.button;
var onUploadSuccess = up.settings.onUploadSuccess;
var data = typeof ret.data !== 'undefined' ? ret.data : null; var data = typeof ret.data !== 'undefined' ? ret.data : null;
//上传成功后回调 //上传成功后回调
if (button) { if (button) {
@ -10240,7 +10247,9 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
} }
}, },
//上传错误的回调 //上传错误的回调
onUploadError: function (ret, onUploadError, button) { onUploadError: function (up, ret) {
var button = up.settings.button;
var onUploadError = up.settings.onUploadError;
var data = typeof ret.data !== 'undefined' ? ret.data : null; var data = typeof ret.data !== 'undefined' ? ret.data : null;
if (button) { if (button) {
var onDomUploadError = $(button).data("upload-error"); var onDomUploadError = $(button).data("upload-error");
@ -10275,11 +10284,36 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
var ret = {code: -1, msg: e.message, data: null}; var ret = {code: -1, msg: e.message, data: null};
} }
return ret; return ret;
},
//上传全部结束后
onUploadComplete: function (up, files) {
var button = up.settings.button;
var onUploadComplete = up.settings.onUploadComplete;
if (button) {
var onDomUploadComplete = $(button).data("upload-complete");
if (onDomUploadComplete) {
if (typeof onDomUploadComplete !== 'function' && typeof Upload.api.custom[onDomUploadComplete] === 'function') {
onDomUploadComplete = Upload.api.custom[onDomUploadComplete];
}
if (typeof onDomUploadComplete === 'function') {
var result = onDomUploadComplete.call(button, files);
if (result === false)
return;
}
}
}
if (typeof onUploadComplete === 'function') {
var result = onUploadComplete.call(button, files);
if (result === false) {
return;
}
}
} }
}, },
api: { api: {
//Plupload上传 //Plupload上传
plupload: function (element, onUploadSuccess, onUploadError) { plupload: function (element, onUploadSuccess, onUploadError, onUploadComplete) {
element = typeof element === 'undefined' ? Upload.config.classname : element; element = typeof element === 'undefined' ? Upload.config.classname : element;
$(element, Upload.config.container).each(function () { $(element, Upload.config.container).each(function () {
if ($(this).attr("initialized")) { if ($(this).attr("initialized")) {
@ -10341,30 +10375,32 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
BeforeUpload: Upload.events.onBeforeUpload, BeforeUpload: Upload.events.onBeforeUpload,
UploadProgress: function (up, file) { UploadProgress: function (up, file) {
var button = up.settings.button; var button = up.settings.button;
//这里可以改成其它的表现形式
//document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
$(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%"); $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");
Upload.events.onUploadProgress(up, file);
}, },
FileUploaded: function (up, file, info) { FileUploaded: function (up, file, info) {
var button = up.settings.button; var button = up.settings.button;
//还原按钮文字及状态 //还原按钮文字及状态
$(button).prop("disabled", false).html($(button).data("bakup-html")); $(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = Upload.events.onUploadResponse(info.response, info, up, file); var ret = Upload.events.onUploadResponse(info.response, info, up, file);
file.ret = ret;
if (ret.code === 1) { if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess, button, up, file); Upload.events.onUploadSuccess(up, ret, file);
} else { } else {
Upload.events.onUploadError(ret, onUploadError, button, up, file); Upload.events.onUploadError(up, ret, file);
} }
}, },
UploadComplete: Upload.events.onUploadComplete,
Error: function (up, err) { Error: function (up, err) {
var button = up.settings.button; var button = up.settings.button;
$(button).prop("disabled", false).html($(button).data("bakup-html")); $(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = {code: err.code, msg: err.message, data: null}; var ret = {code: err.code, msg: err.message, data: null};
Upload.events.onUploadError(ret, onUploadError, button, up, null); Upload.events.onUploadError(up, ret);
} }
}, },
onUploadSuccess: onUploadSuccess, onUploadSuccess: onUploadSuccess,
onUploadError: onUploadError, onUploadError: onUploadError,
onUploadComplete: onUploadComplete,
button: that button: that
}); });
@ -10418,31 +10454,21 @@ define('upload',['jquery', 'bootstrap', 'plupload', 'template'], function ($, un
}); });
}, },
// AJAX异步上传 // AJAX异步上传
send: function (file, onUploadSuccess, onUploadError) { send: function (file, onUploadSuccess, onUploadError, onUploadComplete) {
var data = new FormData(); var index = Layer.msg(__('Uploading'), {offset: 't', time: 0});
data.append("file", file); var id = Plupload.guid();
$.each(Config.upload.multipart, function (k, v) { var _onPostInit = Upload.events.onPostInit;
data.append(k, v); Upload.events.onPostInit = function () {
}); // 当加载完成后添加文件并上传
$.ajax({ Upload.list[id].addFile(file);
url: Config.upload.uploadurl, //Upload.list[id].start();
data: data, };
cache: false, $('<button type="button" id="' + id + '" class="btn btn-danger hidden plupload" />').appendTo("body");
contentType: false, $("#" + id).data("upload-complete", function (files) {
processData: false, Upload.events.onPostInit = _onPostInit;
type: 'POST', Layer.close(index);
success: function (ret) {
ret = Upload.events.onUploadResponse(ret);
if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess);
} else {
Upload.events.onUploadError(ret, onUploadError);
}
}, error: function (e) {
var ret = {code: 500, msg: e.message, data: null};
Upload.events.onUploadError(ret, onUploadError);
}
}); });
Upload.api.plupload("#" + id, onUploadSuccess, onUploadError, onUploadComplete);
}, },
custom: { custom: {
//自定义上传完成回调 //自定义上传完成回调

View File

@ -38,11 +38,18 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
up.start(); up.start();
}, 1); }, 1);
}, },
//上传进行中的回调
onUploadProgress: function (up, file) {
},
//上传之前的回调
onBeforeUpload: function (up, file) { onBeforeUpload: function (up, file) {
console.log("before", up.settings);
}, },
//上传成功的回调 //上传成功的回调
onUploadSuccess: function (ret, onUploadSuccess, button) { onUploadSuccess: function (up, ret) {
var button = up.settings.button;
var onUploadSuccess = up.settings.onUploadSuccess;
var data = typeof ret.data !== 'undefined' ? ret.data : null; var data = typeof ret.data !== 'undefined' ? ret.data : null;
//上传成功后回调 //上传成功后回调
if (button) { if (button) {
@ -78,7 +85,9 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
} }
}, },
//上传错误的回调 //上传错误的回调
onUploadError: function (ret, onUploadError, button) { onUploadError: function (up, ret) {
var button = up.settings.button;
var onUploadError = up.settings.onUploadError;
var data = typeof ret.data !== 'undefined' ? ret.data : null; var data = typeof ret.data !== 'undefined' ? ret.data : null;
if (button) { if (button) {
var onDomUploadError = $(button).data("upload-error"); var onDomUploadError = $(button).data("upload-error");
@ -113,11 +122,36 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
var ret = {code: -1, msg: e.message, data: null}; var ret = {code: -1, msg: e.message, data: null};
} }
return ret; return ret;
},
//上传全部结束后
onUploadComplete: function (up, files) {
var button = up.settings.button;
var onUploadComplete = up.settings.onUploadComplete;
if (button) {
var onDomUploadComplete = $(button).data("upload-complete");
if (onDomUploadComplete) {
if (typeof onDomUploadComplete !== 'function' && typeof Upload.api.custom[onDomUploadComplete] === 'function') {
onDomUploadComplete = Upload.api.custom[onDomUploadComplete];
}
if (typeof onDomUploadComplete === 'function') {
var result = onDomUploadComplete.call(button, files);
if (result === false)
return;
}
}
}
if (typeof onUploadComplete === 'function') {
var result = onUploadComplete.call(button, files);
if (result === false) {
return;
}
}
} }
}, },
api: { api: {
//Plupload上传 //Plupload上传
plupload: function (element, onUploadSuccess, onUploadError) { plupload: function (element, onUploadSuccess, onUploadError, onUploadComplete) {
element = typeof element === 'undefined' ? Upload.config.classname : element; element = typeof element === 'undefined' ? Upload.config.classname : element;
$(element, Upload.config.container).each(function () { $(element, Upload.config.container).each(function () {
if ($(this).attr("initialized")) { if ($(this).attr("initialized")) {
@ -179,30 +213,32 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
BeforeUpload: Upload.events.onBeforeUpload, BeforeUpload: Upload.events.onBeforeUpload,
UploadProgress: function (up, file) { UploadProgress: function (up, file) {
var button = up.settings.button; var button = up.settings.button;
//这里可以改成其它的表现形式
//document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
$(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%"); $(button).prop("disabled", true).html("<i class='fa fa-upload'></i> " + __('Upload') + file.percent + "%");
Upload.events.onUploadProgress(up, file);
}, },
FileUploaded: function (up, file, info) { FileUploaded: function (up, file, info) {
var button = up.settings.button; var button = up.settings.button;
//还原按钮文字及状态 //还原按钮文字及状态
$(button).prop("disabled", false).html($(button).data("bakup-html")); $(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = Upload.events.onUploadResponse(info.response, info, up, file); var ret = Upload.events.onUploadResponse(info.response, info, up, file);
file.ret = ret;
if (ret.code === 1) { if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess, button, up, file); Upload.events.onUploadSuccess(up, ret, file);
} else { } else {
Upload.events.onUploadError(ret, onUploadError, button, up, file); Upload.events.onUploadError(up, ret, file);
} }
}, },
UploadComplete: Upload.events.onUploadComplete,
Error: function (up, err) { Error: function (up, err) {
var button = up.settings.button; var button = up.settings.button;
$(button).prop("disabled", false).html($(button).data("bakup-html")); $(button).prop("disabled", false).html($(button).data("bakup-html"));
var ret = {code: err.code, msg: err.message, data: null}; var ret = {code: err.code, msg: err.message, data: null};
Upload.events.onUploadError(ret, onUploadError, button, up, null); Upload.events.onUploadError(up, ret);
} }
}, },
onUploadSuccess: onUploadSuccess, onUploadSuccess: onUploadSuccess,
onUploadError: onUploadError, onUploadError: onUploadError,
onUploadComplete: onUploadComplete,
button: that button: that
}); });
@ -256,31 +292,21 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
}); });
}, },
// AJAX异步上传 // AJAX异步上传
send: function (file, onUploadSuccess, onUploadError) { send: function (file, onUploadSuccess, onUploadError, onUploadComplete) {
var data = new FormData(); var index = Layer.msg(__('Uploading'), {offset: 't', time: 0});
data.append("file", file); var id = Plupload.guid();
$.each(Config.upload.multipart, function (k, v) { var _onPostInit = Upload.events.onPostInit;
data.append(k, v); Upload.events.onPostInit = function () {
}); // 当加载完成后添加文件并上传
$.ajax({ Upload.list[id].addFile(file);
url: Config.upload.uploadurl, //Upload.list[id].start();
data: data, };
cache: false, $('<button type="button" id="' + id + '" class="btn btn-danger hidden plupload" />').appendTo("body");
contentType: false, $("#" + id).data("upload-complete", function (files) {
processData: false, Upload.events.onPostInit = _onPostInit;
type: 'POST', Layer.close(index);
success: function (ret) {
ret = Upload.events.onUploadResponse(ret);
if (ret.code === 1) {
Upload.events.onUploadSuccess(ret, onUploadSuccess);
} else {
Upload.events.onUploadError(ret, onUploadError);
}
}, error: function (e) {
var ret = {code: 500, msg: e.message, data: null};
Upload.events.onUploadError(ret, onUploadError);
}
}); });
Upload.api.plupload("#" + id, onUploadSuccess, onUploadError, onUploadComplete);
}, },
custom: { custom: {
//自定义上传完成回调 //自定义上传完成回调

View File

@ -744,6 +744,19 @@ form.form-horizontal .control-label {
} }
} }
} }
.layui-layer-content {
clear: both;
}
.layui-layer-fast-msg {
min-width: 100px;
border-radius: 2px;
background-color: rgba(0,0,0,.6);
color: #fff;
.layui-layer-content {
padding: 12px 25px;
text-align: center;
}
}
.n-bootstrap { .n-bootstrap {
.input-group > .n-right { .input-group > .n-right {