62 lines
1.9 KiB
PHP
62 lines
1.9 KiB
PHP
<?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', '提交成功,我们会尽快与您联系。');
|
|
}
|
|
}
|