__handlePropertyHandler(__CLASS__); } /** * 视频列表 * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: * {"handshake":"","data":{"page":1,"page_size":5,"order":"id","order_sort":"desc","search":{"is_home":"","type_id":"53","title":"","video_id":"","user_id":"","status":"","check":"","stime":"","otime":""}}} */ public function list(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['page' => 'required|int', 'page_size' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $page = $inputData['page']; $page_size = intval($inputData['page_size']); if ($page_size <= 0) { $page_size = 12; } if ($page_size > 100) { $page_size = CommonConstant::PAGE_SIZE; } $select = ['video.*', Db::raw("(select user.nick from user where user.code=video.uid) AS user_nick")]; $model = Model::query(); $order_key = isset($inputData['order']) ? $inputData['order'] : 'id'; $order_value = isset($inputData['order_sort']) ? $inputData['order_sort'] : 'desc'; if (!$order_key) { $order_key = 'id'; //不要信任前端,他可能会传个空字符串过来! } if (!$order_value) { $order_value = 'desc'; } // "type_id":"视频分类ID", "title":"视频名字", "video_id":"视频ID", "user_id":"用户ID", "status":"上架状态", "check":"审核状态","stime":"视频的上传开始时间", "otime":"视频的上传结束时间", "is_home":"是否为首页视频( 0-不是 1-是 ''-不过滤)" // 备注: mu字段没包含.m3u8就是没转码 $search = isset($inputData['search']) ? $inputData['search'] : array(); if ($search) { foreach ($search as $k => $v) { if (!strlen((string) $v)) { continue; } switch ($k) { case "is_home": $is_home_ids = VideoPerfectModel::query()->pluck('video_id'); if ($v == '1') { $model->whereIn('id', $is_home_ids); } else { $model->whereNotIn('id', $is_home_ids); } break; case "type_id": $model->where('tv.' . $k, $v); $model->leftJoin('type_video as tv', 'video.id', '=', 'tv.video_id'); break; case "category_alias_name": $model->whereHas('perfect', function ($q1) use($v) { $q1->where('category_alias_name', $v); }); break; case "title": $model->where('video.' . $k, 'like', '%' . $v . '%'); break; case "user_id": $model->where('video.uid', $v); break; case "video_id": $model->where('video.id', $v); break; case "stime": $model->where('video.created_at', '>=', Carbon::parse($v)->startOfDay()->toDateTimeString()); break; case "otime": $model->where('video.created_at', '<=', Carbon::parse($v)->endOfDay()->toDateTimeString()); break; case "online_otime": $model->where('video.online_at', '>=', Carbon::parse($v)->startOfDay()->toDateTimeString()); break; case "online_stime": $model->where('video.online_at', '<=', Carbon::parse($v)->endOfDay()->toDateTimeString()); break; case "player_type": $model->where('video.player_type', $v); break; default: $model->where('video.' . $k, $v); } } } $creatorRepo = make(CreatorRepository::class); $result = $model->select($select)->with(['category:type.id as type_id,type.title', 'perfect:id,video_id,category_alias_name'])->orderBy((string) $order_key, (string) $order_value)->paginate($page_size, ['*'], 'page', $page); $result = $result->toArray(); if (!empty($result['data'])) { foreach ($result['data'] as &$v) { if ($v['pay_type'] == 2) { // 金币视频, 才走sql $v['buy_video_count'] = $creatorRepo->countVideoBuyer($v['id']); } else { $v['buy_video_count'] = 0; } } } //处理图片/视频路径 // foreach ($result as $v) { // if (!$v->from) { // $v->cover = make(CommonService::class)->getImageUrl((string)$v->cover, true); // $v->smu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->smu); // $v->mu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->mu); // } // } return json_success($result); } /** * 删除 (假删) * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"id":8}} */ public function delete(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['id' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $info = Model::query()->where('id', $inputData['id'])->first(); if (!$info) { return json_fail('视频信息不存在'); } $result = Model::query()->where('id', $inputData['id'])->delete(); if (!$result) { return json_fail('删除失败'); } // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); // 创建管理员日志 $olditem = clone $info; $logSubject = "删除视频"; $logSvalue = $olditem->id; $logDbData = ['after_items' => [], 'before_items' => [$olditem->toArray()]]; $this->log($logSubject, $logSvalue, $logDbData); return json_success($result); } /** * 删除-批量 (假删) * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"ids":"1,2,4"}} */ public function deleteList(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['ids' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $ids = $inputData['ids']; $_ids = explode(',', $ids); $ids_list = []; foreach ($_ids as $kk => $vv) { if (!$vv) { continue; } $ids_list[] = $vv; } if (!$ids_list) { return json_fail("操作失败,没有满足的视频ID"); } $result = Model::query()->whereIn('id', $ids_list)->delete(); if (!$result) { return json_fail('删除失败'); } // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); // 创建管理员日志 $logSubject = "批量删除视频,ids为:{$ids}"; $logSvalue = ''; $logDbData = ['after_items' => [], 'before_items' => [$ids_list]]; return json_success($result); } /** * 回收站-列表 (强制过滤删除的视频) * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: * {"handshake":"","data":{"page":1,"page_size":5,"order":"id","order_sort":"desc","search":{"type_id":"","title":"","video_id":"","user_id":"","status":"","check":"","stime":"","otime":""}}} */ public function deleteHistoryList(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['page' => 'required|int', 'page_size' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $page = $inputData['page']; $page_size = $inputData['page_size']; $select = ['video.*', Db::raw("(select user.nick from user where user.code=video.uid) AS user_nick")]; //$model = Model::query(); //这样写法,是查询出deleted_at无值的数据 $model = Model::query()->onlyTrashed(); //注意:这样写,因需要查询出deleted_at有值的数据, $order_key = isset($inputData['order']) ? $inputData['order'] : 'id'; $order_value = isset($inputData['order_sort']) ? $inputData['order_sort'] : 'desc'; if (!$order_key) { $order_key = 'id'; //不要信任前端,他可能会传个空字符串过来! } if (!$order_value) { $order_value = 'desc'; } // "type_id":"视频分类ID", "title":"视频名字", "video_id":"视频ID", "user_id":"用户ID", "status":"上架状态", "check":"审核状态","stime":"视频的上传开始时间", "otime":"视频的上传结束时间" // 备注: mu字段没包含.m3u8就是没转码 $search = isset($inputData['search']) ? $inputData['search'] : array(); if ($search) { foreach ($search as $k => $v) { if (!strlen((string) $v)) { continue; } switch ($k) { case "type_id": $model->where('tv.' . $k, $v); $model->leftJoin('type_video as tv', 'video.id', '=', 'tv.video_id'); break; case "title": $model->where('video.' . $k, 'like', $v . '%'); break; case "user_id": $model->where('video.uid', $v); break; case "video_id": $model->where('video.id', $v); break; case "stime": $model->where('video.created_at', '>=', $v); break; case "otime": $model->where('video.created_at', '<=', Carbon::parse($v)->endOfDay()->toDateTimeString()); break; default: $model->where('video.' . $k, $v); } } } $result = $model->select($select)->with(['category:type.id as type_id,type.title'])->orderBy((string) $order_key, (string) $order_value)->paginate($page_size, ['*'], 'page', $page); //处理图片/视频路径 // foreach ($result as $v) { // if (!$v->from) { // $v->cover = make(CommonService::class)->getImageUrl((string)$v->cover, true); // $v->smu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->smu); // $v->mu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->mu); // } // } return json_success($result); } /** * 回收站-恢复(即取消删除) * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"id":2}} */ public function reset(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['id' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $info = Db::table('video')->where('id', $inputData['id'])->first(); if (!$info) { return json_fail('视频信息不存在'); } $data = ['deleted_at' => null]; $result = Db::table('video')->where('id', $inputData['id'])->update($data); /* $result = Model::query() ->where('id', $inputData['id']) ->restore(); // 这个写法可以设置为null, 框架提供的方法 */ if (!$result) { return json_fail('恢复失败'); } // 创建管理员日志 $olditem = clone $info; $olditem = json_decode(json_encode($olditem), true); $newitem = Model::query()->where('id', $inputData['id'])->first(); $logSubject = "恢复视频,将已删除的视频ID:{$inputData['id']},进行恢复状态"; $logSvalue = $inputData['id']; $logDbData = ['after_items' => [$newitem->toArray()], 'before_items' => [ //$olditem->toArray(), $olditem, ]]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success($result); } /** * 首页视频管理-列表 * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: * {"handshake":"","data":{"page":1,"page_size":5,"order":"id","order_sort":"desc","search":{"title":"","video_id":"","user_id":"","stime":"","otime":""}}} */ public function indexList(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['page' => 'required|int', 'page_size' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $page = $inputData['page']; $page_size = $inputData['page_size']; $order_key = $inputData['order'] ?? ""; $order_value = $inputData['order_sort'] ?? 'desc'; switch ($order_key) { case "like": $order_key = 'video.like'; //点赞量 break; default: $order_key = 'video_perfect.id'; } switch ($order_value) { case "asc": $order_value = 'asc'; break; default: $order_value = 'desc'; } $model = VideoPerfectModel::query(); // "title":"视频名字", "video_id":"视频ID", "user_id":"用户ID", "stime":"首页视频添加-开始时间", "otime":"首页视频添加-结束时间" $search = isset($inputData['search']) ? $inputData['search'] : array(); if ($search) { foreach ($search as $k => $v) { if (!strlen((string) $v)) { continue; } switch ($k) { case "title": $model->where('video.' . $k, 'like', "{$v}%"); break; case "video_id": $model->where('video_perfect.' . $k, $v); break; case "user_id": $model->where('video.uid', $v); break; case "stime": $model->where('video_perfect.created_at', '>=', $v); break; case "otime": $model->where('video_perfect.created_at', '<=', Carbon::parse($v)->endOfDay()->toDateTimeString()); break; default: } } } $select = ['video_perfect.id as video_perfect_id', 'video_perfect.created_at as video_perfect_created_at', 'video_perfect.video_id', 'video.*', Db::raw("(select user.nick from user where user.code=video.uid) AS user_nick")]; $result = $model->select($select)->join('video', 'video.id', '=', 'video_perfect.video_id')->with(['category:type.id as type_id,type.title'])->orderBy((string) $order_key, (string) $order_value)->paginate($page_size, ['*'], 'page', $page); //处理图片/视频路径 // foreach ($result as $v) { // if (!$v->from) { // $v->cover = make(CommonService::class)->getImageUrl((string)$v->cover, true); // $v->smu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->smu); // $v->mu = make(VideoService::class)->getPlayUrl((string)$v->from, (string)$v->mu); // } // } return json_success($result); } /** * 首页视频管理-删除[真删] * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"video_id":"11"}} */ public function indexDelete(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['video_id' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $video_id = $inputData['video_id']; $info = VideoPerfectModel::query()->where('video_id', $video_id)->first(); if (!$info) { return json_fail("此视频已从首页视频中删除,请勿重复操作"); } $result = VideoPerfectModel::query()->where('video_id', $video_id)->delete(); if (!$result) { return json_fail("操作失败"); } // 创建管理员日志 $old_items = clone $info; $logSubject = "删除首页视频,id为:{$video_id}"; $logSvalue = $video_id; $logDbData = ['after_items' => [], 'before_items' => [$old_items->toArray()]]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success('', '操作成功'); } /** * 首页视频管理-批量删除[真删] * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"ids":"1,3,4"}} */ public function indexDeleteMore(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['ids' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $ids = $inputData['ids']; $_ids = explode(',', $ids); $ids_list = []; foreach ($_ids as $kk => $vv) { if (!$vv) { continue; } $ids_list[] = $vv; } if (!$ids_list) { return json_fail("操作失败,没有满足的视频ID"); } $result = VideoPerfectModel::query()->whereIn('video_id', $ids_list)->delete(); if (!$result) { return json_fail("操作失败"); } // 创建管理员日志 $logSubject = "批量删除首页视频,ids为:{$ids}"; $logSvalue = ''; $logDbData = ['after_items' => [], 'before_items' => [$ids_list]]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success('', '操作成功'); } /** * 首页视频管理-批量添加 * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"ids":"1,2,3,4"}} */ public function indexAdds(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['ids' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { return json_fail($validator->errors()->first()); } $ids = $inputData['ids']; $_ids = explode(',', $ids); $check = VideoPerfectModel::query()->whereIn('video_id', $_ids)->get(); $_ids_db = []; if ($check) { //过滤已添加的视频id foreach ($check as $k) { $_ids_db[] = $k->video_id; } } $data = []; foreach ($_ids as $kk => $vv) { if (!$vv) { continue; } if (in_array($vv, $_ids_db)) { continue; } $data[] = array('video_id' => $vv, 'created_at' => Carbon::now()->toDateTimeString(), 'updated_at' => Carbon::now()->toDateTimeString()); } if (!$data) { return json_fail("这些视频已处理,请勿重复操作"); } $result = VideoPerfectModel::query()->insert($data); if (!$result) { return json_fail("操作失败"); } // 创建管理员日志 $logSubject = "批量追加首页视频"; $logSvalue = ''; $logDbData = ['after_items' => [$data], 'before_items' => []]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success('', '操作成功'); } /** * 审核 * @author x.b * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"video_id":7,"check":1}} */ public function check(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['video_id' => 'required|int', 'check' => 'required|in:1,2']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $data = ['id' => $inputData['video_id'], 'check' => $inputData['check']]; $data = action_data($data); $oldItem = VideoModel::query()->where('id', $inputData['video_id'])->first(); if (!$oldItem) { return json_fail('视频不存在'); } if ($inputData['check'] == 1 && strpos($oldItem->mu, '.mp4')) { //状态改为转码中 $data['status'] = 2; //转码 make(QueueService::class)->addShiftVideoJob(['path' => $oldItem->mu, 'table' => 'video', 'id' => $oldItem->id, 'update' => 'mu']); } $result = VideoModel::query()->where('id', $inputData['video_id'])->update($data); $newitem = VideoModel::query()->where('id', $inputData['video_id'])->first(); // 创建管理员日志 $logSubject = "审核视频"; $logSvalue = $inputData['video_id']; $logDbData = ['after_items' => [$newitem->toArray()], 'before_items' => [$oldItem->toArray()]]; $this->log($logSubject, $logSvalue, $logDbData); return json_success($result); } /** * 编辑(标示上架/下架) * @author x.b * @param ValidatorFactoryInterface $validatorFactory * @param string no $video_id 视频ID(内调此接口使用) - 非必传 * @param string no $status 状态0-下架 1-上架(内调此接口使用)- 非必传 * @return mixed 若是 内调时,返回bool * @example param_json_data string: {"handshake":"","data":{"video_id":7,"status":1}} */ public function update(ValidatorFactoryInterface $validatorFactory, $video_id = '', $status = '') { $inputData = $this->getJsonData(); $rules = ['video_id' => 'required|int', 'status' => 'required|in:1,2']; if (!$video_id) { $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $is_self = 0; //是否为内调 0-不是 1-是 } else { $inputData['video_id'] = $video_id; $inputData['status'] = $status; $is_self = 1; } $oldItem = VideoModel::query()->where('id', $inputData['video_id'])->first(); if (!$oldItem) { return $is_self ? false : json_fail('视频不存在'); } // if ($inputData['status'] == 1 // && // ( // !strpos($oldItem->mu, '.m3u8') // || // !strpos($oldItem->smu, '.m3u8') // ) // ) { // return $is_self ? false : json_fail('视频还未转码'); // } $data = ['status' => $inputData['status'], 'online_at' => date('Y-m-d H:i:s')]; $result = VideoModel::query()->where('id', $inputData['video_id'])->update($data); // 同步沉余更新视频分类数据表 $data2 = ['status' => $inputData['status']]; $result = TypeVideoModel::query()->where('video_id', $inputData['video_id'])->update($data2); $newitem = VideoModel::query()->where('id', $inputData['video_id'])->first(); // 创建管理员日志 $logSubject = "上下架视频"; $logSvalue = $inputData['video_id']; $logDbData = ['after_items' => [$newitem->toArray()], 'before_items' => [$oldItem->toArray()]]; $this->log($logSubject, $logSvalue, $logDbData); if ($oldItem->status != $newitem->status) { // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); } return $is_self ? true : json_success($result); } /** * 批量上架 ( 特殊处理: 内调 依次 上架 接口) * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"ids":"8,9,10"}} */ public function setStatusUp(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['ids' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $ids = $inputData['ids']; $_ids = explode(',', $ids); $ids_list = []; foreach ($_ids as $kk => $vv) { if (!$vv) { continue; } $ids_list[] = $vv; } if (!$ids_list) { return json_fail("操作失败,没有满足的视频ID"); } $error_msg = ""; foreach ($ids_list as $v) { $r = self::update($validatorFactory, $v, 1); if ($r === false) { $error_msg .= ' ' . $v; } } if ($error_msg) { return json_fail('', '操作失败,以下视频ID处理失败:' . $error_msg); } else { // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success('', '全部处理成功'); } } /** * 批量下架 * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"ids":"8,9,10"}} */ public function setStatusDown(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); $rules = ['ids' => 'required|string']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $ids = $inputData['ids']; $_ids = explode(',', $ids); $ids_list = []; foreach ($_ids as $kk => $vv) { if (!$vv) { continue; } $ids_list[] = $vv; } if (!$ids_list) { return json_fail("操作失败,没有满足的视频ID"); } $data = [ 'status' => 2, //2-下架 1-上架 'online_at' => Carbon::now()->toDateTimeString(), ]; $result = VideoModel::query()->whereIn('id', $ids_list)->update($data); // 同步沉余更新视频分类数据表 $data2 = ['status' => 0]; $result = TypeVideoModel::query()->whereIn('video_id', $ids_list)->update($data2); // 创建管理员日志 $logSubject = "批量下架视频,ids为:{$ids}"; $logSvalue = ''; $logDbData = ['after_items' => [], 'before_items' => [$ids_list]]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); return json_success($result); } /** * 添加/修改视频 * @author x.b * @param ValidatorFactoryInterface $validatorFactory * @return mixed * @example param_json_data string: {"handshake":"","data":{"video_id":7,"title":1,"cover":'',"mu":'','like':1,"type_ids":'1,3,4',"coins":"10"}} */ public function save(ValidatorFactoryInterface $validatorFactory) { $inputData = $this->getJsonData(); if (isset($inputData['video_id'])) { $rules = [ 'video_id' => 'int', 'title' => 'string', 'cover' => 'string', 'mu' => 'string', // 'like' => 'int', 'type_ids' => 'string', 'recommend_level' => 'int', 'pay_type' => 'required|int', ]; } else { $rules = [ 'video_id' => 'int', 'title' => 'required|string', 'cover' => 'required|string', 'mu' => 'required|string', // 'like' => 'int', 'type_ids' => 'string', 'recommend_level' => 'int', 'pay_type' => 'required|int', ]; } $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } if (!$inputData['video_id']) { if (!$inputData['mu']) { return json_fail('请上传视频'); } } $coins = intval(data_get($inputData, 'coins', 0)); $payType = intval(data_get($inputData, 'pay_type', 1)); if ($coins < 0) { return json_fail('请填写金币'); } $data = [ 'title' => $inputData['title'] ?? '', 'cover' => $inputData['cover'] ?? '', 'mu' => $inputData['mu'] ?? '', // 'like' => $inputData['like'], 'pay_type' => $payType, 'coins' => $coins, //金币 'uid' => $inputData['uid'] ?? '', //视频表uid 即用户邀请码 (微啪-非必传,官方视频绑定为 DFZUAR ),抖音-约会版 必传字段 'recommend_level' => isset($inputData['recommend_level']) ? intval($inputData['recommend_level']) : 0, ]; /*if ($data['uid']) { $check = UserModel::query() ->select(['id']) ->where('code', $data['uid']) ->first(); if (!$check) { return json_fail('请填写正确的用户邀请码'); } }*/ $newStrTags = ''; $newArrTags = []; $create = action_data($data); if ($inputData['video_id']) { $oldItem = Model::query()->where('id', $inputData['video_id'])->first(); if (!$oldItem) { return json_fail('视频不存在'); } //判断分类 if ($inputData['type_ids']) { $ids = explode(',', $inputData['type_ids']); foreach ($ids as $k => $id) { $typeObj = TypeModel::query()->where(['id' => $id])->first(); if (!empty($typeObj)) { $newArrTags[] = $typeObj->title; } $type[$k] = ['type_id' => $id, 'video_id' => $inputData['video_id']]; } } if (isset($type)) { TypeVideoModel::query()->where('video_id', $inputData['video_id'])->delete(); TypeVideoModel::query()->insert($type); } if (!empty($newArrTags)) { $newStrTags = implode(',', $newArrTags); $create['tags'] = $newStrTags; } else { $create['tags'] = ''; } $result = Model::query()->where('id', $inputData['video_id'])->update($create); $newitem = Model::query()->where('id', $inputData['video_id'])->first(); // 创建管理员日志 $logSubject = "修改视频"; $logSvalue = $inputData['video_id']; $logDbData = ['after_items' => [$newitem->toArray()], 'before_items' => [$oldItem->toArray()]]; $this->log($logSubject, $logSvalue, $logDbData); if ($oldItem->status != $newitem->status) { // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); } } else { if ($inputData['type_ids']) { $ids = explode(',', $inputData['type_ids']); foreach ($ids as $k => $id) { $typeObj = TypeModel::query()->where(['id' => $id])->first(); if (!empty($typeObj)) { $newArrTags[] = $typeObj->title; } $type[$k] = ['type_id' => $id, 'video_id' => $inputData['video_id']]; } } if (!empty($newArrTags)) { $newStrTags = implode(',', $newArrTags); $create['tags'] = $newStrTags; } else { $create['tags'] = ''; } $result = Model::query()->create($create); if (!$result) { return json_fail('创建失败'); } if (isset($type)) { TypeVideoModel::query()->insert($type); } // 创建管理员日志 $logSubject = "添加视频"; $logSvalue = $result->id; $logDbData = ['after_items' => [$result->toArray()], 'before_items' => []]; $this->log($logSubject, $logSvalue, $logDbData); // 清理最新视频分页缓存. dispatch_job(new ClearAllLastestPagesCacheJob()); } return json_success($result); } /** * 首页视频发布 * @author x.b * @return mixed */ public function home() { $video_ids = VideoPerfectModel::query()->pluck('video_id')->all(); $count = count($video_ids) / 5; //总条数 if ($count < 20) { return json_fail('视频至少添加100个,当前' . count($video_ids) . '个'); } $result = make(QueueService::class)->addHomeVideoJob(['video_ids' => $video_ids]); // 创建管理员日志 $logSubject = "发布首页视频"; $logSvalue = 0; $logDbData = ['after_items' => [[]], 'before_items' => [$video_ids]]; $this->log($logSubject, $logSvalue, $logDbData); return json_success($result); } /** * 首页视频桶缓存初始化. * @return mixed */ public function homeInit() { dispatch_job(new HomeVideoInitJob()); $logSubject = "首页视频桶缓存初始化"; $logSvalue = 0; $logDbData = ['after_items' => [[]], 'before_items' => []]; $this->log($logSubject, $logSvalue, $logDbData); return json_success(['result' => 'success']); } /** * 硬删除,用于回收站内. * @return mixed */ public function hardDelete() { $validatorFactory = make(ValidatorFactoryInterface::class); $inputData = $this->getJsonData(); $rules = ['ids' => 'required|array']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $ids = data_get($inputData, 'ids', []); $ids = array_filter($ids); $ids = array_unique($ids); if (empty($ids)) { return json_fail('请选择视频'); } $newIds = []; $items = VideoModel::query()->withTrashed()->whereIn('id', $ids)->get(['id', 'deleted_at']); if ($items->isNotEmpty()) { foreach ($items as $v) { if (is_null($v->deleted_at)) { return json_fail($v->id . ', 非回收站视频,不能完整执行硬删除操作'); break; } else { $newIds[] = $v->id; } } } if (!empty($newIds)) { $videoRepo = make(VideoRepository::class); $videoRepo->hardDelete($newIds); } else { return json_fail('视频选择有误'); } return json_success(['result' => 'success']); } /** * 审核 * @return mixed */ public function changeCheck() { $validatorFactory = make(ValidatorFactoryInterface::class); $inputData = $this->getJsonData(); $rules = ['id' => 'required|int', 'target_check' => 'required|int', 'reject_reason' => 'nullable']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $videoRepo = make(VideoRepository::class); $targetCheck = intval(data_get($inputData, 'target_check', 0)); $obj = $videoRepo->find($inputData['id'], ['id', 'title', 'status', 'type', 'check', 'reject_reason', 'updated_at', 'created_at', 'uid', 'online_at']); if (empty($obj)) { return json_fail('对象不存在'); } $rejectReason = data_get($inputData, 'reject_reason', ''); if ($obj->check == $targetCheck) { return json_fail('前后状态无变化'); } $creatorRepo = make(CreatorRepository::class); $creatorObj = $creatorRepo->detail($obj->uid); $videoTitle = mb_substr($obj->title, 0, 30); $msgSubjct = '恭喜您,视频【' . $videoTitle . '】审核通过.'; $msgContent = '您可以分享本APP给微信、qq群里的朋友,收益越大.'; $obj->reject_reason = ''; if ($targetCheck == 2) { $obj->reject_reason = $rejectReason; $obj->status = 2; $msgSubjct = '视频【' . $videoTitle . '】未通过审核'; $msgContent = '拒绝原因:' . $rejectReason . ', 若有异议,请联系客服!'; } elseif ($targetCheck == 1) { $obj->status = 1; //审核通过就直接上架. $obj->online_at = Carbon::now()->toDateTimeString(); // 上架时间 $jobParams = ['video_id' => $obj->id, 'type' => $obj->type, 'status' => 1, 'check' => $targetCheck]; // 异步自动增加评论和点赞 dispatch_job(new VideoAutoCommentJob($jobParams)); } $obj->check = $targetCheck; $saveStatus = $obj->save(); if ($saveStatus && !empty($creatorObj)) { $jobParams = ['from_type' => 'sys', 'receive_uid' => $obj->uid, 'subject' => $msgSubjct, 'content' => $msgContent]; // 异步发送通知站内消息 dispatch_job(new SendMessageToUserJob($jobParams)); $creatorRepo->checkUpgrade0to1($creatorObj); } return json_success(['result' => 'success']); } /** * 批量审核 * @return mixed */ public function batchChangeCheck() { $validatorFactory = make(ValidatorFactoryInterface::class); $inputData = $this->getJsonData(); $rules = ['ids' => 'required', 'target_check' => 'required|int']; $validator = $validatorFactory->make($inputData, $rules); if ($validator->fails()) { // 如果有错误(可能是多个信息),这里只取第一个错误信息返回. return json_fail($validator->errors()->first()); } $videoRepo = make(VideoRepository::class); $targetCheck = intval(data_get($inputData, 'target_check', 0)); $arrIds = []; if (is_string($inputData['ids'])) { $arrIds = explode(',', $inputData['ids']); } else { $arrIds = $inputData['ids']; } $rejectReason = '您上传的视频不符合要求'; if (!empty($arrIds)) { $creatorRepo = make(CreatorRepository::class); foreach ($arrIds as $id) { $obj = $videoRepo->find($id, ['id', 'title', 'status', 'type', 'check', 'reject_reason', 'updated_at', 'created_at', 'uid', 'online_at']); if (empty($obj)) { continue; } if ($obj->check == $targetCheck) { continue; } if ($obj->status == 2 && $obj->check == 0) { // 未审核的条件 $creatorObj = $creatorRepo->detail($obj->uid); $videoTitle = mb_substr($obj->title, 0, 30); $msgSubjct = '恭喜您,视频【' . $videoTitle . '】审核通过.'; $msgContent = '您可以分享本APP给微信、qq群里的朋友,收益越大.'; $obj->reject_reason = ''; if ($targetCheck == 2) { $obj->reject_reason = $rejectReason; $obj->status = 2; $msgSubjct = '视频【' . $videoTitle . '】未通过审核'; $msgContent = '拒绝原因:' . $rejectReason . ', 若有异议,请联系客服!'; } elseif ($targetCheck == 1) { $obj->status = 1; //审核通过就直接上架. $obj->online_at = Carbon::now()->toDateTimeString(); // 上架时间 $jobParams = ['video_id' => $obj->id, 'type' => $obj->type, 'status' => 1, 'check' => $targetCheck]; // 异步自动增加评论和点赞 dispatch_job(new VideoAutoCommentJob($jobParams)); } $obj->check = $targetCheck; $saveStatus = $obj->save(); if ($saveStatus && !empty($creatorObj)) { $jobParams = ['from_type' => 'sys', 'receive_uid' => $obj->uid, 'subject' => $msgSubjct, 'content' => $msgContent]; // 异步发送通知站内消息 dispatch_job(new SendMessageToUserJob($jobParams)); $creatorRepo->checkUpgrade0to1($creatorObj); } } } } return json_success(['result' => 'success']); } }