定义路由
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');
});
});
完成