diff --git a/application/adminapi/controller/SysSet.php b/application/adminapi/controller/SysSet.php index ec006e8f..1aabfb68 100644 --- a/application/adminapi/controller/SysSet.php +++ b/application/adminapi/controller/SysSet.php @@ -4,6 +4,7 @@ namespace app\adminapi\controller; use app\admin\model\AdminLog; use app\common\controller\adminApi; +use think\Cache; use think\Config; use think\Db; use think\Hook; @@ -95,6 +96,9 @@ class SysSet extends adminApi $data = [ 'key_value'=>$v, ]; + if($k == 'is_maintenance' || $k == 'inside_uid'){ + Cache::rm($k); + } db::name($this->table)->where(['key_title'=>$k])->update($data); } return V(1,"成功"); diff --git a/application/api/controller/Room.php b/application/api/controller/Room.php index b7921412..57367cee 100644 --- a/application/api/controller/Room.php +++ b/application/api/controller/Room.php @@ -7,17 +7,6 @@ use think\Db; class Room extends BaseCom { - //创建房间前的检测 - public function check_create_room() - {return V(1, '可以创建房间'); - //检测用户的签约徒弟 - $signCount = db::name('vs_user_sign')->where(['parent_user_id' => $this->uid ,'end_time' => ['>', time()]] )->count(); - if($signCount < 10){ - $need_sign_num = 10 - $signCount; - return V(0, '还需签约'.$need_sign_num.'人,才能创建房间!'); - } - return V(1, '可以创建房间'); - } //创建房间 diff --git a/application/api/model/Login.php b/application/api/model/Login.php index 05c36fc9..8babe87a 100644 --- a/application/api/model/Login.php +++ b/application/api/model/Login.php @@ -5,7 +5,7 @@ namespace app\api\model; use fast\Http; use think\Db; use think\Model; -use think\facade\Env; +use app\common\library\Token as TokenLib; class Login extends Model { @@ -534,6 +534,8 @@ class Login extends Model }else{ return ['code' => 0, 'msg' => '注销失败', 'data' => null]; } + // 删除这个Token,使其失效 + TokenLib::delete($token); return ['code' => 1, 'msg' => '注销成功', 'data' => null]; }else{ diff --git a/application/api/model/Room.php b/application/api/model/Room.php index 08b18237..816a9c3f 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -11,11 +11,10 @@ use think\Model; class Room extends Model { protected $table = 'fa_vs_room'; - private $redis; public function __construct() { parent::__construct(); - $this->redis = \think\Cache::store('redis')->handler(); + } //创建房间 创建 public function user_create_room($uid, $room_name,$room_cover,$room_intro,$type = 0,$need_apply=1) @@ -649,7 +648,7 @@ class Room extends Model } //进入房间 - public function join_room($user_id, $room_id, $password) { + public function join_rooms($user_id, $room_id, $password) { $room = db::name('vs_room')->where(['id' => $room_id,'apply_status' => ['in',[1,2]]])->find(); if(isset($room['password']) && $user_id != $room['user_id']){ if (empty($password) || $room['password'] != md5($password)) { @@ -657,7 +656,6 @@ class Room extends Model } } - $room = db::name('vs_room')->where(['id' => $room_id,'apply_status' => ['in',[1,2]]])->find(); //K歌模式下获取歌曲信息 $song_pit_list = null; $song_list = null; @@ -1024,6 +1022,328 @@ class Room extends Model } + //房间类型整合 + /* + * return 1:交友/pk(二卡八),2:练歌房(声网点歌),3:亲密拍,4:真爱拍,6:私密房,7:互娱房,9:点唱/歌手房,10:签约房 + */ + public function get_room_type($room_id){ + $room_info = db::name('vs_room')->where('id', $room_id)->field('type_id,label_id')->find(); + if($room_info['type_id'] == 1 && $room_info['label_id'] == 1){ + return 1;//交友/pk(二卡八) + } + if($room_info['type_id'] == 1 && $room_info['label_id'] == 2){ + return 2;//练歌房(声网点歌) + } + if($room_info['type_id'] == 2 && $room_info['label_id'] == 3){ + return 3;//亲密拍 + } + if($room_info['type_id'] == 2 && $room_info['label_id'] == 4){ + return 4;//真爱拍 + } + if($room_info['type_id'] == 6){ + return 6;//私密房 + } + if($room_info['type_id'] == 7){ + return 7;//互娱房 + } + if($room_info['type_id'] == 9){ + return 9;//点唱/歌手房 + } + if($room_info['type_id'] == 10){ + return 10;//签约房 + } + return 0; + } + + + //进入房间 + //房间的信息放入缓存中,房间类型判断单独拿出来重新判断 所有的类型判断的地方使用 + //各种房间类型的具体信息 在各个类型中获取 把下面有获取房间类型中的状态等信息的信息 放到各自的类型中去 这里只根据类型调用相关的就行 + public function join_room($user_id, $room_id, $password) { + //房间基础信息先从缓存获取 + $room = json_decode(Cache::get('room_info_' . $room_id), true); + + if(!$room){ + $room = db::name('vs_room')->where(['id' => $room_id])->find(); + $room['is_use_code'] = 0; + $liang = model('api/Decorate')->user_decorate_detail($room_id,7); + if($liang != $room['room_number']){ + $room['is_use_code'] = 1; + $room['room_number'] = $liang; + } + Cache::set('room_info_' . $room_id, json_encode($room), 7200); + } + + if(isset($room['password']) && $user_id != $room['user_id']){ + if (empty($password) || $room['password'] != md5($password)) { + return ['code' => 0, 'msg' => '密码错误', 'data' => '']; + } + } + + //房主信息 + //先从缓存中获取 + $room_owner = json_decode(Cache::get('room_owner_' . $room_id),true); + if(!$room_owner){ + $room_owner = db::name('user')->where('id', $room['user_id'])->field('id as user_id,user_code,sex,nickname,avatar')->find(); + $room_owner['user_code'] = model('api/Decorate')->user_decorate_detail($room['user_id'],6); + Cache::set('room_owner_' . $room_id, json_encode($room_owner), 7200); + } + + $room_type = $this->get_room_type($room_id); + if($room_type == 0){ + return ['code' => 0, 'msg' => '当前房间类型错误,请联系管理员', 'data' => '']; + } + + //给前端定义返回的数据 + $room_owner = null;//房间拥有者信息 + $cp_users = null;//CP用户信息 + $friend = null;//交友信息 + $singer_info = null;//点唱房内的演唱信息 + $sign_info = null;//签约信息 + //K歌模式下获取歌曲信息 + $song_pit_list = null; + $song_list = null; + $next_song_info = null; + //拍卖模式下获取当前竞拍信息 + $roomauction = null; + $xlh_info['xlh_info'] = model('api/BlindBoxTurntableGift')->get_user_xlh_info($room_id); + $pk_info = $this->room_pk($room_id,$room_type); + + $user_pit = 0; + $pit_list = []; + switch ($room_type) { + case 1: + $pit_list = $this->room_pit($room_id); + $user_pit = db::name('vs_room_pit')->where(['room_id' => $room_id,'user_id' => $user_id])->find(); + break; + case 2://练歌房(声网点歌) + $song = $this->get_song_info($room_id,$user_id); + $song_pit_list = $song['song_pit_list']; + $song_list = $song['song_user_info']; + $next_song_info = $song['nextInfo']; + $user_pit = $song['user_pit']; + $pit_list = $song['pit_list']; + break; + case 4: + case 3://亲密拍,真爱拍 + $roomauction = $this->auction_room($room_id,$user_id); + $pit_list = $roomauction['pit_list']; + $user_pit = $roomauction['user_pit']; + break; + case 6://私密房 + $cp_users = $this->cp_room($room_id,$user_id); + $room_name = ''; + if($cp_users['user_id'] == $user_id){ + $room_name = db::name('user')->where('id', $cp_users['user_id1'])->value('nickname'); + } + if($cp_users['user_id1'] == $user_id){ + $room_name = db::name('user')->where('id', $cp_users['user_id'])->value('nickname'); + } + $room['room_name'] = '我 ❤️ '.$room_name; + break; + case 7://互娱房 + $friend = $this->getRoomFriendData($room_id); + //交友状态 交友进行到第几步 1等待邂逅 2心动连线 3牵手良缘 + $friend['step'] = db::name('vs_room')->where('id', $room_id)->value('step'); + $pit_list = $this->room_pit($room_id); + $user_pit = db::name('vs_room_pit')->where(['room_id' => $room_id,'user_id' => $user_id])->find(); + break; + case 9://点唱房内的演唱信息 + $singer_info = $this->getSingInfo($room_id); + $pit_list = $this->room_pit($room_id); + $user_pit = db::name('vs_room_pit')->where(['room_id' => $room_id,'user_id' => $user_id])->find(); + break; + case 10://签约房间信息 + $room_sign = db::name('vs_room_sign')->where('room_id', $room_id)->order('id desc')->find(); + if($room_sign){ + $sign_info = [ + 'sign_id' => $room_sign['id'], + 'sign_status' => $room_sign['sign_type'], + 'sign_day' => $room_sign['sign_day'], + 'current_body_value' => db::name('user')->where('id', $room_sign['sign_user_id'])->value('market_value'), + 'end_time' => $room_sign['end_time'] + ]; + }else{ + $sign_info = [ + 'sign_id' => 0, + 'sign_status' => 0, + 'sign_day' => 0, + 'current_body_value' => 0, + 'end_time' => 0 + ]; + } + $pit_list = $this->room_pit($room_id); + $user_pit = db::name('vs_room_pit')->where(['room_id' => $room_id,'user_id' => $user_id])->find(); + break; + } + + //记录用户进入房间 + $is_join = db::name('vs_room_visitor')->where(['room_id' => $room_id, 'user_id' => $user_id])->find(); + if (!$is_join) { + db::name('vs_room_visitor')->insert(['room_id' => $room_id, 'user_id' => $user_id, 'createtime' => time()]); + }else{ + db::name('vs_room_visitor')->where('id', $is_join['id'])->update(['createtime' => time(),'is_online' => 1]); + } + + //记录用户最后进入的是哪个房间 + db::name('user_data')->where('user_id', $user_id)->update(['room_id' => $room_id]); + + //记录用户访问记录 + if($user_id != $room['user_id']){ + model('api/User')->add_user_visit_log(2,$user_id, $room_id); + } + + //进入房间保持心跳 + $is_xintiao = db::name('vs_room_heartbeat')->where(['user_id' => $user_id, 'room_id' => $room_id])->find(); + if($is_xintiao){ + db::name('vs_room_heartbeat')->where('id' , $is_xintiao['id'])->update(['updatetime' => time()]); + }else{ + db::name('vs_room_heartbeat')->insert([ + 'user_id' => $user_id, + 'room_id' => $room_id, + 'createtime' => time(), + 'updatetime' => time() + ]); + } + + //头条 + $headline = db::name('vs_headline')->where('end_time' , '>', time())->where('is_now', 1)->find(); + $headline_data = null; + if($headline){ + $headline_data = $headline; + $headline_data['nickname'] = db::name('user')->where('id', $headline['user_id'])->value('nickname'); + $headline_data['avatar'] = db::name('user')->where('id', $headline['user_id'])->value('avatar'); + } + + if($room['label_id'] == 3){ + $label_id = 2; + }elseif ($room['label_id'] == 4){ + $label_id = 1; + }else{ + $label_id = $room['label_id']; + } + + //上次的PK参数 + if($room['last_pk_room_id'] > 0){ + $last_pk_room_id = $room['last_pk_room_id']; + }else{ + $last_pk_info = db::name('vs_room_pk')->where(['room_id_a' => $room_id])->order('pk_id', 'desc')->find(); + if($last_pk_info){ + $last_pk_room_id = $last_pk_info['room_id_b']; + }else{ + $last_pk_info1 = db::name('vs_room_pk')->where(['room_id_b' => $room_id])->order('pk_id', 'desc')->find(); + if($last_pk_info1){ + $last_pk_room_id = $last_pk_info1['room_id_a']; + }else{ + $last_pk_room_id = 0; + } + } + } + + //房间信息 + $room_info = [ + 'room_id' => $room['id'], + 'is_use_code' => $room['is_use_code'], + 'room_number' => $room['room_number'], + 'room_name' => $room['room_name'], + 'room_cover' => $room['room_cover'], + 'room_intro' => $room['room_intro'], + 'type_id' => $room['type_id'], + 'type_name' => db::name('vs_room_type')->where('id', $room['type_id'])->value('type_name'), + 'user_id' => $room['user_id'], + 'label_id' => $label_id, + 'label_icon' => db::name('vs_room_label')->where('id', $room['label_id'])->value('label_icon_room'), + 'room_background' => $room['room_background'], + 'hot_value' => $room['today_hot_value'], + 'chatrooms' => 'room'.$room['id'], + 'pit_list' => $pit_list, + 'room_up_pit_type'=>$room['room_up_pit_type'], + 'online_number' => db::name('vs_room_visitor')->where(['room_id' => $room['id'],'is_online'=>1])->count(), + 'head_line' => $headline_data, + 'is_pk' => $room['is_pk'],//1-默认接受PK,2不接受', + 'last_pk_room_id' => $last_pk_room_id, + 'queue_number' => db::name('vs_room_pit_apply')->where(['room_id' => $room_id,'status' => 0])->count(), + ]; + + //当前用户信息 + $user_info = $this ->get_user_info($room_id,$user_id,$user_pit,1);//用户进入房间 才会获取声网token,更新房间不获取声网token + $user_info['is_room_owner'] = ($user_id == $room['user_id']) ? 1 : 0; + //推送信息 + $text['text'] = '欢迎用户 ' . $user_info['nickname'] .' 进入房间'; + $text['jia_jia'] = model('api/Decorate')->user_decorate_detail($user_id,2); + $text['FromUserInfo'] = $user_info; + $text['FromUserInfo']['enter_text'] = '欢迎 ' . $user_info['nobility_name'] .' 进入房间'; + + $is_hide = db::name('user')->where('id', $user_id)->value('hide_status'); + if($is_hide != 1){//不是隐身 + + model('api/Chat')->sendMsg(1001,$room_id,$text,$user_id); + + //当前用户不是隐身状态的时候触发CP特效 + //获取房间内的用户 和当前用户 查找是否有有效CPzone + $user_list = db::name('vs_room_visitor') + ->where(['room_id' => $room_id]) + ->column('user_id'); // 使用column直接获取一维数组 + + $cpzone_list = db::name('user_cp_zone') + ->where(['status' => 1]) + ->where(function($query) use ($user_id) { + $query->whereOr(['user_id1' => $user_id]) + ->whereOr(['user_id2' => $user_id]); + }) + ->select(); + + if ($cpzone_list) { + foreach ($cpzone_list as $cpzone) { + // 获取CP伙伴的用户ID + $partner_id = ($cpzone['user_id1'] == $user_id) ? $cpzone['user_id2'] : $cpzone['user_id1']; + + // 检查CP伙伴是否在房间内 + if (in_array($partner_id, $user_list)) { + // 推送CP特效 + $ttex['rights_icon'] = model('api/Decorate')->user_decorate_detail($user_id, 10); + $ttex['FromUserInfo'] = db::name('user')->where('id', $user_id)->field('id as user_id,nickname,avatar,sex')->find(); + $ttex['ToUserInfo'] = db::name('user')->where('id', $partner_id)->field('id as user_id,nickname,avatar,sex')->find(); + $ttex['text'] = 'CP特效'; + model('api/Chat')->sendMsg(1080, $room_id, $ttex); + } + } + } + } + + //小时榜 + $open_time = db::name('vs_hour_ranking_config')->where('id', 1)->value('open_time'); + if($open_time > 0){ + if($open_time <= time()){ + $hour_open = 1;//开启 + }else{ + $hour_open = 0;//关闭 + } + }else{ + $hour_open = 0;//关闭 + } + + return ['code' => 1, + 'msg' => '成功', + 'data' => ['room_info' => $room_info, + 'room_owner' => $room_owner, + 'user_info' => $user_info, + 'song_user_info' => $song_list, + 'nextInfo' => $next_song_info, + 'room_auction'=>$roomauction, + 'cp_user'=>$cp_users, + 'pk_info' => $pk_info, + 'song_pit_list' => $song_pit_list, + 'friend_info' => $friend, + 'gift_cycle' => $xlh_info, + 'hour_ranking_open' => $hour_open, + 'singer_info' => $singer_info, + 'sign_info' => $sign_info + ] + ]; + } + + //房间内当前用户信息 public function get_user_info($room_id,$user_id,$user_pit,$is_join = 0) { @@ -1228,6 +1548,136 @@ class Room extends Model return ['auction_list' => $auction_list,'pit_list' => $pit_list,'auction_user' => $auction_user,'user_pit' => $user_pit]; } + + //私密房 + public function cp_room($room_id,$user_id) + { + //查看房间时间是否已到期 + $room_time = db::name('vs_room_cp_movie')->where(['room_id' => $room_id])->value('time_day'); + if($room_time <= time()){ + db::name('vs_room')->where(['id' => $room_id])->update(['room_status' => 3]); + db::name('vs_room_cp_movie')->where(['room_id' => $room_id])->update(['status' => 2]); + model('api/Tencent')->delete_group('room'.$room_id); + return ['code' => 0, 'msg' => 'cp房间已到期', 'data' => '']; + } + $room_status = db::name('vs_room_cp_movie')->where(['room_id' => $room_id])->value('status'); + if($room_status == 4){ + db::name('vs_room')->where(['id' => $room_id])->update(['room_status' => 3]); + return ['code' => 0, 'msg' => '房间已被迫结束', 'data' => '']; + } + $cp_users = db::name('vs_room_cp_movie')->alias('a') + ->join('user b', 'a.user_id = b.id', 'left') + ->join('user c', 'a.user_id1 = c.id', 'left') + ->where(['room_id' => $room_id,'a.status' => 1]) + ->field('a.time_day,a.cp_id,a.user_id,a.user_id1,b.nickname,c.nickname as nickname1,b.avatar,c.avatar as avatar1,b.user_code,c.user_code as user_code1') + ->find(); + //非cp房用户不得进入 + if($cp_users['user_id'] != $user_id && $cp_users['user_id1'] != $user_id){ + return ['code' => 0, 'msg' => '您不是房间的cp用户,请勿进入', 'data' => '']; + } + $cp_users['dress'] = model('api/Decorate')->user_decorate_detail($cp_users['user_id'],1); + $cp_users['dress1'] = model('api/Decorate')->user_decorate_detail($cp_users['user_id1'],1); + + return $cp_users; + } + + + //房间PK信息 + public function room_pk($room_id, $room_type) + { + $pk_info = null; + if($room_type == 1){ + $is_pk = db::name('vs_room_pk')->where(['room_id_a' => $room_id])->where(['status' => ['in',[2,3,4]]]) + ->field('pk_id,create_user_id,receive_user_id,room_id_b,create_value_a,receive_value_b,pk_times,start_time,status,updatetime')->find(); + if($is_pk){ + $pk_info['pk_room_id'] = $is_pk['room_id_b'];//对方房间id + $pk_info['invite_pk_user_id'] = $is_pk['create_user_id'];//发起pk用户id + $pk_info['receive_pk_user_id'] = $is_pk['receive_user_id'];//接受者用户id + $pk_info['pk_id'] = $is_pk['pk_id'];//pkid + $pk_info['pk_end_times'] = $is_pk['start_time'] + $is_pk['pk_times'] * 60;//pk结束时间 + $pk_info['my_room_value'] = $is_pk['create_value_a'];//自己房间的值 + $pk_info['pk_room_value'] = $is_pk['receive_value_b'];//对方房间的值 + $pk_info['pk_part'] = $is_pk['status']; + if($is_pk['status'] == 2){ + $pk_info['pk_end_times'] = $is_pk['updatetime'] + 300; + }elseif($is_pk['status'] == 3){ + $pk_info['pk_end_times'] = $is_pk['start_time'] + $is_pk['pk_times'] * 60; + }elseif($is_pk['status'] == 4){ + $pk_info['pk_end_times'] = $is_pk['updatetime'] + 300; + if($is_pk['create_value_a'] > $is_pk['receive_value_b']){ + $pk_info['create_type'] = 1;//赢 + $pk_info['receive_type'] = 0;//输 + }elseif ($is_pk['create_value_a'] = $is_pk['receive_value_b']){ + $pk_info['create_type'] = 2;//平局 + $pk_info['receive_type'] = 2;//平局 + }else{ + $pk_info['create_type'] = 0;//输 + $pk_info['receive_type'] = 1;//赢 + } + } + }else{ + $is_pk = db::name('vs_room_pk')->where(['room_id_b' => $room_id])->where(['status' => ['in',[2,3,4]]]) + ->field('pk_id,create_user_id,receive_user_id,room_id_a,create_value_a,receive_user_id,receive_value_b,pk_times,start_time,status,updatetime')->find(); + if($is_pk){ + $pk_info['pk_room_id'] = $is_pk['room_id_a']; + $pk_info['invite_pk_user_id'] = $is_pk['create_user_id']; + $pk_info['receive_pk_user_id'] = $is_pk['receive_user_id'];//接受者用户id + $pk_info['pk_id'] = $is_pk['pk_id']; + $pk_info['pk_end_times'] = $is_pk['start_time'] + $is_pk['pk_times'] * 60; + $pk_info['my_room_value'] = $is_pk['receive_value_b']; + $pk_info['pk_room_value'] = $is_pk['create_value_a']; + $pk_info['pk_part'] = $is_pk['status']; + if($is_pk['status'] == 2){ + $pk_info['pk_end_times'] = $is_pk['updatetime'] + 300; + }elseif($is_pk['status'] == 3){ + $pk_info['pk_end_times'] = $is_pk['start_time'] + $is_pk['pk_times'] * 60; + }elseif($is_pk['status'] == 4){ + $pk_info['pk_end_times'] = $is_pk['updatetime'] + 300; + if($is_pk['create_value_a'] > $is_pk['receive_value_b']){ + $pk_info['create_type'] = 1;//赢 + $pk_info['receive_type'] = 0;//输 + }elseif ($is_pk['create_value_a'] = $is_pk['receive_value_b']){ + $pk_info['create_type'] = 2;//平局 + $pk_info['receive_type'] = 2;//平局 + }else{ + $pk_info['create_type'] = 0;//输 + $pk_info['receive_type'] = 1;//赢 + } + } + } + } + } + + return $pk_info; + } + + + //房间麦位信息 + public function room_pit($room_id) + { + //麦位信息 + $pit_list = db::name('vs_room_pit')->alias('a')->join('user b', 'a.user_id = b.id', 'left') + ->where(['a.room_id' => $room_id,'a.status' => 1]) + ->field('a.id,a.user_id,a.pit_number,a.is_lock,a.is_mute,a.count_down,b.nickname,b.avatar,b.sex,b.user_code') + ->order('a.pit_number asc')->select(); + foreach ($pit_list as &$value) { + $value['charm'] = 0; + $value['dress'] = ''; + $value['is_online'] = 2; + if (isset($value['user_id']) && $value['user_id'] > 0) { + $value['charm'] = db::name('vs_room_user_charm')->where(['room_id' => $room_id, 'user_id' => $value['user_id']])->value('charm'); + $value['dress'] = model('api/Decorate')->user_decorate_detail($value['user_id'], 1); + $value['user_code'] = model('api/Decorate')->user_decorate_detail($value['user_id'], 6); + $Nobility = model('api/Nobility')->getUserNobilityInfo($value['user_id']); + $value['mic_cycle'] = model('api/Decorate')->user_decorate_detail($value['user_id'],3); + $value['nobility_image'] = $Nobility['play_image']; + $value['nickname_color'] = $Nobility['nick_name_color']; + $value['is_online'] = db::name('vs_room_visitor')->where(['user_id' => $value['user_id'],'room_id' => $room_id])->value('is_online')??2; + } + } + return $pit_list; + } + //退出房间 //$type 0-正常退出 1-被踢出房间 2-脚本清理 public function quit_room($uid, $room_id,$user_id,$type = 0) diff --git a/application/api/model/User.php b/application/api/model/User.php index cd2b28e4..dac41ed1 100644 --- a/application/api/model/User.php +++ b/application/api/model/User.php @@ -2,6 +2,7 @@ namespace app\api\model; +use think\Cache; use think\Db; use think\Model; @@ -189,36 +190,49 @@ class User extends Model //获取用户基础信息 public function get_user_base_info($uid) { - $user_info = db::name('user') - ->field('id as user_id,nickname,avatar,sex,mobile,market_value,user_code as code') - ->where('id', $uid)->find(); + //先从缓存中获取 + $cache_key = 'user_base_info_'.$uid; + $user_info = json_decode(Cache::get($cache_key), true); - if (empty($user_info)) { - return ['code' => 0, 'msg' => '用户不存在', 'data' => null]; - } - $user_info['dress'] = model('api/Decorate')->user_decorate_detail($uid,1);//头像装扮 - $user_info['user_code'] = model('api/Decorate')->user_decorate_detail($uid,6);//靓号 - $user_info['is_special_code'] = 0;//是否是靓号:0-普通,1-靓号 - if($user_info['user_code'] != $user_info['code']){ - $user_info['is_special_code'] = 1;//是靓号:0-普通,1-靓号 - } - $user_info['mic_cycle'] = model('api/Decorate')->user_decorate_detail($uid,3);//麦圈 - $user_info['chat_bubble'] = model('api/Decorate')->user_decorate_detail($user_info['user_id'],9);//聊天气泡 - $user_info['auth'] = db::name('user_auth')->where(['mobile' => $user_info['mobile'],'is_real' => 1])->find() ? 1 : 0;//是否实名:0-未实名,1-实名 + if(!$user_info){ + $user_info = db::name('user') + ->field('id as user_id,nickname,avatar,sex,mobile,market_value,user_code as code') + ->where('id', $uid)->find(); - $Nobility = model('api/Nobility')->getUserNobilityInfo($uid);//爵位 - $user_info['nobility_image'] = $Nobility['play_image'];//爵位图标 - $user_info['nickname_color'] = $Nobility['nick_name_color'];//昵称颜色 + if (empty($user_info)) { + return ['code' => 0, 'msg' => '用户不存在', 'data' => null]; + } + $user_info['dress'] = model('api/Decorate')->user_decorate_detail($uid,1);//头像装扮 + $user_info['user_code'] = model('api/Decorate')->user_decorate_detail($uid,6);//靓号 + $user_info['is_special_code'] = 0;//是否是靓号:0-普通,1-靓号 + if($user_info['user_code'] != $user_info['code']){ + $user_info['is_special_code'] = 1;//是靓号:0-普通,1-靓号 + } + $user_info['mic_cycle'] = model('api/Decorate')->user_decorate_detail($uid,3);//麦圈 + $user_info['chat_bubble'] = model('api/Decorate')->user_decorate_detail($user_info['user_id'],9);//聊天气泡 - $user_info['is_hide'] = 0;//是否可以设置隐身:0-不可以,1-可以 - if($Nobility['power_list']){ - foreach ($Nobility['power_list'] as $key => $value){ - if($value['id'] == 8){ - $user_info['is_hide'] = 1;//隐身 + $Nobility = model('api/Nobility')->getUserNobilityInfo($uid);//爵位 + $user_info['nobility_image'] = $Nobility['play_image'];//爵位图标 + $user_info['nickname_color'] = $Nobility['nick_name_color'];//昵称颜色 + $user_info['enter_image'] = $Nobility['enter_image'];//入场特效 + $user_info['nobility_name'] = $Nobility['nobility_name'];//入场特效 + + $user_info['is_hide'] = 0;//是否可以设置隐身:0-不可以,1-可以 + if($Nobility['power_list']){ + foreach ($Nobility['power_list'] as $key => $value){ + if($value['id'] == 8){ + $user_info['is_hide'] = 1;//隐身 + } } } } + if(isset($user_info['mobile'])){ + $user_mo = $user_info['mobile']; + }else{ + $user_mo = 1213131231; + } + $user_info['auth'] = db::name('user_auth')->where(['mobile' => $user_mo,'is_real' => 1])->find() ? 1 : 0;//是否实名:0-未实名,1-实名 $user_info['icon'][0] = model('api/UserData')->user_wealth_icon($uid);//财富图标 $user_info['icon'][1] = model('api/UserData')->user_charm_icon($uid);//魅力图标 //判断是否是歌手 如果是 返回等级图标 @@ -228,6 +242,8 @@ class User extends Model if($singer['status'] == 1){ $user_info['icon'][2] = db::name('vs_singer_level')->where(['level' =>$singer['level'],'deletetime' => 0])->value('image');//等级图标 } + //设置缓存 + Cache::set($cache_key, json_encode($user_info), 3600); return $user_info; } diff --git a/application/api/model/UserToken.php b/application/api/model/UserToken.php index acbf8c98..34ba5393 100644 --- a/application/api/model/UserToken.php +++ b/application/api/model/UserToken.php @@ -40,7 +40,7 @@ class UserToken extends Model } //更新token - public function update_token($user_id) + public function update_tokens($user_id) { $token =md5($user_id . date('YmdHis') . generateRandom(32)); $expiretime = time() + 3600 * 24 * 7; @@ -62,4 +62,31 @@ class UserToken extends Model return $token; } + //更新token + public function update_token($user_id) + { + $tokenString = md5($user_id . date('YmdHis') . generateRandom(32)); + + // 4. 核心操作:将Token与用户ID关联,并存入Redis(配置的独立库) + // 参数说明:Token::set(‘token字符串’, ‘用户ID’, ‘有效期(秒)’) + $result = \app\common\library\Token::set($tokenString, $user_id, 3600 * 24 * 7); + + $expiretime = time() + 3600 * 24 * 7; + $data_token = $this->where('user_id', $user_id)->find(); + if(empty($data_token)){ + $data_token = []; + $data_token['user_id'] = $user_id; + $data_token['token'] = $tokenString; + $data_token['expiretime'] = $expiretime; + if(!($this->save($data_token))){ + return ['code' => 0, 'msg'=> 'token更新失败']; + } + }else{ + if(!($this->where('user_id', $user_id)->update(['token' => $tokenString, 'expiretime' => $expiretime]))){ + return ['code' => 0, 'msg'=> 'token更新失败']; + } + } + return $result ? $tokenString : null; + } + } \ No newline at end of file diff --git a/application/common/controller/BaseCom.php b/application/common/controller/BaseCom.php index 7b1a2610..17ef708b 100644 --- a/application/common/controller/BaseCom.php +++ b/application/common/controller/BaseCom.php @@ -2,16 +2,17 @@ namespace app\common\controller; +use think\Cache; use think\Controller; use think\Db; +use app\common\library\Token as TokenLib; class BaseCom extends Controller { - public $uid = 0; - public $redis = ''; + protected $uid = 0; //初始化 - protected function _initialize() + protected function _initializes() { //允许跨域 header("Access-Control-Allow-Origin: *"); // 允许所有域访问 @@ -24,6 +25,7 @@ class BaseCom extends Controller //获取内侧账号 $inside_uid = get_system_config_value('inside_uid'); + //检测是什么系统 $system = input('system',''); if(empty($system)){ @@ -104,4 +106,106 @@ class BaseCom extends Controller } } + + /** + * 初始化方法 + */ + protected function _initialize() + { + parent::_initialize(); + + //检测系统是否维护中 + //先从cache中获取 + $is_maintenance = Cache::get('is_maintenance'); + if(!$is_maintenance){ + $is_maintenance = get_system_config_value('is_maintenance'); + //缓存 并设置缓存时间 + Cache::set('is_maintenance',$is_maintenance,3600); + } + + if($is_maintenance == 2){ + return V(0, '系统维护中'); + } + + //检测是什么系统 + $system = input('system','未知'); + if(empty($system)){ + $system = request()->header('system'); + } + + if ($system == 'iOS') { + //版本号 + $version = input('App-Version',''); + if(empty($version)){ + $version = request()->header('App-Version'); + } + + $api_versions = db::name('version')->where(['type' => 2, 'status' => 1])->order('id', 'desc')->find(); + //app的版本和用户使用的当前版本比对 + //$api_versions['newversion'] 是数据库当前的版本 也是用户使用的版本 + //$app_version 有可能是appstore里面的审核版本 审核版本比用户的版本高 + //审核版本给前端返回1 + $result = version_compare($api_versions['newversion'],$version); + if ($result < 0) {//-1:前面版本小于后面版本,0:相等,1:前面版本大于后面版本 + //请求的接口 + $api = request()->controller().'/'.request()->action(); + if($api == 'Index/index_banner' || $api == 'Index/room_type_list' || $api == 'Index/room_list' || $api == 'UserZone/expand_zone' || $api == 'UserZone/zone_list' || $api == 'UserZone/topic_list' || $api == 'UserZone/get_zone_topic'){ + $this->uid = 0; + //定义一个常量 + define('UID', $this->uid); + } + }else{ + $this->check_login($is_maintenance) ; + } + }else{ + $this->check_login($is_maintenance) ; + } + } + + + //检测登录 + public function check_login($is_maintenance) + { + // 2. 从请求中获取Token(支持多种方式) + $token = request()->header('token'); + if (empty($token)) { + $token = input('token', ''); + } + + if (empty($token)) { + // 3. Token为空,拒绝访问 + return V(0, 'Token不能为空'); + } + + // 4. 核心验证:检查Token是否有效 + $tokenData = TokenLib::get($token); + if (!$tokenData) { + // Token不存在或已过期 + return V(301, '登录失效,请重新登录'); + } + + // 5. 验证成功,提取并存储用户信息 + $this->uid = $tokenData['user_id']; + + //获取内侧账号 + //先从cache中获取 + $inside_uid = Cache::get('inside_uid'); + if(!$inside_uid){ + $inside_uid = get_system_config_value('inside_uid'); + //缓存 并设置缓存时间 + Cache::set('inside_uid',$inside_uid,3600); + } + + if($inside_uid && $is_maintenance == 3){ + //先转为数组 不是内侧账号 返回301 + $inside_uid = explode(',',$inside_uid); + if(!in_array($this->uid,$inside_uid)){ + return V(0, '系统维护中'); + } + } + //定义一个常量 + define('UID', $this->uid); + + } + } \ No newline at end of file diff --git a/application/common/library/token/driver/Cache.php b/application/common/library/token/driver/Cache.php new file mode 100644 index 00000000..63322f6a --- /dev/null +++ b/application/common/library/token/driver/Cache.php @@ -0,0 +1,132 @@ +options = $options; + + // 获取缓存配置 + $cacheName = isset($options['cache']) ? $options['cache'] : 'cache'; + $cacheConfig = config($cacheName); + + // 初始化缓存实例 + $this->cache = Caches::connect($cacheConfig ?: []); + } + + /** + * 获取Token + * @param string $token Token标识 + * @return array|false + */ + public function get($token) + { + if (!$token) { + return false; + } + + $key = $this->getCacheKey($token); + $data = $this->cache->get($key); + + if (!$data) { + return false; + } + + // 检查是否过期 + if (isset($data['expire_time']) && $data['expire_time'] < time()) { + $this->delete($token); + return false; + } + + return $data; + } + + /** + * 设置Token + * @param string $token Token标识 + * @param mixed $user_id 用户ID + * @param int $expire 过期时间(秒) + * @return bool + */ + public function set($token, $user_id, $expire = 0) + { + if (!$token) { + return false; + } + + $data = [ + 'token' => $token, + 'user_id' => $user_id, + 'expire_time' => $expire > 0 ? time() + $expire : 0, + 'create_time' => time(), + ]; + + $key = $this->getCacheKey($token); + + if ($expire > 0) { + return $this->cache->set($key, $data, $expire); + } else { + return $this->cache->set($key, $data); + } + } + + /** + * 删除Token + * @param string $token Token标识 + * @return bool + */ + public function delete($token) + { + if (!$token) { + return false; + } + + $key = $this->getCacheKey($token); + return $this->cache->rm($key); + } + + /** + * 清除用户的所有Token + * @param mixed $user_id 用户ID + * @return bool + */ + public function clear($user_id) + { + // 注意:缓存驱动可能无法直接按用户ID清理所有Token + // 如果需要此功能,建议使用Redis驱动或在业务层维护Token列表 + // 这里简单实现,实际项目中可能需要更复杂的逻辑 + return true; + } + + /** + * 获取缓存键名 + * @param string $token Token标识 + * @return string + */ + protected function getCacheKey($token) + { + $prefix = isset($this->options['prefix']) ? $this->options['prefix'] : 'fastadmin:token:'; + return $prefix . $token; + } +} \ No newline at end of file diff --git a/application/config.php b/application/config.php index 1b7ebdf1..c4e8b93f 100644 --- a/application/config.php +++ b/application/config.php @@ -172,7 +172,7 @@ return [ 'path' => LOG_PATH, // 日志记录级别 'level' => [], - 'max_files'=>100,//最大保存日志数,超过tp将自动清理 + 'max_files'=>1000,//最大保存日志数,超过tp将自动清理 ], // +---------------------------------------------------------------------- // | Trace设置 开启 app_trace 后 有效 @@ -257,18 +257,31 @@ return [ // 验证成功后是否重置 'reset' => true ], + // 新增:专门给Token使用的缓存配置 + 'token_cache' => [ // 注意这个键名,可以自定义,但需唯一 + 'type' => 'redis', // 驱动类型 + 'host' => '127.0.0.1', // 同个Redis实例 + 'port' => 6379, // 同个端口 + 'select' => 3, // 为Token专门指定一个新的库,例如3 + // 以下参数建议与‘cache’配置保持一致 + 'password' => '', // 如果有密码请填写 + 'prefix' => 'fa_token:', // 这里定义Token键前缀更合适 + ], // +---------------------------------------------------------------------- // | Token设置 // +---------------------------------------------------------------------- 'token' => [ // 驱动方式 - 'type' => 'Mysql', + 'type' => 'cache', // 缓存前缀 'key' => 'Ydkn5NyZBMoCshDIXSRcQrHGefjt6iax', // 加密方式 'hashalgo' => 'ripemd160', // 缓存有效期 0表示永久缓存 - 'expire' => 0, + 'expire' => 7 * 86400, + 'cache' => 'token_cache', + // 可选:存储在Redis中的键名前缀,便于识别和管理 + 'prefix' => ':token:', ], //FastAdmin配置 'fastadmin' => [ diff --git a/thinkphp/library/think/Controller.php b/thinkphp/library/think/Controller.php index 77225b73..c70e8673 100644 --- a/thinkphp/library/think/Controller.php +++ b/thinkphp/library/think/Controller.php @@ -74,6 +74,11 @@ class Controller */ protected function _initialize() { + //允许跨域 + header("Access-Control-Allow-Origin: *"); // 允许所有域访问 + header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); + header("Access-Control-Allow-Headers: Content-Type, Authorization"); + header("Access-Control-Max-Age: 3600"); } /**