Files
chatroom/app/Http/Controllers/Admin/VipController.php
lkddi 5f30220609 feat: 任命/撤销通知系统 + 用户名片UI优化
- 任命/撤销事件增加 type 字段区分类型
- 任命:全屏礼花 + 紫色弹窗 + 紫色系统消息
- 撤销:灰色弹窗 + 灰色系统消息,无礼花
- 消息分发:操作者/被操作者显示在私聊面板,其他人显示在公屏
- 系统消息加随机鼓励语(各5条轮换)
- ChatStateService 修复 Redis key 前缀扫描问题(getAllActiveRoomIds)
- 用户名片折叠优化:管理员视野、职务履历均可折叠
- 管理操作 + 职务操作合并为「🔧 管理操作」折叠区
- 悄悄话改为「🎁 送礼物」按钮,礼物面板内联展开
2026-02-28 23:44:38 +08:00

123 lines
3.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 文件功能:后台 VIP 会员等级管理控制器
* 提供会员等级的 CRUD增删改查功能
* 后台可自由创建、修改、删除会员等级
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\VipLevel;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class VipController extends Controller
{
/**
* 会员等级管理列表页
*/
public function index(): View
{
$levels = VipLevel::orderBy('sort_order')->get();
return view('admin.vip.index', compact('levels'));
}
/**
* 新增会员等级
*/
public function store(Request $request): RedirectResponse
{
$data = $request->validate([
'name' => 'required|string|max:50',
'icon' => 'required|string|max:20',
'color' => 'required|string|max:10',
'exp_multiplier' => 'required|numeric|min:1|max:99',
'jjb_multiplier' => 'required|numeric|min:1|max:99',
'sort_order' => 'required|integer|min:0',
'price' => 'required|integer|min:0',
'duration_days' => 'required|integer|min:0',
'join_templates' => 'nullable|string',
'leave_templates' => 'nullable|string',
]);
// 将文本框的多行模板转为 JSON 数组
$data['join_templates'] = $this->textToJson($data['join_templates'] ?? '');
$data['leave_templates'] = $this->textToJson($data['leave_templates'] ?? '');
VipLevel::create($data);
return redirect()->route('admin.vip.index')->with('success', '会员等级创建成功!');
}
/**
* 更新会员等级
*
* @param VipLevel $vip 路由模型自动注入
*/
public function update(Request $request, VipLevel $vip): RedirectResponse
{
$level = $vip;
$data = $request->validate([
'name' => 'required|string|max:50',
'icon' => 'required|string|max:20',
'color' => 'required|string|max:10',
'exp_multiplier' => 'required|numeric|min:1|max:99',
'jjb_multiplier' => 'required|numeric|min:1|max:99',
'sort_order' => 'required|integer|min:0',
'price' => 'required|integer|min:0',
'duration_days' => 'required|integer|min:0',
'join_templates' => 'nullable|string',
'leave_templates' => 'nullable|string',
]);
$data['join_templates'] = $this->textToJson($data['join_templates'] ?? '');
$data['leave_templates'] = $this->textToJson($data['leave_templates'] ?? '');
$level->update($data);
return redirect()->route('admin.vip.index')->with('success', '会员等级更新成功!');
}
/**
* 删除会员等级(关联用户的 vip_level_id 会自动置 null
*
* @param VipLevel $vip 路由模型自动注入
*/
public function destroy(VipLevel $vip): RedirectResponse
{
$vip->delete();
return redirect()->route('admin.vip.index')->with('success', '会员等级已删除!');
}
/**
* 将多行文本转为 JSON 数组字符串
* 每行一个模板,空行忽略
*
* @param string $text 多行文本
* @return string|null JSON 字符串
*/
private function textToJson(string $text): ?string
{
$lines = array_filter(
array_map('trim', explode("\n", $text)),
fn ($line) => $line !== ''
);
if (empty($lines)) {
return null;
}
return json_encode(array_values($lines), JSON_UNESCAPED_UNICODE);
}
}