觉得后台admin空荡荡的,索性加个图表自己魔改一下下。以下是完整的index.php  ```php %s 篇文章, 并有 %s 条关于你的评论在 %s 个分类中.', $stat->myPublishedPostsNum, $stat->myPublishedCommentsNum, $stat->categoriesNum); ?> pass('contributor', true)): ?> pass('editor', true) && 'on' == $request->get('__typecho_all_comments') && $stat->waitingCommentsNum > 0): ?> waitingCommentsNum(); ?> myWaitingCommentsNum > 0): ?> myWaitingCommentsNum(); ?> pass('editor', true) && 'on' == $request->get('__typecho_all_comments') && $stat->spamCommentsNum > 0): ?> spamCommentsNum(); ?> mySpamCommentsNum > 0): ?> mySpamCommentsNum(); ?> pass('administrator', true)): ?> to($posts); ?> have()): ?> next()): ?> date('n.j'); ?> title(); ?> to($comments); ?> have()): ?> next()): ?> date('n.j'); ?> author(false); ?>: excerpt(35, '...'); ?> ``` 其他插件推荐: [post cid="405" /] Loading... 觉得后台admin空荡荡的,索性加个图表自己魔改一下下。以下是完整的index.php  ```php <?php include 'common.php'; include 'header.php'; include 'menu.php'; $stat = \Widget\Stat::alloc(); ?> <div class="main"> <div class="container typecho-dashboard"> <?php include 'page-title.php'; ?> <div class="row typecho-page-main"> <div class="col-mb-12 welcome-board" role="main"> <p><?php _e('目前有 <em>%s</em> 篇文章, 并有 <em>%s</em> 条关于你的评论在 <em>%s</em> 个分类中.', $stat->myPublishedPostsNum, $stat->myPublishedCommentsNum, $stat->categoriesNum); ?> <!--<br><?php _e('点击下面的链接快速开始:'); ?></p>--> <ul id="start-link" class="clearfix"> <?php if ($user->pass('contributor', true)): ?> <li><a href="<?php $options->adminUrl('write-post.php'); ?>"><?php _e('撰写新文章'); ?></a></li> <?php if ($user->pass('editor', true) && 'on' == $request->get('__typecho_all_comments') && $stat->waitingCommentsNum > 0): ?> <li> <a href="<?php $options->adminUrl('manage-comments.php?status=waiting'); ?>"><?php _e('待审核的评论'); ?></a> <span class="balloon"><?php $stat->waitingCommentsNum(); ?></span> </li> <?php elseif ($stat->myWaitingCommentsNum > 0): ?> <li> <a href="<?php $options->adminUrl('manage-comments.php?status=waiting'); ?>"><?php _e('待审核评论'); ?></a> <span class="balloon"><?php $stat->myWaitingCommentsNum(); ?></span> </li> <?php endif; ?> <?php if ($user->pass('editor', true) && 'on' == $request->get('__typecho_all_comments') && $stat->spamCommentsNum > 0): ?> <li> <a href="<?php $options->adminUrl('manage-comments.php?status=spam'); ?>"><?php _e('垃圾评论'); ?></a> <span class="balloon"><?php $stat->spamCommentsNum(); ?></span> </li> <?php elseif ($stat->mySpamCommentsNum > 0): ?> <li> <a href="<?php $options->adminUrl('manage-comments.php?status=spam'); ?>"><?php _e('垃圾评论'); ?></a> <span class="balloon"><?php $stat->mySpamCommentsNum(); ?></span> </li> <?php endif; ?> <?php if ($user->pass('administrator', true)): ?> <li><a href="<?php $options->adminUrl('manage-posts.php'); ?>"><?php _e('文章管理'); ?></a></li> <!--<li><a href="<?php $options->adminUrl('themes.php'); ?>"><?php _e('更换外观'); ?></a></li>--> <li><a href="<?php $options->adminUrl('plugins.php'); ?>"><?php _e('插件管理'); ?></a></li> <li><a href="<?php $options->adminUrl('options-general.php'); ?>"><?php _e('系统设置'); ?></a> </li> <?php endif; ?> <?php endif; ?> <!--<li><a href="<?php $options->adminUrl('profile.php'); ?>"><?php _e('更新我的资料'); ?></a></li>--> </ul> </div> <div class="col-mb-12 col-tb-4" role="complementary"> <section class="latest-link"> <h3><?php _e('最近发布的文章'); ?></h3> <?php \Widget\Contents\Post\Recent::alloc('pageSize=10')->to($posts); ?> <ul> <?php if ($posts->have()): ?> <?php while ($posts->next()): ?> <li> <span><?php $posts->date('n.j'); ?></span> <a href="<?php $posts->permalink(); ?>" class="title"><?php $posts->title(); ?></a> </li> <?php endwhile; ?> <?php else: ?> <li><em><?php _e('暂时没有文章'); ?></em></li> <?php endif; ?> </ul> </section> </div> <div class="col-mb-12 col-tb-4" role="complementary"> <section class="latest-link"> <h3><?php _e('最近得到的回复'); ?></h3> <ul> <?php \Widget\Comments\Recent::alloc('pageSize=10')->to($comments); ?> <?php if ($comments->have()): ?> <?php while ($comments->next()): ?> <li> <span><?php $comments->date('n.j'); ?></span> <a href="<?php $comments->permalink(); ?>" class="title"><?php $comments->author(false); ?></a>: <?php $comments->excerpt(35, '...'); ?> </li> <?php endwhile; ?> <?php else: ?> <li><?php _e('暂时没有回复'); ?></li> <?php endif; ?> </ul> </section> </div> <!--<div class="col-mb-12 col-tb-4" role="complementary">--> <!-- <section class="latest-link">--> <!-- <h3><?php _e('官方最新日志'); ?></h3>--> <!-- <div id="typecho-message">--> <!-- <ul>--> <!-- <li><?php _e('读取中...'); ?></li>--> <!-- </ul>--> <!-- </div>--> <!-- </section>--> <!--</div>--> <!-- 图表显示区域 --> <div class="col-mb-12 welcome-board"> <h3 style="color:black"><?php _e('文章统计数据'); ?></h3> <div style="display: flex; gap: 20px; flex-wrap: wrap; margin-bottom: 20px;"> <!-- 月度发布图表 --> <div style="flex: 1; min-width: 400px;"> <canvas id="monthlyPostChart" height="300"></canvas> </div> <!-- 状态分布图表 --> <div style="flex: 1; min-width: 300px;"> <canvas id="statusChart" height="300"></canvas> </div> </div> <div style="display: flex; gap: 20px; flex-wrap: wrap; margin-bottom: 20px;"> <!-- 分类文章统计 --> <div style="flex: 1; min-width: 400px;"> <canvas id="categoryChart" height="300"></canvas> </div> <!-- 标签文章统计 --> <div style="flex: 1; min-width: 400px;"> <canvas id="tagChart" height="300"></canvas> </div> </div> </div> </div> </div> </div> <?php include 'copyright.php'; include 'common-js.php'; ?> <script src="https://blog.iletter.top/usr/blog_img/chart.js"></script> <script> $(document).ready(function() { <?php // ==================== PHP 数据计算部分 ==================== // 1. 月度文章统计数据 $db = Typecho_Db::get(); // 月度文章统计 $select = $db->select() ->from('table.contents') ->where('type = ?', 'post') ->where('status = ?', 'publish'); $posts = $db->fetchAll($select); $monthlyData = []; $monthLabels = []; $currentYear = date('Y'); $currentMonth = date('n'); // 初始化最近12个月的数据 for ($i = 11; $i >= 0; $i--) { $year = $currentYear; $month = $currentMonth - $i; if ($month <= 0) { $month += 12; $year--; } $key = $year . '-' . str_pad($month, 2, '0', STR_PAD_LEFT); $monthlyData[$key] = 0; $monthLabels[$key] = $year . '年' . $month . '月'; } // 统计实际数据 foreach ($posts as $post) { $created = $post['created']; $year = date('Y', $created); $month = date('m', $created); $key = $year . '-' . $month; if (isset($monthlyData[$key])) { $monthlyData[$key]++; } } // 2. 文章状态统计 $published = $db->fetchObject($db->select(['COUNT(*)' => 'count']) ->from('table.contents') ->where('type = ?', 'post') ->where('status = ?', 'publish'))->count; $draft = $db->fetchObject($db->select(['COUNT(*)' => 'count']) ->from('table.contents') ->where('type = ?', 'post_draft') ->where('status = ?', 'publish'))->count; // 3. 分类文章统计 $categories = $db->fetchAll($db->select()->from('table.metas')->where('type = ?', 'category')); $categoryData = []; $categoryLabels = []; foreach ($categories as $category) { $count = $db->fetchObject($db->select(['COUNT(*)' => 'count']) ->from('table.relationships') ->where('mid = ?', $category['mid']))->count; if ($count > 0) { // 只显示有文章的分类 $categoryLabels[] = $category['name']; $categoryData[] = (int)$count; } } // 4. 标签文章统计 (取前10个) $tags = $db->fetchAll($db->select()->from('table.metas')->where('type = ?', 'tag')); $tagData = []; $tagLabels = []; foreach ($tags as $tag) { $count = $db->fetchObject($db->select(['COUNT(*)' => 'count']) ->from('table.relationships') ->where('mid = ?', $tag['mid']))->count; if ($count > 0) { $tagLabels[] = $tag['name']; $tagData[] = (int)$count; } } // 按数量排序,取前10个 array_multisort($tagData, SORT_DESC, $tagLabels); $topTagLabels = array_slice($tagLabels, 0, 10); $topTagData = array_slice($tagData, 0, 10); // 准备图表数据 $chartMonthlyData = [ 'labels' => array_values($monthLabels), 'values' => array_values($monthlyData) ]; $chartStatusData = [ 'published' => (int)$published, 'draft' => (int)$draft ]; $chartCategoryData = [ 'labels' => $categoryLabels, 'values' => $categoryData ]; $chartTagData = [ 'labels' => $topTagLabels, 'values' => $topTagData ]; ?> // ==================== JavaScript 图表渲染部分 ==================== // 1. 月度文章图表 var monthlyData = <?php echo json_encode($chartMonthlyData); ?>; if (monthlyData.labels && monthlyData.labels.length > 0) { var ctx1 = document.getElementById('monthlyPostChart').getContext('2d'); new Chart(ctx1, { type: 'line', data: { labels: monthlyData.labels, datasets: [{ label: '每月发文数', data: monthlyData.values, borderColor: 'rgb(75, 192, 192)', backgroundColor: 'rgba(75, 192, 192, 0.2)', tension: 0.1, fill: true }] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { title: { display: true, text: '月度文章发布趋势' } } } }); } // 2. 文章状态图表 var statusData = <?php echo json_encode($chartStatusData); ?>; if (statusData) { var ctx2 = document.getElementById('statusChart').getContext('2d'); new Chart(ctx2, { type: 'doughnut', data: { labels: ['已发布', '草稿'], datasets: [{ data: [statusData.published, statusData.draft], backgroundColor: [ 'rgba(75, 192, 192, 0.8)', 'rgba(255, 205, 86, 0.8)', ], borderWidth: 1 }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { title: { display: true, text: '文章状态分布' }, legend: { position: 'bottom' } } } }); } // 3. 分类文章图表 var categoryData = <?php echo json_encode($chartCategoryData); ?>; if (categoryData.labels && categoryData.labels.length > 0) { var ctx3 = document.getElementById('categoryChart').getContext('2d'); new Chart(ctx3, { type: 'bar', data: { labels: categoryData.labels, datasets: [{ label: '文章数量', data: categoryData.values, backgroundColor: 'rgba(153, 102, 255, 0.8)', borderColor: 'rgba(153, 102, 255, 1)', borderWidth: 1 }] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { title: { display: true, text: '各分类文章数量' } } } }); } // 4. 标签文章图表 var tagData = <?php echo json_encode($chartTagData); ?>; if (tagData.labels && tagData.labels.length > 0) { var ctx4 = document.getElementById('tagChart').getContext('2d'); new Chart(ctx4, { type: 'bar', data: { labels: tagData.labels, datasets: [{ label: '文章数量', data: tagData.values, backgroundColor: 'rgba(255, 159, 64, 0.8)', borderColor: 'rgba(255, 159, 64, 1)', borderWidth: 1 }] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, ticks: { precision: 0 } } }, plugins: { title: { display: true, text: '热门标签文章数量 (前10)' } } } }); } }); </script> <script> $(document).ready(function () { var ul = $('#typecho-message ul'), cache = window.sessionStorage, html = cache ? cache.getItem('feed') : '', update = cache ? cache.getItem('update') : ''; if (!!html) { ul.html(html); } else { html = ''; $.get('<?php $options->index('/action/ajax?do=feed'); ?>', function (o) { for (var i = 0; i < o.length; i++) { var item = o[i]; html += '<li><span>' + item.date + '</span> <a href="' + item.link + '" target="_blank">' + item.title + '</a></li>'; } ul.html(html); cache.setItem('feed', html); }, 'json'); } function applyUpdate(update) { if (update.available) { $('<div class="update-check message error"><p>' + '<?php _e('您当前使用的版本是 %s'); ?>'.replace('%s', update.current) + '<br />' + '<strong><a href="' + update.link + '" target="_blank">' + '<?php _e('官方最新版本是 %s'); ?>'.replace('%s', update.latest) + '</a></strong></p></div>') .insertAfter('.typecho-page-title').effect('highlight'); } } if (!!update) { applyUpdate($.parseJSON(update)); } else { $.get('<?php $options->index('/action/ajax?do=checkVersion'); ?>', function (o, status, resp) { applyUpdate(o); cache.setItem('update', resp.responseText); }, 'json'); } }); </script> <?php include 'footer.php'; ?> ``` 其他插件推荐: <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.iletter.top/index.php/archives/405.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.iletter.top/usr/uploads/2025/07/2255174822.jpg);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">为typecho博客添加Gotify插件通知</p> <div class="inster-summary text-muted"> 受限于typecho博客没有通知,自己写了一个博客有评论就通知的gotify插件,脚本使用之前的python改的。... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> 最后修改:2025 年 07 月 31 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果觉得我的文章对你有用,请随意赞赏