love_php/app/Http/Controllers/SquareController.php
2026-04-02 09:20:51 +08:00

252 lines
9.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Arena;
use App\Models\ArenaGroup;
use App\Models\ArenaLabel;
use App\Models\ArenaLabelLink;
use App\Models\ArenaList;
use App\Models\ArenaPreviewHistory;
use App\Models\ArenaMember;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;
class SquareController extends Controller
{
/**
* 广场
*/
public function square(Request $request, Arena $arena, ArenaGroup $arena_group, ArenaLabel $arena_label, ArenaMember $arena_member, ArenaLabelLink $arena_label_link)
{
//标签
$labels = $arena_label->all()->toArray();
//添加推荐标签
$array = [
'id'=>0,
'title'=>'推荐',
];
array_unshift($labels, $array);
//分类列表
// $groups = $arena_group->all();
return $this->success('ok', compact('labels'));
}
/**
* 竞技场列表
*/
public function arenasV2(Request $request, Arena $arena, ArenaMember $arena_member, ArenaLabel $label)
{
$arenas = $arena->orderBy('id', 'asc');
$group_id = $request->input('group_id');
if ($group_id) {
$arenas = $arenas->where('group_id', $group_id);
}
$labels = [];
$label_id = $request->input('label_id');
if ($label_id) {
$label_id = explode(',', $label_ids);
if (is_array($label_ids) && count($label_ids)) {
// $arena_ids = $arena_label_link->whereIn('label_id', $label_ids)->distinct('arena_id')->pluck('arena_id');
// $arenas = $arenas->whereIn('id', $arena_ids);
$arenas = $arenas->whereHas('labelLink', function($sql) use($label_ids){
$sql->whereIn('label_id', $label_ids);
});
}
$labels = $label->whereIn('id', $label_ids)->get();
}
$arenas = $arenas->paginate();
foreach ($arenas as $arena_obj) {
$first_team = $arena_member->where('arena_id', $arena_obj->id)->where('team', 1)->orderBy('id', 'desc')->limit(6)->get();
$second_team = $arena_member->where('arena_id', $arena_obj->id)->where('team', 2)->orderBy('id', 'desc')->limit(6)->get();
$arena_obj->male_team = $first_team;
$arena_obj->female_team = $second_team;
}
return $this->success('ok', compact('arenas', 'labels'));
}
public function arenas(Request $request, Arena $arena, ArenaMember $arena_member, ArenaGroup $group, ArenaLabel $arena_lable)
{
$label_id = $request->input('label_id', 0);
$group_id = $request->input('group_id', 0);
if (empty($label_id)) {//推荐
$group_ids = Arena::where('is_recommend', 1)->pluck('group_id');
$groups = $group->whereIn('id', $group_ids)->get();
$arenas = $arena->where('is_recommend', 1);
}else{
$groups = $group->where('id', $label_id)->get();
$group_ids = $groups->pluck('group_id');
$arenas = $arena->whereIn('id', $group_ids);
}
$group_id = $request->input('group_id', 0);
if ($group_id) {
$arenas->where('group_id', $group_id);
}
$arenas = $arenas->orderBy('is_recommend', 'desc')->orderBy('status', 'asc')->orderBy('created_at', 'asc')->orderBy('id', 'desc')->paginate();
foreach ($arenas as $arena_obj) {
$first_team = $arena_member->where('arena_id', $arena_obj->id)->where('team', 1)->orderBy('id', 'desc')->limit(6)->get();
$second_team = $arena_member->where('arena_id', $arena_obj->id)->where('team', 2)->orderBy('id', 'desc')->limit(6)->get();
$arena_obj->male_team = $first_team;
$arena_obj->female_team = $second_team;
}
return $this->success('ok', compact('arenas', 'groups'));
}
/**
* 竞技场详情
*/
public function arena(Request $request, Arena $arena, ArenaPreviewHistory $history, ArenaList $arena_list, User $user_obj)
{
$arena->intro = json_decode($arena->intro, true);
$from_user_id = $request->input('from_user_id');
if ($from_user_id) {
$from_user_ids = explode(',', $from_user_id);
if (is_array($from_user_ids) && $from_user_ids[0]) {
$from_user_id = $from_user_ids[0];
$result = $this->addArenaPreview($request, $arena->id, $from_user_id, $history);
$this->addArenaList($arena->id, $from_user_id, $arena_list, $result);
}
}
$arena->increment('click_num', 1);
$comments = $arena->comments()->orderBy('id', 'desc')->paginate();
foreach ($comments as $comment) {
$comment->user = User::where('id', $comment->commented_id)->select('id', 'name', 'photo')->first();
}
//榜单
$list = $arena_list->where('arena_id', $arena->id)->with('user.wechat')->orderBy('share_num', 'desc')->paginate();
$cache_key = 'arena_preview_history_'.$arena->id;
//添加访问记录
$user = auth()->user();
if (empty($user)) {
$user = $this->authCheck();
}
if ($user) {//用户已登录
$key = $user->id;
$user_ids = Redis::lrange($cache_key, 0, -1);
if (in_array($key, $user_ids)) {
Redis::lrem($cache_key, 1, $key);
}
Redis::lpush($cache_key, $key);
}
//访问记录
$user_ids = Redis::lrange($cache_key, 0, 15);
$user_list = [];
foreach ($user_ids as $user_id) {
$user = $user_obj->where('id', $user_id)->select('id', 'name', 'circle_avatar')->first();
$user_list[] = $user;
}
return $this->success('ok', compact('arena', 'comments', 'list', 'user_list'));
}
public function arenaComments(Request $request, Arena $arena)
{
//留言
$comments = $arena->comments()->orderBy('id', 'desc')->paginate();
foreach ($comments as $comment) {
$comment->user = User::where('id', $comment->commented_id)->select('id', 'name', 'photo')->first();
}
return $this->success('ok', $comments);
}
public function arenaLists(Request $request, Arena $arena, ArenaList $arena_list)
{
//榜单
$list = $arena_list->where('arena_id', $arena->id)->where('share_num','<>', 0)->with('user.wechat')->orderBy('share_num', 'desc')->orderBy('id', 'desc')->get();
return $this->success('ok', $list);
}
/**
* 添加分享记录
*/
public function addArenaList($arena_id, $from_user_id, $arena_list, $result)
{
$list = $arena_list->firstOrCreate(['arena_id'=>$arena_id, 'user_id'=>$from_user_id]);
if ($list) {
$list->increment('share_num', 1);
}
return;
}
/**
* 添加查看记录
*/
public function addArenaPreview($request, $arena_id, $share_user_id, $history)
{
$user = auth()->user();
if (empty($user)) {
$user = $this->authCheck();
}
$openid = $request->session()->get('official_openid');
$count = $history->where('openid', $openid)->count();
if ($count || empty($openid)) {
return false;
}
if ($user) {
$data['user_id'] = $user->id;
$data['arena_id'] = $arena_id;
$data['openid'] = $openid;
$data['name'] = $user->name;
$data['avatar'] = $user->photo;
$data['share_user_id'] = $share_user_id;
$user->wechat->official_openid = $openid;
$user->wechat->save();
}else{
$data['openid'] = $openid;
$data['share_user_id'] = $share_user_id;
$data['arena_id'] = $arena_id;
}
$history->create($data);
return true;
}
/**
* 加入竞技场
*/
public function joinArena(Request $request, Arena $arena, ArenaMember $arena_member)
{
$user = auth()->user();
//判断是否已加入
$count = $arena_member->where('arena_id', $arena->id)->where('user_id', $user->id)->count();
if ($count) {
return $this->failure('已参加过【'.$arena->title.'】');
}
//判断是否有性别
if (empty($user->sex)) {
return $this->failure('请先编辑个人信息');
}
$data['user_id'] = $user->id;
$data['arena_id'] = $arena->id;
$data['team'] = $user->sex;
$data['avatar'] = $user->photo?:$user->wechat->avatar2;
$arena_member->create($data);
$arena->increment($user->sex == 1?'male_team_num':'female_team_num');
return $this->success('ok');
}
/**
* 留言竞技场
*/
public function commentArena(Request $request, Arena $arena)
{
$user = auth()->user();
$content = $request->input('content');
if (empty($content)) {
return $this->failure('请输入内容');
}
$comment = $user->comment($arena, $content);
$comment->user = User::where('id', $comment->commented_id)->select('id', 'name', 'photo')->first();
#redis
$cache_key = 'arena_'.$arena->id.'_comments';
return $this->success('ok', $comment);
}
}