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

733 lines
29 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Configs;
use App\Models\Notice;
use App\Models\RankHistory;
use App\Models\AreaUser;
use App\Models\Moment;
use App\Models\Rbac\RoleUser;
use App\Models\RestrictMomentUser;
use App\Services\CommonUtilsService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Contracts\MomentContract;
use App\Contracts\UserContract;
use App\Models\User;
use App\Models\LinkingBlacklist;
use App\Models\UnlikeMomentLog;
use App\Models\MomentTopic;
use App\Models\App\Comment;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Auth;
use App\Http\Response\ResponseJson;
use App\Models\App\UserVote;
use App\Models\App\Vote;
use App\Models\App\VoteOption;
use Illuminate\Support\Facades\DB;
class MomentController extends Controller
{
use ResponseJson;
protected $momentCon;
protected $userCon;
public function __construct(MomentContract $moment, UserContract $userCon)
{
$this->momentCon = $moment;
$this->userCon = $userCon;
}
/**
* 动态列表
* @param Request $request [description]
* @return [type] [description]
*/
public function moments(Request $request)
{
try {
$user = $this->getMyUserinfo();
$other_user_id = request()->input('user_id');
if ($user) {
// $is_blacklist = LinkingBlacklist::where('other_user_id', $user->id)->where('user_id', $other_user_id)->count() ? 1 : 0;
// if($is_blacklist) return $this->success('ok', []);
if ($request->input('user_id')) {
$moments = $this->momentCon->userMoments($request->user_id);
} else {
$moments = $this->momentCon->momentsV2(15, 'user', $user->belief);
if ($request->page == 1) {
$last_moment_id = Redis::get($user->id . 'last_see_moment');
foreach ($moments as $m) {
if ($m->id > $last_moment_id) {
Redis::set($user->id . 'last_see_moment', $m->id);
break;
}
}
}
}
} else {
$moments = $this->momentCon->moments(15, 'tourist');
}
return $this->success('ok', $moments);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取动态列表失败,请稍后再试');
}
}
public function momentsV2(Request $request)
{
try {
$user = auth()->user();
$user_vote_id = UserVote::where('user_id', $user->id)->pluck('vote_id')->toArray();
$votes = Vote::with('option')->whereNotIn('id', $user_vote_id)->where('is_show', 1)->orderByRaw("RAND()")->limit(3)->get()->toArray();
// 手动分页
$limit = 15 - count($votes);
$comment_count = DB::table('comments')->where('commentable_type', 'App\\Models\\Moment')->groupBy('commentable_id')->selectRaw('commentable_id as moment_id, count(*) as comment_count');
$moments = DB::table('moments as m')
->leftJoin('moment_topics as mt', 'm.topic_id', '=', 'mt.id')
->leftJoin('votes as v', 'm.vote_id', '=', 'v.id')
->leftJoin('users as u', 'm.user_id', '=', 'u.id')
->leftJoin('profile_courtships as pc', 'm.user_id', '=', 'pc.user_id')
->leftJoinSub($comment_count, 'ufutx_mc', function ($join) {
$join->on('m.id', 'mc.moment_id');
})
->whereNotExists(function ($sql) {
$date = date('Y-m-d H:i:s');
$sql->select(DB::raw(1))->from('system_blacklists as sb')->whereRaw('ufutx_sb.user_id = ufutx_m.user_id ')->where('sb.start_time', '<', $date)->where('sb.end_time', '>', $date)->whereNull('sb.deleted_at');
})
->whereNotExists(function ($sql) use ($user) {
$sql->select(DB::raw(1))->from('unlike_moment_logs as uml')->whereRaw('ufutx_uml.moment_id = ufutx_m.id')->where('uml.user_id', $user->id);
})
->whereNotExists(function ($sql) use ($user) {
$sql->select(DB::raw(1))->from('linking_blacklists as lb')->whereRaw('ufutx_lb.other_user_id = ufutx_m.user_id')->where('lb.user_id', $user->id)->whereNull('lb.deleted_at');
})
->whereNotExists(function ($sql) use ($user) {
$sql->select(DB::raw(1))->from('linking_blacklists as olb')->whereRaw('ufutx_olb.user_id = ufutx_m.user_id')->where('olb.other_user_id', $user->id)->whereNull('olb.deleted_at');
});
if ($request->is_hot == 0) {//设置为热门动态的不区分信仰
if ($user->belief == '基督教') {
$moments = $moments->where('u.belief', $user->belief);
} else {
$moments = $moments->where('u.belief', '!=', '基督教');
}
}
if ($request->input('topic_id')) {
$moments = $moments->where('topic_id', $request->topic_id);
}
if ($request->input('is_hot')) {
$moments = $moments->where('m.is_hot', $request->is_hot);
}
$moments = $moments->where('m.is_audited', 1)->where('m.is_show', 1)->whereNull('u.deleted_at')->whereNull('m.deleted_at')->where('u.hidden_profile', 'NONE')->selectRaw('ufutx_m.*, ufutx_u.nickname as u_nickname, ufutx_u.is_photo_audited as is_photo_audited, ufutx_u.photo as u_photo,ufutx_u.app_avatar as u_app_avatar, ufutx_u.sex as u_sex,ufutx_u.belief as u_belief, ufutx_u.type as u_type, ufutx_pc.birthday as u_birthday, ufutx_pc.stature as u_stature,ufutx_pc.degree as u_degree, ufutx_mt.name as mt_name, ufutx_v.title as v_title')->orderBy('is_top', 'desc')->orderBy('id', 'desc')->paginate($limit);
foreach ($moments->items() as &$moment) {
// $this->momentDetail($moment,$user);
$this->momentCon->momentDetailV2($moment, $user);
}
if ($request->versions != 'v5.4.14' || $request->topic_id) {
return $this->success('ok', $moments);
}
$moments = $moments->toArray();
foreach ($moments['data'] as &$val) {
$val->type = 'moment';
}
//动态里面插入投票
foreach ($votes as $key => $vote) {
$vote = $this->momentCon->vote($vote['id']);
$vote = [$vote];
switch ($key) {
case 0:
if ($moments['to'] > 1) {
array_splice($moments['data'], 2, 0, $vote);
}
break;
case 1:
if ($moments['to'] > 6) {
array_splice($moments['data'], 8, 0, $vote);
}
break;
case 2:
if ($moments['to'] > 13) {
array_splice($moments['data'], 15, 0, $vote);
}
break;
default:
break;
}
}
return $this->success('ok', $moments);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
public function voteOption(Request $request, $option_id)
{
try {
$vote_id = VoteOption::where('id', $option_id)->value('vote_id');
$has_vote = UserVote::where('user_id', auth()->id())->where('vote_id', $vote_id)->count();
if ($has_vote) {
return $this->failure('您已投票');
}
$user_id = auth()->id();
$user_vote = new UserVote();
$user_vote->user_id = $user_id;
$user_vote->vote_id = $vote_id;
$user_vote->option_id = $option_id;
$user_vote->save();
$vote = $this->momentCon->vote($vote_id);
return $this->success('ok', $vote);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('投票失败');
}
}
public function commentVote(Request $request, $vote_id)
{
try {
if (empty($request->comment)) {
return $this->failure('评论不能为空');
}
\DB::beginTransaction();
$vote = Vote::find($vote_id);
if (empty($vote)) {
return $this->failure('投票不存在');
}
$result = $this->momentCon->commentModel($vote);
if ($request->reply_id) {
$result->reply_id = $request->reply_id;
$result->save();
}
//同步到动态
if ($request->sync_to_moment) {
$request->merge(['content' => $request->comment, 'vote_id' => $vote_id]);
//发布动态
$moment = $this->momentCon->addMoment(auth()->id());
}
$result->user = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->commented_id)->first();
$result->replyer = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->reply_id)->first();
if (empty($result))
throw new \Exception("评论失败", 1);
\DB::commit();
return $this->success('ok', $result);
} catch (\Exception $e) {
\DB::rollback();
$this->getError($e);
return $this->failure('评论动态失败,请稍后再试');
}
}
//投票详情
public function vote(Request $request, $vote_id)
{
try {
$is_set = Vote::where('id', $vote_id)->count();
if (empty($is_set)) {
return $this->failure('投票不存在');
}
$vote = $this->momentCon->vote($vote_id);
return $this->success('ok', $vote);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取投票详情失败,请稍后再试');
}
}
/**
* 发表动态
* @param Request $request [description]
*/
public function addMoment(Request $request)
{
try {
$user = auth()->user();
if (empty($user)) {
return $this->fail('profile', 2, '', '未登录', '你的账号还没登录');
}
// if ($user->id == 130163) {
$check = RestrictMomentUser::query()->where('user_id', $user->id)->first();
if ($check) {
$config_value = Configs::query()->where('key', 'restrict_moment_num')->value('value') ?: 1;
$start_time = date('Y-m-d 00:00:00');
$end_time = date('Y-m-d 23:59:59');
$send_num = Moment::query()->where('user_id', $user->id)
->whereBetween('created_at', [$start_time, $end_time])
->whereNull('deleted_at')
->count();
if (($send_num + 1) > $config_value) {
return $this->failure('频繁发动态今天暂被限制');
}
}
// }
$res = $this->momentCon->addMomentV2($user, 'MP');
if (empty($res))
throw new \Exception("发布动态失败", 1);
if (is_array($res) && $res['code'])
return $this->failure($res['msg']);
$res['data']['topic_give'] = ['state' => 0, 'msg' => ''];
return $this->success('ok', $res['data']);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('发布动态的失败');
}
}
/**
* 动态详情
* @param Request $request [description]
* @param [type] $moment_id [description]
* @return [type] [description]
*/
public function moment(Request $request, $moment_id)
{
try {
$moment = $this->momentCon->moment($moment_id);
if (is_array($moment) && $moment['code'] == 1)
return $this->failure($moment['msg']);
if (!empty($moment->topic)) {
$moment->topic->quote_num = Moment::where('topic_id', $moment->topic_id)->where(function ($sql) {
$sql->where('is_audited', 1)
->orWhere(function ($query) {
$query->where('user_id', auth()->id())->where('is_audited', 0);
});
})->count();
}
if (empty($moment))
throw new \Exception("动态详情失败", 1);
if (is_array($moment) && $moment['code'])
return $this->failure($moment['msg']);
$comments = $this->momentCon->momentComments($moment->id, $limit = 0, $nopage = 0);
//通知已读
$where = [
'user_id' => auth()->id(),
'type' => 'moment',
'status' => 0
];
$unread_ids = Notice::query()->where($where)->pluck('id');
if ($unread_ids) {
Notice::whereIn('id', $unread_ids)->update(['status' => 1]);
}
return $this->success('ok', compact('moment', 'comments'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取动态详情失败,请稍后再试');
}
}
//评论列表
public function comments(Request $request)
{
try {
$result = $this->momentCon->comments($request);
return $this->success('ok', $result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取评论失败,请稍后再试');
}
}
//删除动态评论
public function delComment(Request $request)
{
try {
$user = auth()->user();
$comment_id = $request->comment_id;
$moment_id = $request->moment_id;
$vote_id = $request->vote_id;
$moment = Moment::find($moment_id);
$comment = Comment::find($comment_id);
if (!$comment) {
return $this->failure('动态不存在或已删除');
}
$vote = Vote::find($vote_id);
if ($user->id != $moment->user_id && $user->id != $comment->commented_id) {
return $this->failure('只能删除自己发布的评论');
}
if ($request->moment_id) {
$moment->comments()->where(function ($sql) use ($comment_id) {
$sql->where('id', $comment_id);
})->delete();
}
if ($request->vote_id) {
$vote->comments()->where(function ($sql) use ($comment_id) {
$sql->where('id', $comment_id);
})->delete();
}
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
/**
* 删除动态
* @param [type] $moment_id [description]
* @return [type] [description]
*/
public function deleteMoment($moment_id)
{
try {
$moment = $this->momentCon->deleteMoment($moment_id);
if (empty($moment))
throw new \Exception("删除动态失败", 1);
if ($moment && is_array($moment) && $moment['code'])
return $this->failure($moment['msg']);
return $this->success('ok', $moment);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('删除动态失败,请稍后再试');
}
}
//点赞投票
public function likeVote(Request $request, $vote_id)
{
try {
$vote = Vote::find($vote_id);
if (empty($vote)) {
return $this->failure('投票不存在');
}
$result = $this->momentCon->likeModel($vote);
if (empty($result))
throw new \Exception("点赞失败", 1);
if (is_array($result) && $result['code'])
return $this->failure($result['msg']);
$isLker = $result['isLker'];
return $this->success('ok', compact('isLker'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('点赞动态失败,请稍后再试');
}
}
/**
* 点赞动态
* @param Request $request [description]
* @param [type] $momment_id [description]
* @return [type] [description]
*/
public function likeMoment(Request $request, $moment_id)
{
$user = auth()->user();
try {
// 被拉黑用户的用户无法点赞
$moment = Moment::find($moment_id);
if (empty($moment))
return $this->failure('该动态已被删除');
$result = $this->userCon->isBlacklist($user->id, $moment->user_id);
if ($result) {
if ($result == 1)
return $this->failure('您已经被对方拉入黑名单');
if ($result == 2)
return $this->failure('您已经将对方拉入黑名单');
}
$result = $this->momentCon->likeMoment($moment_id);
if (empty($result))
throw new \Exception("点赞失败", 1);
if (is_array($result) && $result['code'])
return $this->failure($result['msg']);
$isLkerMoment = $result['isLkerMoment'];
return $this->success('ok', compact('isLkerMoment'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('点赞动态失败,请稍后再试');
}//点赞
$this->moment->likeMoment($user->id, $moment_id);
return $this->success('ok');
}
/**
* 评论动态
* @param Request $request [description]
* @param [type] $moment_id [description]
* @return [type] [description]
*/
public function commentMoment(Request $request, $moment_id)
{
try {
if (empty($request->comment)) {
return $this->failure('评论不能为空');
}
//敏感词汇过滤
$result = \CommonUtilsService::checkoutTextArray([$request->comment]);
if ($result['code'] == 1) {
return $this->failure($result['cause']);
}
$result = $this->momentCon->commentMoment($moment_id);
if (is_array($result) && array_key_exists('code', $result)) {
return $this->failure($result['msg']);
}
if ($request->reply_id) {
$result->reply_id = $request->reply_id;
$result->save();
}
$result->user = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->commented_id)->first();
$result->replyer = User::select('id', 'nickname', 'app_avatar', 'photo', 'sex')->where('id', $result->reply_id)->first();
if (empty($result))
throw new \Exception("评论失败", 1);
return $this->success('ok', $result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('评论动态失败,请稍后再试');
}
}
/**
* 动态话题列表
* @param Request $request [description]
* @return [type] [description]
*/
public function topics(Request $request)
{
try {
$user = null;
if (Auth::guard('api')->check()) {
$topics = $this->momentCon->topicsV2($request);
$user = auth()->user();
} else {
$topics = $this->momentCon->topicsV2($request, 'tourist');
}
foreach ($topics as $topic) {
$topic->quote_num = $topic->moment_count;
$topic->is_participated = 0;
if ($user) {
if ($topic->moment_topics_activities) {
$topic->is_participated = 0;
$other_type = RankHistory::TOPICACTIVITIESPARTGIVE . '_' . $topic->id;
$superCount = $user->getSuperCount($user->id, RankHistory::TOPICACTIVITIESPARTGIVE, $other_type);
if ($superCount >= 1) {
$topic->is_participated = 1;
}
}
}
}
if (empty($topics))
throw new \Exception("获取话题列表失败", 1);
return $this->success('ok', $topics);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取话题列表失败,请稍后再试');
}
}
public function topic(Request $request, $topic_id)
{
try {
$user = auth()->user();
//不喜欢的动态id
$unlike_moment_id = UnlikeMomentLog::where('user_id', $user->id)->pluck('moment_id')->toArray();
//没有用户的动态id
$has_no_user_moment_id = Moment::doesntHave('user')->pluck('id')->toArray();
$topic = MomentTopic::where('id', $topic_id)
->with([
'momentTopicsActivities' => function ($q) {
$date = date('Y-m-d H:i:s');
$q->where('start_time', '<=', $date);
$q->where('end_time', '>=', $date);
}
])
->withCount([
'moment' => function ($query) use ($unlike_moment_id, $has_no_user_moment_id) {
$query->where(function ($sql) use ($unlike_moment_id, $has_no_user_moment_id) {
$sql->where('is_audited', 1)->whereNotIn('id', $unlike_moment_id)->whereNotIn('id', $has_no_user_moment_id);
})
->orWhere(function ($sql) {
$sql->where('user_id', auth()->id())->where('is_audited', 0);
});
}
])->first();
if ($user) {
$topic->is_participated = 0;
$other_type = RankHistory::TOPICACTIVITIESPARTGIVE . '_' . $topic_id;
$superCount = $user->getSuperCount($user->id, RankHistory::TOPICACTIVITIESPARTGIVE, $other_type);
if ($superCount >= 1) {
$topic->is_participated = 1;
}
}
if (empty($topic)) {
return $this->failure('话题不存在');
}
$topic->quote_num = $topic->moment_count;
return $this->success('ok', $topic);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取话题列表失败,请稍后再试');
}
}
/**
* 举报动态
* @param Request $request [description]
* @param [type] $moment_id [description]
* @return [type] [description]
*/
public function complaintMoment(Request $request, $moment_id)
{
try {
$result = $this->momentCon->complaintMoment($moment_id);
if (empty($result))
throw new \Exception("举报动态失败", 1);
if ($result && is_array($result) && $result['code'])
return $this->failure($result['msg']);
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('举报动态失败,请稍后再试');
}
}
public function liker(Request $request)
{
try {
$result = $this->momentCon->liker($request);
return $this->success('ok', $result);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取点赞列表失败,请稍后再试');
}
}
public function momentLikers(Request $request, $moment_id)
{
try {
$users = $this->momentCon->momentLikers($moment_id);
if (empty($users))
throw new \Exception("点赞列表失败", 1);
if (is_array($users) && $users['code'])
return $this->failure($users['msg']);
return $this->success('ok', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure("获取点赞列表失败,请稍后再试");
}
}
public function unlikeMoment(Request $request, $moment_id)
{
try {
$result = $this->momentCon->unlikeMoment($moment_id);
if (empty($result))
throw new \Exception("不感兴趣失败", 1);
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('操作失败,请稍后再试');
}
}
//点赞评论
public function likeComment(Request $request, $comment_id)
{
try {
$comment = Comment::find($comment_id);
if (empty($comment)) {
return $this->failure('评论不存在');
}
$result = $this->momentCon->likeModel($comment);
if (empty($result))
throw new \Exception("点赞失败", 1);
if (is_array($result) && $result['code'])
return $this->failure($result['msg']);
$isLker = $result['isLker'];
return $this->success('ok', compact('isLker'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('点赞评论失败,请稍后再试');
}
}
/**
* 用户动态列表
* @param Request $request [description]
* @param [type] $user_id [description]
* @return [type] [description]
*/
public function userMoments(Request $request, $user_id)
{
$moments = $this->moment->userMoments($user_id);
return $this->success('ok', $moments);
}
public function complaintLabels(Request $request)
{
$labels = ['信息虚假', '侵权抄袭', '广告软文', '政治敏感', '色情低俗', '内容引起不适'];
return $this->success('ok', $labels);
}
//动态首页(判断是否动态管理员、是否有更新)
public function momentHome(Request $request)
{
$user = $this->getMyUserinfo();
if (!empty($user)) {
$is_moment_admin = RoleUser::where('role_id', 21)->where('user_id', $user->id)->count() ? 1 : 0;
$last_moment_id = Redis::get($user->id . 'last_see_moment');
$belief = $user->belief;
$new_moment_id = Moment::where('is_audited', 1)
->where('is_show', 1)
->whereNull('aliyun_video_id')
->whereHas('user', function ($q) use ($belief) {
$q->where('hidden_profile', 'NONE');
if ($belief) {
if ($belief == '基督教') {
$q->where('belief', $belief);
} else {
$q->where('belief', '<>', '基督教');
}
}
})
->orderBy('id', 'desc')
->value('id');
$has_new_moment = $new_moment_id > $last_moment_id ? 1 : 0;
$is_subscribe = $user->is_subscribe;
$is_approved = $user->is_approved;
$is_real_approved = $user->is_real_approved;
$is_profile = $user->isCompletedProfile('mp_other_info');
$is_audited = AreaUser::where('user_id', $user->id)->where('area_id', 1)->orderBy('id', 'desc')->value('is_audited');
if ($is_audited === null || $is_audited == -1) {
$is_audited = 2;
}
$has_apply_area = $is_audited === null ? 2 : $is_audited;
//基本资料
$is_base_info = $this->userCon->isCompleteBaseInfo($user);
} else {
$is_moment_admin = 0;
$has_new_moment = 0;
$is_subscribe = 0;
$is_approved = 0;
$is_profile = 0;
$has_apply_area = 0;
$is_real_approved = 0;
$is_base_info = 0;
}
$activities_is_start = 0;
$start_time = 1623427200;
$end_time = 1624204800;
$present_time = time();
if ($present_time > $start_time && $present_time < $end_time) {
$activities_is_start = 1;
}
return $this->success('ok', compact('is_moment_admin', 'has_new_moment', 'is_subscribe', 'is_approved', 'is_profile', 'has_apply_area', 'is_real_approved', 'activities_is_start', 'is_base_info'));
}
}