博客项目 laravel vue mysql 第五章 标签功能

发布于:2025-07-14 ⋅ 阅读:(15) ⋅ 点赞:(0)

前言

前面章节没看过的朋友请先从第一章开始看 。这章主要写标签相关功能。

后端

创建迁移文件

php artisan make:migration create_tags_table

编辑迁移文件

public function up()
{
    Schema::create('tags', function (Blueprint $table) {
        $table->id(); // 主键,自增ID
        $table->string('name')->unique(); // 标签名称,唯一,如“Laravel”
        $table->string('slug')->unique(); // 标签别名,URL 友好,如“laravel”
        $table->timestamps(); // 创建时间和更新时间
    });
}

运行迁移

php artisan migrate

编辑种子文件database/seeders/DatabaseSeeder.php

// 创建8个标签
use App\Models\Tag;

$tags = [
    Tag::create(['name' => 'Laravel', 'slug' => 'laravel']),
    Tag::create(['name' => 'Vue.js', 'slug' => 'vue']),
    Tag::create(['name' => 'PHP', 'slug' => 'php']),
    Tag::create(['name' => 'JavaScript', 'slug' => 'javascript']),
    Tag::create(['name' => 'MySQL', 'slug' => 'mysql']),
    Tag::create(['name' => 'CSS', 'slug' => 'css']),
    Tag::create(['name' => 'Git', 'slug' => 'git']),
    Tag::create(['name' => 'Docker', 'slug' => 'docker']),
];

创建模型命令

php artisan make:model Tag

编辑文件

protected $fillable = ['name', 'slug'];

创建控制器命令

php artisan make:controller TagController

编辑控制器

<?php
namespace App\Http\Controllers;

use App\Models\Tag;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;

class TagController extends Controller
{
/**
     * 查询所有标签(分页,支持文章计数)
     *
     * @param Request $request
     * @return JsonResponse
     */
    public function all(Request $request): JsonResponse
    {
        $perPage = $request->input('per_page', 10);
        $page = $request->input('page', 1);
        $search = $request->input('search');
        $query = Tag::withCount('articles')->orderBy('created_at', 'desc');
        if ($search) {
            $query->where(function($q) use ($search) {
                $q->where('name', 'like', "%{$search}%")
                  ->orWhere('slug', 'like', "%{$search}%");
            });
        }
        $tags = $query->paginate($perPage, ['id', 'name', 'slug'], 'page', $page);
        return response()->json([
            'data' => $tags->items(),
            'meta' => [
                'current_page' => $tags->currentPage(),
                'per_page' => $tags->perPage(),
                'total' => $tags->total(),
                'last_page' => $tags->lastPage(),
                'from' => $tags->firstItem(),
                'to' => $tags->lastItem(),
            ],
            'links' => [
                'first' => $tags->url(1),
                'last' => $tags->url($tags->lastPage()),
                'prev' => $tags->previousPageUrl(),
                'next' => $tags->nextPageUrl(),
            ],
            'message' => '成功获取标签列表',
        ], 200);
    }
}

前端


网站公告

今日签到

点亮在社区的每一天
去签到