一、钓鱼全局开关
- 钓鱼纳入 GameConfig(game_key=fishing),游戏管理页可一键开关
- cast() 接口加开关校验,关闭时返回 403 友好提示
- GameConfigSeeder 新增 fishing 配置(含4个参数)
二、钓鱼事件数据库化
- 新建 fishing_events 表(emoji/name/message/exp/jjb/weight/is_active/sort)
- FishingEvent 模型含 rollOne() 加权随机方法
- FishingEventSeeder 填充7条初始事件(经验降低、金币提升)
- FishingController::randomFishResult() 改为读数据库事件
三、钓鱼参数迁移至 GameConfig
- fishing_cost/wait_min/wait_max/cooldown 改为 GameConfig::param() 读取
- 保留 Sysparam fallback 兼容旧数据
四、后台管理页面
- 新建 FishingEventController(CRUD + AJAX toggle)
- 新建 admin/fishing/index.blade.php(事件列表+概率显示+编辑弹窗)
- 侧边栏「游戏管理」下方新增「🎣 钓鱼事件」入口
- 游戏管理视图 gameParamLabels 新增钓鱼参数标签
181 lines
10 KiB
PHP
181 lines
10 KiB
PHP
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||
<title>后台管理 - 流星</title>
|
||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
||
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
||
</head>
|
||
|
||
<body class="bg-gray-100 flex h-screen text-gray-800">
|
||
<!-- 左侧侧边栏 -->
|
||
<aside class="w-64 bg-slate-900 text-white flex flex-col">
|
||
<div class="p-6 text-center border-b border-white/10">
|
||
<h2 class="text-2xl font-extrabold tracking-widest uppercase">Admin</h2>
|
||
<p class="text-xs text-slate-400 mt-2">控制台</p>
|
||
</div>
|
||
<nav class="flex-1 px-4 py-6 space-y-2 overflow-y-auto">
|
||
|
||
{{-- ──────── 所有有职务的人都可见 ──────── --}}
|
||
<a href="{{ route('admin.dashboard') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.dashboard') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
📊 仪表盘
|
||
</a>
|
||
<a href="{{ route('admin.currency-stats.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.currency-stats.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
📈 积分流水统计
|
||
</a>
|
||
<a href="{{ route('admin.users.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.users.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
👥 用户管理
|
||
</a>
|
||
{{-- ──────── 部门职务任命系统 ──────── --}}
|
||
<div class="border-t border-white/10 my-2"></div>
|
||
<a href="{{ route('admin.appointments.my-duty-logs') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.appointments.my-duty-logs') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
📝 我的履职记录
|
||
</a>
|
||
<a href="{{ route('admin.appointments.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.appointments.*') && !request()->routeIs('admin.appointments.my-duty-logs') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
🎖️ 任命管理
|
||
</a>
|
||
|
||
{{-- superlevel 及以上:可查看(只读标注)以下模块;id=1 可编辑 --}}
|
||
@php $superLvl = (int) \App\Models\Sysparam::getValue('superlevel', '100'); @endphp
|
||
@if (Auth::user()->user_level >= $superLvl)
|
||
<div class="border-t border-white/10 my-2"></div>
|
||
<p class="px-4 text-xs text-slate-500 uppercase tracking-widest mb-1">
|
||
{{ Auth::id() === 1 ? '站长功能' : '查看' }}</p>
|
||
|
||
<a href="{{ route('admin.system.edit') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.system.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '⚙️ 聊天室参数' !!}
|
||
</a>
|
||
<a href="{{ route('admin.rooms.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.rooms.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🏠 房间管理' !!}
|
||
</a>
|
||
<a href="{{ route('admin.autoact.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.autoact.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🎲 随机事件' !!}
|
||
</a>
|
||
<a href="{{ route('admin.vip.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.vip.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '👑 VIP 会员等级' !!}
|
||
</a>
|
||
<a href="{{ route('admin.shop.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.shop.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🛒 商店管理' !!}
|
||
</a>
|
||
<a href="{{ route('admin.marriages.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.marriages.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '💒 婚姻管理' !!}
|
||
</a>
|
||
<a href="{{ route('admin.holiday-events.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.holiday-events.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🎊 节日福利' !!}
|
||
</a>
|
||
<a href="{{ route('admin.game-configs.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.game-configs.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🎮 游戏管理' !!}
|
||
</a>
|
||
<a href="{{ route('admin.fishing.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.fishing.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🎣 钓鱼事件' !!}
|
||
</a>
|
||
<a href="{{ route('admin.departments.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.departments.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '🏛️ 部门管理' !!}
|
||
</a>
|
||
<a href="{{ route('admin.positions.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.positions.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
{!! '📋 职务管理' !!}
|
||
</a>
|
||
|
||
{{-- 以下纯写操作:仅 id=1 可见 --}}
|
||
@if (Auth::id() === 1)
|
||
<div class="border-t border-white/10 my-2"></div>
|
||
<p class="px-4 text-xs text-slate-500 uppercase tracking-widest mb-1">系统配置</p>
|
||
<a href="{{ route('admin.smtp.edit') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.smtp.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
📧 邮件 SMTP 配置
|
||
</a>
|
||
<a href="{{ route('admin.ai-providers.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.ai-providers.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
🤖 AI 厂商配置
|
||
</a>
|
||
<a href="{{ route('admin.ops.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.ops.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
🛠️ 运维工具
|
||
</a>
|
||
<a href="{{ route('admin.changelogs.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.changelogs.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
📋 开发日志
|
||
</a>
|
||
<a href="{{ route('admin.feedback.index') }}"
|
||
class="flex items-center justify-between px-4 py-3 rounded-md transition {{ request()->routeIs('admin.feedback.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
<span>💬 用户反馈</span>
|
||
@php $pendingFeedback = \App\Models\FeedbackItem::pending()->count(); @endphp
|
||
@if ($pendingFeedback > 0)
|
||
<span
|
||
class="bg-orange-500 text-white text-xs px-1.5 py-0.5 rounded-full font-bold">{{ $pendingFeedback }}</span>
|
||
@endif
|
||
</a>
|
||
<a href="{{ route('admin.forbidden-usernames.index') }}"
|
||
class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.forbidden-usernames.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}">
|
||
🚫 禁用用户名
|
||
</a>
|
||
@endif
|
||
@endif
|
||
</nav>
|
||
<div class="p-4 border-t border-white/10">
|
||
<a href="{{ route('rooms.index') }}"
|
||
class="block w-full text-center px-4 py-2 bg-slate-800 hover:bg-slate-700 rounded transition text-sm">
|
||
返回前台大厅
|
||
</a>
|
||
</div>
|
||
</aside>
|
||
|
||
<!-- 右侧主体内容 -->
|
||
<main class="flex-1 flex flex-col h-full overflow-hidden relative">
|
||
<!-- 顶栏 -->
|
||
<header class="bg-white shadow relative z-20 flex items-center justify-between px-6 py-4">
|
||
<h1 class="text-xl font-bold text-gray-700">@yield('title', '控制台')</h1>
|
||
<div class="flex items-center space-x-4">
|
||
<span class="text-sm font-medium">当前操作人: <span
|
||
class="text-indigo-600">{{ Auth::user()->username }}</span></span>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- 内容滚动区 -->
|
||
<div class="flex-1 overflow-y-auto p-6 relative z-10">
|
||
@if (session('success'))
|
||
<div class="mb-6 bg-emerald-100 border-l-4 border-emerald-500 text-emerald-700 p-4 rounded shadow-sm">
|
||
{{ session('success') }}
|
||
</div>
|
||
@endif
|
||
@if (session('error'))
|
||
<div class="mb-6 bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded shadow-sm">
|
||
{{ session('error') }}
|
||
</div>
|
||
@endif
|
||
@if ($errors->any())
|
||
<div class="mb-6 bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded shadow-sm">
|
||
<ul class="list-disc list-inside text-sm">
|
||
@foreach ($errors->all() as $error)
|
||
<li>{{ $error }}</li>
|
||
@endforeach
|
||
</ul>
|
||
</div>
|
||
@endif
|
||
|
||
@yield('content')
|
||
</div>
|
||
</main>
|
||
</body>
|
||
|
||
</html>
|