mirror of
https://gitee.com/zoujingli/ThinkAdmin.git
synced 2025-04-06 03:58:04 +08:00
[更新]修改后台登录(增加图形验证码)
This commit is contained in:
parent
ade4fbf4b0
commit
a7d47cefe3
@ -15,6 +15,7 @@
|
||||
|
||||
namespace app\admin\controller;
|
||||
|
||||
use app\admin\service\CaptchaService;
|
||||
use app\admin\service\NodeService;
|
||||
use library\Controller;
|
||||
use think\Db;
|
||||
@ -46,6 +47,7 @@ class Login extends Controller
|
||||
$this->domain = Request::host(true);
|
||||
if (!($this->loginskey = session('loginskey'))) session('loginskey', $this->loginskey = uniqid());
|
||||
$this->devmode = in_array($this->domain, ['127.0.0.1', 'localhost']) || is_numeric(stripos($this->domain, 'thinkadmin.top'));
|
||||
$this->captcha = new CaptchaService();
|
||||
$this->fetch();
|
||||
}
|
||||
} else {
|
||||
@ -59,40 +61,19 @@ class Login extends Controller
|
||||
'username.min' => '登录账号长度不能少于4位有效字符!',
|
||||
'password.min' => '登录密码长度不能少于4位有效字符!',
|
||||
]);
|
||||
if (!CaptchaService::check(input('verify'), input('uniqid'))) {
|
||||
$this->error('图形验证码验证失败,请重新输入!');
|
||||
}
|
||||
// 用户信息验证
|
||||
$map = ['is_deleted' => '0', 'username' => $data['username']];
|
||||
$user = Db::name('SystemUser')->where($map)->order('id desc')->find();
|
||||
if (empty($user)) $this->error('登录账号或密码错误,请重新输入!');
|
||||
if (empty($user['status'])) $this->error('账号已经被禁用,请联系管理员!');
|
||||
// 账号锁定消息
|
||||
$cache = cache("user_login_{$user['username']}");
|
||||
if (is_array($cache) && !empty($cache['number']) && !empty($cache['time'])) {
|
||||
if ($cache['number'] >= 10 && ($diff = $cache['time'] + 3600 - time()) > 0) {
|
||||
list($m, $s, $info) = [floor($diff / 60), floor($diff % 60), ''];
|
||||
if ($m > 0) $info = "{$m} 分";
|
||||
$this->error("<strong class='color-red'>抱歉,该账号已经被锁定!</strong><p class='nowrap'>连续 10 次登录错误,请 {$info} {$s} 秒后再登录!</p>");
|
||||
}
|
||||
}
|
||||
if (md5($user['password'] . session('loginskey')) !== $data['password']) {
|
||||
if (empty($cache) || empty($cache['time']) || empty($cache['number']) || $cache['time'] + 3600 < time()) {
|
||||
$cache = ['time' => time(), 'number' => 1, 'geoip' => $this->request->ip()];
|
||||
} elseif ($cache['number'] + 1 <= 10) {
|
||||
$cache = ['time' => time(), 'number' => $cache['number'] + 1, 'geoip' => $this->request->ip()];
|
||||
}
|
||||
cache("user_login_{$user['username']}", $cache);
|
||||
if (($diff = 10 - $cache['number']) > 0) {
|
||||
$this->error("<strong class='color-red'>登录账号或密码错误!</strong><p class='nowrap'>还有 {$diff} 次尝试机会,将锁定一小时内禁止登录!</p>");
|
||||
} else {
|
||||
sysoplog('系统管理', "账号{$user['username']}连续10次登录密码错误,请注意账号安全!");
|
||||
$this->error("<strong class='color-red'>登录账号或密码错误!</strong><p class='nowrap'>尝试次数达到上限,锁定一小时内禁止登录!</p>");
|
||||
}
|
||||
$this->error('登录账号或密码错误,请重新输入!');
|
||||
}
|
||||
// 登录成功并更新账号
|
||||
cache("user_login_{$user['username']}", null);
|
||||
if (empty($user['status'])) $this->error('账号已经被禁用,请联系管理员!');
|
||||
Db::name('SystemUser')->where(['id' => $user['id']])->update([
|
||||
'login_at' => Db::raw('now()'),
|
||||
'login_ip' => $this->request->ip(),
|
||||
'login_num' => Db::raw('login_num+1'),
|
||||
'login_at' => Db::raw('now()'), 'login_ip' => Request::ip(), 'login_num' => Db::raw('login_num+1'),
|
||||
]);
|
||||
session('loginskey', null);
|
||||
session('admin_user', $user);
|
||||
|
146
application/admin/service/CaptchaService.php
Normal file
146
application/admin/service/CaptchaService.php
Normal file
@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkAdmin
|
||||
// +----------------------------------------------------------------------
|
||||
// | 版权所有 2014~2019 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | 官方网站: http://demo.thinkadmin.top
|
||||
// +----------------------------------------------------------------------
|
||||
// | 开源协议 ( https://mit-license.org )
|
||||
// +----------------------------------------------------------------------
|
||||
// | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin
|
||||
// | github 代码仓库:https://github.com/zoujingli/ThinkAdmin
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
namespace app\admin\service;
|
||||
|
||||
use think\facade\Cache;
|
||||
|
||||
/**
|
||||
* 图形验证码服务
|
||||
* Class CaptchaService
|
||||
* @package app\data\service
|
||||
*/
|
||||
class CaptchaService
|
||||
{
|
||||
private $code; // 验证码
|
||||
private $uniqid; // 唯一序号
|
||||
private $charset = 'ABCDEFGHKMNPRSTUVWXYZ23456789'; // 随机因子
|
||||
private $codelen = 4; // 验证码长度
|
||||
private $width = 130; // 宽度
|
||||
private $height = 50; // 高度
|
||||
private $img; // 图形资源句柄
|
||||
private $font; // 指定的字体
|
||||
private $fontsize = 20; // 指定字体大小
|
||||
private $fontcolor; // 指定字体颜色
|
||||
|
||||
/**
|
||||
* 构造方法初始化
|
||||
* CaptchaService constructor.
|
||||
* @param array $config
|
||||
*/
|
||||
public function __construct($config = [])
|
||||
{
|
||||
// 动态配置属性
|
||||
foreach ($config as $k => $v) if (isset($this->$k)) $this->$k = $v;
|
||||
// 设置字体文件路径
|
||||
$this->font = __DIR__ . '/font/icon.ttf';
|
||||
// 生成验证码序号
|
||||
$this->uniqid = uniqid('captcha');
|
||||
// 生成验证码字符串
|
||||
$_len = strlen($this->charset) - 1;
|
||||
for ($i = 0; $i < $this->codelen; $i++) {
|
||||
$this->code .= $this->charset[mt_rand(0, $_len)];
|
||||
}
|
||||
// 缓存验证码字符串
|
||||
Cache::tag('captcha')->set($this->uniqid, $this->code, 360);
|
||||
p([$this->uniqid, $this->code]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建验证码图片
|
||||
* @return string
|
||||
*/
|
||||
private function createImage()
|
||||
{
|
||||
// 生成背景
|
||||
$this->img = imagecreatetruecolor($this->width, $this->height);
|
||||
$color = imagecolorallocate($this->img, mt_rand(220, 255), mt_rand(220, 255), mt_rand(220, 255));
|
||||
imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
|
||||
// 线条
|
||||
for ($i = 0; $i < 6; $i++) {
|
||||
$color = imagecolorallocate($this->img, mt_rand(0, 50), mt_rand(0, 50), mt_rand(0, 50));
|
||||
imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $color);
|
||||
}
|
||||
// 雪花
|
||||
for ($i = 0; $i < 100; $i++) {
|
||||
$color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
|
||||
imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
|
||||
}
|
||||
// 生成文字
|
||||
$_x = $this->width / $this->codelen;
|
||||
for ($i = 0; $i < $this->codelen; $i++) {
|
||||
$this->fontcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
|
||||
imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4, $this->fontcolor, $this->font, $this->code[$i]);
|
||||
}
|
||||
ob_start();
|
||||
imagepng($this->img);
|
||||
$data = ob_get_contents();
|
||||
ob_end_clean();
|
||||
imagedestroy($this->img);
|
||||
return base64_encode($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取验证码
|
||||
* @return array
|
||||
*/
|
||||
public function getAttr()
|
||||
{
|
||||
return ['code' => $this->code, 'uniq' => $this->uniqid, 'data' => $this->getData()];
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取验证码值
|
||||
* @return string
|
||||
*/
|
||||
public function getCode()
|
||||
{
|
||||
return $this->code;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取图片内容
|
||||
* @return string
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return "data:image/png;base64,{$this->createImage()}";
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取验证码编号
|
||||
* @return string
|
||||
*/
|
||||
public function getUniqid()
|
||||
{
|
||||
return $this->uniqid;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查验证码是否正确
|
||||
* @param string $code 需要验证的值
|
||||
* @param string $uniqid 验证码编号
|
||||
* @return boolean
|
||||
*/
|
||||
public static function check($code, $uniqid = null)
|
||||
{
|
||||
$_uni = is_string($uniqid) ? $uniqid : input('uniqid', '-');
|
||||
$_ver = Cache::tag('captcha')->get($_uni);
|
||||
if (is_string($_ver) && strtolower($_ver) === strtolower($code)) {
|
||||
Cache::tag('captcha')->rm($_uni);
|
||||
return true;
|
||||
} else return false;
|
||||
}
|
||||
}
|
BIN
application/admin/service/font/icon.ttf
Normal file
BIN
application/admin/service/font/icon.ttf
Normal file
Binary file not shown.
@ -13,12 +13,14 @@
|
||||
// | github 代码仓库:https://github.com/zoujingli/ThinkAdmin
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
use app\admin\service\CaptchaService;
|
||||
use app\admin\service\NodeService;
|
||||
use app\admin\service\OplogService;
|
||||
use library\File;
|
||||
use think\Console;
|
||||
use think\Db;
|
||||
use think\facade\Middleware;
|
||||
use think\facade\Route;
|
||||
use think\Request;
|
||||
|
||||
if (!function_exists('auth')) {
|
||||
@ -156,3 +158,9 @@ Console::addDefaultCommands([
|
||||
'app\admin\queue\task\Query',
|
||||
'app\admin\queue\task\Listen',
|
||||
]);
|
||||
|
||||
// ThinkAdmin 图形验证码
|
||||
Route::get('/think/admin/captcha', function () {
|
||||
$image = new CaptchaService();
|
||||
return json(['uniqid' => $image->getUniqid(), 'image' => $image->getData()]);
|
||||
});
|
@ -16,15 +16,23 @@
|
||||
<li class="username">
|
||||
<label>
|
||||
<i class="layui-icon layui-icon-username"></i>
|
||||
<input class="layui-input" required pattern="^\S{4,}$" name="username" autofocus autocomplete="off" placeholder="请输入账号">
|
||||
<input class="layui-input" required pattern="^\S{4,}$" name="username" autofocus autocomplete="off" placeholder="登录账号" title="请输入登录账号">
|
||||
</label>
|
||||
</li>
|
||||
<li class="password">
|
||||
<label>
|
||||
<i class="layui-icon layui-icon-password"></i>
|
||||
<input class="layui-input" required pattern="^\S{4,}$" name="password" maxlength="32" type="password" autocomplete="off" placeholder="请输入密码">
|
||||
<input class="layui-input" required pattern="^\S{4,}$" name="password" maxlength="32" type="password" autocomplete="off" placeholder="登录密码" title="请输入登录密码">
|
||||
</label>
|
||||
</li>
|
||||
<li class="verify layui-hide">
|
||||
<label class="inline-block relative">
|
||||
<i class="layui-icon layui-icon-picture-fine"></i>
|
||||
<input class="layui-input" required pattern="^\S{4,}$" name="verify" value="{$captcha->getCode()}" maxlength="4" autocomplete="off" placeholder="验证码" title="请输入验证码">
|
||||
</label>
|
||||
<img data-refresh-captcha alt="img" src="{$captcha->getData()}">
|
||||
<input type="hidden" name="uniqid" value="{$captcha->getUniqid()}">
|
||||
</li>
|
||||
<li class="text-center padding-top-20">
|
||||
<input type="hidden" name="skey" value="{$loginskey|default=''}">
|
||||
<button type="submit" class="layui-btn layui-disabled full-width" data-form-loaded="立即登入">正在载入</button>
|
||||
|
@ -10,6 +10,7 @@
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6",
|
||||
"ext-gd": "*",
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-soap": "*",
|
||||
|
@ -747,16 +747,35 @@ $(function () {
|
||||
});
|
||||
|
||||
/*! 后台加密登录处理 */
|
||||
$body.find('[data-login-form]').map(function () {
|
||||
$body.find('[data-login-form]').map(function (that) {
|
||||
that = this;
|
||||
require(["md5"], function (md5) {
|
||||
$("form").vali(function (data) {
|
||||
data['password'] = md5.hash(md5.hash(data['password']) + data['skey']);
|
||||
if (data['skey']) delete data['skey'];
|
||||
$.form.load(location.href, data, "post", null, null, null, 'false');
|
||||
$.form.load(location.href, data, "post", function (ret) {
|
||||
if (parseInt(ret.code) !== 1) {
|
||||
$(that).find('[name=verify]').val('');
|
||||
$(that).find('.verify.layui-hide').removeClass('layui-hide');
|
||||
$(that).find('[data-refresh-captcha]').trigger('click');
|
||||
}
|
||||
}, null, null, 'false');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/*! 后台图形验证码刷新 */
|
||||
$body.on('click', '[data-refresh-captcha]', function (image, verify, uniqid) {
|
||||
image = this, uniqid = this.getAttribute('data-uniqid-field') || 'uniqid';
|
||||
verify = this.getAttribute('data-refresh-captcha') || this.getAttribute('data-verify-field') || 'verify';
|
||||
$.form.load('?s=think/admin/captcha', {}, 'get', function (ret) {
|
||||
image.src = ret.image;
|
||||
$(image).parents('form').find('[name=' + verify + ']').val('');
|
||||
$(image).parents('form').find('[name=' + uniqid + ']').val(ret.uniqid);
|
||||
return false;
|
||||
}, false);
|
||||
});
|
||||
|
||||
/*! 图片加载异常处理 */
|
||||
document.addEventListener('error', function (e, elem) {
|
||||
elem = e.target;
|
||||
|
@ -64,6 +64,21 @@ body {
|
||||
margin-top: 20px;
|
||||
text-shadow: #000 0.1em 0.1em 0.1em;
|
||||
}
|
||||
.login-container form ul li.verify label {
|
||||
width: 200px;
|
||||
}
|
||||
.login-container form ul li.verify input.layui-input {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.login-container form ul li.verify img {
|
||||
width: 95px;
|
||||
height: 44px;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
margin-left: 5px;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
.login-container form ul li i.layui-icon {
|
||||
color: #fff;
|
||||
font-size: 18px;
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"sources":["login.less"],"names":[],"mappings":"AAAA,SAAS;AAeT;AAAM;EACJ,YAAA;EACA,cAAA;;AAGF;EACE,gBAAgB,+CAAhB;EACA,sBAAA;;AAGF;EACE,YAAA;;AADF,gBAGE;EACE,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mCAAA;;AATJ,gBAGE,QAQE;EACE,WAAA;EACA,WAAA;EACA,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,mBAAA;;AAIA,gBAlBJ,QAiBE;AACK,gBAlBP,QAiBE,EACM;AAAQ,gBAlBhB,QAiBE,EACe;EACX,WAAA;EACA,mBAAA;EACA,qBAAA;;AAxBR,gBAGE,QAyBE;EACE,YAAA;;AA7BN,gBAGE,QAyBE,GAGE;EACE,WAAA;EACA,iBAAA;EACA,iBAAA;;AAlCR,gBAuCE;EACE,QAAA;EACA,SAAA;EACA,YAAA;EACA,kBAAA;EACA,kBAAA;EACA,mBAAA;;AA7CJ,gBAuCE,KAQE;EACE,WAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,mBAAA;EACA,sCAAA;;AAtDN,gBAuCE,KAkBE,GAAG;EACD,kBAAA;EACA,gBAAA;EACA,mCAAA;;AA5DN,gBAuCE,KAkBE,GAAG,GAKD,EAAC;EACC,WAAA;EACA,eAAA;EACA,kBAAA;EACA,4BAAA;;AAlER,gBAuCE,KAkBE,GAAG,GAYD;EACE,WAAA;EACA,YAAA;EACA,eAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;EACA,+BAAA;EACA,mCAAA;EACA,6BAAA;EACA,gDAAA;;AAEA,gBA5CN,KAkBE,GAAG,GAYD,MAcG;AAAQ,gBA5Cf,KAkBE,GAAG,GAYD,MAcY;AAAQ,gBA5CxB,KAkBE,GAAG,GAYD,MAcqB;AACnB,gBA7CN,KAkBE,GAAG,GAYD,MAeG;AAAmB,gBA7C1B,KAkBE,GAAG,GAYD,MAeuB,iBAAiB;AACtC,gBA9CN,KAkBE,GAAG,GAYD,MAgBG,iBAAiB;AAAQ,gBA9ChC,KAkBE,GAAG,GAYD,MAgB6B,iBAAiB;EAC1C,mCAAA;EACA,gDAAA;EACA,6BAAA;EACA,0CAAA;EACA,yEAAA;;AA1FV,gBAuCE,KAkBE,GAAG,GAqCD;EACE,mBAAA;EACA,WAAA;;AAhGR,gBAuCE,KAkBE,GAAG,GA0CD;EACE,WAAA;EACA,uBAAA;EACA,gBAAA;EACA,6BAAA;EACA,8BAAA;EACA,uFAAA;;AAzGR,gBA8GE;EACE,OAAA;EACA,SAAA;EACA,WAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mCAAA;;AAvHJ,gBA8GE,QAWE;AAzHJ,gBA8GE,QAWK;EACD,WAAA;;AA1HN,gBA8GE,QAeE,EAAC;EACC,WAAA;;AAKN;EACE,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;;AARF,WAUE;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA;;AAGF,WAAC,MAAO;EACN,iCAAA;EACA,wCAAA;;AAGF,WAAC,QAAS;EACR,gCAAA;EACA,+BAAA;;AA3BJ,WA8BE;AA9BF,WA8BK;EACD,WAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;;AAlCJ,WAqCE;EACE,MAAA;EACA,OAAA;EACA,YAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;;AAEA,WARF,GAQG;EACC,YAAA;;AADF,WARF,GAQG,UAGC;EACE,eAAA;;AAIJ,WAhBF,GAgBG;EACC,YAAA;;AADF,WAhBF,GAgBG,YAGC;EACE,eAAA;;AAIJ,WAxBF,GAwBG;EACC,WAAA;EACA,YAAA;EACA,4EAAA;;AAHF,WAxBF,GAwBG,cAKC;EACE,kBAAA;;AAMR;EACE,QAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,uBAAA;EACA,4EAAA","file":"login.css"}
|
||||
{"version":3,"sources":["login.less"],"names":[],"mappings":"AAAA,SAAS;AAeT;AAAM;EACJ,YAAA;EACA,cAAA;;AAGF;EACE,gBAAgB,+CAAhB;EACA,sBAAA;;AAGF;EACE,YAAA;;AADF,gBAGE;EACE,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mCAAA;;AATJ,gBAGE,QAQE;EACE,WAAA;EACA,WAAA;EACA,eAAA;EACA,iBAAA;EACA,iBAAA;EACA,mBAAA;;AAIA,gBAlBJ,QAiBE;AACK,gBAlBP,QAiBE,EACM;AAAQ,gBAlBhB,QAiBE,EACe;EACX,WAAA;EACA,mBAAA;EACA,qBAAA;;AAxBR,gBAGE,QAyBE;EACE,YAAA;;AA7BN,gBAGE,QAyBE,GAGE;EACE,WAAA;EACA,iBAAA;EACA,iBAAA;;AAlCR,gBAuCE;EACE,QAAA;EACA,SAAA;EACA,YAAA;EACA,kBAAA;EACA,kBAAA;EACA,mBAAA;;AA7CJ,gBAuCE,KAQE;EACE,WAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,mBAAA;EACA,sCAAA;;AAtDN,gBAuCE,KAkBE,GAAG;EACD,kBAAA;EACA,gBAAA;EACA,mCAAA;;AAEA,gBAvBJ,KAkBE,GAAG,GAKA,OACC;EACE,YAAA;;AAFJ,gBAvBJ,KAkBE,GAAG,GAKA,OAKC,MAAK;EACH,yBAAA;;AANJ,gBAvBJ,KAkBE,GAAG,GAKA,OASC;EACE,WAAA;EACA,YAAA;EACA,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,kBAAA;EACA,0CAAA;;AA9EV,gBAuCE,KAkBE,GAAG,GAyBD,EAAC;EACC,WAAA;EACA,eAAA;EACA,kBAAA;EACA,4BAAA;;AAtFR,gBAuCE,KAkBE,GAAG,GAgCD;EACE,WAAA;EACA,YAAA;EACA,eAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,mBAAA;EACA,+BAAA;EACA,mCAAA;EACA,6BAAA;EACA,gDAAA;;AAEA,gBAhEN,KAkBE,GAAG,GAgCD,MAcG;AAAQ,gBAhEf,KAkBE,GAAG,GAgCD,MAcY;AAAQ,gBAhExB,KAkBE,GAAG,GAgCD,MAcqB;AACnB,gBAjEN,KAkBE,GAAG,GAgCD,MAeG;AAAmB,gBAjE1B,KAkBE,GAAG,GAgCD,MAeuB,iBAAiB;AACtC,gBAlEN,KAkBE,GAAG,GAgCD,MAgBG,iBAAiB;AAAQ,gBAlEhC,KAkBE,GAAG,GAgCD,MAgB6B,iBAAiB;EAC1C,mCAAA;EACA,gDAAA;EACA,6BAAA;EACA,0CAAA;EACA,yEAAA;;AA9GV,gBAuCE,KAkBE,GAAG,GAyDD;EACE,mBAAA;EACA,WAAA;;AApHR,gBAuCE,KAkBE,GAAG,GA8DD;EACE,WAAA;EACA,uBAAA;EACA,gBAAA;EACA,6BAAA;EACA,8BAAA;EACA,uFAAA;;AA7HR,gBAkIE;EACE,OAAA;EACA,SAAA;EACA,WAAA;EACA,WAAA;EACA,kBAAA;EACA,kBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mCAAA;;AA3IJ,gBAkIE,QAWE;AA7IJ,gBAkIE,QAWK;EACD,WAAA;;AA9IN,gBAkIE,QAeE,EAAC;EACC,WAAA;;AAKN;EACE,MAAA;EACA,OAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,eAAA;EACA,gBAAA;;AARF,WAUE;EACE,SAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA;;AAGF,WAAC,MAAO;EACN,iCAAA;EACA,wCAAA;;AAGF,WAAC,QAAS;EACR,gCAAA;EACA,+BAAA;;AA3BJ,WA8BE;AA9BF,WA8BK;EACD,WAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;;AAlCJ,WAqCE;EACE,MAAA;EACA,OAAA;EACA,YAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;;AAEA,WARF,GAQG;EACC,YAAA;;AADF,WARF,GAQG,UAGC;EACE,eAAA;;AAIJ,WAhBF,GAgBG;EACC,YAAA;;AADF,WAhBF,GAgBG,YAGC;EACE,eAAA;;AAIJ,WAxBF,GAwBG;EACC,WAAA;EACA,YAAA;EACA,4EAAA;;AAHF,WAxBF,GAwBG,cAKC;EACE,kBAAA;;AAMR;EACE,QAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,uBAAA;EACA,4EAAA","file":"login.css"}
|
@ -85,6 +85,26 @@ body {
|
||||
margin-top: 20px;
|
||||
text-shadow: #000 .1em .1em .1em;
|
||||
|
||||
&.verify {
|
||||
label {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
input.layui-input {
|
||||
text-transform: uppercase
|
||||
}
|
||||
|
||||
img {
|
||||
width: 95px;
|
||||
height: 44px;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
margin-left: 5px;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
|
||||
}
|
||||
}
|
||||
|
||||
i.layui-icon {
|
||||
color: #fff;
|
||||
font-size: 18px;
|
||||
|
2
vendor/autoload.php
vendored
2
vendor/autoload.php
vendored
@ -4,4 +4,4 @@
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804::getLoader();
|
||||
return ComposerAutoloaderInitea9430bef9688db72c38464c06dd4032::getLoader();
|
||||
|
14
vendor/composer/autoload_real.php
vendored
14
vendor/composer/autoload_real.php
vendored
@ -2,7 +2,7 @@
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804
|
||||
class ComposerAutoloaderInitea9430bef9688db72c38464c06dd4032
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
@ -19,15 +19,15 @@ class ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804', 'loadClassLoader'), true, true);
|
||||
spl_autoload_register(array('ComposerAutoloaderInitea9430bef9688db72c38464c06dd4032', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804', 'loadClassLoader'));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInitea9430bef9688db72c38464c06dd4032', 'loadClassLoader'));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require_once __DIR__ . '/autoload_static.php';
|
||||
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804::getInitializer($loader));
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInitea9430bef9688db72c38464c06dd4032::getInitializer($loader));
|
||||
} else {
|
||||
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||
foreach ($map as $namespace => $path) {
|
||||
@ -48,19 +48,19 @@ class ComposerAutoloaderInit415d1b9a7b2ee3822de734e6cbe4a804
|
||||
$loader->register(true);
|
||||
|
||||
if ($useStaticLoader) {
|
||||
$includeFiles = Composer\Autoload\ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804::$files;
|
||||
$includeFiles = Composer\Autoload\ComposerStaticInitea9430bef9688db72c38464c06dd4032::$files;
|
||||
} else {
|
||||
$includeFiles = require __DIR__ . '/autoload_files.php';
|
||||
}
|
||||
foreach ($includeFiles as $fileIdentifier => $file) {
|
||||
composerRequire415d1b9a7b2ee3822de734e6cbe4a804($fileIdentifier, $file);
|
||||
composerRequireea9430bef9688db72c38464c06dd4032($fileIdentifier, $file);
|
||||
}
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
|
||||
function composerRequire415d1b9a7b2ee3822de734e6cbe4a804($fileIdentifier, $file)
|
||||
function composerRequireea9430bef9688db72c38464c06dd4032($fileIdentifier, $file)
|
||||
{
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
require $file;
|
||||
|
8
vendor/composer/autoload_static.php
vendored
8
vendor/composer/autoload_static.php
vendored
@ -4,7 +4,7 @@
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804
|
||||
class ComposerStaticInitea9430bef9688db72c38464c06dd4032
|
||||
{
|
||||
public static $files = array (
|
||||
'841780ea2e1d6545ea3a253239d59c05' => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu/functions.php',
|
||||
@ -321,9 +321,9 @@ class ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInit415d1b9a7b2ee3822de734e6cbe4a804::$classMap;
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInitea9430bef9688db72c38464c06dd4032::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInitea9430bef9688db72c38464c06dd4032::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInitea9430bef9688db72c38464c06dd4032::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user