2018-12-28 18:58:37 +08:00
|
|
|
|
<?php
|
|
|
|
|
// +----------------------------------------------------------------------
|
|
|
|
|
// | ShopXO 国内领先企业级B2C免费开源电商系统
|
|
|
|
|
// +----------------------------------------------------------------------
|
2021-03-16 10:34:52 +08:00
|
|
|
|
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// +----------------------------------------------------------------------
|
2021-03-16 10:34:52 +08:00
|
|
|
|
// | Licensed ( https://opensource.org/licenses/mit-license.php )
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// +----------------------------------------------------------------------
|
|
|
|
|
// | Author: Devil
|
|
|
|
|
// +----------------------------------------------------------------------
|
|
|
|
|
namespace app\service;
|
|
|
|
|
|
2021-07-18 23:42:10 +08:00
|
|
|
|
use think\facade\Db;
|
2019-01-17 00:37:20 +08:00
|
|
|
|
use app\service\RegionService;
|
2019-04-04 11:14:03 +08:00
|
|
|
|
use app\service\SafetyService;
|
2019-05-17 17:47:47 +08:00
|
|
|
|
use app\service\ResourcesService;
|
2021-07-06 23:57:03 +08:00
|
|
|
|
use app\service\SystemBaseService;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户服务层
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-01T21:51:08+0800
|
|
|
|
|
*/
|
|
|
|
|
class UserService
|
|
|
|
|
{
|
2020-11-27 15:57:34 +08:00
|
|
|
|
// user登录session key
|
2021-07-18 23:42:10 +08:00
|
|
|
|
public static $user_login_key = 'user_login_info';
|
2021-12-07 18:16:37 +08:00
|
|
|
|
public static $user_token_key = 'user_token_data';
|
2020-11-27 15:57:34 +08:00
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
/**
|
2021-12-07 18:16:37 +08:00
|
|
|
|
*
|
2019-02-27 10:17:33 +08:00
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-02-27
|
|
|
|
|
* @desc description
|
|
|
|
|
*/
|
2021-12-07 18:16:37 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取用户登录信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-12-06
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [boolean] $is_cache [是否缓存读取]
|
|
|
|
|
*/
|
|
|
|
|
public static function LoginUserInfo($is_cache = true)
|
2019-02-27 10:17:33 +08:00
|
|
|
|
{
|
2021-08-08 22:06:17 +08:00
|
|
|
|
// 静态数据避免重复读取
|
|
|
|
|
static $user_login_info = null;
|
|
|
|
|
if($user_login_info === null)
|
2019-02-27 10:17:33 +08:00
|
|
|
|
{
|
2021-08-08 22:06:17 +08:00
|
|
|
|
// 参数
|
|
|
|
|
$params = input();
|
2019-06-29 23:55:47 +08:00
|
|
|
|
|
2021-08-08 22:06:17 +08:00
|
|
|
|
// 用户数据处理
|
|
|
|
|
if(APPLICATION == 'web')
|
2019-06-29 23:32:27 +08:00
|
|
|
|
{
|
2021-08-08 22:06:17 +08:00
|
|
|
|
// web用户session
|
|
|
|
|
$user_login_info = MySession(self::$user_login_key);
|
|
|
|
|
|
|
|
|
|
// 用户信息为空,指定了token则设置登录信息
|
2021-12-07 18:16:37 +08:00
|
|
|
|
if(empty($user_login_info))
|
2019-06-29 23:32:27 +08:00
|
|
|
|
{
|
2021-12-07 18:16:37 +08:00
|
|
|
|
$token = empty($params['token']) ? MySession(self::$user_token_key) : $params['token'];
|
|
|
|
|
if(!empty($token))
|
2021-08-08 22:06:17 +08:00
|
|
|
|
{
|
2021-12-07 18:16:37 +08:00
|
|
|
|
$user_login_info = self::UserTokenData($token);
|
|
|
|
|
if($user_login_info !== null && isset($user_login_info['id']))
|
|
|
|
|
{
|
|
|
|
|
self::UserLoginRecord($user_login_info['id']);
|
|
|
|
|
}
|
2021-08-08 22:06:17 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if(!empty($params['token']))
|
|
|
|
|
{
|
|
|
|
|
$user_login_info = self::UserTokenData($params['token']);
|
2019-06-29 23:32:27 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-02-27 10:17:33 +08:00
|
|
|
|
}
|
2021-12-07 18:16:37 +08:00
|
|
|
|
|
|
|
|
|
// 是否缓存读取
|
|
|
|
|
if(!empty($user_login_info) && !$is_cache)
|
|
|
|
|
{
|
|
|
|
|
// 根据用户id从数据库获取信息并处理
|
|
|
|
|
$user_login_info = self::UserHandle(self::UserInfo('id', $user_login_info['id']));
|
|
|
|
|
if(!empty($user_login_info))
|
|
|
|
|
{
|
|
|
|
|
// 重新更新用户缓存
|
|
|
|
|
self::UserLoginRecord($user_login_info['id']);
|
|
|
|
|
if(!empty($user_login_info['token']))
|
|
|
|
|
{
|
|
|
|
|
MyCache(MyConfig('shopxo.cache_user_info').$user_login_info['token'], $user_login_info);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-08 22:06:17 +08:00
|
|
|
|
return $user_login_info;
|
2019-02-27 10:17:33 +08:00
|
|
|
|
}
|
2019-02-27 11:51:19 +08:00
|
|
|
|
|
2019-08-18 19:38:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* 获取用户token用户数据
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @datetime 2019-08-18T19:01:59+0800
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [string] $token [用户token]
|
|
|
|
|
*/
|
2022-03-27 23:37:16 +08:00
|
|
|
|
public static function UserTokenData($token)
|
2019-08-18 19:38:03 +08:00
|
|
|
|
{
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$user = MyCache(MyConfig('shopxo.cache_user_info').$token);
|
2019-08-18 19:38:03 +08:00
|
|
|
|
if($user !== null && isset($user['id']))
|
|
|
|
|
{
|
|
|
|
|
return $user;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 数据库校验
|
|
|
|
|
return self::AppUserInfoHandle(null, 'token', $token);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-27 11:51:19 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户状态校验
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-02-27
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [string] $field [条件字段]
|
|
|
|
|
* @param [string] $value [条件值]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserStatusCheck($field, $value)
|
|
|
|
|
{
|
|
|
|
|
// 查询用户状态是否正常
|
|
|
|
|
$user = self::UserInfo($field, $value);
|
|
|
|
|
if(empty($user))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户不存在或已删除', -110);
|
|
|
|
|
}
|
|
|
|
|
if(!in_array($user['status'], [0,1]))
|
|
|
|
|
{
|
2021-08-14 17:17:45 +08:00
|
|
|
|
$common_user_status_list = MyConst('common_user_status_list');
|
2019-02-27 11:51:19 +08:00
|
|
|
|
if(isset($common_user_status_list[$user['status']]))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($common_user_status_list[$user['status']]['tips'], -110);
|
|
|
|
|
} else {
|
|
|
|
|
return DataReturn('用户状态有误', -110);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('正常', 0);
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-27 10:17:33 +08:00
|
|
|
|
/**
|
2018-12-28 18:58:37 +08:00
|
|
|
|
* 用户列表
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-06T21:31:53+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function UserList($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
$where = empty($params['where']) ? [] : $params['where'];
|
|
|
|
|
$field = empty($params['field']) ? '*' : $params['field'];
|
|
|
|
|
$order_by = empty($params['order_by']) ? 'id desc' : trim($params['order_by']);
|
|
|
|
|
$m = isset($params['m']) ? intval($params['m']) : 0;
|
|
|
|
|
$n = isset($params['n']) ? intval($params['n']) : 10;
|
|
|
|
|
|
2019-09-12 23:30:51 +08:00
|
|
|
|
// 获取用户列表
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$data = Db::name('User')->where($where)->order($order_by)->field($field)->limit($m, $n)->select()->toArray();
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if(!empty($data))
|
|
|
|
|
{
|
2021-08-07 00:41:33 +08:00
|
|
|
|
// 用户列表钩子-前面
|
|
|
|
|
$hook_name = 'plugins_service_user_list_handle_begin';
|
|
|
|
|
MyEventTrigger($hook_name, [
|
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'data' => &$data,
|
|
|
|
|
]);
|
|
|
|
|
|
2022-03-14 17:02:45 +08:00
|
|
|
|
// 字段列表
|
|
|
|
|
$keys = ArrayKeys($data);
|
|
|
|
|
|
|
|
|
|
// 邀请用户列表
|
|
|
|
|
if(in_array('referrer', $keys))
|
|
|
|
|
{
|
|
|
|
|
$referrer_list = self::GetUserViewInfo(array_column($data, 'referrer'));
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-07 00:41:33 +08:00
|
|
|
|
// 开始处理数据
|
2021-08-14 17:17:45 +08:00
|
|
|
|
$common_gender_list = MyConst('common_gender_list');
|
|
|
|
|
$common_user_status_list = MyConst('common_user_status_list');
|
2018-12-28 18:58:37 +08:00
|
|
|
|
foreach($data as &$v)
|
|
|
|
|
{
|
|
|
|
|
// 生日
|
2020-12-17 18:50:53 +08:00
|
|
|
|
if(array_key_exists('birthday', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['birthday_text'] = empty($v['birthday']) ? '' : date('Y-m-d', $v['birthday']);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 头像
|
2020-12-17 18:50:53 +08:00
|
|
|
|
if(array_key_exists('avatar', $v))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-12-17 18:50:53 +08:00
|
|
|
|
if(!empty($v['avatar']))
|
|
|
|
|
{
|
|
|
|
|
$v['avatar'] = ResourcesService::AttachmentPathViewHandle($v['avatar']);
|
|
|
|
|
} else {
|
2021-07-06 23:57:03 +08:00
|
|
|
|
$v['avatar'] = SystemBaseService::AttachmentHost().'/static/index/'.strtolower(MyC('common_default_theme', 'default', true)).'/images/default-user-avatar.jpg';
|
2020-12-17 18:50:53 +08:00
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-03-14 17:02:45 +08:00
|
|
|
|
// 邀请用户信息
|
|
|
|
|
if(array_key_exists('referrer', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['referrer_info'] = (!empty($referrer_list) && is_array($referrer_list) && array_key_exists($v['referrer'], $referrer_list)) ? $referrer_list[$v['referrer']] : [];
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-17 18:50:53 +08:00
|
|
|
|
// 时间
|
|
|
|
|
if(array_key_exists('add_time', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['add_time'] = date('Y-m-d H:i:s', $v['add_time']);
|
|
|
|
|
}
|
|
|
|
|
if(array_key_exists('upd_time', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['upd_time'] = date('Y-m-d H:i:s', $v['upd_time']);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 性别
|
2020-12-17 18:50:53 +08:00
|
|
|
|
if(array_key_exists('gender', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['gender_text'] = isset($common_gender_list[$v['gender']]) ? $common_gender_list[$v['gender']]['name'] : '未知';
|
|
|
|
|
}
|
2019-02-26 17:52:17 +08:00
|
|
|
|
|
|
|
|
|
// 状态
|
2020-12-17 18:50:53 +08:00
|
|
|
|
if(array_key_exists('status', $v))
|
|
|
|
|
{
|
|
|
|
|
$v['status_text'] = $common_user_status_list[$v['status']]['name'];
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2021-08-07 00:41:33 +08:00
|
|
|
|
|
|
|
|
|
// 用户列表钩子-后面
|
|
|
|
|
$hook_name = 'plugins_service_user_list_handle_end';
|
|
|
|
|
MyEventTrigger($hook_name, [
|
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'data' => &$data,
|
|
|
|
|
]);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2019-01-21 15:19:03 +08:00
|
|
|
|
return DataReturn('处理成功', 0, $data);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户总数
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-10T22:16:29+0800
|
|
|
|
|
* @param [array] $where [条件]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function UserTotal($where)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
return (int) Db::name('User')->where($where)->count();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户信息保存
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-10T22:16:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function UserSave($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 请求参数
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'admin',
|
2020-08-24 23:39:14 +08:00
|
|
|
|
'error_msg' => '管理员信息有误',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'length',
|
|
|
|
|
'key_name' => 'username',
|
|
|
|
|
'checked_data' => '30',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '用户名格式最多 30 个字符之间',
|
|
|
|
|
],
|
2020-08-24 23:39:14 +08:00
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'unique',
|
|
|
|
|
'key_name' => 'username',
|
|
|
|
|
'checked_data' => 'User',
|
|
|
|
|
'checked_key' => 'id',
|
2020-09-02 19:35:02 +08:00
|
|
|
|
'is_checked' => 1,
|
2020-08-24 23:39:14 +08:00
|
|
|
|
'error_msg' => '用户已存在[{$var}]',
|
|
|
|
|
],
|
2018-12-28 18:58:37 +08:00
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'length',
|
|
|
|
|
'key_name' => 'nickname',
|
|
|
|
|
'checked_data' => '30',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '用户昵称格式最多 30 个字符之间',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'fun',
|
|
|
|
|
'key_name' => 'mobile',
|
|
|
|
|
'checked_data' => 'CheckMobile',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '手机号码格式错误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'fun',
|
|
|
|
|
'key_name' => 'email',
|
|
|
|
|
'checked_data' => 'CheckEmail',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '邮箱格式错误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'in',
|
|
|
|
|
'key_name' => 'gender',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_gender_list'), 'id'),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'error_msg' => '性别值范围不正确',
|
|
|
|
|
],
|
2019-02-26 17:52:17 +08:00
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'in',
|
|
|
|
|
'key_name' => 'status',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_user_status_list'), 'id'),
|
2019-02-26 17:52:17 +08:00
|
|
|
|
'error_msg' => '状态值范围不正确',
|
|
|
|
|
],
|
2018-12-28 18:58:37 +08:00
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'length',
|
|
|
|
|
'key_name' => 'address',
|
|
|
|
|
'checked_data' => '80',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '地址格式最多 80 个字符之间',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'fun',
|
|
|
|
|
'key_name' => 'pwd',
|
|
|
|
|
'checked_data' => 'CheckLoginPwd',
|
|
|
|
|
'is_checked' => 1,
|
|
|
|
|
'error_msg' => '密码格式 6~18 个字符之间',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新数据
|
|
|
|
|
$data = [
|
|
|
|
|
'username' => isset($params['username']) ? $params['username'] : '',
|
|
|
|
|
'nickname' => isset($params['nickname']) ? $params['nickname'] : '',
|
|
|
|
|
'mobile' => isset($params['mobile']) ? $params['mobile'] : '',
|
|
|
|
|
'email' => isset($params['email']) ? $params['email'] : '',
|
|
|
|
|
'address' => isset($params['address']) ? $params['address'] : '',
|
|
|
|
|
'gender' => intval($params['gender']),
|
|
|
|
|
'integral' => intval($params['integral']),
|
2022-03-07 12:30:10 +08:00
|
|
|
|
'locking_integral' => intval($params['locking_integral']),
|
2019-02-26 17:52:17 +08:00
|
|
|
|
'status' => intval($params['status']),
|
|
|
|
|
'alipay_openid' => isset($params['alipay_openid']) ? $params['alipay_openid'] : '',
|
|
|
|
|
'baidu_openid' => isset($params['baidu_openid']) ? $params['baidu_openid'] : '',
|
2019-10-27 10:00:12 +08:00
|
|
|
|
'toutiao_openid' => isset($params['toutiao_openid']) ? $params['toutiao_openid'] : '',
|
2019-10-31 15:34:16 +08:00
|
|
|
|
'qq_openid' => isset($params['qq_openid']) ? $params['qq_openid'] : '',
|
|
|
|
|
'qq_unionid' => isset($params['qq_unionid']) ? $params['qq_unionid'] : '',
|
2019-10-04 17:47:01 +08:00
|
|
|
|
'weixin_openid' => isset($params['weixin_openid']) ? $params['weixin_openid'] : '',
|
|
|
|
|
'weixin_unionid' => isset($params['weixin_unionid']) ? $params['weixin_unionid'] : '',
|
|
|
|
|
'weixin_web_openid' => isset($params['weixin_web_openid']) ? $params['weixin_web_openid'] : '',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'birthday' => empty($params['birthday']) ? 0 : strtotime($params['birthday']),
|
2020-06-08 22:38:02 +08:00
|
|
|
|
'referrer' => empty($params['referrer']) ? 0 : intval($params['referrer']),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
];
|
|
|
|
|
|
2019-07-24 00:12:51 +08:00
|
|
|
|
// 用户保存处理钩子
|
2019-07-23 21:50:54 +08:00
|
|
|
|
$hook_name = 'plugins_service_user_save_handle';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2019-07-23 21:50:54 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'data' => &$data,
|
|
|
|
|
'user_id' => isset($params['id']) ? intval($params['id']) : 0,
|
2019-12-02 20:58:24 +08:00
|
|
|
|
]));
|
2019-07-23 21:50:54 +08:00
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 密码
|
|
|
|
|
if(!empty($params['pwd']))
|
|
|
|
|
{
|
|
|
|
|
$data['salt'] = GetNumberCode(6);
|
|
|
|
|
$data['pwd'] = LoginPwdEncryption(trim($params['pwd']), $data['salt']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新/添加
|
|
|
|
|
if(!empty($params['id']))
|
|
|
|
|
{
|
|
|
|
|
// 获取用户信息
|
|
|
|
|
$user = Db::name('User')->field('id,integral')->find($params['id']);
|
|
|
|
|
if(empty($user))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户信息不存在', -10);
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-13 20:24:36 +08:00
|
|
|
|
$ret = self::UserUpdateHandle($data, $params['id']);
|
|
|
|
|
if($ret['code'] == 0)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
$user_id = $params['id'];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$data['add_time'] = time();
|
2022-02-08 22:14:06 +08:00
|
|
|
|
$ret = self::UserInsert($data);
|
|
|
|
|
if($ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
$user_id = $ret['data']['user_id'];
|
2021-06-09 14:57:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加用户后处理钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_save_success_handle';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2021-06-09 14:57:14 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'data' => &$data,
|
|
|
|
|
'user_id' => &$user_id,
|
|
|
|
|
]));
|
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 状态
|
|
|
|
|
if(isset($user_id))
|
|
|
|
|
{
|
|
|
|
|
if(($data['integral'] > 0 && empty($user)) || (isset($user['integral']) && $user['integral'] != $data['integral']))
|
|
|
|
|
{
|
|
|
|
|
$integral_type = 1;
|
2020-06-28 22:50:10 +08:00
|
|
|
|
$old_integral = 0;
|
|
|
|
|
$opt_integral = 0;
|
|
|
|
|
if(!empty($params['id']))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-06-28 22:50:10 +08:00
|
|
|
|
$old_integral = $user['integral'];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
$integral_type = ($user['integral'] > $data['integral']) ? 0 : 1;
|
2020-06-28 22:50:10 +08:00
|
|
|
|
$opt_integral = ($integral_type == 1) ? $data['integral']-$user['integral'] : $user['integral']-$data['integral'];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2020-06-28 22:50:10 +08:00
|
|
|
|
IntegralService::UserIntegralLogAdd($user_id, $old_integral, $opt_integral, '管理员操作', $integral_type, $params['admin']['id']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作失败', -100);
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-13 20:24:36 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户信息更新
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2022-02-13
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $data [用户更新信息]
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserUpdateHandle($data, $user_id)
|
|
|
|
|
{
|
|
|
|
|
$data['upd_time'] = time();
|
|
|
|
|
if(Db::name('User')->where(['id'=>intval($user_id)])->update($data))
|
|
|
|
|
{
|
|
|
|
|
// 更新成功后钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_update_success';
|
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'data' => $data,
|
|
|
|
|
]));
|
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('更新成功', 0);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('更新失败', -100);
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户删除
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-10T22:16:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function UserDelete($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-06-08 22:38:02 +08:00
|
|
|
|
// 参数是否有误
|
|
|
|
|
if(empty($params['ids']))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-06-08 22:38:02 +08:00
|
|
|
|
return DataReturn('商品id有误', -1);
|
|
|
|
|
}
|
|
|
|
|
// 是否数组
|
|
|
|
|
if(!is_array($params['ids']))
|
|
|
|
|
{
|
|
|
|
|
$params['ids'] = explode(',', $params['ids']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除操作
|
2020-06-08 22:38:02 +08:00
|
|
|
|
if(Db::name('User')->where(['id'=>$params['ids']])->delete())
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
return DataReturn('删除成功');
|
|
|
|
|
}
|
2020-06-08 22:38:02 +08:00
|
|
|
|
return DataReturn('删除失败', -100);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [UserLoginRecord 用户登录记录]
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-09T11:37:43+0800
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
* @return [boolean] [记录成功true, 失败false]
|
|
|
|
|
*/
|
2021-07-03 00:05:00 +08:00
|
|
|
|
public static function UserLoginRecord($user_id = 0)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
if(!empty($user_id))
|
|
|
|
|
{
|
2021-07-03 00:05:00 +08:00
|
|
|
|
$user = Db::name('User')->find($user_id);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
2020-01-26 01:05:08 +08:00
|
|
|
|
// 用户数据处理
|
|
|
|
|
$user = self::UserHandle($user);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-04-28 11:34:18 +08:00
|
|
|
|
// 用户登录成功信息纪录钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_login_success_record';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MyEventTrigger($hook_name, [
|
2019-04-28 11:34:18 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'user' => &$user,
|
|
|
|
|
'user_id' => $user_id
|
|
|
|
|
]);
|
|
|
|
|
|
2021-07-03 00:05:00 +08:00
|
|
|
|
// web端设置session
|
|
|
|
|
if(APPLICATION == 'web')
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 存储session
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MySession(self::$user_login_key, $user);
|
|
|
|
|
return (MySession(self::$user_login_key) !== null);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2021-07-12 22:17:42 +08:00
|
|
|
|
return true;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-26 01:05:08 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户数据处理
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2020-01-23
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [ array] $user [用户数据]
|
|
|
|
|
*/
|
2020-12-17 18:50:53 +08:00
|
|
|
|
public static function UserHandle($user)
|
2020-01-26 01:05:08 +08:00
|
|
|
|
{
|
2021-12-11 10:21:31 +08:00
|
|
|
|
if(!empty($user))
|
2020-01-26 01:05:08 +08:00
|
|
|
|
{
|
2021-12-11 10:21:31 +08:00
|
|
|
|
// 基础数据处理
|
|
|
|
|
if(isset($user['add_time']))
|
|
|
|
|
{
|
|
|
|
|
$user['add_time_text'] = date('Y-m-d H:i:s', $user['add_time']);
|
|
|
|
|
}
|
|
|
|
|
if(isset($user['upd_time']))
|
|
|
|
|
{
|
|
|
|
|
$user['upd_time_text'] = date('Y-m-d H:i:s', $user['upd_time']);
|
|
|
|
|
}
|
|
|
|
|
if(isset($user['gender']))
|
|
|
|
|
{
|
|
|
|
|
$user['gender_text'] = MyConst('common_gender_list')[$user['gender']]['name'];
|
|
|
|
|
}
|
|
|
|
|
if(isset($user['birthday']))
|
|
|
|
|
{
|
|
|
|
|
$user['birthday_text'] = empty($user['birthday']) ? '' : date('Y-m-d', $user['birthday']);
|
|
|
|
|
}
|
2020-01-26 01:05:08 +08:00
|
|
|
|
|
2021-12-11 10:21:31 +08:00
|
|
|
|
// 邮箱/手机
|
|
|
|
|
if(isset($user['mobile']))
|
|
|
|
|
{
|
|
|
|
|
$user['mobile_security']= empty($user['mobile']) ? '' : mb_substr($user['mobile'], 0, 3, 'utf-8').'***'.mb_substr($user['mobile'], -3, null, 'utf-8');
|
|
|
|
|
}
|
|
|
|
|
if(isset($user['email']))
|
|
|
|
|
{
|
|
|
|
|
$user['email_security'] = empty($user['email']) ? '' : mb_substr($user['email'], 0, 3, 'utf-8').'***'.mb_substr($user['email'], -3, null, 'utf-8');
|
|
|
|
|
}
|
2020-01-26 01:05:08 +08:00
|
|
|
|
|
2021-12-11 10:21:31 +08:00
|
|
|
|
// 显示名称,根据规则优先展示
|
|
|
|
|
$user['user_name_view'] = isset($user['username']) ? $user['username'] : '';
|
|
|
|
|
if(empty($user['user_name_view']) && isset($user['nickname']))
|
|
|
|
|
{
|
|
|
|
|
$user['user_name_view'] = $user['nickname'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($user['user_name_view']) && isset($user['mobile_security']))
|
|
|
|
|
{
|
|
|
|
|
$user['user_name_view'] = $user['mobile_security'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($user['user_name_view']) && isset($user['email_security']))
|
|
|
|
|
{
|
|
|
|
|
$user['user_name_view'] = $user['email_security'];
|
|
|
|
|
}
|
2020-01-26 01:05:08 +08:00
|
|
|
|
|
2021-12-11 10:21:31 +08:00
|
|
|
|
// 头像
|
|
|
|
|
if(isset($user['avatar']))
|
|
|
|
|
{
|
|
|
|
|
if(!empty($user['avatar']))
|
|
|
|
|
{
|
|
|
|
|
$user['avatar'] = ResourcesService::AttachmentPathViewHandle($user['avatar']);
|
|
|
|
|
} else {
|
|
|
|
|
$user['avatar'] = SystemBaseService::AttachmentHost().'/static/index/'.strtolower(MyFileConfig('common_default_theme', '', 'default', true)).'/images/default-user-avatar.jpg';
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-26 01:05:08 +08:00
|
|
|
|
|
2021-12-11 10:21:31 +08:00
|
|
|
|
// 移除特殊数据
|
|
|
|
|
unset($user['pwd'], $user['salt']);
|
|
|
|
|
}
|
2021-07-03 00:05:00 +08:00
|
|
|
|
|
2020-01-26 01:05:08 +08:00
|
|
|
|
return $user;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户头像更新
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-10-16
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function UserAvatarUpload($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 请求参数
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'img_width',
|
|
|
|
|
'error_msg' => '图片宽度不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'img_height',
|
|
|
|
|
'error_msg' => '图片高度不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'isset',
|
|
|
|
|
'key_name' => 'img_x',
|
|
|
|
|
'error_msg' => '图片裁剪x坐标有误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'isset',
|
|
|
|
|
'key_name' => 'img_y',
|
|
|
|
|
'error_msg' => '图片裁剪y坐标有误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'img_field',
|
|
|
|
|
'error_msg' => '图片name字段值不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'user',
|
|
|
|
|
'error_msg' => '用户信息有误',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 开始处理图片存储
|
|
|
|
|
// 定义图片目录
|
2018-12-28 22:27:22 +08:00
|
|
|
|
$root_path = ROOT.'public'.DS;
|
2018-12-28 22:25:03 +08:00
|
|
|
|
$img_path = 'static'.DS.'upload'.DS.'images'.DS.'user_avatar'.DS;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
$date = DS.date('Y').DS.date('m').DS.date('d').DS;
|
|
|
|
|
|
|
|
|
|
// 图像类库
|
|
|
|
|
$images_obj = \base\Images::Instance(['is_new_name'=>false]);
|
|
|
|
|
|
|
|
|
|
// 文件上传校验
|
|
|
|
|
$error = FileUploadError($params['img_field']);
|
|
|
|
|
if($error !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($error, -2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$original = $images_obj->GetCompressCut($_FILES[$params['img_field']], $root_path.$img_path.'original'.$date, 800, 800, $params['img_x'], $params['img_y'], $params['img_width'], $params['img_height']);
|
|
|
|
|
if(!empty($original))
|
|
|
|
|
{
|
|
|
|
|
$compr = $images_obj->GetBinaryCompress($root_path.$img_path.'original'.$date.$original, $root_path.$img_path.'compr'.$date, 200, 200);
|
|
|
|
|
$small = $images_obj->GetBinaryCompress($root_path.$img_path.'original'.$date.$original, $root_path.$img_path.'small'.$date, 50, 50);
|
|
|
|
|
}
|
|
|
|
|
if(empty($compr) || empty($small))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('图片有误,请换一张', -3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新用户头像
|
|
|
|
|
$data = [
|
|
|
|
|
'avatar' => DS.$img_path.'compr'.$date.$compr,
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
|
|
|
|
if(Db::name('User')->where(['id'=>$params['user']['id']])->update($data))
|
|
|
|
|
{
|
2021-07-03 00:05:00 +08:00
|
|
|
|
// 设置session
|
|
|
|
|
self::UserLoginRecord($params['user']['id']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
return DataReturn('上传成功', 0);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('上传失败', -100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户登录
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-12-03
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function Login($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-12-05 20:35:13 +08:00
|
|
|
|
// 用户登录前校验钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_login_begin_check';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2020-12-05 20:35:13 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
]));
|
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 请求参数
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'in',
|
|
|
|
|
'key_name' => 'type',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_login_type_list'), 'value'),
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'error_msg' => '登录类型有误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'accounts',
|
|
|
|
|
'error_msg' => '登录账号不能为空',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-03-04 21:50:30 +08:00
|
|
|
|
return DataReturn($ret, -1);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 是否开启用户注册
|
|
|
|
|
if(!in_array($params['type'], MyC('home_user_login_type', [], true)))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-03-04 21:50:30 +08:00
|
|
|
|
return DataReturn('暂时关闭登录', -1);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 账户校验
|
|
|
|
|
$ac = self::UserLoginAccountsCheck($params);
|
|
|
|
|
if($ac['code'] != 0)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-03-04 21:50:30 +08:00
|
|
|
|
return $ac;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 验证参数
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify_params = [
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'key_prefix' => 'user_login_'.md5($params['accounts']),
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
2021-03-04 21:50:30 +08:00
|
|
|
|
|
|
|
|
|
// 帐号密码登录需要校验密码
|
|
|
|
|
if($params['type'] == 'username')
|
|
|
|
|
{
|
|
|
|
|
// 请求参数
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'pwd',
|
|
|
|
|
'error_msg' => '密码格式 6~18 个字符之间',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'fun',
|
|
|
|
|
'key_name' => 'pwd',
|
|
|
|
|
'checked_data' => 'CheckLoginPwd',
|
|
|
|
|
'error_msg' => '密码格式 6~18 个字符',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 帐号密码登录是否开启图片验证码
|
|
|
|
|
$verify_params['key_prefix'] = 'user_login';
|
|
|
|
|
$verify = self::IsImaVerify($params, $verify_params, MyC('home_user_login_img_verify_state'));
|
|
|
|
|
if($verify['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $verify;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 账户类型
|
|
|
|
|
$obj = null;
|
|
|
|
|
switch($params['type'])
|
|
|
|
|
{
|
|
|
|
|
// 短信
|
|
|
|
|
case 'sms' :
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 未知的字段
|
|
|
|
|
default :
|
|
|
|
|
return DataReturn('验证类型有误', -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码校验
|
|
|
|
|
// sms, email
|
|
|
|
|
if(isset($obj) && is_object($obj))
|
|
|
|
|
{
|
|
|
|
|
// 是否已过期
|
|
|
|
|
if(!$obj->CheckExpire())
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码已过期', -10);
|
|
|
|
|
}
|
|
|
|
|
// 是否正确
|
|
|
|
|
if(!$obj->CheckCorrect($params['verify']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码错误', -11);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-05-17 17:47:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 获取用户账户信息
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$where = [$ac['data'] => $params['accounts'], 'is_delete_time'=>0];
|
2021-11-30 18:54:21 +08:00
|
|
|
|
$user = Db::name('User')->where($where)->find();
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if(empty($user))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('帐号不存在', -3);
|
|
|
|
|
}
|
2019-02-26 17:52:17 +08:00
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 密码校验
|
|
|
|
|
// 帐号密码登录需要校验密码
|
|
|
|
|
if($params['type'] == 'username')
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$pwd = LoginPwdEncryption($params['pwd'], $user['salt']);
|
|
|
|
|
if($pwd != $user['pwd'])
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('密码错误', -4);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 用户状态
|
|
|
|
|
if(in_array($user['status'], [2,3]))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-08-14 17:17:45 +08:00
|
|
|
|
return DataReturn(MyConst('common_user_status_list')[$user['status']]['tips'], -10);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-02-14 23:06:04 +08:00
|
|
|
|
// 用户登录前钩子
|
2019-02-26 22:45:47 +08:00
|
|
|
|
$hook_name = 'plugins_service_user_login_begin';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2019-02-26 22:45:47 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'user_id' => $user['id']
|
2019-12-02 20:58:24 +08:00
|
|
|
|
]));
|
2019-02-14 23:06:04 +08:00
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
// 返回数据,更新数据库
|
|
|
|
|
$data = [
|
2021-11-30 18:54:21 +08:00
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
2021-03-04 21:50:30 +08:00
|
|
|
|
if($params['type'] == 'username')
|
|
|
|
|
{
|
|
|
|
|
$salt = GetNumberCode(6);
|
|
|
|
|
$data['salt'] = $salt;
|
|
|
|
|
$data['pwd'] = LoginPwdEncryption($params['pwd'], $salt);
|
|
|
|
|
}
|
2021-11-30 18:54:21 +08:00
|
|
|
|
|
|
|
|
|
// 用户openid
|
|
|
|
|
if(empty($user[APPLICATION_CLIENT_TYPE.'_openid']))
|
|
|
|
|
{
|
|
|
|
|
$openid = self::UserOpenidHandle($params);
|
|
|
|
|
if(!empty($openid['field']) && !empty($openid['value']))
|
|
|
|
|
{
|
|
|
|
|
// openid放入用户data中
|
|
|
|
|
$data[$openid['field']] = $openid['value'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 用户unionid
|
|
|
|
|
if(empty($user[APPLICATION_CLIENT_TYPE.'_unionid']))
|
|
|
|
|
{
|
|
|
|
|
$unionid = self::UserUnionidHandle($params);
|
|
|
|
|
if(!empty($unionid['field']) && !empty($unionid['value']))
|
|
|
|
|
{
|
|
|
|
|
// unionid放入用户data中
|
|
|
|
|
$data[$unionid['field']] = $unionid['value'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新用户信息
|
2019-04-04 11:14:03 +08:00
|
|
|
|
if(Db::name('User')->where(['id'=>$user['id']])->update($data) !== false)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 清除图片验证码
|
|
|
|
|
if(isset($verify) && isset($verify['data']) && is_object($verify['data']))
|
|
|
|
|
{
|
|
|
|
|
$verify['data']->Remove();
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 17:21:07 +08:00
|
|
|
|
return self::UserLoginHandle($user['id'], $params);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('登录失效,请重新登录', -100);
|
|
|
|
|
}
|
2019-02-14 23:06:04 +08:00
|
|
|
|
|
2019-05-24 17:21:07 +08:00
|
|
|
|
/**
|
|
|
|
|
* 登录处理
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-05-24
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-05-24 17:23:26 +08:00
|
|
|
|
public static function UserLoginHandle($user_id, $params = [])
|
2019-05-24 17:21:07 +08:00
|
|
|
|
{
|
|
|
|
|
// 登录记录
|
2019-05-24 17:24:05 +08:00
|
|
|
|
if(self::UserLoginRecord($user_id))
|
2019-05-24 17:21:07 +08:00
|
|
|
|
{
|
|
|
|
|
// 返回前端html代码
|
|
|
|
|
$body_html = [];
|
|
|
|
|
|
|
|
|
|
// 用户登录后钩子
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$user = Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user_id])->find();
|
2019-05-24 17:21:07 +08:00
|
|
|
|
$hook_name = 'plugins_service_user_login_end';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2019-05-24 17:21:07 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'user_id' => $user_id,
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'user' => $user,
|
2019-05-24 17:21:07 +08:00
|
|
|
|
'body_html' => &$body_html,
|
2019-12-02 20:58:24 +08:00
|
|
|
|
]));
|
2019-05-24 17:21:07 +08:00
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2019-05-24 17:21:07 +08:00
|
|
|
|
|
2021-03-04 23:14:21 +08:00
|
|
|
|
// 成功返回
|
2021-03-04 21:50:30 +08:00
|
|
|
|
if(APPLICATION == 'app')
|
|
|
|
|
{
|
|
|
|
|
$result = self::AppUserInfoHandle($user_id);
|
|
|
|
|
} else {
|
|
|
|
|
$result = [
|
|
|
|
|
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
|
|
|
|
|
];
|
|
|
|
|
}
|
2019-05-24 17:21:07 +08:00
|
|
|
|
return DataReturn('登录成功', 0, $result);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
return DataReturn('登录失效,请重新登录', -100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户注册
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-12-03
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function Reg($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'accounts',
|
|
|
|
|
'error_msg' => '账号不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'pwd',
|
|
|
|
|
'error_msg' => '密码不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
2019-05-16 18:42:22 +08:00
|
|
|
|
'checked_type' => 'in',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'key_name' => 'type',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_user_reg_type_list'), 'value'),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'error_msg' => '注册类型有误',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'verify',
|
2019-05-16 18:42:22 +08:00
|
|
|
|
'is_checked' => 2,
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'error_msg' => '验证码不能为空',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-05 20:35:13 +08:00
|
|
|
|
// 用户注册前校验钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_register_begin_check';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2020-12-05 20:35:13 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
]));
|
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 是否开启用户注册
|
2021-03-04 21:50:30 +08:00
|
|
|
|
if(!in_array($params['type'], MyC('home_user_reg_type', [], true)))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
return DataReturn('暂时关闭用户注册', -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 账户校验
|
2019-01-17 00:37:20 +08:00
|
|
|
|
$ret = self::UserRegAccountsCheck($params);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if($ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 是否需要审核
|
|
|
|
|
$common_register_is_enable_audit = MyC('common_register_is_enable_audit', 0);
|
|
|
|
|
|
|
|
|
|
// 用户数据
|
|
|
|
|
$salt = GetNumberCode(6);
|
|
|
|
|
$data = [
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
'salt' => $salt,
|
|
|
|
|
'pwd' => LoginPwdEncryption($params['pwd'], $salt),
|
|
|
|
|
'status' => ($common_register_is_enable_audit == 1) ? 3 : 0,
|
|
|
|
|
];
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 验证码校验
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify_params = [
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'key_prefix' => 'user_reg_'.md5($params['accounts']),
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// 账户类型
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$obj = null;
|
2020-03-10 18:03:39 +08:00
|
|
|
|
switch($params['type'])
|
2019-05-17 17:47:47 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 短信
|
|
|
|
|
case 'sms' :
|
|
|
|
|
$data['mobile'] = $params['accounts'];
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$data['email'] = $params['accounts'];
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 默认 账号
|
|
|
|
|
default :
|
|
|
|
|
$data['username'] = $params['accounts'];
|
|
|
|
|
// 是否开启图片验证码
|
2021-03-24 18:28:38 +08:00
|
|
|
|
// user_reg 由前端图片验证码传递的 type 一致
|
|
|
|
|
$verify_params['key_prefix'] = 'user_reg';
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify = self::IsImaVerify($params, $verify_params, MyC('home_user_register_img_verify_state'));
|
|
|
|
|
if($verify['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $verify;
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2019-05-16 18:42:22 +08:00
|
|
|
|
|
|
|
|
|
// 验证码校验
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// sms, email
|
2019-05-16 18:42:22 +08:00
|
|
|
|
if(isset($obj) && is_object($obj))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 是否已过期
|
|
|
|
|
if(!$obj->CheckExpire())
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码已过期', -10);
|
|
|
|
|
}
|
|
|
|
|
// 是否正确
|
|
|
|
|
if(!$obj->CheckCorrect($params['verify']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码错误', -11);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 数据添加
|
2019-04-04 11:14:03 +08:00
|
|
|
|
$user_ret = self::UserInsert($data, $params);
|
|
|
|
|
if($user_ret['code'] == 0)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 清除验证码
|
2019-05-16 18:42:22 +08:00
|
|
|
|
if(isset($obj) && is_object($obj))
|
|
|
|
|
{
|
|
|
|
|
$obj->Remove();
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-02-26 17:52:17 +08:00
|
|
|
|
// 是否需要审核
|
|
|
|
|
if($common_register_is_enable_audit == 1)
|
|
|
|
|
{
|
2021-05-19 15:10:00 +08:00
|
|
|
|
return DataReturn('用户等待审核中', -110);
|
2019-02-26 17:52:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 用户登录session纪录
|
2019-04-04 11:14:03 +08:00
|
|
|
|
if(self::UserLoginRecord($user_ret['data']['user_id']))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-03-04 23:14:21 +08:00
|
|
|
|
// 成功返回
|
|
|
|
|
if(APPLICATION == 'app')
|
|
|
|
|
{
|
|
|
|
|
$result = self::AppUserInfoHandle($user_ret['data']['user_id']);
|
|
|
|
|
} else {
|
|
|
|
|
$result = $user_ret['data'];
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('注册成功', 0, $result);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
return DataReturn('注册成功,请到登录页面登录帐号');
|
2019-04-04 11:14:03 +08:00
|
|
|
|
} else {
|
|
|
|
|
return $user_ret;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
return DataReturn('注册失败', -100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户注册账户校验
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T10:06:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
private static function UserRegAccountsCheck($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-05-16 18:42:22 +08:00
|
|
|
|
switch($params['type'])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 手机
|
|
|
|
|
case 'sms' :
|
|
|
|
|
// 手机号码格式
|
|
|
|
|
if(!CheckMobile($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码格式错误', -2);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 手机号码是否已存在
|
|
|
|
|
if(self::IsExistAccounts($params['accounts'], 'mobile'))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码已存在', -3);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
// 电子邮箱格式
|
|
|
|
|
if(!CheckEmail($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('电子邮箱格式错误', -2);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 电子邮箱是否已存在
|
|
|
|
|
if(self::IsExistAccounts($params['accounts'], 'email'))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('电子邮箱已存在', -3);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 用户名
|
|
|
|
|
case 'username' :
|
|
|
|
|
// 用户名格式
|
|
|
|
|
if(!CheckUserName($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户名格式由 字母数字下划线 2~18 个字符', -2);
|
|
|
|
|
}
|
|
|
|
|
break;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 账户是否存在
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-08T10:27:14+0800
|
|
|
|
|
* @param [string] $accounts [账户名称]
|
|
|
|
|
* @param [string] $field [字段名称]
|
|
|
|
|
* @return [boolean] [存在true, 不存在false]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
private static function IsExistAccounts($accounts, $field = 'mobile')
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
$id = Db::name('User')->where(array($field=>$accounts))->value('id');
|
|
|
|
|
return !empty($id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否开启图片验证码校验
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-22T15:48:31+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
* @param [array] $verify_params [配置参数]
|
2019-05-17 17:47:47 +08:00
|
|
|
|
* @param [int] $status [状态 0未开启, 1已开启]
|
2018-12-28 18:58:37 +08:00
|
|
|
|
* @return [object] [图片验证码类对象]
|
|
|
|
|
*/
|
2019-05-17 17:47:47 +08:00
|
|
|
|
private static function IsImaVerify($params, $verify_params, $status = 0)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-05-17 17:47:47 +08:00
|
|
|
|
if($status == 1)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
if(empty($params['verify']))
|
|
|
|
|
{
|
2019-05-17 17:47:47 +08:00
|
|
|
|
return DataReturn('图片验证码为空', -10);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
$verify = new \base\Verify($verify_params);
|
|
|
|
|
if(!$verify->CheckExpire())
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码已过期', -11);
|
|
|
|
|
}
|
|
|
|
|
if(!$verify->CheckCorrect($params['verify']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码错误', -12);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0, $verify);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0);
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 21:50:30 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户登录账户校验
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T10:06:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
private static function UserLoginAccountsCheck($params = [])
|
|
|
|
|
{
|
|
|
|
|
$field = '';
|
|
|
|
|
switch($params['type'])
|
|
|
|
|
{
|
|
|
|
|
// 手机
|
|
|
|
|
case 'sms' :
|
|
|
|
|
// 手机号码格式
|
|
|
|
|
if(!CheckMobile($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码格式错误', -2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 手机号码是否不存在
|
|
|
|
|
if(!self::IsExistAccounts($params['accounts'], 'mobile'))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码不存在', -3);
|
|
|
|
|
}
|
|
|
|
|
$field = 'mobile';
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
// 电子邮箱格式
|
|
|
|
|
if(!CheckEmail($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('电子邮箱格式错误', -2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 电子邮箱是否不存在
|
|
|
|
|
if(!self::IsExistAccounts($params['accounts'], 'email'))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('电子邮箱不存在', -3);
|
|
|
|
|
}
|
|
|
|
|
$field = 'email';
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 用户名
|
|
|
|
|
case 'username' :
|
|
|
|
|
$field = 'username|mobile|email';
|
|
|
|
|
|
|
|
|
|
// 帐号是否不存在
|
|
|
|
|
if(!self::IsExistAccounts($params['accounts'], 'username|mobile|email'))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('登录帐号不存在', -3);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0, $field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户登录-验证码发送
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T10:06:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function LoginVerifySend($params = [])
|
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'accounts',
|
|
|
|
|
'error_msg' => '账号不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'in',
|
|
|
|
|
'key_name' => 'type',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_login_type_list'), 'value'),
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'error_msg' => '登录类型有误',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-30 18:54:21 +08:00
|
|
|
|
// 是否开启用户登录
|
2021-03-04 21:50:30 +08:00
|
|
|
|
if(!in_array($params['type'], MyC('home_user_login_type', [], true)))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('暂时关闭登录', -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码基础参数
|
|
|
|
|
$verify_params = [
|
|
|
|
|
'key_prefix' => 'user_login',
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
|
|
|
|
'interval_time' => MyC('common_verify_interval_time'),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// 是否开启图片验证码
|
|
|
|
|
$verify = self::IsImaVerify($params, $verify_params, MyC('common_img_verify_state'));
|
|
|
|
|
if($verify['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $verify;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 账户校验
|
|
|
|
|
$ac = self::UserLoginAccountsCheck($params);
|
|
|
|
|
if($ac['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ac;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码基础参数 key
|
|
|
|
|
$verify_params['key_prefix'] = 'user_login_'.md5($params['accounts']);
|
|
|
|
|
|
|
|
|
|
// 发送验证码
|
|
|
|
|
$code = GetNumberCode(4);
|
|
|
|
|
switch($params['type'])
|
|
|
|
|
{
|
|
|
|
|
// 短信
|
|
|
|
|
case 'sms' :
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
$status = $obj->SendCode($params['accounts'], $code, MyC('home_sms_login_template'));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
$email_params = array(
|
|
|
|
|
'email' => $params['accounts'],
|
|
|
|
|
'content' => MyC('home_email_login_template'),
|
|
|
|
|
'title' => MyC('home_site_name').' - 用户登录',
|
|
|
|
|
'code' => $code,
|
|
|
|
|
);
|
|
|
|
|
$status = $obj->SendHtml($email_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 默认
|
|
|
|
|
default :
|
|
|
|
|
return DataReturn('该类型不支持验证码发送', -2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 状态
|
|
|
|
|
if($status)
|
|
|
|
|
{
|
|
|
|
|
// 清除验证码
|
|
|
|
|
if(isset($verify['data']) && is_object($verify['data']))
|
|
|
|
|
{
|
|
|
|
|
$verify['data']->Remove();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return DataReturn('发送成功', 0);
|
|
|
|
|
} else {
|
|
|
|
|
return DataReturn('发送失败'.'['.$obj->error.']', -100);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户注册-验证码发送
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T10:06:29+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function RegVerifySend($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'accounts',
|
|
|
|
|
'error_msg' => '账号不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
2019-05-16 18:42:22 +08:00
|
|
|
|
'checked_type' => 'in',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'key_name' => 'type',
|
2021-08-14 17:17:45 +08:00
|
|
|
|
'checked_data' => array_column(MyConst('common_user_reg_type_list'), 'value'),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'error_msg' => '注册类型有误',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 是否开启用户注册
|
2021-03-04 21:50:30 +08:00
|
|
|
|
if(!in_array($params['type'], MyC('home_user_reg_type', [], true)))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-12-26 13:18:26 +08:00
|
|
|
|
return DataReturn('暂时关闭用户注册', -1);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 验证码基础参数
|
|
|
|
|
$verify_params = [
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'key_prefix' => 'user_reg',
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
|
|
|
|
'interval_time' => MyC('common_verify_interval_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 是否开启图片验证码
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$verify = self::IsImaVerify($params, $verify_params, MyC('common_img_verify_state'));
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if($verify['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $verify;
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-16 18:42:22 +08:00
|
|
|
|
// 账户校验
|
|
|
|
|
$ret = self::UserRegAccountsCheck($params);
|
|
|
|
|
if($ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 验证码基础参数 key
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$verify_params['key_prefix'] = 'user_reg_'.md5($params['accounts']);
|
2020-03-10 18:03:39 +08:00
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 发送验证码
|
2019-08-05 23:47:02 +08:00
|
|
|
|
$code = GetNumberCode(4);
|
2020-03-10 18:03:39 +08:00
|
|
|
|
switch($params['type'])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 短信
|
|
|
|
|
case 'sms' :
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
$status = $obj->SendCode($params['accounts'], $code, MyC('home_sms_user_reg'));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
$email_params = array(
|
|
|
|
|
'email' => $params['accounts'],
|
|
|
|
|
'content' => MyC('home_email_user_reg'),
|
|
|
|
|
'title' => MyC('home_site_name').' - 用户注册',
|
|
|
|
|
'code' => $code,
|
|
|
|
|
);
|
|
|
|
|
$status = $obj->SendHtml($email_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 默认
|
|
|
|
|
default :
|
|
|
|
|
return DataReturn('该类型不支持验证码发送', -2);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 状态
|
|
|
|
|
if($status)
|
|
|
|
|
{
|
|
|
|
|
// 清除验证码
|
|
|
|
|
if(isset($verify['data']) && is_object($verify['data']))
|
|
|
|
|
{
|
|
|
|
|
$verify['data']->Remove();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return DataReturn('发送成功', 0);
|
|
|
|
|
} else {
|
|
|
|
|
return DataReturn('发送失败'.'['.$obj->error.']', -100);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 密码找回验证码发送
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T17:35:03+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function ForgetPwdVerifySend($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 参数
|
|
|
|
|
if(empty($params['accounts']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('参数错误', -10);
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 验证码基础参数
|
|
|
|
|
$verify_params = [
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'key_prefix' => 'user_forget',
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
|
|
|
|
'interval_time' => MyC('common_verify_interval_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 是否开启图片验证码
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$verify = self::IsImaVerify($params, $verify_params, MyC('common_img_verify_state'));
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if($verify['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $verify;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 账户是否存在,并返回账户格式类型
|
2019-05-16 18:42:22 +08:00
|
|
|
|
$ret = self::UserForgetAccountsCheck($params['accounts']);
|
|
|
|
|
if($ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 验证码基础参数 key
|
2021-03-04 21:50:30 +08:00
|
|
|
|
$verify_params['key_prefix'] = 'user_forget_'.md5($params['accounts']);
|
2020-03-10 18:03:39 +08:00
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 验证码
|
2019-08-05 23:47:02 +08:00
|
|
|
|
$code = GetNumberCode(4);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 账户字段类型
|
|
|
|
|
switch($ret['data'])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 手机
|
|
|
|
|
case 'mobile' :
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
$status = $obj->SendCode($params['accounts'], $code, MyC('home_sms_user_forget_pwd'));
|
|
|
|
|
break;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
$email_params = [
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'email' => $params['accounts'],
|
|
|
|
|
'content' => MyC('home_email_user_forget_pwd'),
|
|
|
|
|
'title' => MyC('home_site_name').' - '.'密码找回',
|
|
|
|
|
'code' => $code,
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
|
|
|
|
$status = $obj->SendHtml($email_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 默认
|
|
|
|
|
default :
|
|
|
|
|
return DataReturn('手机/邮箱格式有误', -1);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 状态
|
|
|
|
|
if($status)
|
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 清除图片验证码
|
|
|
|
|
if(isset($verify) && isset($verify['data']) && is_object($verify['data']))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
$verify['data']->Remove();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return DataReturn('发送成功', 0);
|
|
|
|
|
} else {
|
|
|
|
|
return DataReturn('发送失败'.'['.$obj->error.']', -100);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* [UserForgetAccountsCheck 帐号校验]
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T17:59:53+0800
|
|
|
|
|
* @param [string] $accounts [账户名称]
|
|
|
|
|
* @return [string] [账户字段 mobile, email]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
private static function UserForgetAccountsCheck($accounts)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
if(CheckMobile($accounts))
|
|
|
|
|
{
|
2019-01-17 00:37:20 +08:00
|
|
|
|
if(!self::IsExistAccounts($accounts, 'mobile'))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码不存在', -3);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0, 'mobile');
|
|
|
|
|
} else if(CheckEmail($accounts))
|
|
|
|
|
{
|
2019-01-17 00:37:20 +08:00
|
|
|
|
if(!self::IsExistAccounts($accounts, 'email'))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
return DataReturn('电子邮箱不存在', -3);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0, 'email');
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('手机/邮箱格式有误', -4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 密码找回
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2017-03-10T17:35:03+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function ForgetPwd($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'accounts',
|
|
|
|
|
'error_msg' => '账号不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'pwd',
|
|
|
|
|
'error_msg' => '密码不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'verify',
|
|
|
|
|
'error_msg' => '验证码不能为空',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 账户是否存在
|
2019-01-17 00:37:20 +08:00
|
|
|
|
$ret = self::UserForgetAccountsCheck($params['accounts']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if($ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码校验
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify_params = [
|
2021-03-04 21:50:30 +08:00
|
|
|
|
'key_prefix' => 'user_forget_'.md5($params['accounts']),
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
|
|
|
|
'interval_time' => MyC('common_verify_interval_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
|
|
|
|
switch($ret['data'])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 手机
|
|
|
|
|
case 'mobile' :
|
|
|
|
|
$obj = new \base\Sms($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 邮箱
|
|
|
|
|
case 'email' :
|
|
|
|
|
$obj = new \base\Email($verify_params);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 默认
|
|
|
|
|
default :
|
|
|
|
|
return DataReturn('手机/邮箱格式有误', -1);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2020-03-10 18:03:39 +08:00
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 是否已过期
|
|
|
|
|
if(!$obj->CheckExpire())
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码已过期', -10);
|
|
|
|
|
}
|
|
|
|
|
// 是否正确
|
|
|
|
|
if(!$obj->CheckCorrect($params['verify']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码错误', -11);
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-04 11:14:03 +08:00
|
|
|
|
// 获取用户信息
|
|
|
|
|
$user = Db::name('User')->where([$ret['data']=>$params['accounts']])->find();
|
|
|
|
|
if(empty($user))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-04-04 11:14:03 +08:00
|
|
|
|
return DataReturn('用户信息不存在', -12);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2019-04-04 11:14:03 +08:00
|
|
|
|
|
|
|
|
|
// 密码修改
|
|
|
|
|
$ret = SafetyService::UserLoginPwdUpdate($params['accounts'], $user['id'], $params['pwd']);
|
2020-06-03 13:38:13 +08:00
|
|
|
|
if($ret['code'] == 0)
|
2019-04-04 11:14:03 +08:00
|
|
|
|
{
|
2020-03-10 18:03:39 +08:00
|
|
|
|
// 清除验证码
|
2020-06-03 13:38:13 +08:00
|
|
|
|
if(isset($obj) && is_object($obj))
|
|
|
|
|
{
|
|
|
|
|
$obj->Remove();
|
|
|
|
|
}
|
2019-04-04 11:14:03 +08:00
|
|
|
|
return DataReturn('操作成功', 0);
|
|
|
|
|
}
|
|
|
|
|
return $ret;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户资料保存
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-12-04
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function PersonalSave($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'length',
|
|
|
|
|
'checked_data' => '2,16',
|
|
|
|
|
'key_name' => 'nickname',
|
|
|
|
|
'error_msg' => '昵称 2~16 个字符之间',
|
|
|
|
|
],
|
|
|
|
|
[
|
2019-01-23 10:53:24 +08:00
|
|
|
|
'checked_type' => 'isset',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'key_name' => 'birthday',
|
|
|
|
|
'error_msg' => '请填写生日',
|
|
|
|
|
],
|
|
|
|
|
[
|
2019-01-23 10:53:24 +08:00
|
|
|
|
'checked_type' => 'in',
|
|
|
|
|
'checked_data' => [0,1,2],
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'key_name' => 'gender',
|
2019-01-23 10:53:24 +08:00
|
|
|
|
'error_msg' => '性别选择有误',
|
2018-12-28 18:58:37 +08:00
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'user',
|
|
|
|
|
'error_msg' => '用户信息有误',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新数据库
|
|
|
|
|
$data = [
|
2019-01-23 10:53:24 +08:00
|
|
|
|
'birthday' => empty($params['birthday']) ? '' : strtotime($params['birthday']),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'nickname' => $params['nickname'],
|
|
|
|
|
'gender' => intval($params['gender']),
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
|
|
|
|
if(Db::name('User')->where(array('id'=>$params['user']['id']))->update($data))
|
|
|
|
|
{
|
|
|
|
|
// 更新用户session数据
|
2019-01-17 00:37:20 +08:00
|
|
|
|
self::UserLoginRecord($params['user']['id']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
return DataReturn('编辑成功', 0);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('编辑失败或数据未改变', -100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户授权数据
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-11-06
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [用户数据]
|
|
|
|
|
* @param [string] $field [平台字段名称]
|
|
|
|
|
*/
|
2019-01-17 00:37:20 +08:00
|
|
|
|
public static function AuthUserProgram($params, $field)
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2019-06-28 16:18:04 +08:00
|
|
|
|
// 用户信息
|
2018-12-28 18:58:37 +08:00
|
|
|
|
$data = [
|
|
|
|
|
$field => $params['openid'],
|
2021-01-07 12:45:44 +08:00
|
|
|
|
'nickname' => empty($params['nickname']) ? '' : $params['nickname'],
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'avatar' => empty($params['avatar']) ? '' : $params['avatar'],
|
2019-06-28 16:18:04 +08:00
|
|
|
|
'gender' => empty($params['gender']) ? 0 : intval($params['gender']),
|
2018-12-28 18:58:37 +08:00
|
|
|
|
'province' => empty($params['province']) ? '' : $params['province'],
|
|
|
|
|
'city' => empty($params['city']) ? '' : $params['city'],
|
2020-09-20 20:00:58 +08:00
|
|
|
|
'mobile' => empty($params['mobile']) ? '' : $params['mobile'],
|
2019-06-28 16:18:04 +08:00
|
|
|
|
'referrer' => isset($params['referrer']) ? $params['referrer'] : 0,
|
2018-12-28 18:58:37 +08:00
|
|
|
|
];
|
2019-10-04 17:47:01 +08:00
|
|
|
|
|
2020-09-20 23:26:30 +08:00
|
|
|
|
// 是否一键登录
|
|
|
|
|
$is_onekey_mobile_bind = isset($params['is_onekey_mobile_bind']) && $params['is_onekey_mobile_bind'] == 1 ? 1 : 0;
|
|
|
|
|
|
2019-10-31 15:34:16 +08:00
|
|
|
|
// 用户信息处理
|
2019-06-29 14:36:20 +08:00
|
|
|
|
$user = self::AppUserInfoHandle(null, $field, $params['openid']);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
2021-05-19 15:10:00 +08:00
|
|
|
|
// 用户状态
|
|
|
|
|
if($user['status'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户待审核', -301);
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-20 23:26:30 +08:00
|
|
|
|
// 如果是一键登录、如当前用户不存在手机号码则绑定
|
|
|
|
|
if(empty($user['mobile']) && !empty($data['mobile']) && $is_onekey_mobile_bind == 1)
|
|
|
|
|
{
|
|
|
|
|
// 手机号码不存在则绑定到当前账号下
|
|
|
|
|
$temp = self::AppUserInfoHandle(null, 'mobile', $data['mobile']);
|
|
|
|
|
if(empty($temp))
|
|
|
|
|
{
|
|
|
|
|
$upd_data = [
|
|
|
|
|
'mobile' => $data['mobile'],
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
|
|
|
|
if(Db::name('User')->where(['id'=>$user['id']])->update($upd_data))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('绑定成功', 0, self::AppUserInfoHandle($user['id']));
|
|
|
|
|
}
|
2021-05-19 15:10:00 +08:00
|
|
|
|
} else {
|
|
|
|
|
if($user['id'] != $temp['id'])
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机已绑定其他帐号', -1);
|
|
|
|
|
}
|
2020-09-20 23:26:30 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-29 14:36:20 +08:00
|
|
|
|
return DataReturn('授权成功', 0, $user);
|
2019-06-28 16:18:04 +08:00
|
|
|
|
} else {
|
2021-05-19 15:10:00 +08:00
|
|
|
|
// 是否需要添加用户
|
|
|
|
|
$is_insert_user = false;
|
|
|
|
|
|
2020-02-12 12:12:43 +08:00
|
|
|
|
// 用户unionid
|
|
|
|
|
$unionid = self::UserUnionidHandle($params);
|
|
|
|
|
if(!empty($unionid['field']) && !empty($unionid['value']))
|
2019-11-03 00:17:51 +08:00
|
|
|
|
{
|
2020-02-12 12:12:43 +08:00
|
|
|
|
// unionid字段是否存在用户
|
2020-09-20 20:00:58 +08:00
|
|
|
|
$user_unionid = self::AppUserInfoHandle(null, $unionid['field'], $unionid['value']);
|
2020-02-12 12:12:43 +08:00
|
|
|
|
if(!empty($user_unionid))
|
2019-11-03 00:17:51 +08:00
|
|
|
|
{
|
2021-05-19 15:10:00 +08:00
|
|
|
|
// 用户状态
|
|
|
|
|
if($user_unionid['status'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户待审核', -301);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-12 12:12:43 +08:00
|
|
|
|
// openid绑定
|
2020-09-20 23:26:30 +08:00
|
|
|
|
$upd_data = [
|
|
|
|
|
$field => $params['openid'],
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// 如果是一键登录、如当前用户不存在手机号码则绑定
|
2021-05-19 15:10:00 +08:00
|
|
|
|
if(empty($user_unionid['mobile']) && !empty($data['mobile']) && $is_onekey_mobile_bind == 1)
|
2020-09-20 23:26:30 +08:00
|
|
|
|
{
|
|
|
|
|
// 手机号码不存在则绑定到当前账号下
|
|
|
|
|
$temp = self::AppUserInfoHandle(null, 'mobile', $data['mobile']);
|
|
|
|
|
if(empty($temp))
|
|
|
|
|
{
|
|
|
|
|
$upd_data['mobile'] = $data['mobile'];
|
2021-05-19 15:10:00 +08:00
|
|
|
|
} else {
|
|
|
|
|
if($user_unionid['id'] != $temp['id'])
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机已绑定其他帐号', -1);
|
|
|
|
|
}
|
2020-09-20 23:26:30 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(Db::name('User')->where(['id'=>$user_unionid['id']])->update($upd_data))
|
2019-11-03 00:17:51 +08:00
|
|
|
|
{
|
2020-09-20 23:26:30 +08:00
|
|
|
|
return DataReturn('绑定成功', 0, self::AppUserInfoHandle($user_unionid['id']));
|
2019-11-03 00:17:51 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-02-12 12:12:43 +08:00
|
|
|
|
|
|
|
|
|
// 如果用户不存在数据库中,则unionid放入用户data中
|
|
|
|
|
$data[$unionid['field']] = $unionid['value'];
|
2019-11-03 00:17:51 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-29 13:39:45 +08:00
|
|
|
|
// 不强制绑定手机则写入用户信息
|
|
|
|
|
if(intval(MyC('common_user_is_mandatory_bind_mobile')) != 1)
|
2019-06-28 16:18:04 +08:00
|
|
|
|
{
|
2021-05-19 15:10:00 +08:00
|
|
|
|
$is_insert_user = true;
|
2020-09-20 20:00:58 +08:00
|
|
|
|
} else {
|
|
|
|
|
// 强制绑定手机号码、是否一键获取操作绑定
|
2020-09-20 23:26:30 +08:00
|
|
|
|
if($is_onekey_mobile_bind == 1 && !empty($data['mobile']))
|
2020-09-20 20:00:58 +08:00
|
|
|
|
{
|
|
|
|
|
// 如果手机号码存在则直接绑定openid
|
|
|
|
|
// 不存在添加,存在更新openid
|
|
|
|
|
$user = self::AppUserInfoHandle(null, 'mobile', $data['mobile']);
|
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
|
|
|
|
$upd_data = [
|
|
|
|
|
$field => $params['openid'],
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
2021-05-19 15:10:00 +08:00
|
|
|
|
if(!empty($unionid['field']) && !empty($unionid['value']))
|
|
|
|
|
{
|
|
|
|
|
$upd_data[$unionid['field']] = $unionid['value'];
|
|
|
|
|
}
|
2020-09-20 20:00:58 +08:00
|
|
|
|
if(Db::name('User')->where(['id'=>$user['id']])->update($upd_data))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('绑定成功', 0, self::AppUserInfoHandle($user['id']));
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2021-05-19 15:10:00 +08:00
|
|
|
|
$is_insert_user = true;
|
2020-09-20 20:00:58 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-06-28 16:18:04 +08:00
|
|
|
|
}
|
2021-05-19 15:10:00 +08:00
|
|
|
|
|
|
|
|
|
// 添加用户
|
|
|
|
|
if($is_insert_user)
|
|
|
|
|
{
|
|
|
|
|
// 是否需要审核
|
|
|
|
|
$common_register_is_enable_audit = MyC('common_register_is_enable_audit', 0);
|
|
|
|
|
$data['status'] = ($common_register_is_enable_audit == 1) ? 3 : 0;
|
|
|
|
|
|
|
|
|
|
// 添加用户
|
|
|
|
|
$ret = self::UserInsert($data, $params);
|
|
|
|
|
if($ret['code'] == 0)
|
|
|
|
|
{
|
|
|
|
|
// 是否需要审核
|
|
|
|
|
if($common_register_is_enable_audit == 1)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户等待审核中', -110);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('授权成功', 0, self::AppUserInfoHandle($ret['data']['user_id']));
|
|
|
|
|
}
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2019-06-29 14:36:20 +08:00
|
|
|
|
return DataReturn('授权成功', 0, self::AppUserInfoHandle(null, null, null, $data));
|
2019-06-29 13:39:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-21 23:47:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户openid绑定
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-06-21
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
* @param [string] $openid [openid]
|
|
|
|
|
* @param [string] $field [openid 字段]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserOpenidBind($user_id, $openid, $field)
|
|
|
|
|
{
|
|
|
|
|
$data = [
|
|
|
|
|
$field => $openid,
|
|
|
|
|
'upd_time' => time(),
|
|
|
|
|
];
|
|
|
|
|
return Db::name('User')->where(['id'=>$user_id])->update($data);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-30 18:54:21 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户openid处理
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2020-02-11
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserOpenidHandle($params = [])
|
|
|
|
|
{
|
|
|
|
|
$field = null;
|
|
|
|
|
$value = null;
|
|
|
|
|
$fields_arr = array_column(MyConst('common_appmini_type'), 'value');
|
|
|
|
|
foreach($fields_arr as $type)
|
|
|
|
|
{
|
|
|
|
|
$openid = $type.'_openid';
|
|
|
|
|
if(!empty($params[$openid]))
|
|
|
|
|
{
|
|
|
|
|
$field = $openid;
|
|
|
|
|
$value = $params[$openid];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ['field'=>$field, 'value'=>$value];
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-12 12:12:43 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户unionid处理
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2020-02-11
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2021-06-21 23:47:37 +08:00
|
|
|
|
public static function UserUnionidHandle($params = [])
|
2020-02-12 12:12:43 +08:00
|
|
|
|
{
|
|
|
|
|
// 用户unionid列表
|
|
|
|
|
// 微信用户unionid
|
|
|
|
|
// QQ用户unionid
|
|
|
|
|
$field = null;
|
|
|
|
|
$value = null;
|
2021-11-30 18:54:21 +08:00
|
|
|
|
$fields_arr = ['weixin_unionid', 'qq_unionid'];
|
|
|
|
|
foreach($fields_arr as $unionid)
|
2020-02-12 12:12:43 +08:00
|
|
|
|
{
|
|
|
|
|
if(!empty($params[$unionid]))
|
|
|
|
|
{
|
|
|
|
|
$field = $unionid;
|
|
|
|
|
$value = $params[$unionid];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ['field'=>$field, 'value'=>$value];
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-29 13:39:45 +08:00
|
|
|
|
/**
|
|
|
|
|
* app用户信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-11-06
|
|
|
|
|
* @desc description
|
2019-06-29 14:36:20 +08:00
|
|
|
|
* @param [int] $user_id [指定用户id]
|
2019-06-29 14:03:46 +08:00
|
|
|
|
* @param [string] $where_field [字段名称]
|
|
|
|
|
* @param [string] $where_value [字段值]
|
|
|
|
|
* @param [array] $user [用户信息]
|
2019-06-29 13:39:45 +08:00
|
|
|
|
*/
|
2019-06-29 14:36:20 +08:00
|
|
|
|
public static function AppUserInfoHandle($user_id = null, $where_field = null, $where_value = null, $user = [])
|
2019-06-29 13:39:45 +08:00
|
|
|
|
{
|
2019-06-29 14:03:46 +08:00
|
|
|
|
// 获取用户信息
|
2019-06-29 14:36:20 +08:00
|
|
|
|
if(!empty($user_id))
|
2019-06-29 14:03:46 +08:00
|
|
|
|
{
|
2021-07-03 00:05:00 +08:00
|
|
|
|
$user = self::UserInfo('id', $user_id);
|
2019-06-29 14:36:20 +08:00
|
|
|
|
} elseif(!empty($where_field) && !empty($where_value) && empty($user))
|
|
|
|
|
{
|
2021-07-03 00:05:00 +08:00
|
|
|
|
$user = self::UserInfo($where_field, $where_value);
|
2019-06-29 14:03:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-06-29 13:39:45 +08:00
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
|
|
|
|
// 用户信息处理
|
2021-07-03 00:05:00 +08:00
|
|
|
|
$user = self::UserHandle($user);
|
2019-06-29 13:39:45 +08:00
|
|
|
|
|
|
|
|
|
// 是否强制绑定手机号码
|
2019-06-29 15:11:53 +08:00
|
|
|
|
$user['is_mandatory_bind_mobile'] = intval(MyC('common_user_is_mandatory_bind_mobile'));
|
|
|
|
|
|
2019-06-29 15:23:49 +08:00
|
|
|
|
// 基础处理
|
2019-06-29 15:11:53 +08:00
|
|
|
|
if(isset($user['id']))
|
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 非token数据库校验,则重新生成token更新到数据库
|
|
|
|
|
if($where_field != 'token')
|
2019-06-29 15:23:49 +08:00
|
|
|
|
{
|
2021-07-03 00:05:00 +08:00
|
|
|
|
$user = self::UserTokenUpdate($user['id'], $user);
|
2020-01-26 01:05:08 +08:00
|
|
|
|
}
|
2019-06-29 15:11:53 +08:00
|
|
|
|
}
|
2021-05-21 18:26:29 +08:00
|
|
|
|
|
|
|
|
|
// 用户信息钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_app_info_handle';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MyEventTrigger($hook_name, [
|
2021-05-21 18:26:29 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
'where_field' => $where_field,
|
|
|
|
|
'where_value' => $where_value,
|
|
|
|
|
'user' => &$user,
|
|
|
|
|
]);
|
2019-06-29 13:39:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $user;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-03 00:05:00 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户 token更新
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-07-01
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
* @param [array] $user [指定用户信息]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserTokenUpdate($user_id, $user = [])
|
|
|
|
|
{
|
|
|
|
|
// 未指定用户则读取用户信息、并处理数据
|
|
|
|
|
if(empty($user))
|
|
|
|
|
{
|
|
|
|
|
$user = self::UserHandle(self::UserInfo('id', $user_id));
|
|
|
|
|
}
|
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
|
|
|
|
// token生成并存储缓存
|
|
|
|
|
$user['token'] = self::CreatedUserToken($user_id);
|
|
|
|
|
if(Db::name('User')->where(['id'=>$user_id])->update(['token'=>$user['token'], 'upd_time'=>time()]))
|
|
|
|
|
{
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MyCache(MyConfig('shopxo.cache_user_info').$user['token'], $user);
|
2021-07-03 00:05:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// web端用户登录纪录处理
|
|
|
|
|
self::UserLoginRecord($user_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回用户信息
|
|
|
|
|
return $user;
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-27 23:51:19 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户token生成
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-02-26
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
*/
|
|
|
|
|
public static function CreatedUserToken($user_id)
|
|
|
|
|
{
|
|
|
|
|
return md5(md5($user_id.time()).rand(100, 1000000));
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-25 10:54:50 +08:00
|
|
|
|
/**
|
|
|
|
|
* 根据字段获取用户信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-01-25
|
|
|
|
|
* @desc description
|
2019-06-29 14:03:46 +08:00
|
|
|
|
* @param [string] $where_field [字段名称]
|
|
|
|
|
* @param [string] $where_value [字段值]
|
|
|
|
|
* @param [string] $field [指定字段]
|
2019-01-25 10:54:50 +08:00
|
|
|
|
*/
|
2019-06-29 14:03:46 +08:00
|
|
|
|
public static function UserInfo($where_field, $where_value, $field = '*')
|
2019-01-25 10:54:50 +08:00
|
|
|
|
{
|
2019-06-29 14:03:46 +08:00
|
|
|
|
if(empty($where_field) || empty($where_value))
|
2019-03-03 09:10:04 +08:00
|
|
|
|
{
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-29 14:03:46 +08:00
|
|
|
|
return Db::name('User')->where([$where_field=>$where_value, 'is_delete_time'=>0])->field($field)->find();
|
2019-01-25 10:54:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-04-04 11:14:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户添加
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-04-03
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $data [用户添加数据]
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserInsert($data, $params = [])
|
|
|
|
|
{
|
|
|
|
|
// 账号是否存在,以用户名 手机 邮箱 作为唯一
|
|
|
|
|
if(!empty($data['username']))
|
|
|
|
|
{
|
|
|
|
|
$temp = Db::name('User')->where(['username'=>$data['username'], 'is_delete_time'=>0])->find();
|
|
|
|
|
} else if(!empty($data['mobile']))
|
|
|
|
|
{
|
|
|
|
|
$temp = Db::name('User')->where(['mobile'=>$data['mobile'], 'is_delete_time'=>0])->find();
|
|
|
|
|
} else if(!empty($data['email']))
|
|
|
|
|
{
|
|
|
|
|
$temp = Db::name('User')->where(['email'=>$data['email'], 'is_delete_time'=>0])->find();
|
|
|
|
|
}
|
|
|
|
|
if(!empty($temp))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('账号已存在', -10);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-14 21:43:10 +08:00
|
|
|
|
// 用户基础信息处理
|
|
|
|
|
$data = self::UserBaseHandle($data, $params);
|
|
|
|
|
|
2021-11-30 18:54:21 +08:00
|
|
|
|
// 用户openid
|
|
|
|
|
$openid = self::UserOpenidHandle($params);
|
|
|
|
|
if(!empty($openid['field']) && !empty($openid['value']))
|
|
|
|
|
{
|
|
|
|
|
// openid放入用户data中
|
|
|
|
|
$data[$openid['field']] = $openid['value'];
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-12 12:12:43 +08:00
|
|
|
|
// 用户unionid
|
|
|
|
|
$unionid = self::UserUnionidHandle($params);
|
|
|
|
|
if(!empty($unionid['field']) && !empty($unionid['value']))
|
|
|
|
|
{
|
|
|
|
|
// unionid放入用户data中
|
|
|
|
|
$data[$unionid['field']] = $unionid['value'];
|
|
|
|
|
}
|
|
|
|
|
|
2019-06-09 13:13:25 +08:00
|
|
|
|
// 推荐人id
|
2019-06-21 17:51:42 +08:00
|
|
|
|
$data['referrer'] = self::UserReferrerDecrypt($params);
|
2019-06-09 13:13:25 +08:00
|
|
|
|
|
|
|
|
|
// 添加用户
|
2019-06-28 18:07:57 +08:00
|
|
|
|
$data['add_time'] = time();
|
2019-04-04 11:14:03 +08:00
|
|
|
|
$user_id = Db::name('User')->insertGetId($data);
|
|
|
|
|
if($user_id > 0)
|
|
|
|
|
{
|
2019-06-09 13:13:25 +08:00
|
|
|
|
// 清除推荐id
|
|
|
|
|
if(isset($data['referrer']))
|
|
|
|
|
{
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MySession('share_referrer_id', null);
|
2019-06-09 13:13:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
2019-04-04 11:14:03 +08:00
|
|
|
|
// 返回前端html代码
|
|
|
|
|
$body_html = [];
|
|
|
|
|
|
|
|
|
|
// 注册成功后钩子
|
2021-03-04 23:14:21 +08:00
|
|
|
|
$user = Db::name('User')->field('id,username,nickname,mobile,email,gender,avatar,province,city,birthday')->where(['id'=>$user_id])->find();
|
2019-04-04 11:14:03 +08:00
|
|
|
|
$hook_name = 'plugins_service_user_register_end';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2019-04-04 11:14:03 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
'user_id' => $user_id,
|
2021-03-04 23:14:21 +08:00
|
|
|
|
'user' => $user,
|
2019-04-04 11:14:03 +08:00
|
|
|
|
'body_html' => &$body_html,
|
2019-12-02 20:58:24 +08:00
|
|
|
|
]));
|
2019-04-04 11:14:03 +08:00
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 登录返回
|
|
|
|
|
$result = [
|
|
|
|
|
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return DataReturn('添加成功', 0, $result);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('添加失败', -100);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-14 21:43:10 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户基础信息处理、注册绑定的时候处理外部传入的基础信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-11-13
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $data [用户信息]
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserBaseHandle($data, $params)
|
|
|
|
|
{
|
|
|
|
|
if(!empty($params) && is_array($params))
|
|
|
|
|
{
|
|
|
|
|
// 是否存在基信息
|
|
|
|
|
// 参数key => dbkey
|
|
|
|
|
$base_fields = [
|
|
|
|
|
'nickname' => [
|
|
|
|
|
'key' => 'nickname',
|
|
|
|
|
'type' => 'string'
|
|
|
|
|
],
|
|
|
|
|
'avatar' => [
|
|
|
|
|
'key' => 'avatar',
|
|
|
|
|
'type' => 'url'
|
|
|
|
|
],
|
|
|
|
|
'province' => [
|
|
|
|
|
'key' => 'province',
|
|
|
|
|
'type' => 'string'
|
|
|
|
|
],
|
|
|
|
|
'city' => [
|
|
|
|
|
'key' => 'city',
|
|
|
|
|
'type' => 'string'
|
|
|
|
|
],
|
|
|
|
|
'gender' => [
|
|
|
|
|
'key' => 'gender',
|
|
|
|
|
'type' => 'int',
|
|
|
|
|
'isset' => 1
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
foreach($base_fields as $k=>$v)
|
|
|
|
|
{
|
|
|
|
|
if(!empty($params[$k]) || (isset($v['isset']) && isset($params[$k])))
|
|
|
|
|
{
|
|
|
|
|
switch($v['type'])
|
|
|
|
|
{
|
|
|
|
|
// url处理
|
|
|
|
|
case 'url' :
|
|
|
|
|
$params[$k] = str_replace(['&'], ['&'], $params[$k]);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
// 整数
|
|
|
|
|
case 'int' :
|
|
|
|
|
$params[$k] = intval($params[$k]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
$data[$v['key']] = $params[$k];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $data;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
/**
|
2021-03-04 23:14:21 +08:00
|
|
|
|
* app用户手机绑定
|
2018-12-28 18:58:37 +08:00
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-12-27
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2021-03-04 23:14:21 +08:00
|
|
|
|
public static function AppMobileBind($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'mobile',
|
|
|
|
|
'error_msg' => '手机号码不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'verify',
|
|
|
|
|
'error_msg' => '验证码不能为空',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-04 23:14:21 +08:00
|
|
|
|
// 用户手机绑定前校验钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_app_mobile_bind_begin_check';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$ret = EventReturnHandle(MyEventTrigger($hook_name, [
|
2020-12-05 20:35:13 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => &$params,
|
|
|
|
|
]));
|
|
|
|
|
if(isset($ret['code']) && $ret['code'] != 0)
|
|
|
|
|
{
|
|
|
|
|
return $ret;
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-28 18:58:37 +08:00
|
|
|
|
// 手机号码格式
|
|
|
|
|
if(!CheckMobile($params['mobile']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('手机号码格式错误', -2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码校验
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify_params = [
|
2021-03-04 23:14:21 +08:00
|
|
|
|
'key_prefix' => 'user_bind_'.md5($params['mobile']),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
'expire_time' => MyC('common_verify_expire_time')
|
|
|
|
|
];
|
2019-05-17 17:47:47 +08:00
|
|
|
|
$obj = new \base\Sms($verify_params);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 是否已过期
|
|
|
|
|
if(!$obj->CheckExpire())
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码已过期', -10);
|
|
|
|
|
}
|
|
|
|
|
// 是否正确
|
|
|
|
|
if(!$obj->CheckCorrect($params['verify']))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('验证码错误', -11);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 用户更新数据
|
|
|
|
|
$data = [
|
|
|
|
|
'mobile' => $params['mobile'],
|
|
|
|
|
];
|
2019-02-26 17:52:17 +08:00
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 是否小程序请求
|
2021-08-14 17:17:45 +08:00
|
|
|
|
$is_appmini = array_key_exists(APPLICATION_CLIENT_TYPE, MyConst('common_appmini_type'));
|
2019-06-29 00:13:49 +08:00
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 手机号码获取用户信息
|
2020-09-21 10:03:26 +08:00
|
|
|
|
$mobile_user = Db::name('User')->where([
|
2019-06-29 00:23:45 +08:00
|
|
|
|
['mobile', '=', $data['mobile']],
|
|
|
|
|
['is_delete_time', '=', 0],
|
|
|
|
|
])->find();
|
2019-06-29 00:11:00 +08:00
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 额外信息
|
|
|
|
|
if(empty($mobile_user))
|
2019-06-29 00:11:00 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
if(empty($mobile_user['nickname']) && !empty($params['nickname']))
|
2019-06-29 00:11:00 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
$data['nickname'] = $params['nickname'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($mobile_user['avatar']) && !empty($params['avatar']))
|
|
|
|
|
{
|
|
|
|
|
$data['avatar'] = $params['avatar'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($mobile_user['province']) && !empty($params['province']))
|
|
|
|
|
{
|
|
|
|
|
$data['province'] = $params['province'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($mobile_user['city']) && !empty($params['city']))
|
|
|
|
|
{
|
|
|
|
|
$data['city'] = $params['city'];
|
|
|
|
|
}
|
|
|
|
|
if(empty($mobile_user) && isset($params['gender']))
|
|
|
|
|
{
|
|
|
|
|
$data['gender'] = intval($params['gender']);
|
2019-06-29 00:11:00 +08:00
|
|
|
|
}
|
2020-09-21 10:03:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 小程序请求处理
|
|
|
|
|
if($is_appmini)
|
2020-09-21 10:03:26 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// openid必须存在
|
|
|
|
|
$accounts_field = APPLICATION_CLIENT_TYPE.'_openid';
|
|
|
|
|
if(empty($params[$accounts_field]))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户openid不能为空', -20);
|
|
|
|
|
}
|
2019-06-29 00:11:00 +08:00
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// openid数据
|
|
|
|
|
$data[$accounts_field] = $params[$accounts_field];
|
|
|
|
|
|
|
|
|
|
// 小程序请求获取用户信息
|
2021-11-18 10:17:42 +08:00
|
|
|
|
$current_user = Db::name('User')->where([
|
2021-04-20 18:38:23 +08:00
|
|
|
|
[$accounts_field, '=', $params[$accounts_field]],
|
|
|
|
|
['is_delete_time', '=', 0],
|
|
|
|
|
])->find();
|
2021-11-18 10:17:42 +08:00
|
|
|
|
} else {
|
|
|
|
|
// 当前登录用户
|
|
|
|
|
$current_user = self::LoginUserInfo();
|
|
|
|
|
}
|
2021-04-20 18:38:23 +08:00
|
|
|
|
|
2021-11-18 10:17:42 +08:00
|
|
|
|
// 用户是否存在已登录
|
|
|
|
|
if(!empty($current_user))
|
|
|
|
|
{
|
|
|
|
|
// 手机帐号信息是否存在
|
2021-04-20 18:38:23 +08:00
|
|
|
|
if(!empty($mobile_user))
|
|
|
|
|
{
|
2021-11-18 10:17:42 +08:00
|
|
|
|
// id不一致则提示错误
|
|
|
|
|
if($current_user['id'] != $mobile_user['id'])
|
2021-04-20 18:38:23 +08:00
|
|
|
|
{
|
2021-11-18 10:17:42 +08:00
|
|
|
|
return DataReturn('手机已绑定其他账号、请换手机号重试', -50);
|
2021-04-20 18:38:23 +08:00
|
|
|
|
}
|
2021-11-18 10:17:42 +08:00
|
|
|
|
|
|
|
|
|
// 是否与当前帐号的手机号码一致
|
|
|
|
|
if(!empty($current_user['mobile']) && $current_user['mobile'] == $mobile_user['mobile'])
|
2021-04-20 18:38:23 +08:00
|
|
|
|
{
|
2021-11-18 10:17:42 +08:00
|
|
|
|
return DataReturn('请使用新的手机号', -51);
|
2021-04-20 18:38:23 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-11-18 10:17:42 +08:00
|
|
|
|
|
|
|
|
|
// 当前用户赋值手机帐号信息
|
|
|
|
|
$mobile_user = $current_user;
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 不存在添加/则更新
|
2020-09-21 10:03:26 +08:00
|
|
|
|
if(empty($mobile_user))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 如果用户不存在则新增用户状态字段
|
|
|
|
|
// 是否需要审核
|
|
|
|
|
$common_register_is_enable_audit = MyC('common_register_is_enable_audit', 0);
|
|
|
|
|
$data['status'] = ($common_register_is_enable_audit == 1) ? 3 : 0;
|
|
|
|
|
|
|
|
|
|
// 新增用户
|
2019-04-04 11:14:03 +08:00
|
|
|
|
$user_ret = self::UserInsert($data, $params);
|
|
|
|
|
if($user_ret['code'] == 0)
|
|
|
|
|
{
|
|
|
|
|
$user_id = $user_ret['data']['user_id'];
|
|
|
|
|
} else {
|
|
|
|
|
return $user_ret;
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
} else {
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 小程序请求处理
|
|
|
|
|
if($is_appmini)
|
2020-02-12 12:12:43 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 用户unionid
|
|
|
|
|
$unionid = self::UserUnionidHandle($params);
|
|
|
|
|
if(!empty($unionid['field']) && !empty($unionid['value']))
|
2020-02-12 12:12:43 +08:00
|
|
|
|
{
|
2021-04-20 18:38:23 +08:00
|
|
|
|
if(empty($mobile_user[$unionid['field']]))
|
|
|
|
|
{
|
|
|
|
|
// unionid放入用户data中
|
|
|
|
|
$data[$unionid['field']] = $unionid['value'];
|
|
|
|
|
}
|
2020-02-12 12:12:43 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-20 18:38:23 +08:00
|
|
|
|
// 帐号信息更新
|
2018-12-28 18:58:37 +08:00
|
|
|
|
$data['upd_time'] = time();
|
2020-09-21 10:03:26 +08:00
|
|
|
|
if(Db::name('User')->where(['id'=>$mobile_user['id']])->update($data))
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
2020-09-21 10:03:26 +08:00
|
|
|
|
$user_id = $mobile_user['id'];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(isset($user_id) && $user_id > 0)
|
|
|
|
|
{
|
|
|
|
|
// 清除验证码
|
|
|
|
|
$obj->Remove();
|
2019-06-29 14:36:20 +08:00
|
|
|
|
return DataReturn('绑定成功', 0, self::AppUserInfoHandle($user_id));
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
2020-03-10 18:03:39 +08:00
|
|
|
|
return DataReturn('绑定失败', -100);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2021-03-04 23:14:21 +08:00
|
|
|
|
* app用户手机绑定验证码发送
|
2018-12-28 18:58:37 +08:00
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2018-12-27
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
2021-03-04 23:14:21 +08:00
|
|
|
|
public static function AppMobileBindVerifySend($params = [])
|
2018-12-28 18:58:37 +08:00
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'mobile',
|
|
|
|
|
'error_msg' => '手机号码不能为空',
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'fun',
|
|
|
|
|
'key_name' => 'mobile',
|
|
|
|
|
'checked_data' => 'CheckMobile',
|
|
|
|
|
'error_msg' => '手机号码格式错误',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证码公共基础参数
|
2020-03-10 18:03:39 +08:00
|
|
|
|
$verify_params = [
|
2021-03-04 23:14:21 +08:00
|
|
|
|
'key_prefix' => 'user_bind_'.md5($params['mobile']),
|
|
|
|
|
'expire_time' => MyC('common_verify_expire_time'),
|
2020-06-03 13:38:13 +08:00
|
|
|
|
'interval_time' => MyC('common_verify_interval_time'),
|
2020-03-10 18:03:39 +08:00
|
|
|
|
];
|
2018-12-28 18:58:37 +08:00
|
|
|
|
|
|
|
|
|
// 发送验证码
|
2019-05-17 17:47:47 +08:00
|
|
|
|
$obj = new \base\Sms($verify_params);
|
2019-08-05 23:47:02 +08:00
|
|
|
|
$code = GetNumberCode(4);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
$status = $obj->SendCode($params['mobile'], $code, MyC('home_sms_user_mobile_binding'));
|
|
|
|
|
|
|
|
|
|
// 状态
|
|
|
|
|
if($status)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('发送成功', 0);
|
|
|
|
|
}
|
2020-03-10 18:03:39 +08:00
|
|
|
|
return DataReturn('发送失败'.'['.$obj->error.']', -100);
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-12-07 18:16:37 +08:00
|
|
|
|
/**
|
|
|
|
|
* 根据token获取用户信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2021-12-06
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function TokenUserinfo($params = [])
|
|
|
|
|
{
|
|
|
|
|
// 数据验证
|
|
|
|
|
$p = [
|
|
|
|
|
[
|
|
|
|
|
'checked_type' => 'empty',
|
|
|
|
|
'key_name' => 'token',
|
|
|
|
|
'error_msg' => 'token不能为空',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$ret = ParamsChecked($params, $p);
|
|
|
|
|
if($ret !== true)
|
|
|
|
|
{
|
|
|
|
|
return DataReturn($ret, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取用户信息并处理
|
|
|
|
|
$user = self::UserHandle(self::UserInfo('token', $params['token']));
|
|
|
|
|
if(empty($user))
|
|
|
|
|
{
|
|
|
|
|
return DataReturn('用户信息不存在', -1);
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('success', 0, $user);
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-04 11:14:03 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户退出
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 0.0.1
|
|
|
|
|
* @datetime 2016-12-05T14:31:23+0800
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function Logout($params = [])
|
|
|
|
|
{
|
|
|
|
|
// 用户信息
|
|
|
|
|
$user = self::LoginUserInfo();
|
|
|
|
|
|
|
|
|
|
// 清除session
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MySession(self::$user_login_key, null);
|
2019-04-04 11:14:03 +08:00
|
|
|
|
|
|
|
|
|
// html代码
|
|
|
|
|
$body_html = [];
|
|
|
|
|
|
|
|
|
|
// 用户退出钩子
|
|
|
|
|
$hook_name = 'plugins_service_user_logout_handle';
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MyEventTrigger($hook_name, [
|
2019-04-04 11:14:03 +08:00
|
|
|
|
'hook_name' => $hook_name,
|
|
|
|
|
'is_backend' => true,
|
|
|
|
|
'params' => [],
|
|
|
|
|
'user_id' => isset($user['id']) ? $user['id'] : 0,
|
|
|
|
|
'user' => $user,
|
|
|
|
|
'body_html' => &$body_html,
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// 数据返回
|
|
|
|
|
$result = [
|
|
|
|
|
'body_html' => is_array($body_html) ? implode(' ', $body_html) : $body_html,
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return DataReturn('退出成功', 0, $result);
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-13 18:37:53 +08:00
|
|
|
|
/**
|
|
|
|
|
* 获取用户展示信息
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-05-05
|
|
|
|
|
* @desc description
|
2020-12-07 18:51:13 +08:00
|
|
|
|
* @param [array|int] $user_ids [用户id]
|
2019-06-10 00:54:01 +08:00
|
|
|
|
* @param [array] $user [指定用户信息]
|
2019-05-13 18:37:53 +08:00
|
|
|
|
*/
|
2020-12-21 20:03:35 +08:00
|
|
|
|
public static function GetUserViewInfo($user_ids, $user = [])
|
2019-05-13 18:37:53 +08:00
|
|
|
|
{
|
2019-06-10 00:54:01 +08:00
|
|
|
|
// 是否指定用户信息
|
2020-12-07 18:51:13 +08:00
|
|
|
|
if(empty($user) && !empty($user_ids))
|
2019-06-10 00:54:01 +08:00
|
|
|
|
{
|
2020-12-07 18:51:13 +08:00
|
|
|
|
if(is_array($user_ids))
|
|
|
|
|
{
|
|
|
|
|
$user_ids = array_filter(array_unique($user_ids));
|
|
|
|
|
}
|
|
|
|
|
if(!empty($user_ids))
|
|
|
|
|
{
|
2021-06-03 14:15:24 +08:00
|
|
|
|
$data = Db::name('User')->where(['id'=>$user_ids])->column('username,nickname,mobile,email,avatar,province,city', 'id');
|
2020-12-07 18:51:13 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 数据处理
|
|
|
|
|
if(!empty($data) && is_array($data))
|
|
|
|
|
{
|
|
|
|
|
foreach($data as &$v)
|
|
|
|
|
{
|
|
|
|
|
$v = self::UserHandle($v);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 用户id是否数组
|
|
|
|
|
if(is_array($user_ids))
|
|
|
|
|
{
|
|
|
|
|
$user = isset($data) ? $data : [];
|
|
|
|
|
} else {
|
|
|
|
|
$user = (!empty($data) && array_key_exists($user_ids, $data)) ? $data[$user_ids] : [];
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2021-08-11 17:30:06 +08:00
|
|
|
|
if(!empty($user))
|
|
|
|
|
{
|
|
|
|
|
$user = self::UserHandle($user);
|
|
|
|
|
}
|
2019-06-10 00:54:01 +08:00
|
|
|
|
}
|
2019-05-13 18:37:53 +08:00
|
|
|
|
|
|
|
|
|
return $user;
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-17 17:47:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* 用户登录,密码找回左侧数据
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-05-17
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserEntranceLeftData($params = [])
|
|
|
|
|
{
|
|
|
|
|
// 从缓存获取
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$data = empty($params['cache_key']) ? [] : MyCache($params['cache_key']);
|
2019-05-17 17:47:47 +08:00
|
|
|
|
|
|
|
|
|
// 获取数据
|
|
|
|
|
if(empty($data))
|
|
|
|
|
{
|
|
|
|
|
$data = [];
|
|
|
|
|
if(!empty($params['left_key']))
|
|
|
|
|
{
|
|
|
|
|
for($i=1; $i<=3; $i++)
|
|
|
|
|
{
|
|
|
|
|
$images_value = MyC('home_site_user_'.$params['left_key'].'_ad'.$i.'_images');
|
|
|
|
|
$url_value = MyC('home_site_user_'.$params['left_key'].'_ad'.$i.'_url');
|
|
|
|
|
$bg_color_value = MyC('home_site_user_'.$params['left_key'].'_ad'.$i.'_bg_color');
|
|
|
|
|
if(!empty($images_value))
|
|
|
|
|
{
|
|
|
|
|
$data[] = [
|
|
|
|
|
'images' => ResourcesService::AttachmentPathViewHandle($images_value),
|
|
|
|
|
'url' => empty($url_value) ? null : $url_value,
|
|
|
|
|
'bg_color' => empty($bg_color_value) ? null : $bg_color_value,
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 存储缓存
|
|
|
|
|
if(!empty($params['cache_key']))
|
|
|
|
|
{
|
2021-07-18 23:42:10 +08:00
|
|
|
|
MyCache($params['cache_key'], $data);
|
2019-05-17 17:47:47 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return DataReturn('操作成功', 0, $data);
|
|
|
|
|
}
|
2019-06-21 17:51:42 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户推荐id加密
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-06-21
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [int] $user_id [用户id]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserReferrerEncryption($user_id)
|
|
|
|
|
{
|
|
|
|
|
return StrToAscii(base64_encode($user_id));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用户推荐id解密
|
|
|
|
|
* @author Devil
|
|
|
|
|
* @blog http://gong.gg/
|
|
|
|
|
* @version 1.0.0
|
|
|
|
|
* @date 2019-06-21
|
|
|
|
|
* @desc description
|
|
|
|
|
* @param [array] $params [输入参数, referrer 参数用户推荐id]
|
|
|
|
|
*/
|
|
|
|
|
public static function UserReferrerDecrypt($params = [])
|
|
|
|
|
{
|
|
|
|
|
// 推荐人
|
2021-07-18 23:42:10 +08:00
|
|
|
|
$referrer = empty($params['referrer']) ? MySession('share_referrer_id') : $params['referrer'];
|
2019-06-21 17:51:42 +08:00
|
|
|
|
|
|
|
|
|
// 查看用户id是否已加密
|
|
|
|
|
if(preg_match('/[a-zA-Z]/', $referrer))
|
|
|
|
|
{
|
|
|
|
|
$referrer = base64_decode(AsciiToStr($referrer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return intval($referrer);
|
|
|
|
|
}
|
2018-12-28 18:58:37 +08:00
|
|
|
|
}
|
|
|
|
|
?>
|