From 632a4240c48e67544e250c3212a0e9b838cab381 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sun, 1 Mar 2026 14:04:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E8=AF=8D=E7=AE=A1=E7=90=86=E6=94=AF=E6=8C=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ForbiddenUsernameController::batchStore() 支持换行、逗号、中文逗号、空格多种分隔格式 自动去重、跳过已存在词语、忽略超长词 返回成功数/跳过数详细提示 - 新增路由 POST /admin/forbidden-usernames/batch - View 新增卡片加「单个/批量」两 Tab 切换 批量 Tab 使用 textarea 多行输入 --- .../Admin/ForbiddenUsernameController.php | 66 +++++++++++++++++ .../admin/forbidden-usernames/index.blade.php | 74 +++++++++++++++++-- routes/web.php | 1 + 3 files changed, 133 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Admin/ForbiddenUsernameController.php b/app/Http/Controllers/Admin/ForbiddenUsernameController.php index 5850019..8af441a 100644 --- a/app/Http/Controllers/Admin/ForbiddenUsernameController.php +++ b/app/Http/Controllers/Admin/ForbiddenUsernameController.php @@ -80,6 +80,72 @@ class ForbiddenUsernameController extends Controller return response()->json(['status' => 'success', 'message' => "「{$username}」已加入永久禁用列表。"]); } + /** + * 批量添加永久禁用词。 + * + * 接受多行文本或逗号分隔的词语列表,自动去重并过滤已存在者。 + * 返回成功添加数量和跳过数量。 + * + * @param Request $request 请求体:words(换行/逗号分隔),reason(选填,共用) + */ + public function batchStore(Request $request): JsonResponse + { + $validated = $request->validate([ + 'words' => ['required', 'string'], + 'reason' => ['nullable', 'string', 'max:100'], + ], [ + 'words.required' => '请输入至少一个词语。', + ]); + + // 支持换行、逗号、中文逗号、空格分隔 + $rawWords = preg_split('/[\r\n,,\s]+/', $validated['words']); + $reason = trim($validated['reason'] ?? ''); + + // 过滤空串、截断过长、去重 + $words = collect($rawWords) + ->map(fn ($w) => trim($w)) + ->filter(fn ($w) => $w !== '' && mb_strlen($w) <= 50) + ->unique() + ->values(); + + if ($words->isEmpty()) { + return response()->json(['status' => 'error', 'message' => '没有有效的词语,请检查输入。'], 422); + } + + // 查询已存在的(批量一次查询) + $existing = UsernameBlacklist::permanent() + ->whereIn('username', $words->all()) + ->pluck('username') + ->flip(); // 转为键名方便 has() 查询 + + $now = Carbon::now(); + $added = 0; + $rows = []; + + foreach ($words as $word) { + if ($existing->has($word)) { + continue; // 跳过已存在 + } + $rows[] = [ + 'username' => $word, + 'type' => 'permanent', + 'reserved_until' => null, + 'reason' => $reason ?: null, + 'created_at' => $now, + ]; + $added++; + } + + if (! empty($rows)) { + UsernameBlacklist::insert($rows); + } + + $skipped = $words->count() - $added; + $msg = "成功添加 {$added} 个词语".($skipped > 0 ? ",跳过 {$skipped} 个(已存在)" : '').'。'; + + return response()->json(['status' => 'success', 'message' => $msg, 'added' => $added]); + } + /** * 更新指定禁用词的原因备注。 * diff --git a/resources/views/admin/forbidden-usernames/index.blade.php b/resources/views/admin/forbidden-usernames/index.blade.php index a66d1a4..e816e59 100644 --- a/resources/views/admin/forbidden-usernames/index.blade.php +++ b/resources/views/admin/forbidden-usernames/index.blade.php @@ -25,12 +25,14 @@ {{-- 新增表单 + 搜索栏 --}}
- {{-- 新增卡片 --}} + {{-- 新增卡片(单个 + 批量 Tab) --}}
-

➕ 新增禁用词

+ {{-- Tab 切换 --}} +
+ + +
+
-
- + {{-- 单个模式 --}} +
+
+ + {{-- 批量模式 --}} +
+ + +

+ 自动去重,跳过已存在的词语,超过50字符的词语忽略 +

+
+ + {{-- 共用原因 --}}
- +
- + +

diff --git a/routes/web.php b/routes/web.php index 53fb87c..7616b60 100644 --- a/routes/web.php +++ b/routes/web.php @@ -265,6 +265,7 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad // 禁用用户名管理(永久禁止注册/改名的词语:领导人名称、攻击性词汇等) Route::get('/forbidden-usernames', [\App\Http\Controllers\Admin\ForbiddenUsernameController::class, 'index'])->name('forbidden-usernames.index'); Route::post('/forbidden-usernames', [\App\Http\Controllers\Admin\ForbiddenUsernameController::class, 'store'])->name('forbidden-usernames.store'); + Route::post('/forbidden-usernames/batch', [\App\Http\Controllers\Admin\ForbiddenUsernameController::class, 'batchStore'])->name('forbidden-usernames.batch'); Route::put('/forbidden-usernames/{id}', [\App\Http\Controllers\Admin\ForbiddenUsernameController::class, 'update'])->name('forbidden-usernames.update'); Route::delete('/forbidden-usernames/{id}', [\App\Http\Controllers\Admin\ForbiddenUsernameController::class, 'destroy'])->name('forbidden-usernames.destroy'); });