Files
YwxAppThink/addon/wxchat/view/index/User.php
T

252 lines
6.2 KiB
PHP

<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
namespace ywxapp\library;
use think\exception\HttpException;
use think\facade\Db;
use think\facade\Event;
use ywxapp\library\Result;
use ywxapp\model\Rule as MemberRule;
use ywxapp\model\MemberUser as UsersModel;
/**
* Member 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class Member
{
/***
* 是否登录
* @var bool
*/
protected $isLogin = false;
/**
* Summary of config
* @var array
*/
protected $config = [];
/**
* Summary of options
* @var array
*/
protected $options = [];
/**
* 登录标识
* @var bool
*/
protected $token;
/**
* 个人信息
* @return \ywxapp\model\Member
*/
protected $info;
/**
* 权限规则
* @return array
*/
protected $powers;
/**
* 角色
* @var array
*/
protected $roles;
/**
* 用户资料,用于临时存放一些用户数据,比如用户IP地址,需要使用后销毁
* @var array
*/
protected $profile;
/**
* 允许查询的字段
* @var array
*/
protected $allowFields = ['id', 'account', 'nickname', 'roles', 'avatar', 'score'];
public function __construct($options = [])
{
$this->info = new \stdClass();
// if ($config = Config::get('member')) {
// $this->config = array_merge($this->config, $config);
// }
// $this->options = array_merge($this->config, $options);
}
/**
* 初始化用户信息
*/
public function initUser($uid)
{
$this->direct($uid);
return $this;
}
/**
* 直接登录账号.
*
* @param int $id
* @return void
*/
public function direct($uid)
{
$info = UsersModel::findOrEmpty($uid);
if ($info->isEmpty()) {
Result::instance()->error("Uid:$uid is incorrect");
}
Db::startTrans();
try {
if ($info->update_time < \ywxapp\utils\Date::unixtime('day')) {
$info->successions = $info->logintime < \ywxapp\utils\Date::unixtime(
'day',
-1
) ? 1 : $info->successions + 1;
$info->maxsuccessions = max($info->successions, $info->maxsuccessions);
}
// $user->prevtime = $user->logintime;
//记录本次登录的IP和时间
//$user->loginip =request()->ip();
//重置登录失败次数
//$user->loginfailure = 0;
$info->save();
$this->info = $info;
// $this->roles = $info->roles;
// $this->powers = $info->roles;
$this->isLogin = true;
//登录成功的事件
Event::trigger('user_login_successed', $this->info);
Db::commit();
} catch (\think\Exception $e) {
Db::rollback();
throw new HttpException(4001, $e->getMessage());
}
}
/**
* 获取会员组别规则列表.
* @return array
*/
public function getRuleList()
{
if ($this->powers) {
return $this->powers;
}
if (! $$this->roles) {
return [];
}
$power = [];
foreach ($this->roles as $role) {
$powers = array_merge($powers, explode(',', $role->powers));
}
$powers = MemberRule::whereIn('id', implode(',', $power))
->where('status', 0)
->field('id,pid,name,title,ismenu')
->select();
$this->powers = $powers;
return $this->powers;
}
private function getEncryptPassword($password, $salt = '')
{
return md5(md5($password) . $salt);
}
/**
* 用户权限验证
*/
public function verifyAuth($noNeedLogin = ["*"], $noNeedRight = ["*"])
{
$request = app()->request;
$modulename = app()->http->getName();
$controllername = strtolower($request->controller());
$actionname = strtolower($request->action());
$path = str_replace('.', '/', $controllername) . '/' . $actionname;
if (! $this->match($noNeedLogin)) {
if (! $this->isLogin) {
Result::instance()->error('Please login first');
}
// 判断是否需要验证权限
if (! $this->match($noNeedRight) && ! $this->check($path)) {
Result::instance()->error('You have no permission');
}
}
}
/**
* 检测当前控制器和方法是否匹配传递的数组.
* @param array $arr 需要验证权限的数组
* @return bool
*/
private function match($arr = [])
{
if (in_array(strtolower(app()->request->action()), $arr) || in_array('*', $arr)) {
return true;
}
return false;
}
/**
* 检测是否是否有对应权限.
* @param string $path 控制器/方法
* @param string $module 模块 默认为当前模块
* @return bool
*/
private function check($path = null, $module = null)
{
$ruleList = $this->getRuleList();
$rules = [];
foreach ($ruleList as $k => $v) {
$rules[] = $v['name'];
}
$url = strtolower(str_replace('.', '/', $path));
return in_array($url, $rules) ? true : false;
}
public static function instance($options = [])
{
return app()->auth;
}
public function __get($name)
{
if ($name == 'info' && $this->info != null) {
return $this->info;
//return array_intersect_key($this->info->toArray(), array_flip($this->allowFields));
}
return $this->$name;
}
public function __set($name, $value)
{
$this->$name = $value;
}
}