1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-16 13:16:14 +08:00

1.redis增加expire()方法

2.精简代码
This commit is contained in:
xiaochong0302 2024-07-30 20:06:17 +08:00
parent 7c5ea7fe34
commit 3a703dd0e1
9 changed files with 39 additions and 72 deletions

View File

@ -4,7 +4,7 @@
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title kg-tab-title">
<li class="layui-this">注册设置</li>
<li class="layui-this">基本设置</li>
<li>QQ登录</li>
<li>微信登录</li>
<li>微博登录</li>

View File

@ -16,13 +16,13 @@
<div class="layui-form-item" style="margin-bottom:20px;">
<label class="layui-form-label">用户协议</label>
<div class="layui-input-block">
<a class="layui-btn layui-btn-normal" href="{{ url({'for':'admin.page.edit','id':'terms'}) }}">前往设置</a>
<a class="layui-btn layui-btn-normal" href="{{ url({'for':'admin.page.edit','id':'terms'}) }}">设置</a>
</div>
</div>
<div class="layui-form-item" style="margin-bottom:20px;">
<label class="layui-form-label">隐私政策</label>
<div class="layui-input-block">
<a class="layui-btn layui-btn-normal" href="{{ url({'for':'admin.page.edit','id':'privacy'}) }}">前往设置</a>
<a class="layui-btn layui-btn-normal" href="{{ url({'for':'admin.page.edit','id':'privacy'}) }}">设置</a>
</div>
</div>
<div class="layui-form-item">

View File

@ -161,7 +161,7 @@ class Redis extends \Phalcon\Cache\Backend\Redis
$redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY);
$it = null;
$it = 0;
while ($keys = $redis->scan($it, $pattern)) {
if (count($result) > $limit) break;
@ -191,6 +191,35 @@ class Redis extends \Phalcon\Cache\Backend\Redis
return (bool)$redis->exists($lastKey);
}
/**
* @param string $keyName
* @return bool
*/
public function expire($keyName = null, $lifetime = null): bool
{
$redis = $this->getRedis();
/**
* @var FrontendInterface $frontend
*/
$frontend = $this->_frontend;
if ($keyName === null) {
$lastKey = $this->_lastKey;
} else {
$lastKey = $this->getKeyName($keyName);
}
if ($lifetime === null) {
$tmp = $this->_lastLifetime;
$ttl = $tmp ?: $frontend->getLifetime();
} else {
$ttl = $lifetime;
}
return $redis->expire($lastKey, $ttl);
}
/**
* @param string $keyName
* @return int|bool

View File

@ -26,19 +26,4 @@ class UserSession extends Repository
->execute();
}
/**
* @param int $userId
* @param int $minutes
* @return ResultsetInterface|Resultset|UserSessionModel[]
*/
public function findUserRecentSessions($userId, $minutes = 10)
{
$createTime = time() - $minutes * 60;
return UserSessionModel::query()
->where('user_id = :user_id:', ['user_id' => $userId])
->andWhere('create_time > :create_time:', ['create_time' => $createTime])
->execute();
}
}

View File

@ -25,19 +25,4 @@ class UserToken extends Repository
->execute();
}
/**
* @param int $userId
* @param int $minutes
* @return ResultsetInterface|Resultset|UserTokenModel[]
*/
public function findUserRecentTokens($userId, $minutes = 10)
{
$createTime = time() - $minutes * 60;
return UserTokenModel::query()
->where('user_id = :user_id:', ['user_id' => $userId])
->andWhere('create_time > :create_time:', ['create_time' => $createTime])
->execute();
}
}

View File

@ -54,11 +54,6 @@ class Home extends AuthService
return $authInfo ?: null;
}
public function getAuthKey()
{
return 'home_auth_info';
}
public function logoutClients($userId)
{
$cache = $this->getCache();
@ -101,4 +96,9 @@ class Home extends AuthService
return "_PHCR_SESSION_:{$sessionId}";
}
protected function getAuthKey()
{
return 'home_auth_info';
}
}

View File

@ -12,12 +12,9 @@ use App\Exceptions\Forbidden as ForbiddenException;
use App\Library\Utils\Password as PasswordUtil;
use App\Library\Validators\Common as CommonValidator;
use App\Models\Account as AccountModel;
use App\Models\Client as ClientModel;
use App\Models\User as UserModel;
use App\Repos\Account as AccountRepo;
use App\Repos\User as UserRepo;
use App\Repos\UserSession as UserSessionRepo;
use App\Repos\UserToken as UserTokenRepo;
use App\Traits\Client as ClientTrait;
class Account extends Validator
@ -193,34 +190,6 @@ class Account extends Validator
if ($case1 && $case2) {
throw new ForbiddenException('account.locked');
}
$this->checkFloodLogin($user->id);
}
public function checkFloodLogin($userId)
{
$clientIp = $this->getClientIp();
$clientType = $this->getClientType();
if ($clientType == ClientModel::TYPE_PC) {
$repo = new UserSessionRepo();
$records = $repo->findUserRecentSessions($userId, 10);
} else {
$repo = new UserTokenRepo();
$records = $repo->findUserRecentTokens($userId, 10);
}
if ($records->count() == 0) return;
$clientIps = array_column($records->toArray(), 'client_ip');
$countValues = array_count_values($clientIps);
foreach ($countValues as $ip => $count) {
if ($clientIp == $ip && $count > 4) {
throw new ForbiddenException('account.flood_login');
}
}
}
}

View File

@ -47,7 +47,6 @@ $error['captcha.invalid_code'] = '无效的验证码';
*/
$error['account.not_found'] = '账号不存在';
$error['account.locked'] = '账号被锁定,无法登录';
$error['account.flood_login'] = '帐号泛滥登录';
$error['account.login_pwd_incorrect'] = '登录密码不正确';
$error['account.invalid_login_name'] = '无效的登录名';
$error['account.invalid_email'] = '无效的电子邮箱';

View File

@ -11,7 +11,7 @@ layui.use(['jquery', 'layer', 'helper'], function () {
var url = '/verify/captcha?type=all&account=' + $account.val();
layer.open({
type: 2,
title: '获取验证码',
title: '验证码',
area: ['500px', '250px'],
content: [url, 'no'],
});