From e65f150df7281362058bed401851ae2aa96ee0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E6=B3=BD=E7=BD=91?= <”357099073@qq.com“> Date: Mon, 19 May 2025 22:24:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BB=A3=E7=A0=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=BB=9F=E8=AE=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/index/controller/BaseController.php | 34 ++- app/service/VisitStatsService.php | 218 ++++++++------ config/cache.php | 2 +- public/static/images/logo.png | Bin 7983 -> 6857 bytes public/static/images/logo1.png | Bin 0 -> 7983 bytes .../images/{qrcode.jpg => wechat_qrcode.jpg} | Bin .../temp/34d283a1bcbe58ecbdbcd3d1f0e36700.php | 267 ++++++++++++++++++ .../temp/792969fb591a0f355761a1b3bf3d1226.php | 2 +- 8 files changed, 428 insertions(+), 95 deletions(-) create mode 100644 public/static/images/logo1.png rename public/static/images/{qrcode.jpg => wechat_qrcode.jpg} (100%) create mode 100644 runtime/admin/temp/34d283a1bcbe58ecbdbcd3d1f0e36700.php diff --git a/app/index/controller/BaseController.php b/app/index/controller/BaseController.php index 60e5846..96ee0e7 100644 --- a/app/index/controller/BaseController.php +++ b/app/index/controller/BaseController.php @@ -6,7 +6,8 @@ namespace app\index\controller; use think\App; use think\facade\View; use think\facade\Request; -use think\facade\Config; +use think\facade\Db; +use app\service\VisitStatsService; /** * 前台控制器基础类 @@ -18,6 +19,7 @@ abstract class BaseController * @var \think\Request */ protected $request; + protected $visitStats; /** * 应用实例 @@ -34,6 +36,7 @@ abstract class BaseController { $this->app = $app; $this->request = $this->app->request; + $this->visitStats = new VisitStatsService(); // 控制器初始化 $this->initialize(); @@ -44,20 +47,25 @@ abstract class BaseController */ protected function initialize() { + // 记录访问 + $this->visitStats->recordVisit($this->getControllerName()); + + // 获取配置 + $configList = Db::table('yz_admin_config') + ->where('config_status', 1) + ->order('config_sort DESC') + ->select() + ->toArray(); + + // 将配置数据转换为键值对形式 + $config = []; + foreach ($configList as $item) { + $config[$item['config_name']] = $item['config_value']; + } + // 设置通用变量 View::assign([ - 'site_name' => '网站名称', - 'site_description' => '网站描述', - 'site_keywords' => '网站关键词', - 'config' => [ - 'admin_name' => Config::get('site.name', '云泽科技'), - 'admin_phone' => Config::get('site.phone', '400-123-4567'), - 'admin_email' => Config::get('site.email', 'admin@example.com'), - 'admin_wechat' => Config::get('site.wechat_qrcode', '/static/images/wechat_qrcode.jpg'), - 'logo' => Config::get('site.logo', '/static/images/logo.png'), - 'logo1' => Config::get('site.logo1', '/static/images/logo1.png'), - 'admin_route' => Config::get('site.admin_route', '/admin/') - ] + 'config' => $config ]); } diff --git a/app/service/VisitStatsService.php b/app/service/VisitStatsService.php index 6800b53..599aca4 100644 --- a/app/service/VisitStatsService.php +++ b/app/service/VisitStatsService.php @@ -4,6 +4,7 @@ namespace app\service; use think\facade\Cache; use think\facade\Request; use think\facade\Db; +use think\facade\Log; class VisitStatsService { @@ -15,8 +16,14 @@ class VisitStatsService public function __construct() { - // 获取Redis处理器 - $this->redis = Cache::store('redis')->handler(); + try { + // 获取Redis处理器 + $this->redis = Cache::store('redis')->handler(); + } catch (\Exception $e) { + // Redis连接失败,使用文件缓存 + $this->redis = Cache::store('file')->handler(); + Log::error('Redis连接失败,已切换到文件缓存:' . $e->getMessage()); + } } /** @@ -24,45 +31,56 @@ class VisitStatsService */ public function recordVisit(string $page = 'home', string $userId = null): array { - $date = date('Y-m-d'); - $hour = date('H'); - $userId = $userId ?? Request::ip(); - - // 使用管道提高性能 - $pipe = $this->redis->multi(); - - // 总访问量(PV) - $pipe->incr($this->prefix.'total_visits'); - - // 每日访问量 - $pipe->incr($this->prefix.'daily:'.$date); - - // 页面统计 - $pipe->zIncrBy($this->prefix.'page_views', 1, $page); - - // UV统计(使用HyperLogLog节省内存) - $pipe->pfAdd($this->prefix.'uv:'.$date, [$userId]); - - // 时段统计 - $pipe->hIncrBy($this->prefix.'hourly:'.$date, $hour, 1); - - // 执行所有命令 - $result = $pipe->exec(); - - // 更新数据库统计 - $this->updateDailyStats($date, [ - 'total_visits' => $result[0], - 'daily_visits' => $result[1], - 'unique_visitors' => $this->getUniqueVisitors($date) - ]); - - return [ - 'total' => $result[0], - 'daily' => $result[1], - 'page' => $result[2], - 'uv' => $result[3], - 'hourly'=> $result[4] - ]; + try { + $date = date('Y-m-d'); + $hour = date('H'); + $userId = $userId ?? Request::ip(); + + // 使用管道提高性能 + $pipe = $this->redis->multi(); + + // 总访问量(PV) + $pipe->incr($this->prefix.'total_visits'); + + // 每日访问量 + $pipe->incr($this->prefix.'daily:'.$date); + + // 页面统计 + $pipe->zIncrBy($this->prefix.'page_views', 1, $page); + + // UV统计(使用HyperLogLog节省内存) + $pipe->pfAdd($this->prefix.'uv:'.$date, [$userId]); + + // 时段统计 + $pipe->hIncrBy($this->prefix.'hourly:'.$date, $hour, 1); + + // 执行所有命令 + $result = $pipe->exec(); + + // 更新数据库统计 + $this->updateDailyStats($date, [ + 'total_visits' => $result[0], + 'daily_visits' => $result[1], + 'unique_visitors' => $this->getUniqueVisitors($date) + ]); + + return [ + 'total' => $result[0], + 'daily' => $result[1], + 'page' => $result[2], + 'uv' => $result[3], + 'hourly'=> $result[4] + ]; + } catch (\Exception $e) { + Log::error('访问统计失败:' . $e->getMessage()); + return [ + 'total' => 0, + 'daily' => 0, + 'page' => 0, + 'uv' => 0, + 'hourly'=> 0 + ]; + } } /** @@ -70,36 +88,63 @@ class VisitStatsService */ protected function updateDailyStats(string $date, array $stats) { - // 获取其他统计数据 - $otherStats = [ - 'total_users' => Db::name('users')->where('delete_time', null)->count(), - 'new_users' => Db::name('users')->whereDay('create_time', $date)->count(), - 'total_articles' => Db::name('articles')->where('delete_time', null)->count(), - 'daily_articles' => Db::name('articles')->whereDay('create_time', $date)->count(), - 'article_views' => Db::name('articles')->whereDay('update_time', $date)->sum('views'), - 'total_resources' => Db::name('resources')->where('delete_time', null)->count(), - 'daily_resources' => Db::name('resources')->whereDay('create_time', $date)->count(), - 'resource_downloads' => Db::name('resources')->whereDay('update_time', $date)->sum('downloads') - ]; - - // 合并统计数据 - $stats = array_merge($stats, $otherStats); - - // 更新或插入统计数据 - Db::name('daily_stats')->insertOrUpdate([ - 'date' => $date, - 'total_users' => $stats['total_users'], - 'new_users' => $stats['new_users'], - 'total_visits' => $stats['total_visits'], - 'daily_visits' => $stats['daily_visits'], - 'unique_visitors' => $stats['unique_visitors'], - 'total_articles' => $stats['total_articles'], - 'daily_articles' => $stats['daily_articles'], - 'article_views' => $stats['article_views'], - 'total_resources' => $stats['total_resources'], - 'daily_resources' => $stats['daily_resources'], - 'resource_downloads' => $stats['resource_downloads'] - ], ['date']); + try { + // 获取其他统计数据 + $otherStats = [ + 'total_users' => Db::name('users')->count(), // 移除 delete_time 条件 + 'new_users' => Db::name('users')->whereDay('create_time', $date)->count(), + 'total_articles' => Db::name('articles')->where('delete_time', null)->count(), + 'daily_articles' => Db::name('articles')->whereDay('create_time', $date)->count(), + 'article_views' => Db::name('articles')->whereDay('update_time', $date)->sum('views'), + 'total_resources' => Db::name('resources')->where('delete_time', null)->count(), + 'daily_resources' => Db::name('resources')->whereDay('create_time', $date)->count(), + 'resource_downloads' => Db::name('resources')->whereDay('update_time', $date)->sum('downloads') + ]; + + // 记录日志,方便调试 + Log::info('统计数据:' . json_encode($otherStats, JSON_UNESCAPED_UNICODE)); + + // 合并统计数据 + $stats = array_merge($stats, $otherStats); + + // 检查记录是否存在 + $exists = Db::name('daily_stats')->where('date', $date)->find(); + + if ($exists) { + // 更新已存在的记录 + Db::name('daily_stats')->where('date', $date)->update([ + 'total_users' => $stats['total_users'], + 'new_users' => $stats['new_users'], + 'total_visits' => $stats['total_visits'], + 'daily_visits' => $stats['daily_visits'], + 'unique_visitors' => $stats['unique_visitors'], + 'total_articles' => $stats['total_articles'], + 'daily_articles' => $stats['daily_articles'], + 'article_views' => $stats['article_views'], + 'total_resources' => $stats['total_resources'], + 'daily_resources' => $stats['daily_resources'], + 'resource_downloads' => $stats['resource_downloads'] + ]); + } else { + // 插入新记录 + Db::name('daily_stats')->insert([ + 'date' => $date, + 'total_users' => $stats['total_users'], + 'new_users' => $stats['new_users'], + 'total_visits' => $stats['total_visits'], + 'daily_visits' => $stats['daily_visits'], + 'unique_visitors' => $stats['unique_visitors'], + 'total_articles' => $stats['total_articles'], + 'daily_articles' => $stats['daily_articles'], + 'article_views' => $stats['article_views'], + 'total_resources' => $stats['total_resources'], + 'daily_resources' => $stats['daily_resources'], + 'resource_downloads' => $stats['resource_downloads'] + ]); + } + } catch (\Exception $e) { + Log::error('更新统计数据失败:' . $e->getMessage()); + } } /** @@ -107,7 +152,12 @@ class VisitStatsService */ public function getTotalVisits(): int { - return (int)$this->redis->get($this->prefix.'total_visits'); + try { + return (int)$this->redis->get($this->prefix.'total_visits'); + } catch (\Exception $e) { + Log::error('获取总访问量失败:' . $e->getMessage()); + return 0; + } } /** @@ -115,8 +165,13 @@ class VisitStatsService */ public function getDailyVisits(string $date = null): int { - $date = $date ?? date('Y-m-d'); - return (int)$this->redis->get($this->prefix.'daily:'.$date); + try { + $date = $date ?? date('Y-m-d'); + return (int)$this->redis->get($this->prefix.'daily:'.$date); + } catch (\Exception $e) { + Log::error('获取当日访问量失败:' . $e->getMessage()); + return 0; + } } /** @@ -124,10 +179,13 @@ class VisitStatsService */ public function getUniqueVisitors(string $date = null): int { - $date = $date ?? date('Y-m-d'); - return $this->redis->pfCount($this->prefix.'uv:'.$date); + try { + $date = $date ?? date('Y-m-d'); + return $this->redis->pfCount($this->prefix.'uv:'.$date); + } catch (\Exception $e) { + Log::error('获取独立访客数失败:' . $e->getMessage()); + return 0; + } } - - /** - * 获取热门页面 - \ No newline at end of file +} + \ No newline at end of file diff --git a/config/cache.php b/config/cache.php index d4c2158..03ca926 100644 --- a/config/cache.php +++ b/config/cache.php @@ -39,7 +39,7 @@ return [ // 连接超时时间 'timeout' => 0, // 是否持久化连接 - 'persistent' => true, + 'persistent' => false, // 缓存前缀 'prefix' => 'yz_:', ], diff --git a/public/static/images/logo.png b/public/static/images/logo.png index ab69e49c775dd1cc3fa826b52345087a5841f121..41d09290aa6673c46f86d0491a3048d67e96a4aa 100644 GIT binary patch delta 6667 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 V6Nws_8d(4U002ovPDHLkV1jGlZT0{F delta 7812 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 Bds_ei literal 0 HcmV?d00001 diff --git a/public/static/images/qrcode.jpg b/public/static/images/wechat_qrcode.jpg similarity index 100% rename from public/static/images/qrcode.jpg rename to public/static/images/wechat_qrcode.jpg diff --git a/runtime/admin/temp/34d283a1bcbe58ecbdbcd3d1f0e36700.php b/runtime/admin/temp/34d283a1bcbe58ecbdbcd3d1f0e36700.php new file mode 100644 index 0000000..b872a21 --- /dev/null +++ b/runtime/admin/temp/34d283a1bcbe58ecbdbcd3d1f0e36700.php @@ -0,0 +1,267 @@ + + + + + <?php echo htmlentities((string) $config['admin_name']); ?> + + + + + + + + + + + +

+
+ 操作日志 +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/runtime/admin/temp/792969fb591a0f355761a1b3bf3d1226.php b/runtime/admin/temp/792969fb591a0f355761a1b3bf3d1226.php index 08fac6e..61ccadd 100644 --- a/runtime/admin/temp/792969fb591a0f355761a1b3bf3d1226.php +++ b/runtime/admin/temp/792969fb591a0f355761a1b3bf3d1226.php @@ -1,4 +1,4 @@ - +