You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:40:13