初始化

This commit is contained in:
2026-03-02 13:44:38 +08:00
commit 05b785083c
677 changed files with 58662 additions and 0 deletions

View File

@@ -0,0 +1,292 @@
<?php
namespace addons\webman\controller;
use addons\webman\Admin;
use addons\webman\model\Player;
use addons\webman\model\PlayerLoginRecord;
use addons\webman\model\PlayerRechargeRecord;
use addons\webman\model\PlayerWithdrawRecord;
use ExAdmin\ui\component\common\Html;
use ExAdmin\ui\component\common\Icon;
use ExAdmin\ui\component\echart\BarChart;
use ExAdmin\ui\component\echart\LineChart;
use ExAdmin\ui\component\grid\card\Card;
use ExAdmin\ui\component\grid\statistic\Statistic;
use ExAdmin\ui\component\layout\Divider;
use ExAdmin\ui\component\layout\layout\Layout;
use ExAdmin\ui\component\layout\Row;
use Illuminate\Support\Carbon;
use support\Db;
use support\Response;
/**
* 数据中心
* @group channel
*/
class ChannelIndexController
{
/**
* 数据中心
* @group channel
* @auth true
*/
public function index(): Layout
{
$rechargeData = $this->rechargeData();
$withdrawData = $this->withdrawData();
$playerData = $this->playerData();
$loginData = $this->loginData();
$layout = Layout::create();
$layout->row(function (Row $row) use ($rechargeData, $withdrawData, $playerData, $loginData) {
$row->gutter([10, 10]);
$row->column(
Card::create([
Row::create()->column(Icon::create('fas fa-globe')->style(['fontSize' => '45px', 'color' => 'rgb(0,154,97)', 'marginRight' => '20px']), 4),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.department_id'))
->value(Admin::user()->department->id ?? '')->style(['fontSize' => '45px', 'text-align' => 'center']), 6),
Divider::create()->type('vertical')->style(['height' => '4.9em']),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.department_name'))
->value(Admin::user()->department->name ?? '')->style(['fontSize' => '45px', 'text-align' => 'center']), 8),
])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px'])
, 12);
$row->column(
Card::create([
Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 6),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_add_player'))
->value($playerData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8),
Divider::create()->type('vertical')->style(['height' => '4.9em']),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.player_all'))
->value($playerData['all'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8),
])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined')
->redirect('ex-admin/addons-webman-controller-ChannelPlayerController/index'))
->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px'])
, 12);
$row->column(
Card::create([
Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#e91e63', 'marginRight' => '20px']), 6),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_active_player'))
->value($loginData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8)
->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 1]),
Divider::create()->type('vertical')->style(['height' => '4.9em']),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.mouth_active_player'))
->value($loginData['month'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8)
->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 2])
])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()
, 12);
$row->column(
Card::create([
Row::create()->column(Icon::create('fas fa-money-bill')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 6),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.recharge_all'))
->value(floatval($rechargeData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8),
])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined')
->redirect('ex-admin/addons-webman-controller-ChannelRechargeRecordController/index'))
->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px'])
, 6);
$row->column(
Card::create([
Row::create()->column(Icon::create('fas fa-money-bill-alt')->style(['fontSize' => '45px', 'color' => '#ff9800', 'marginRight' => '20px']), 6),
Row::create()->column(Statistic::create()->title(admin_trans('data_center.withdraw_all'))
->value(floatval($withdrawData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8),
])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined')
->redirect('ex-admin/addons-webman-controller-ChannelWithdrawRecordController/index'))
->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px'])
, 6);
$row->column(Card::create($this->rechargeChart())->hoverable(), 12);
$row->column(Card::create($this->withdrawChart())->hoverable(), 12);
$row->column(Card::create($this->playerChart())->hoverable(), 12);
});
return $layout;
}
/**
* 获取活跃玩家数据
* @return array
*/
public function loginData(): array
{
return [
'month' => PlayerLoginRecord::whereYear('created_at', date('Y'))->whereMonth('created_at', date('m'))->distinct('player_id')->count(),
'today' => PlayerLoginRecord::whereDate('created_at', date('Y-m-d'))->distinct('player_id')->count(),
];
}
/**
* 获取玩家数据
* @return array
*/
public function playerData(): array
{
return [
'all' => Player::count('*'),
'today' => Player::whereDate('created_at', date('Y-m-d'))->count(),
];
}
/**
* 获取充值数据
* @return array
*/
public function rechargeData(): array
{
return [
'all' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ARTIFICIAL])->sum('coins'),
'regular' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_REGULAR)->sum('coins'),
'artificial' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_ARTIFICIAL)->sum('coins'),
];
}
/**
* 获取提现数据
* @return array
*/
public function withdrawData(): array
{
return [
'all' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->sum('coins'),
'self' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_SELF)->sum('coins'),
'artificial' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_ARTIFICIAL)->sum('coins'),
];
}
/**
* 充值趋势图
* @return LineChart
*/
public function rechargeChart(): LineChart
{
$range = Carbon::now()->subDays(15)->format('Y-m-d');
$data = PlayerRechargeRecord::whereDate('created_at', '>=', $range)
->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)
->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ARTIFICIAL])
->groupBy('date')
->orderBy('date', 'DESC')
->get([
DB::raw('Date(`created_at`) as date'),
DB::raw('SUM(`coins`) as value')
])
->toArray();
$data = $data ? array_column($data, 'value', 'date') : [];
$xAxis = [];
$yAxis = [];
for ($i = 14; $i >= 0; $i--) {
$date = Carbon::now()->subDays($i)->format('Y-m-d');
$xAxis[] = $date;
$yAxis[] = $data[$date] ?? 0;
}
return LineChart::create()
->height('280px')
->hideDateFilter()
->header(Html::create(admin_trans('data_center.recharge_chart'))->tag('h2')->style(['text-align' => 'center']))
->xAxis($xAxis)
->data(admin_trans('data_center.recharge_amount'), $yAxis);
}
/**
* 提现趋势图
* @return LineChart
*/
public function withdrawChart(): LineChart
{
$range = Carbon::now()->subDays(15)->format('Y-m-d');
$data = PlayerWithdrawRecord::whereDate('created_at', '>=', $range)
->where('status', PlayerWithdrawRecord::STATUS_SUCCESS)
->groupBy('date')
->orderBy('date', 'DESC')
->get([
DB::raw('Date(`created_at`) as date'),
DB::raw('SUM(`coins`) as value')
])
->toArray();
$data = $data ? array_column($data, 'value', 'date') : [];
$xAxis = [];
$yAxis = [];
for ($i = 14; $i >= 0; $i--) {
$date = Carbon::now()->subDays($i)->format('Y-m-d');
$xAxis[] = $date;
$yAxis[] = $data[$date] ?? 0;
}
return LineChart::create()
->height('280px')
->hideDateFilter()
->header(Html::create(admin_trans('data_center.withdraw_chart'))->tag('h2')->style(['text-align' => 'center']))
->xAxis($xAxis)
->data(admin_trans('data_center.withdraw_amount'), $yAxis);
}
/**
* 上传
* @return Response|void
*/
public function myEditorUpload()
{
$file = request()->file('file');
if ($file && $file->isValid()) {
$size = $file->getSize();
if ($file->getSize() >= 1024 * 1024) {
return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message'));
}
$extension = $file->getUploadExtension();
if (!in_array($extension, ['png', 'jpg', 'jpeg'])) {
return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message'));
}
$uploadName = $file->getUploadName();
$basePath = public_path() . '/storage/' . date('Ymd') . DIRECTORY_SEPARATOR;
$baseUrl = env('APP_URL', 'http://127.0.0.1:8787') . '/storage/' . date('Ymd') . '/';
$uniqueId = hash_file('md5', $file->getPathname());
$saveFilename = $uniqueId . '.' . $file->getUploadExtension();
$savePath = $basePath . $saveFilename;
$file->move($savePath);
return jsonSuccessResponse('success', [
'origin_name' => $uploadName,
'save_name' => $saveFilename,
'save_path' => $savePath,
'url' => $baseUrl . $saveFilename,
'unique_id' => $uniqueId,
'size' => $size,
'mime_type' => $file->getUploadMimeType(),
'extension' => $extension,
]);
}
}
/**
* 新增玩家
* @return BarChart
*/
public function playerChart(): BarChart
{
$range = Carbon::now()->subDays(15)->format('Y-m-d');
$data = Player::whereDate('created_at', '>=', $range)
->groupBy('date')
->orderBy('date', 'DESC')
->get([
DB::raw('Date(`created_at`) as date'),
DB::raw('COUNT(`id`) as value')
])
->toArray();
$data = $data ? array_column($data, 'value', 'date') : [];
$xAxis = [];
$yAxis = [];
for ($i = 14; $i >= 0; $i--) {
$date = Carbon::now()->subDays($i)->format('Y-m-d');
$xAxis[] = $date;
$yAxis[] = $data[$date] ?? 0;
}
return BarChart::create()
->height('280px')
->hideDateFilter()
->header(Html::create(admin_trans('data_center.player_chart'))->tag('h2')->style(['text-align' => 'center']))
->xAxis($xAxis)
->data(admin_trans('data_center.player_amount'), $yAxis);
}
}