input('view')) { case 'anthology': $table = ArticleCollection::where('collect_id', $request->input('id')) ->leftJoin('articles', 'articles.uid', '=', 'article_collections.article_id'); break; case 'article': $table = ArticleCollection::where('article_id', $request->input('id')) ->leftJoin('articles', 'articles.uid', '=', 'article_collections.article_id'); break; } $count = $table->count(); $result = []; if (!empty($request->input('parent'))) { //输出某节点的子节点 $node = $table->where('article_id', $request->input('parent'))->first(); if ($node) { $nodeList = ArticleCollection::where('collect_id', $request->input('id')) ->where('id', '>', (int)$node->id)->orderBy('id')->get(); foreach ($nodeList as $key => $curr) { if ($curr->level <= $node->level) { break; } if ($request->has('lazy')) { if ($curr->level === $node->level + 1) { $result[] = $curr; } } else { $result[] = $curr; } } } } else { if ($request->has('lazy') && $count > 300) { $table = $table->where('level', 1); } $result = $table->select([ 'article_collections.id', 'collect_id', 'article_id', 'level', 'article_collections.title', 'children', 'article_collections.editor_id', 'article_collections.deleted_at', 'articles.status' ])->orderBy('id')->get(); } return $this->ok(["rows" => ArticleMapResource::collection($result), "count" => $count]); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // $validated = $request->validate([ 'anthology_id' => 'required', 'operation' => 'required' ]); $collection = Collection::find($request->input('anthology_id')); if (!$collection) { return $this->error("no recorder"); } //鉴权 $user = AuthApi::current($request); if (!$user) { return $this->error(__('auth.failed')); } if (!CollectionController::UserCanEdit($user["user_uid"], $collection)) { Log::error($user["user_uid"] . '无文集编辑权限' . $collection->uid); return $this->error(__('auth.failed')); } switch ($validated['operation']) { case 'add': # 添加多个文章到文集 $count = 0; foreach ($request->input('article_id') as $key => $article) { # code... if (!ArticleCollection::where('article_id', $article) ->where('collect_id', $request->input('anthology_id')) ->exists()) { $new = new ArticleCollection; $new->id = app('snowflake')->id(); $new->article_id = $article; $new->collect_id = $request->input('anthology_id'); $new->title = Article::find($article)->title; $new->level = 1; $new->editor_id = $user["user_id"]; $new->save(); $count++; } } return $this->ok($count); break; default: return $this->error('unknown operation'); break; } } /** * Display the specified resource. * * @param \App\Models\ArticleCollection $articleCollection * @return \Illuminate\Http\Response */ public function show(string $articleCollection) { // $id = explode('_', $articleCollection); $result = ArticleCollection::where('article_id', $id[0]) ->where('collect_id', $id[1]) ->first(); if ($result) { return $this->ok(new ArticleMapResource($result)); } else { return $this->error('no'); } } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param string $id * @return \Illuminate\Http\Response */ public function update(Request $request, string $id) { // $validated = $request->validate([ 'operation' => 'required' ]); $collection = Collection::find($id); if (!$collection) { return $this->error("no recorder"); } //鉴权 $user = AuthApi::current($request); if (!$user) { return $this->error(__('auth.failed')); } if (!CollectionController::UserCanEdit($user["user_uid"], $collection)) { return $this->error(__('auth.failed')); } switch ($validated['operation']) { case 'anthology': $delete = ArticleCollection::where('collect_id', $id)->delete(); $count = 0; foreach ($request->input('data') as $key => $row) { # code... $new = new ArticleCollection; $new->id = app('snowflake')->id(); $new->article_id = $row["article_id"]; $new->collect_id = $id; $new->title = $row["title"]; $new->level = $row["level"]; $new->children = $row["children"]; $new->editor_id = $user["user_id"]; if (isset($row["deleted_at"])) { $new->deleted_at = $row["deleted_at"]; } $new->save(); $count++; } ArticleMapController::updateCollection($id); return $this->ok($count); break; } } /** * Remove the specified resource from storage. * * @param \App\Models\ArticleCollection $articleCollection * @return \Illuminate\Http\Response */ public function destroy(ArticleCollection $articleCollection) { // } public static function deleteArticle(string $articleId) { //查找有这个文章的文集 $collections = ArticleCollection::where('article_id', $articleId) ->select('collect_id') ->groupBy('collect_id') ->get(); //设置为删除 ArticleCollection::where('article_id', $articleId) ->update(['deleted_at' => now()]); //查找没有下级文章的文集 $updateCollections = ArticleCollection::where('article_id', $articleId) ->where('children', 0) ->select('collect_id') ->groupBy('collect_id') ->get(); //真的删除没有下级文章的文集中的文章 $count = ArticleCollection::where('article_id', $articleId) ->where('children', 0) ->delete(); //更新改动的文集 foreach ($updateCollections as $collection) { # code... ArticleMapController::updateCollection($collection->collect_id); } return [count($collections), $count]; } public static function deleteCollection(string $collectionId) { $count = ArticleCollection::where('collect_id', $collectionId) ->delete(); return $count; } /** * 用表中的数据生成json,更新collection 表中的字段 */ public static function updateCollection(string $collectionId) { $result = ArticleCollection::where('collect_id', $collectionId) ->select(['article_id', 'level', 'title']) ->orderBy('id')->get(); Collection::where('uid', $collectionId) ->update(['article_list' => json_encode($result, JSON_UNESCAPED_UNICODE)]); return count($result); } }