You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wkcrm/application/admin/model/LoginRecord.php

134 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | Description: 应用配置
// +----------------------------------------------------------------------
// | Author: Michael_xu | gengxiaoxu@5kcrm.com
// +----------------------------------------------------------------------
namespace app\admin\model;
use com\Scan;
class LoginRecord extends Common
{
/**
* 为了数据库的整洁同时又不影响Model和Controller的名称
* 我们约定每个模块的数据表都加上相同的前缀比如CRM模块用crm作为数据表前缀
*/
protected $name = 'admin_login_record';
protected $autoWriteTimestamp = true;
protected $createTime = 'create_time';
protected $updateTime = false;
/**
* 登录成功
*/
const TYPE_SUCCESS = 0;
/**
* 密码错误
*/
const TYPE_PWD_ERROR = 1;
/**
* 账号被禁用
*/
const TYPE_USER_BANNED = 2;
// 类型
public $typeList = [
self::TYPE_SUCCESS => '登录成功',
self::TYPE_PWD_ERROR => '密码错误',
self::TYPE_USER_BANNED => '账号被禁用',
];
/**
* 登录员工ID
*/
public $user_id = 0;
/**
* 添加登录记录
*
* @param int $type
*/
public function createRecord($type = 0)
{
$data = [];
$data['type'] = $type;
$data['create_user_id'] = $this->user_id;
$data['create_time'] = time();
$data['ip'] = (new Scan())->get_client_ip();
$data['os'] = getOS();
$data['browser'] = getBrowser();
$ip_address = getAddressById($data['ip']);
$data['address'] = $ip_address['country'];
// 效果图有这个备注字段不知道存啥就把UA记录了一下
$data['remark'] = $_SERVER['HTTP_USER_AGENT'];
$this->save($data);
}
/**
* 创建人
*/
public function getCreateUserInfoAttr($val, $data)
{
return User::getUserById($data['create_user_id']) ?: [];
}
/**
* 获取登录记录类型
*/
public function getTypeNameAttr($val, $data)
{
return $this->typeList[$data['type']];
}
/**
*
*/
/**
* 固定时间内登录密码错超过限制
*
* @param integer $count 登录出错次数
* @param integer $time 等待时间 (分钟)
* @return bool
*/
public function verify($count = 3, $time = 5)
{
$where = [
'create_user_id' => $this->user_id,
'create_time' => ['GT', time() - 60 * $time],
'type' => 1
];
$last_record = $this->order(['id' => 'DESC'])
->where($where)
->find();
// 登录记录
if ($last_record) {
$last_time = strtotime($last_record['create_time']);
$where['create_time'] = [
'BETWEEN',
[
$last_time - 60 * $time,
$last_time
]
];
$list = $this->where($where)
->order(['id' => 'DESC'])
->column('type');
if (count($list) >= $count) {
$surplusTime = getTimeBySec(60 * $time - (time()-strtotime($last_record['create_time'])));
$this->error = "密码错误次数过多,请在{$surplusTime}后重试!";
return false;
}
}
return true;
}
}