如何在Laravel中实现Campaign的批准与驳回功能?
实现Campaign的批准与驳回功能方案
看起来你需要给后台的Campaign列表添加审核(批准/驳回)功能,我来一步步帮你实现这个需求(基于你提供的Laravel表结构推断你使用Laravel框架):
1. 完善数据库表结构
首先得给campaign表加一个状态字段,用来标记Campaign的审核状态,常见的状态有:待审核、已批准、已驳回。
先创建新的迁移文件:
php artisan make:migration add_status_to_campaigns_table
然后在迁移文件中编写字段添加逻辑:
public function up() { Schema::table('campaign', function (Blueprint $table) { // 添加状态字段,默认值设为0(代表待审核) $table->tinyInteger('status')->default(0)->comment('0:待审核, 1:已批准, 2:已驳回'); }); } public function down() { Schema::table('campaign', function (Blueprint $table) { $table->dropColumn('status'); }); }
执行迁移生效:
php artisan migrate
2. 模型层优化
在Campaign模型里定义状态常量,方便后续代码维护,同时更新批量赋值的字段列表:
class Campaign extends Model { // 定义状态常量,避免硬编码数字 const STATUS_PENDING = 0; const STATUS_APPROVED = 1; const STATUS_REJECTED = 2; // 允许批量赋值的字段,把新增的status加进去 protected $fillable = [ 'users_id', 'campaign_name', 'campaign_goal', 'discr...', 'status' // 记得把你原表的其他字段也补充到这里 ]; // 可选:添加获取状态文本的访问器,方便视图直接显示文字 public function getStatusTextAttribute() { return match($this->status) { self::STATUS_APPROVED => '已批准', self::STATUS_REJECTED => '已驳回', default => '待审核' }; } // 可选:添加Scope方法,快速筛选待审核的Campaign public function scopePending($query) { return $query->where('status', self::STATUS_PENDING); } }
3. 后台控制器添加审核处理方法
在你的后台Campaign控制器(比如Admin\CampaignController)里,新增批准和驳回的处理逻辑:
use App\Models\Campaign; use Illuminate\Http\Request; class CampaignController extends Controller { // 构造函数:添加权限验证中间件,确保只有管理员能操作 public function __construct() { $this->middleware('auth'); $this->middleware('admin'); // 假设你有自定义的管理员验证中间件 } // 批准Campaign public function approve(Campaign $campaign) { $campaign->update(['status' => Campaign::STATUS_APPROVED]); // 操作成功后返回列表页并提示 return redirect()->back()->with('success', 'Campaign已成功批准'); } // 驳回Campaign public function reject(Campaign $campaign) { $campaign->update(['status' => Campaign::STATUS_REJECTED]); return redirect()->back()->with('success', 'Campaign已成功驳回'); } }
4. 定义后台路由
在routes/web.php中添加审核操作的路由,遵循RESTful规范使用PATCH方法:
// 后台Campaign相关路由组 Route::prefix('admin')->group(function () { Route::patch('campaigns/{campaign}/approve', [Admin\CampaignController::class, 'approve'])->name('admin.campaigns.approve'); Route::patch('campaigns/{campaign}/reject', [Admin\CampaignController::class, 'reject'])->name('admin.campaigns.reject'); });
5. 后台视图添加操作按钮
在你的Campaign列表视图中,给每个待审核的Campaign添加批准和驳回按钮:
<table class="table"> <thead> <tr> <th>ID</th> <th>Campaign名称</th> <th>目标金额</th> <th>状态</th> <th>操作</th> </tr> </thead> <tbody> @foreach($campaigns as $campaign) <tr> <td>{{ $campaign->id }}</td> <td>{{ $campaign->campaign_name }}</td> <td>{{ $campaign->campaign_goal }}</td> <td> <span class="badge {{ $campaign->status == 1 ? 'bg-success' : ($campaign->status == 2 ? 'bg-danger' : 'bg-warning') }}"> {{ $campaign->status_text }} </span> </td> <td> @if($campaign->status == Campaign::STATUS_PENDING) <!-- 批准按钮表单 --> <form action="{{ route('admin.campaigns.approve', $campaign) }}" method="POST" class="d-inline"> @csrf @method('PATCH') <button type="submit" class="btn btn-sm btn-success" onclick="return confirm('确定要批准这个Campaign吗?')">批准</button> </form> <!-- 驳回按钮表单 --> <form action="{{ route('admin.campaigns.reject', $campaign) }}" method="POST" class="d-inline"> @csrf @method('PATCH') <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('确定要驳回这个Campaign吗?')">驳回</button> </form> @endif </td> </tr> @endforeach </tbody> </table>
6. 权限验证(可选但关键)
如果还没有管理员权限验证,建议自定义一个admin中间件:
php artisan make:middleware AdminMiddleware
在中间件中编写验证逻辑:
public function handle(Request $request, Closure $next) { // 假设你的User模型有is_admin字段用来标记管理员 if (!auth()->check() || !auth()->user()->is_admin) { abort(403, '无权限执行此操作'); } return $next($request); }
最后在app/Http/Kernel.php中注册这个中间件:
protected $routeMiddleware = [ // ...其他中间件 'admin' => \App\Http\Middleware\AdminMiddleware::class, ];
这样一套流程下来,你就能在后台管理端实现完整的Campaign批准与驳回功能了。如果需要给驳回操作添加备注,可以再给campaign表加个reject_reason字段,然后在驳回方法和视图中补充对应逻辑即可。
内容的提问来源于stack exchange,提问作者Bhoomi Patel
相关产品推荐
相关产品推荐

