数据缓存处理

This commit is contained in:
2025-12-24 16:21:07 +08:00
parent 0dfccdd617
commit f3e692f3fc
9 changed files with 650 additions and 46 deletions

View File

@@ -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,"成功");

View File

@@ -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, '可以创建房间');
}
//创建房间

View File

@@ -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{

View File

@@ -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,327 @@ 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 = Cache::get('room_info_' . $room_id);
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, $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 = Cache::get('room_owner_' . $room_id);
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, $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-默认接受PK2不接受',
'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 +1547,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)

View File

@@ -2,6 +2,7 @@
namespace app\api\model;
use think\Cache;
use think\Db;
use think\Model;
@@ -189,36 +190,44 @@ 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 = Cache::get($cache_key);
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;//隐身
}
}
}
}
$user_info['auth'] = db::name('user_auth')->where(['mobile' => $user_info['mobile'],'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 +237,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, $user_info, 3600);
return $user_info;
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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' => [

View File

@@ -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");
}
/**