252 lines
9.0 KiB
PHP
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);
|
|
}
|
|
|
|
}
|