606 lines
17 KiB
PHP
606 lines
17 KiB
PHP
<?php
|
||
// +------------------------------------------------+
|
||
// |http://www.cjango.com |
|
||
// +------------------------------------------------+
|
||
// | 修复BUG不是一朝一夕的事情,等我喝醉了再说吧! |
|
||
// +------------------------------------------------+
|
||
// | Author: 小陈叔叔 <Jason.Chen> |
|
||
// +------------------------------------------------+
|
||
namespace app\common\service;
|
||
|
||
use app\common\model\Member as MemberModel;
|
||
use app\common\model\MemberInfo as MemberInfoModel;
|
||
use app\common\model\MemberSet as MemberSetModel;
|
||
use app\common\model\Template as TemplateModel;
|
||
use app\common\validate\Member as MemberValidate;
|
||
use app\common\validate\MemberInfo as MemberInfoValidate;
|
||
use think\Config;
|
||
use think\Db;
|
||
use think\Request;
|
||
use think\Session;
|
||
use tools\Crypt;
|
||
|
||
class Member extends _Init
|
||
{
|
||
/**
|
||
* 获取用户信息
|
||
* @param integer 用户id
|
||
* @return object
|
||
*/
|
||
public static function info($uid)
|
||
{
|
||
return MemberInfoModel::get($uid);
|
||
}
|
||
|
||
public static function isBind($uid)
|
||
{
|
||
$user = MemberModel::find($uid);
|
||
if (\tools\Verify::isMobilePhone($user->username)) {
|
||
return true;
|
||
} else {
|
||
return '用户尚未绑定手机号';
|
||
}
|
||
}
|
||
|
||
public static function create($data)
|
||
{
|
||
Db::startTrans();
|
||
try {
|
||
$member = [
|
||
'pid' => $data['pid'],
|
||
'username' => '',
|
||
'password' => Crypt::uMd5('111111'),
|
||
'openid' => $data['openid'],
|
||
];
|
||
$result = MemberModel::create($member);
|
||
$info = [
|
||
'nickname' => $data['nickname'],
|
||
'sex' => $data['sex'],
|
||
'headimgurl' => $data['headimgurl'],
|
||
'city' => $data['city'],
|
||
'province' => $data['province'],
|
||
];
|
||
$result->info()->save($info);
|
||
$account = [
|
||
'price' => 0,
|
||
];
|
||
$result->account()->save($account);
|
||
Db::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 编辑用户资料
|
||
* @param integer 用户id
|
||
* @param array 更新的数据
|
||
* @param string 数据验证的名称
|
||
* @return boolean|string
|
||
*/
|
||
public static function editInfo($uid, $data, $scene = '')
|
||
{
|
||
$validate = new MemberInfoValidate();
|
||
|
||
if (!$validate->scene($scene)->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
|
||
$MemberInfo = self::info($uid);
|
||
|
||
if (MemberInfoModel::update($data, ['uid' => $uid])) {
|
||
if (empty($MemberInfo->$scene)) {
|
||
Account::rule(UID, 'setting');
|
||
}
|
||
return true;
|
||
} else {
|
||
return '更新失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 添加 用户资料
|
||
* @param [type] $user 添加的信息
|
||
*/
|
||
private static function createInfo($user)
|
||
{
|
||
$data = [
|
||
'uid' => $user->id,
|
||
'mobile' => $user->username,
|
||
];
|
||
MemberInfoModel::create($data);
|
||
}
|
||
|
||
/**
|
||
* 注册一个用户
|
||
* @param string $username 用户名
|
||
* @param string $password 密码
|
||
* @param integer $status 初始状态
|
||
* @return [type] 返回结果
|
||
*/
|
||
public static function register($username, $password, $status = null, $pid = 0, $extends = [])
|
||
{
|
||
$status = is_numeric($status) ?: (Config::get('new_member_status') ?: 0);
|
||
$data = [
|
||
'username' => $username,
|
||
'password' => $password,
|
||
'status' => $status,
|
||
'pid' => $pid,
|
||
];
|
||
$validate = new MemberValidate();
|
||
|
||
if (!$validate->scene('register')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
|
||
if (is_array($extends) && !empty($extends)) {
|
||
$data = array_merge($data, $extends);
|
||
}
|
||
|
||
$user = MemberModel::create($data);
|
||
if ($user) {
|
||
Logs::write('注册用户', $data);
|
||
// 自动的注册一个用户资料
|
||
self::createInfo($user);
|
||
Account::create($user->id);
|
||
return true;
|
||
} else {
|
||
return '注册失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 修改密码
|
||
* @param integer $uid 用户编号
|
||
* @param string $old 旧密码
|
||
* @param string $new 新密码
|
||
* @return [type]
|
||
*/
|
||
public static function changePassword($uid, $old, $new, $repass)
|
||
{
|
||
$data = [
|
||
'uid' => $uid,
|
||
'oldpass' => $old,
|
||
'newpass' => $new,
|
||
'repass' => $repass,
|
||
];
|
||
|
||
$validate = new MemberValidate();
|
||
if (!$validate->scene('changepass')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
|
||
return self::updatePassword($uid, $new);
|
||
}
|
||
|
||
/**
|
||
* 更新密码
|
||
* @param [type] $uid 用户id
|
||
* @param [type] $password 更新的密码
|
||
* @return [type] [description]
|
||
*/
|
||
public static function updatePassword($uid, $password)
|
||
{
|
||
$data = [
|
||
'password' => $password,
|
||
];
|
||
|
||
$validate = new MemberValidate();
|
||
|
||
if (!$validate->scene('updatepass')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
|
||
$user = MemberModel::update($data, ['id' => $uid]);
|
||
if ($user) {
|
||
Logs::write('重置密码');
|
||
return true;
|
||
} else {
|
||
return '重置密码失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 用户登录
|
||
* @param [type] $username 用户民
|
||
* @param [type] $password 密码
|
||
* @return [type] 登录的结果
|
||
*/
|
||
public static function login($username, $password)
|
||
{
|
||
$data = [
|
||
'username' => $username,
|
||
'password' => $password,
|
||
];
|
||
|
||
$validate = new MemberValidate();
|
||
if (!$validate->scene('login')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
|
||
$user = MemberModel::where('username', $username)->find();
|
||
|
||
if (!$user) {
|
||
return '用户不存在';
|
||
} elseif ($user->status != 1) {
|
||
return '用户被禁用';
|
||
} elseif ($user->password != Crypt::uMd5($password)) {
|
||
return '密码错误';
|
||
} else {
|
||
// 设置session
|
||
$auth = [
|
||
'uid' => $user->id,
|
||
'username' => $user->username,
|
||
'last_time' => $user->last_time,
|
||
'last_ip' => $user->last_ip,
|
||
];
|
||
|
||
Session::set('user_auth', $auth);
|
||
Session::set('user_auth_sign', Crypt::dataAuthSign($auth));
|
||
// 保存登录记录
|
||
$save = [
|
||
'login' => $user->login + 1,
|
||
'last_time' => time(),
|
||
'last_ip' => Request::instance()->ip(),
|
||
];
|
||
$user->save($save);
|
||
Logs::write('用户登录成功');
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据openid 登录
|
||
* @param [type] $openid [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function openid_login($openid)
|
||
{
|
||
$user = MemberModel::where('openid', $openid)->find();
|
||
if (!$user) {
|
||
return '用户不存在';
|
||
} elseif ($user->status != 1) {
|
||
return '用户被禁用';
|
||
} else {
|
||
// 设置session
|
||
$auth = [
|
||
'uid' => $user->id,
|
||
'username' => $user->username,
|
||
'last_time' => $user->last_time,
|
||
'last_ip' => $user->last_ip,
|
||
];
|
||
|
||
Session::set('user_auth', $auth);
|
||
Session::set('user_auth_sign', Crypt::dataAuthSign($auth));
|
||
// 保存登录记录
|
||
$save = [
|
||
'login' => $user->login + 1,
|
||
'last_time' => time(),
|
||
'last_ip' => Request::instance()->ip(),
|
||
];
|
||
$user->save($save);
|
||
Logs::write('用户登录成功');
|
||
return true;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 退出当前账户
|
||
* @return [type] [description]
|
||
*/
|
||
public static function logout()
|
||
{
|
||
Logs::write('注销登录');
|
||
|
||
Session::delete('user_auth');
|
||
Session::delete('user_auth_sign');
|
||
Session::clear();
|
||
Session::destroy();
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 修改用户状态
|
||
* @param [type] $uid 要修改的用户id
|
||
* @param [type] $status 要修改的状态 正常 禁用
|
||
*/
|
||
public static function status($uid, $status)
|
||
{
|
||
$user = MemberModel::get($uid);
|
||
|
||
if (!$user) {
|
||
return '用户不存在';
|
||
} elseif ($user->save(['status' => $status])) {
|
||
Logs::write('修改状态', ['status' => $status]);
|
||
return true;
|
||
} else {
|
||
return '状态修改失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 用户登录判断
|
||
* @return boolean 返回用户id 失败返回0
|
||
*/
|
||
public static function isLogin()
|
||
{
|
||
$user = Session::get('user_auth');
|
||
if (empty($user)) {
|
||
return 0;
|
||
} else {
|
||
return Session::get('user_auth_sign') == Crypt::dataAuthSign($user) ? $user['uid'] : 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 切换模版
|
||
* @param [type] $uid [description]
|
||
* @param [type] $tpl [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function changeTpl($uid, $tpl)
|
||
{
|
||
if (!TemplateModel::get($tpl)) {
|
||
return '模板不存在';
|
||
}
|
||
if (MemberInfoModel::update(['index_tpl' => $tpl], ['uid' => $uid])) {
|
||
return true;
|
||
} else {
|
||
return '操作失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 绑定微信
|
||
* @param [type] $uid [description]
|
||
* @param [type] $data [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function bindWechat($uid, $data)
|
||
{
|
||
$validate = new MemberValidate();
|
||
|
||
if (!$validate->scene('openid')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
$MemberInfo = self::info($uid);
|
||
$scene = 'openid';
|
||
if (MemberModel::update($data, ['id' => $uid])) {
|
||
if (empty($MemberInfo->$scene)) {
|
||
Account::rule(UID, 'setting');
|
||
}
|
||
return true;
|
||
|
||
} else {
|
||
return '更新失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 解除绑定
|
||
* @param [type] $uid [description]
|
||
* @param [type] $data [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function unBindWechat($uid, $openid)
|
||
{
|
||
$ids = MemberModel::where('openid', $openid)->column('id');
|
||
$data = [
|
||
'openid' => '',
|
||
];
|
||
|
||
$map = [
|
||
'id' => ['in', $ids],
|
||
];
|
||
|
||
if (MemberModel::update($data, $map)) {
|
||
return true;
|
||
} else {
|
||
return '解除绑定失败';
|
||
}
|
||
}
|
||
|
||
protected static $list = [];
|
||
protected static $plist = [];
|
||
/**
|
||
* 获取会员所有上级的数列,管理关系
|
||
* @param [int] $uid [用户ID]
|
||
* @return [array] [用户数组]
|
||
*/
|
||
public static function getSub($uid, $addme = false)
|
||
{
|
||
self::$plist = [];
|
||
self::$list = MemberModel::column('pid', 'id');
|
||
if ($addme) {
|
||
array_push(self::$plist, $uid);
|
||
}
|
||
return self::_getSub($uid);
|
||
}
|
||
|
||
public static function _getSub($uid)
|
||
{
|
||
$puser = self::$list[$uid];
|
||
// dump(self::$plist);
|
||
if ($puser != 0) {
|
||
array_push(self::$plist, $puser);
|
||
self::_getSub($puser);
|
||
}
|
||
return self::$plist;
|
||
}
|
||
|
||
//设置会员或者代理商
|
||
public static function memberSet($uid, $time, $type, $team_id)
|
||
{
|
||
$member = MemberInfoModel::where('uid', $uid)->find();
|
||
$time = strtotime($time);
|
||
$key = 'is_' . $type;
|
||
$name = ($type == 'vip') ? '推广先锋' : '推广代理商';
|
||
|
||
if (!in_array($type, ['vip', 'agent'])) {
|
||
return "类型错误";
|
||
}
|
||
if ($time < time()) {
|
||
return "日期错误,必须大于当前时间";
|
||
}
|
||
|
||
if (!$member) {
|
||
return "没有这个会员";
|
||
} else {
|
||
if ($type == 'vip') {
|
||
if ($member->is_vip == 1 && $member->is_fee == 1) {
|
||
return "这个用户已经是推广先锋了";
|
||
} else {
|
||
$member->save([$type . '_time' => $time, 'is_' . $type => 1, 'is_fee' => 1]);
|
||
}
|
||
} else {
|
||
if ($member->is_agent == 1) {
|
||
return "这个用户已经是推广代理商了";
|
||
} else {
|
||
$member->save([$type . '_time' => $time, 'is_' . $type => 1]);
|
||
}
|
||
}
|
||
$this_user = MemberModel::get($uid);
|
||
$sendtype = ($type == 'vip') ? 1 : 2;
|
||
Tmplmsg::services_opened($this_user, $sendtype);
|
||
$in_data = [
|
||
'type' => $type,
|
||
'end_time' => $time,
|
||
'uid' => $uid,
|
||
'team_id' => $team_id,
|
||
'operator' => UID,
|
||
];
|
||
if (MemberSetModel::create($in_data)) {
|
||
$member->member->save(['empty_' . $type => 1]);
|
||
Logs::write("设置" . $name, array_merge($in_data, ['nickname' => $member->nickname]), UID);
|
||
return true;
|
||
} else {
|
||
$member->save([$type . '_time' => 0, 'is_' . $type => 0]);
|
||
return "设置失败";
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 开通代理赠送会员
|
||
* @param [type] $uid [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function open_vip($uid)
|
||
{
|
||
$member = MemberInfoModel::where('uid', $uid)->find();
|
||
|
||
if (!$member) {
|
||
return "会员不存在";
|
||
}
|
||
|
||
if ($member->is_vip == 1) {
|
||
$member->vip_time = strtotime("+1 year", $member->vip_end_time);
|
||
$member->save();
|
||
} else {
|
||
$member->vip_time = strtotime("+1 year");
|
||
$member->is_vip = 1;
|
||
$member->save();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 绑定手机号
|
||
* @param [type] $data [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function bindMobile($data, $uid)
|
||
{
|
||
$validate = new MemberValidate();
|
||
|
||
if (!$validate->scene('bindmobile')->check($data)) {
|
||
return $validate->getError();
|
||
}
|
||
if ($uid == 276) {
|
||
dump($data);
|
||
dump($uid);
|
||
}
|
||
Db::startTrans();
|
||
try {
|
||
$user = MemberModel::get($uid);
|
||
$user->username = $data['username'];
|
||
$user->save();
|
||
Db::commit();
|
||
$user->info->mobile = $data['username'];
|
||
$user->info->is_vip = 1;
|
||
$user->info->vip_time = time() + 7 * 24 * 3600;
|
||
$user->info->share_mobile = $data['username'];
|
||
$user->info->open_mobile = 1;
|
||
$user->info->save();
|
||
Db::commit();
|
||
// 发送模板消息
|
||
Tmplmsg::opened_7days($user);
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
return '操作失败';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取所有下级
|
||
* @param [type] $uid [description]
|
||
* @return [type] [description]
|
||
*/
|
||
public static function getChilds($uid)
|
||
{
|
||
$member = MemberModel::get($uid);
|
||
if (!$member) {
|
||
return "没有这个会员";
|
||
}
|
||
$chids = $member->childs()->column('id');
|
||
if (!empty($chids)) {
|
||
$one_list = $member->childs;
|
||
$two_list = MemberModel::where('pid', 'in', $chids)->select();
|
||
} else {
|
||
$one_list = [];
|
||
$two_list = [];
|
||
}
|
||
|
||
$data = [
|
||
'one_list' => $one_list,
|
||
'two_list' => $two_list,
|
||
];
|
||
|
||
return $data;
|
||
}
|
||
|
||
//获取推荐网络
|
||
public static function recommend($uid)
|
||
{
|
||
$name = 'name';
|
||
$datas = MemberModel::hasWhere('Info')->column('id,pid,CONCAT(nickname," (",username,") ") as ' . $name);
|
||
$list = \tools\Tree::list2tree($datas, 'id', 'pid', 'children', $uid);
|
||
$user = $datas[$uid];
|
||
$user['children'] = $list;
|
||
return json_encode($user);
|
||
}
|
||
|
||
public static function setParent($data)
|
||
{
|
||
$user = MemberModel::get($data['uid']);
|
||
$parentinfo = MemberModel::get($data['puid']);
|
||
if (!$user) {
|
||
return "没有这个用户";
|
||
} elseif (!$parentinfo) {
|
||
return "没有这个推荐人";
|
||
} elseif ($user->save(['pid' => $data['puid']])) {
|
||
// SysLogs::create(UID, 'edit_member_pid', ['data' => $user]);
|
||
|
||
return true;
|
||
} else {
|
||
return "设置新推荐人失败";
|
||
}
|
||
}
|
||
|
||
}
|