| // +------------------------------------------------+ 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 "设置新推荐人失败"; } } }