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

如何实现预约满额判断?Laravel预约系统时段限流与满额提示功能开发

预约系统时段限流实现方案

后端核心校验逻辑(必做,防止绕过前端校验)

你需要在创建预约记录前先统计对应日期、对应时段的已预约人数,超过上限3人则直接返回错误提示,不执行创建操作。修改后的store方法代码如下:

public function store(Request $request)
{
    // 先统计指定日期+时段的已预约人数
    $reservedCount = Pengunjung::where('tanggal', $request->tanggal)
        ->where('jam_id', $request->jam_id)
        ->count();
    
    // 达到上限直接返回错误
    if ($reservedCount >= 3) {
        return back()->withInput()->with('error', '该时段已约满,请选择其他时段');
    }

    Pengunjung::create([
        'nik'=> $request->nik,
        'nama'=> $request->nama,
        'status'=> $request->status,
        'email'=> $request->email,
        'notelp'=> $request->notelp,
        'jenis'=> $request->jenis,
        'kec'=> $request->kec,
        'nop'=> $request->nop,
        'namaobjek'=> $request->namaobjek,
        'tanggal'=> $request->tanggal,
        'jam_id'=> $request->jam_id,
    ]);

    return redirect()->route('formsukses', $request);
}

前端提示逻辑适配

你需要在Blade模板中添加错误提示的渲染逻辑,也可以额外添加选前校验提升用户体验:

1. 基础错误提示适配(配合后端校验)

在Blade模板任意位置添加以下代码,后端返回约满错误时会自动弹出提示:

@if(session('error'))
<script>
    alert("{{ session('error') }}");
</script>
@endif

2. 进阶:选定时段即时校验(无需提交即可提示)

如果要实现用户选完日期、时段后立刻判断是否满员,可以新增一个简易校验接口,前端监听输入变化发起异步校验:
首先在路由文件新增校验路由:

Route::post('/check-reserve', function (Request $request) {
    $count = Pengunjung::where('tanggal', $request->tanggal)
        ->where('jam_id', $request->jam_id)
        ->count();
    return response()->json(['full' => $count >=3]);
})->name('check.reserve');

然后在Blade模板底部添加JS监听逻辑(确保模板head区域存在默认的csrf-token meta标签):

document.querySelector('input[name="tanggal"]').addEventListener('change', checkReserve);
document.querySelector('select[name="jam_id"]').addEventListener('change', checkReserve);

function checkReserve() {
    const tanggal = document.querySelector('input[name="tanggal"]').value;
    const jamId = document.querySelector('select[name="jam_id"]').value;
    if (!tanggal || !jamId) return;

    fetch("{{ route('check.reserve') }}", {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
        },
        body: JSON.stringify({
            tanggal: tanggal,
            jam_id: jamId
        })
    })
    .then(res => res.json())
    .then(data => {
        if (data.full) {
            alert('该时段已约满,请选择其他时段');
            // 可选:自动清空选中的时段
            document.querySelector('select[name="jam_id"]').value = '';
        }
    })
}

内容的提问来源于stack exchange,提问作者aji setiawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:15:06