middleware('can:view_articles'); } public function index() { $categories = ArticleCategory::withCount('articles') ->orderBy('sort_order') ->get(); return view('admin.article-categories.index', compact('categories')); } public function create() { return view('admin.article-categories.create'); } public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'slug' => 'nullable|string|max:255|unique:article_categories,slug', 'description' => 'nullable|string|max:1000', 'sort_order' => 'nullable|integer', ]); $category = ArticleCategory::create([ 'name' => $validated['name'], 'slug' => $validated['slug'] ?? null, 'description' => $validated['description'] ?? null, 'sort_order' => $validated['sort_order'] ?? 0, ]); AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'article_category.created', 'description' => "建立文章分類:{$category->name}", 'ip_address' => request()->ip(), ]); return redirect() ->route('admin.article-categories.index') ->with('status', '分類已成功建立'); } public function edit(ArticleCategory $articleCategory) { return view('admin.article-categories.edit', ['category' => $articleCategory]); } public function update(Request $request, ArticleCategory $articleCategory) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'slug' => 'nullable|string|max:255|unique:article_categories,slug,'.$articleCategory->id, 'description' => 'nullable|string|max:1000', 'sort_order' => 'nullable|integer', ]); $articleCategory->update([ 'name' => $validated['name'], 'slug' => $validated['slug'] ?? $articleCategory->slug, 'description' => $validated['description'] ?? null, 'sort_order' => $validated['sort_order'] ?? 0, ]); AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'article_category.updated', 'description' => "更新文章分類:{$articleCategory->name}", 'ip_address' => request()->ip(), ]); return redirect() ->route('admin.article-categories.index') ->with('status', '分類已成功更新'); } public function destroy(ArticleCategory $articleCategory) { if ($articleCategory->articles()->count() > 0) { return back()->with('error', '此分類下仍有文章,無法刪除'); } $name = $articleCategory->name; $articleCategory->delete(); AuditLog::create([ 'user_id' => auth()->id(), 'action' => 'article_category.deleted', 'description' => "刪除文章分類:{$name}", 'ip_address' => request()->ip(), ]); return redirect() ->route('admin.article-categories.index') ->with('status', '分類已成功刪除'); } }