Laravel 11 书评网5--我的评论模块

92 阅读2分钟

定义路由

Route::group(['middleware' => 'auth'], function () {
    // 我的评论
    Route::get('my-reviews', [\App\Http\Controllers\AccountController::class, 'myReviews'])
        ->name('account.myReviews');
    // 我的评论编辑
    Route::get('my-reviews/{id}', [\App\Http\Controllers\AccountController::class, 'editReviews'])
        ->name('account.myReviews.editReviews');
    // 我的评论执行编辑
    Route::post('my-reviews/{id}', [\App\Http\Controllers\AccountController::class, 'updateReview'])
        ->name('account.myReviews.updateReview');
    // 删除我的评论
    Route::post('delete-my-reviews', [\App\Http\Controllers\AccountController::class, 'deleteReview'])
        ->name('account.myReviews.deleteReview');
});

我的评论控制器

App/Http/Controllers/AccountController.php

<?php

namespace App\Http\Controllers;

use App\Models\Review;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;

class AccountController extends Controller
{
    // 我的评论
    public function myReviews()
    {
        $reviews = Review::with('book')->where('user_id', Auth::user()->id);
        $reviews = $reviews->orderBy('created_at', 'desc');

        // 搜索评论
        if (!empty($request->keyword)) {
            $reviews->where('review', 'like', '%' . $request->keyword . '%');
        };

        $reviews = $reviews->paginate(10);

        return view('account.my-reviews', compact('reviews'));
    }

}

我的评论前端模版

resources/views/account/my-reviews.blade.php

@extends('layouts.app')

@section('title', '我的评论')

@section('content')
    <div class="container">
        <div class="row my-5">
            <div class="col-md-3">
                {{-- 侧边栏 --}}
                @include('layouts.sidebar')
            </div>
            <div class="col-md-9">

                {{-- 表单验证文件 --}}
                @include('layouts.message')

                <div class="card border-0 shadow">
                    <div class="card-header  text-white">
                        我的评论
                    </div>
                    <div class="card-body pb-0">

                        <div class="d-flex justify-content-end">
                            <form action="" method="get">
                                <div class="d-flex">
                                    <input type="text" class="form-control" name="keyword"
                                           value="{{ Request::get('keyword') }}" placeholder="请您输入评论词">
                                    <button type="submit" class="btn btn-primary">Search</button>
                                    <a href="{{ route('account.myReviews') }}" class="btn btn-secondary ms-2"></a>
                                </div>
                            </form>
                        </div>

                        <table class="table  table-striped mt-3">
                            <thead class="table-dark">
                            <tr>
                                <th>书籍</th>
                                <th>评论</th>
                                <th>评分</th>
                                <th>状态</th>
                                <th width="100">操作</th>
                            </tr>
                            <tbody>
                            {{--将空字符进行判断,有空字符也会判断为不空--}}
                            @if($reviews->isNotEmpty())
                                @foreach($reviews as $review)
                                    <tr>
                                        <td>{{ $review->book->title }}</td>
                                        <td>{{ $review->review }}</td>
                                        <td>{{ $review->rating }}</td>
                                        <td>
                                            @if($review->status == 1 )
                                                <span class="text-success">开启</span>
                                            @else
                                                <span class="text-danger">关闭</span>
                                            @endif
                                        </td>
                                        <td>
                                            <a href="{{ route('account.myReviews.editReviews',$review->id) }}"
                                               class="btn btn-primary btn-sm"><i
                                                    class="fa-regular fa-pen-to-square"></i>
                                            </a>
                                            <a href="javascript:void(0)" class="btn btn-danger btn-sm"><i class="fa-solid fa-trash"></i></a>
                                        </td>
                                    </tr>
                                @endforeach
                            @endif
                            </tbody>
                            </thead>
                        </table>
                        {{--分页--}}
                        {{$reviews->links()}}
                    </div>

                </div>
            </div>
        </div>
    </div>
@endsection

编辑我的评论

App/Http/Controllers/AccountController.php

// 编辑我的评论页面
public function editReviews($id)
{
    // 查询当前用户的评论
    $review = Review::where([
        'id' => $id,
        'user_id' => Auth::user()->id,
    ])->with('book')->first();

    return view('account.my-reviews.edit-review', compact('review'));
}

// 执行我的评论编辑
public function updateReview(Request $request, $id)
{
    $review = Review::findOrFail($id);

    $validator = Validator::make($request->all(), [
        'review' => 'required',
        'rating' => 'required',
    ]);

    // 如果验证失败,我们将返回错误
    if ($validator->fails()) {
        return redirect()->route('account.myReviews.editReviews', $id)->withErrors($validator)->withInput();
    }

    $review->review = $request->review;
    $review->rating = $request->rating;
    $review->save();

    session()->flash('success', '编辑评论成功~');
    return redirect()->route('account.myReviews');
}

编辑我的评论前端模版

@extends('layouts.app')

@section('title', '编辑我的评论')

@section('content')
    <div class="container">
        <div class="row my-5">
            <div class="col-md-3">
                {{-- 侧边栏 --}}
                @include('layouts.sidebar')

            </div>
            <div class="col-md-9">

                {{-- 表单验证文件 --}}
                @include('layouts.message')

                <div class="card border-0 shadow">
                    <div class="card-header  text-white">
                        编辑评论
                    </div>
                    <div class="card-body">

                        <form action="{{ route('account.myReviews.updateReview',$review->id) }}" method="post">
                            @csrf

                            <div class="mb-3">
                                <label for="name" class="form-label">书籍</label>
                                <div>
                                    <strong>{{ $review->book->title }}</strong>
                                </div>

                            </div>

                            <div class="mb-3">
                                <label for="name" class="form-label">评论</label>
                                <textarea class="form-control @error('review') is-invalid @enderror" name="review"
                                          id="review">{{ old('review',$review->review) }}</textarea>

                                @error('review')
                                <p class="invalid-feedback">{{ $message }}</p>
                                @enderror

                            </div>
                            <div class="mb-3">
                                <label for="name" class="form-label">评分</label>
                                <select name="rating" id="rating"
                                        class="form-control @error('rating') is-invalid @enderror">
                                    <option value="1" {{ ($review->rating == 1)? 'selected' : '' }}>1</option>
                                    <option value="2" {{ ($review->rating == 2)? 'selected' : '' }}>2</option>
                                    <option value="3" {{ ($review->rating == 3)? 'selected' : '' }}>3</option>
                                    <option value="4" {{ ($review->rating == 4)? 'selected' : '' }}>4</option>
                                    <option value="5" {{ ($review->rating == 5)? 'selected' : '' }}>5</option>
                                </select>

                                @error('rating')
                                <p class="invalid-feedback">{{ $message }}</p>
                                @enderror

                            </div>
                            <button class="btn btn-primary mt-2">更新</button>
                        </form>
                    </div>

                </div>
            </div>
        </div>
    </div>
@endsection

删除我的评论

App/Http/Controllers/AccountController.php

// 删除我的评论
public function deleteReview(Request $request)
{
    $id = $request->id;
    $review = Review::find($id);
    // 如果该条评论为null,返回一个错误提醒
    if ($review == null) {
        return response()->json([
            'status' => false
        ]);
    }

    $review->delete();

    session()->flash('success', '已成功删除我的评论');
    return response()->json([
        'status' => true,
        'message' => '已成功删除我的评论'
    ]);
}

我的评论前端模版按钮绑定

resources/views/account/my-reviews/my-reviews.blade.php 编辑按钮

<a href="javascript:void(0)" onclick="deleteReview({{ $review->id }});"
   class="btn btn-danger btn-sm"><i class="fa-solid fa-trash"></i></a>

ajax删除

@section('script')
    <script type="text/javascript">
        {{--删除我的评论--}}
        function deleteReview(id) {
            if (confirm("您确定要删除我的评论么")) {
                $.ajax({
                    url: '{{ route('account.myReviews.deleteReview') }}',
                    type: 'post',
                    data: {id: id},
                    headers: {
                        'X-CSRF-TOKEN': '{{ csrf_token()}}'
                    },
                    dataType: 'json',
                    success: function (response) {
                        window.location.href = '{{route('account.myReviews')}}';
                    }
                });
            }
        }
    </script>
@endsection

中间件并在访问管理模块时检查用户角色

书籍 和 评论 模块只允许 管理员用户进入查看,其他用户不准

创建中间件

php artisan make:middleware CheckAdmin

中间件编写逻辑

App/Http/Middleware/CheckAdmin.php

public function handle(Request $request, Closure $next): Response
{
    if ($request->user()->role != 'admin') {
        session()->flash('error', '您无权访问此部分');
        return redirect()->route('account.profile');
    }
    return $next($request);
}

注册中间件

bootstrap/app.php

->withMiddleware(function (Middleware $middleware) {

    $middleware->alias([
        'check-admin' => CheckAdmin::class
    ]);
 
})

路由组,书籍 和 评论 模块只允许 管理员用户进入查看

Route::group(['middleware' => 'auth'], function () {
    
    Route::group(['middleware' => 'check-admin'], function () {

        // 书籍页
        Route::get('books', [\App\Http\Controllers\BookController::class, 'index'])
            ->name('books.index');
        // 书籍新增
        Route::get('books/create', [\App\Http\Controllers\BookController::class, 'create'])
            ->name('books.create');
        // 执行书籍新增
        Route::post('books', [\App\Http\Controllers\BookController::class, 'store'])
            ->name('books.store');
        // 书籍编辑页面
        Route::get('books/edit/{id}', [\App\Http\Controllers\BookController::class, 'edit'])
            ->name('books.edit');
        // 执行书籍编辑
        Route::post('books/edit/{id}', [\App\Http\Controllers\BookController::class, 'update'])
            ->name('books.update');
        // 删除书籍
        Route::delete('books', [\App\Http\Controllers\BookController::class, 'destroy'])
            ->name('books.destroy');

        // 评论页
        Route::get('reviews', [\App\Http\Controllers\ReviewController::class, 'index'])
            ->name('account.reviews');
        // 评论编辑
        Route::get('reviews/{id}', [\App\Http\Controllers\ReviewController::class, 'edit'])
            ->name('account.reviews.edit');
        // 执行评论编辑
        Route::post('reviews/{id}', [\App\Http\Controllers\ReviewController::class, 'updateReview'])
            ->name('account.reviews.updateReview');
        // 删除评论
        Route::post('delete-review', [\App\Http\Controllers\ReviewController::class, 'deleteReview'])
            ->name('account.reviews.deleteReview');
    });

});

完成