feat: 实现挂机修仙、排行榜、大厅重构与全站留言板系统

- (Phase 8) 后台各维度管理与配置
- (Phase 9) 全自动静默挂机修仙升级
- (Phase 9) 四大维度风云排行榜页面
- (Phase 10) 全站留言板与悄悄话私信功能
- 运行 Pint 代码格式化
This commit is contained in:
2026-02-26 13:35:38 +08:00
parent 7d6423902d
commit 50fc804402
85 changed files with 5776 additions and 30 deletions
+131
View File
@@ -0,0 +1,131 @@
@extends('layouts.app')
@section('title', '风云排行榜')
@section('content')
<div class="h-screen w-full flex flex-col bg-gray-100 overflow-hidden font-sans">
<!-- 顶部导航条 -->
<header class="bg-indigo-900 border-b border-indigo-800 text-white shadow-md relative z-20 shrink-0">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex items-center justify-between h-16">
<!-- 左侧:标题与返回大厅 -->
<div class="flex items-center space-x-4">
<a href="{{ route('rooms.index') }}"
class="text-indigo-200 hover:text-white transition flex items-center group">
<svg class="w-5 h-5 mr-1 transform group-hover:-translate-x-1 transition" fill="none"
stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M10 19l-7-7m0 0l7-7m-7 7h18"></path>
</svg>
返回大厅
</a>
<div class="h-6 w-px bg-indigo-700"></div>
<div class="flex items-center space-x-2">
<span class="text-xl">🏆</span>
<h1 class="text-xl font-extrabold tracking-wider">风云排行榜</h1>
</div>
</div>
<!-- 右侧:当前用户状态 -->
<div class="flex items-center space-x-3 text-sm">
<img src="/images/headface/{{ Auth::user()->headface ?? '01.gif' }}"
class="w-8 h-8 rounded border border-indigo-500 object-cover bg-white">
<div class="hidden sm:block">
<span class="font-bold">{{ Auth::user()->username }}</span>
<span class="text-indigo-300 ml-2">LV.{{ Auth::user()->user_level }}</span>
</div>
</div>
</div>
</div>
</header>
<!-- 说明条 -->
<div class="bg-indigo-50 border-b border-indigo-100 py-3 shrink-0">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex justify-between items-center text-sm">
<p class="text-indigo-800 font-medium"> 数据每 <span class="font-bold text-red-500">15分钟</span>
自动刷新一次。努力提升自己,让全服铭记你的名字!</p>
</div>
</div>
<!-- 滚动内容区 -->
<main class="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8">
<div class="max-w-7xl mx-auto">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<!-- 1. 境界榜 (user_level) -->
<div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col">
<div
class="bg-gradient-to-r from-red-600 to-red-500 px-4 py-3 flex justify-between items-center text-white">
<h2 class="font-bold text-lg flex items-center"><span class="mr-2 text-xl">👑</span> 无上境界榜</h2>
<span class="text-xs bg-red-800/40 px-2 py-0.5 rounded">Level</span>
</div>
<div class="p-0 overflow-y-auto max-h-[600px] flex-1">
@include('leaderboard.partials.list', [
'users' => $topLevels,
'valueField' => 'user_level',
'unit' => '级',
'color' => 'text-red-600',
])
</div>
</div>
<!-- 2. 修为榜 (exp_num) -->
<div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col">
<div
class="bg-gradient-to-r from-amber-600 to-amber-500 px-4 py-3 flex justify-between items-center text-white">
<h2 class="font-bold text-lg flex items-center"><span class="mr-2 text-xl">🔥</span> 苦修经验榜</h2>
<span class="text-xs bg-amber-800/40 px-2 py-0.5 rounded">Exp</span>
</div>
<div class="p-0 overflow-y-auto max-h-[600px] flex-1">
@include('leaderboard.partials.list', [
'users' => $topExp,
'valueField' => 'exp_num',
'unit' => '点',
'color' => 'text-amber-600',
])
</div>
</div>
<!-- 3. 财富榜 (jjb) -->
<div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col">
<div
class="bg-gradient-to-r from-yellow-500 to-yellow-400 px-4 py-3 flex justify-between items-center text-white">
<h2 class="font-bold text-lg flex items-center text-yellow-900"><span
class="mr-2 text-xl">💰</span> 盖世神豪榜</h2>
<span class="text-xs bg-yellow-800/20 text-yellow-900 px-2 py-0.5 rounded">Coin</span>
</div>
<div class="p-0 overflow-y-auto max-h-[600px] flex-1">
@include('leaderboard.partials.list', [
'users' => $topWealth,
'valueField' => 'jjb',
'unit' => '万',
'color' => 'text-yellow-600',
])
</div>
</div>
<!-- 4. 魅力榜 (meili) -->
<div class="bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col">
<div
class="bg-gradient-to-r from-pink-600 to-pink-500 px-4 py-3 flex justify-between items-center text-white">
<h2 class="font-bold text-lg flex items-center"><span class="mr-2 text-xl">🌸</span> 绝世名伶榜</h2>
<span class="text-xs bg-pink-800/40 px-2 py-0.5 rounded">Charm</span>
</div>
<div class="p-0 overflow-y-auto max-h-[600px] flex-1">
@include('leaderboard.partials.list', [
'users' => $topCharm,
'valueField' => 'meili',
'unit' => '点',
'color' => 'text-pink-600',
])
</div>
</div>
</div>
</div>
</main>
</div>
@endsection
@@ -0,0 +1,57 @@
<ul class="divide-y divide-gray-100">
@forelse($users as $index => $user)
@php
// 前三名前景色
$rankBg = 'bg-gray-100 text-gray-500';
$rowBg = 'hover:bg-gray-50';
if ($index === 0) {
$rankBg = 'bg-yellow-400 text-yellow-900 shadow-md transform scale-110';
$rowBg = 'bg-yellow-50 hover:bg-yellow-100 border-l-4 border-yellow-400';
} elseif ($index === 1) {
$rankBg = 'bg-gray-300 text-gray-800 shadow-sm transform scale-105';
$rowBg = 'bg-gray-50 hover:bg-gray-100 border-l-4 border-gray-300';
} elseif ($index === 2) {
$rankBg = 'bg-orange-300 text-orange-900 shadow-sm';
$rowBg = 'bg-orange-50 hover:bg-orange-100 border-l-4 border-orange-300';
}
@endphp
<li class="p-3 flex items-center justify-between transition-colors duration-150 {{ $rowBg }}">
<!-- 左侧:名次与头像/名字 -->
<div class="flex items-center space-x-3 overflow-hidden">
<div
class="w-6 h-6 shrink-0 {{ $rankBg }} rounded-full flex items-center justify-center font-bold text-xs">
{{ $index + 1 }}
</div>
<div class="flex items-center space-x-2 truncate">
<img class="w-8 h-8 rounded border object-cover shrink-0"
src="/images/headface/{{ $user->headface ?? '01.gif' }}" alt="">
<div class="flex flex-col truncate">
<span class="text-sm font-bold text-gray-800 truncate" title="{{ $user->username }}">
{{ $user->username }}
@if ($user->sex == '女')
<span class="text-pink-500 text-xs ml-0.5"></span>
@elseif($user->sex == '男')
<span class="text-blue-500 text-xs ml-0.5"></span>
@endif
</span>
<span class="text-[10px] text-gray-500 truncate"
title="{{ $user->sign }}">{{ $user->sign ?: '这家伙很懒,什么也没留下' }}</span>
</div>
</div>
</div>
<!-- 右侧:数值 -->
<div class="flex flex-col items-end shrink-0 ml-2">
<span class="text-sm font-black {{ $index < 3 ? $color : 'text-gray-600' }}">
{{ number_format($user->$valueField) }}
<span
class="text-[10px] font-normal {{ $index < 3 ? $color : 'text-gray-400' }} ml-0.5">{{ $unit }}</span>
</span>
</div>
</li>
@empty
<li class="p-8 text-center text-sm text-gray-400 font-bold">
暂无数据登榜
</li>
@endforelse
</ul>