|
|
<?php
|
|
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
|
|
use App\Admin\Extensions\Div; // 引入自定义的 Div 类
|
|
|
use App\Http\Controllers\Controller; // 引入基础控制器
|
|
|
use App\Models\SiteCount; // 引入站点统计模型
|
|
|
use App\Models\User; // 引入用户模型
|
|
|
use App\Services\SiteCountService; // 引入站点统计服务
|
|
|
use Carbon\Carbon; // 引入 Carbon 日期时间处理库
|
|
|
use Encore\Admin\Auth\Database\Menu; // 引入菜单模型
|
|
|
use Encore\Admin\Facades\Admin; // 引入 Admin 门面
|
|
|
use Encore\Admin\Layout\Content; // 引入内容布局
|
|
|
use Encore\Admin\Layout\Row; // 引入行布局
|
|
|
use Encore\Admin\Widgets\Box; // 引入盒子组件
|
|
|
|
|
|
class HomeController extends Controller
|
|
|
{
|
|
|
/**
|
|
|
* 显示仪表盘首页.
|
|
|
*
|
|
|
* @param Content $content 内容布局实例
|
|
|
* @param SiteCountService $service 站点统计服务实例
|
|
|
* @return Content 返回内容布局
|
|
|
*/
|
|
|
public function index(Content $content, SiteCountService $service)
|
|
|
{
|
|
|
// 用于更新菜单数据到文件, 可删除
|
|
|
// file_put_contents(database_path('data/menus.json'), Menu::all()->toJson(JSON_UNESCAPED_UNICODE));
|
|
|
|
|
|
// 引入 ECharts 图表库
|
|
|
Admin::js('/js/echarts.min.js');
|
|
|
|
|
|
return $content
|
|
|
->header('仪表盘') // 设置页面标题
|
|
|
->row(function (Row $row) use ($service) { // 创建一行布局
|
|
|
|
|
|
/**
|
|
|
* 今日统计, 今天的特殊情况,需要从缓存 redis 中读取
|
|
|
*
|
|
|
* @var $todaySite SiteCount
|
|
|
*/
|
|
|
$now = Carbon::now(); // 获取当前时间
|
|
|
$today = $now->toDateString(); // 获取今天的日期字符串
|
|
|
$todaySite = SiteCount::query()->firstOrNew(['date' => $today]); // 获取今天的统计记录,如果不存在则创建新记录
|
|
|
$todaySite = $service->syncByCache($todaySite); // 从缓存中同步今天的统计数据
|
|
|
|
|
|
// 七日统计
|
|
|
$lastWeekDate = $now->subDay(7); // 计算七天前的日期
|
|
|
$weekSites = SiteCount::query()
|
|
|
->where('date', '!=', $today) // 排除今天的记录
|
|
|
->where('date', '>', $lastWeekDate) // 只获取最近七天的记录
|
|
|
->get() // 获取记录
|
|
|
->push($todaySite) // 将今天的记录添加到结果集中
|
|
|
->sortBy('date'); // 按日期排序
|
|
|
|
|
|
// 本月统计
|
|
|
$month = $now->format('Y-m'); // 获取当前月份(格式:YYYY-MM)
|
|
|
$monthSites = SiteCount::query()
|
|
|
->where('date', '!=', $today) // 排除今天的记录
|
|
|
->where('date', '>', $month) // 只获取本月的记录
|
|
|
->get() // 获取记录
|
|
|
->push($todaySite) // 将今天的记录添加到结果集中
|
|
|
->sortBy('date'); // 按日期排序
|
|
|
|
|
|
// 创建统计信息的盒子组件
|
|
|
$row->column(4, new Box('今日用户注册来源', new Div('todayRegister'))); // 今日用户注册来源
|
|
|
$row->column(4, new Box('七日用户注册来源', new Div('weekRegister'))); // 七日用户注册来源
|
|
|
$row->column(4, new Box('本月用户注册来源', new Div('monthRegister'))); // 本月用户注册来源
|
|
|
|
|
|
$row->column(4, new Box('今日订单', new Div('todayOrders'))); // 今日订单
|
|
|
$row->column(4, new Box('近期订单量', new Div('weekSites'))); // 近期订单量
|
|
|
$row->column(4, new Box('交易金额', new Div('saleMoney'))); // 交易金额
|
|
|
|
|
|
// 将所有统计数据传递给视图
|
|
|
$allSites = compact('todaySite', 'weekSites', 'monthSites'); // 打包统计数据
|
|
|
$row->column(12, view('admin.chars.echart', $allSites)); // 渲染 ECharts 视图并传递数据
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 自定义 404 页面.
|
|
|
*
|
|
|
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
|
|
*/
|
|
|
public function noFound()
|
|
|
{
|
|
|
return redirect('admin'); // 重定向到管理员首页
|
|
|
}
|
|
|
}
|