初始化
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\ContactMessage;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\RateLimiter;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class ContactController extends Controller
|
||||
{
|
||||
public function show(): View
|
||||
{
|
||||
return view('contact');
|
||||
}
|
||||
|
||||
public function store(Request $request): JsonResponse|RedirectResponse
|
||||
{
|
||||
$key = 'contact:'.$request->ip();
|
||||
|
||||
if (RateLimiter::tooManyAttempts($key, 5, 60)) {
|
||||
$seconds = RateLimiter::availableIn($key);
|
||||
$msg = "提交过于频繁,请 {$seconds} 秒后再试。";
|
||||
|
||||
if ($request->wantsJson()) {
|
||||
return response()->json(['ok' => false, 'message' => $msg], 429);
|
||||
}
|
||||
|
||||
return back()->withErrors(['message' => $msg])->withInput();
|
||||
}
|
||||
|
||||
$data = $request->validate([
|
||||
'name' => ['required', 'string', 'max:40'],
|
||||
'email' => ['required', 'email', 'max:120'],
|
||||
'phone' => ['nullable', 'string', 'max:20', 'regex:/^[0-9+\-()\s]+$/'],
|
||||
'company' => ['nullable', 'string', 'max:120'],
|
||||
'subject' => ['required', 'string', 'max:80'],
|
||||
'message' => ['required', 'string', 'max:1000'],
|
||||
]);
|
||||
|
||||
ContactMessage::create([
|
||||
'name' => $data['name'],
|
||||
'email' => $data['email'],
|
||||
'phone' => $data['phone'] ?? null,
|
||||
'company' => $data['company'] ?? null,
|
||||
'subject' => $data['subject'],
|
||||
'message' => $data['message'],
|
||||
'ip' => $request->ip(),
|
||||
]);
|
||||
|
||||
RateLimiter::hit($key, 60);
|
||||
|
||||
if ($request->wantsJson()) {
|
||||
return response()->json(['ok' => true, 'message' => '提交成功,我们会尽快与您联系。']);
|
||||
}
|
||||
|
||||
return back()->with('success', '提交成功,我们会尽快与您联系。');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user