Files
chatroom/app/Http/Controllers/LeaderboardController.php
lkddi 8c05e0fb83 优化排行榜:隐藏管理员 + 盖世神豪榜单位改为枚
- 所有榜单查询排除 user_level >= superLevel 的管理员
- 盖世神豪榜单位从'万'改为'枚'
- 缓存的查询也会过滤管理员(缓存到期后自动生效)
2026-02-27 00:33:25 +08:00

79 lines
2.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
/**
* 文件功能:全局风云排行榜控制器
* 各种维度等级、经验、交友币、魅力的前20名抓取与缓存展示。
*
* @author ChatRoom Laravel
*
* @version 1.0.0
*/
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use Illuminate\View\View;
class LeaderboardController extends Controller
{
/**
* 渲染排行榜主视角
*/
public function index(): View
{
// 缓存 15 分钟,防止每秒几百个人看排行榜把数据库扫死
// 选用 remember 则在过期时自动执行闭包查询并重置缓存
$ttl = 60 * 15;
// 管理员等级阈值,排行榜中隐藏管理员
$superLevel = (int) \App\Models\Sysparam::getValue('superlevel', '100');
// 1. 境界榜 (以 user_level 为尊)
$topLevels = Cache::remember('leaderboard:top_levels', $ttl, function () use ($superLevel) {
return User::select('id', 'username', 'usersf', 'user_level', 'sex')
->where('user_level', '>', 0)
->where('user_level', '<', $superLevel)
->orderByDesc('user_level')
->orderBy('id')
->limit(20)
->get();
});
// 2. 修为榜 (以 exp_num 为尊)
$topExp = Cache::remember('leaderboard:top_exp', $ttl, function () use ($superLevel) {
return User::select('id', 'username', 'usersf', 'exp_num', 'sex', 'user_level')
->where('exp_num', '>', 0)
->where('user_level', '<', $superLevel)
->orderByDesc('exp_num')
->orderBy('id')
->limit(20)
->get();
});
// 3. 财富榜 (以 jjb-交友币 为尊)
$topWealth = Cache::remember('leaderboard:top_wealth', $ttl, function () use ($superLevel) {
return User::select('id', 'username', 'usersf', 'jjb', 'sex', 'user_level')
->where('jjb', '>', 0)
->where('user_level', '<', $superLevel)
->orderByDesc('jjb')
->orderBy('id')
->limit(20)
->get();
});
// 4. 魅力榜 (以 meili 为尊)
$topCharm = Cache::remember('leaderboard:top_charm', $ttl, function () use ($superLevel) {
return User::select('id', 'username', 'usersf', 'meili', 'sex', 'user_level')
->where('meili', '>', 0)
->where('user_level', '<', $superLevel)
->orderByDesc('meili')
->orderBy('id')
->limit(20)
->get();
});
return view('leaderboard.index', compact('topLevels', 'topExp', 'topWealth', 'topCharm'));
}
}