浏览代码

优化控制台数据显示

Karson 4 年之前
父节点
当前提交
e2772b164b

+ 43 - 29
application/admin/controller/Dashboard.php

@@ -2,13 +2,17 @@
 
 namespace app\admin\controller;
 
+use app\admin\model\Admin;
+use app\admin\model\User;
 use app\common\controller\Backend;
-use think\Config;
+use app\common\model\Attachment;
+use fast\Date;
+use think\Db;
 
 /**
  * 控制台
  *
- * @icon fa fa-dashboard
+ * @icon   fa fa-dashboard
  * @remark 用于展示当前系统中的统计数据、统计报表及重要实时数据
  */
 class Dashboard extends Backend
@@ -19,37 +23,47 @@ class Dashboard extends Backend
      */
     public function index()
     {
-        $seventtime = \fast\Date::unixtime('day', -7);
-        $paylist = $createlist = [];
-        for ($i = 0; $i < 7; $i++)
-        {
-            $day = date("Y-m-d", $seventtime + ($i * 86400));
-            $createlist[$day] = mt_rand(20, 200);
-            $paylist[$day] = mt_rand(1, mt_rand(1, $createlist[$day]));
+        $column = [];
+        $starttime = Date::unixtime('day', -6);
+        $endtime = Date::unixtime('day', 0, 'end');
+        $joinlist = Db("user")->where('jointime', 'between time', [$starttime, $endtime])
+            ->field('jointime, status, COUNT(*) AS nums, DATE_FORMAT(FROM_UNIXTIME(jointime), "%Y-%m-%d") AS join_date')
+            ->group('join_date')
+            ->select();
+        for ($time = $starttime; $time <= $endtime;) {
+            $column[] = date("Y-m-d", $time);
+            $time += 86400;
         }
-        $hooks = config('addons.hooks');
-        $uploadmode = isset($hooks['upload_config_init']) && $hooks['upload_config_init'] ? implode(',', $hooks['upload_config_init']) : 'local';
-        $addonComposerCfg = ROOT_PATH . '/vendor/karsonzhang/fastadmin-addons/composer.json';
-        Config::parse($addonComposerCfg, "json", "composer");
-        $config = Config::get("composer");
-        $addonVersion = isset($config['version']) ? $config['version'] : __('Unknown');
+        $userlist = array_fill_keys($column, 0);
+        foreach ($joinlist as $k => $v) {
+            $userlist[$v['join_date']] = $v['nums'];
+        }
+
+        $dbTableList = Db::query("SHOW TABLE STATUS");
         $this->view->assign([
-            'totaluser'        => 35200,
-            'totalviews'       => 219390,
-            'totalorder'       => 32143,
-            'totalorderamount' => 174800,
-            'todayuserlogin'   => 321,
-            'todayusersignup'  => 430,
-            'todayorder'       => 2324,
-            'unsettleorder'    => 132,
-            'sevendnu'         => '80%',
-            'sevendau'         => '32%',
-            'paylist'          => $paylist,
-            'createlist'       => $createlist,
-            'addonversion'       => $addonVersion,
-            'uploadmode'       => $uploadmode
+            'totaluser'       => User::count(),
+            'totaladdon'      => count(get_addon_list()),
+            'totaladmin'      => Admin::count(),
+            'totalcategory'   => \app\common\model\Category::count(),
+            'todayusersignup' => User::whereTime('jointime', 'today')->count(),
+            'todayuserlogin'  => User::whereTime('logintime', 'today')->count(),
+            'sevendau'        => User::whereTime('jointime|logintime', '-7 days')->count(),
+            'thirtydau'       => User::whereTime('jointime|logintime', '-30 days')->count(),
+            'threednu'        => User::whereTime('jointime', '-3 days')->count(),
+            'sevendnu'        => User::whereTime('jointime', '-7 days')->count(),
+            'dbtablenums'     => count($dbTableList),
+            'dbsize'          => array_sum(array_map(function ($item) {
+                return $item['Data_length'] + $item['Index_length'];
+            }, $dbTableList)),
+            'attachmentnums'  => Attachment::count(),
+            'attachmentsize'  => Attachment::sum('filesize'),
+            'picturenums'     => Attachment::where('mimetype', 'like', 'image/%')->count(),
+            'picturesize'     => Attachment::where('mimetype', 'like', 'image/%')->sum('filesize'),
         ]);
 
+        $this->assignconfig('column', array_keys($userlist));
+        $this->assignconfig('userdata', array_values($userlist));
+
         return $this->view->fetch();
     }
 

+ 14 - 14
application/admin/lang/zh-cn/dashboard.php

@@ -6,34 +6,34 @@ return [
     'Type'                    => '栏目类型',
     'Image'                   => '图片',
     'Total user'              => '总会员数',
-    'Total view'              => '总访问数',
-    'Total order'             => '总订单数',
-    'Total order amount'      => '总金额',
+    'Total addon'             => '总插件数',
+    'Total category'          => '总分类数',
+    'Total admin'             => '总管理员数',
     'Today user signup'       => '今日注册',
     'Today user login'        => '今日登录',
     'Today order'             => '今日订单',
     'Unsettle order'          => '未处理订单',
+    'Three dnu'               => '三日新增',
     'Seven dnu'               => '七日新增',
     'Seven dau'               => '七日活跃',
+    'Thirty dau'              => '月活跃',
     'Custom zone'             => '这里是你的自定义数据',
-    'Sales'                   => '成交数',
-    'Orders'                  => '订单数',
+    'Register user'           => '注册用户数',
     'Real time'               => '实时',
     'Category count'          => '分类统计',
     'Category count tips'     => '当前分类总记录数',
+    'Database count'          => '数据库统计',
+    'Database table nums'     => '数据表数量',
+    'Database size'           => '占用空间',
     'Attachment count'        => '附件统计',
+    'Attachment nums'         => '附件数量',
+    'Attachment size'         => '附件大小',
     'Attachment count tips'   => '当前上传的附件数量',
-    'Article count'           => '文章统计',
-    'News count'              => '新闻统计',
-    'Comment count'           => '评论次数',
-    'Like count'              => '点赞次数',
-    'Recent news'             => '最新新闻',
-    'Recent discussion'       => '最新发贴',
+    'Picture count'           => '图片统计',
+    'Picture nums'            => '图片数量',
+    'Picture size'            => '图片大小',
     'Server info'             => '服务器信息',
     'PHP version'             => 'PHP版本',
-    'Fastadmin version'       => '主框架版本',
-    'Fastadmin addon version' => '插件版本',
-    'Thinkphp version'        => 'ThinkPHP版本',
     'Sapi name'               => '运行方式',
     'Debug mode'              => '调试模式',
     'Software'                => '环境信息',

+ 61 - 55
application/admin/view/dashboard/index.html

@@ -150,7 +150,6 @@
     }
 
 
-
     #statistics .panel {
         min-height: 150px;
     }
@@ -183,28 +182,28 @@
                     </div>
                     <div class="col-sm-3 col-xs-6">
                         <div class="sm-st clearfix">
-                            <span class="sm-st-icon st-violet"><i class="fa fa-book"></i></span>
+                            <span class="sm-st-icon st-violet"><i class="fa fa-magic"></i></span>
                             <div class="sm-st-info">
-                                <span>{$totalviews}</span>
-                                {:__('Total view')}
+                                <span>{$totaladdon}</span>
+                                {:__('Total addon')}
                             </div>
                         </div>
                     </div>
                     <div class="col-sm-3 col-xs-6">
                         <div class="sm-st clearfix">
-                            <span class="sm-st-icon st-blue"><i class="fa fa-shopping-bag"></i></span>
+                            <span class="sm-st-icon st-blue"><i class="fa fa-leaf"></i></span>
                             <div class="sm-st-info">
-                                <span>{$totalorder}</span>
-                                {:__('Total order')}
+                                <span>{$totalcategory}</span>
+                                {:__('Total category')}
                             </div>
                         </div>
                     </div>
                     <div class="col-sm-3 col-xs-6">
                         <div class="sm-st clearfix">
-                            <span class="sm-st-icon st-green"><i class="fa fa-cny"></i></span>
+                            <span class="sm-st-icon st-green"><i class="fa fa-user"></i></span>
                             <div class="sm-st-info">
-                                <span>{$totalorderamount}</span>
-                                {:__('Total order amount')}
+                                <span>{$totaladdon}</span>
+                                {:__('Total admin')}
                             </div>
                         </div>
                     </div>
@@ -229,7 +228,7 @@
                                         </div>
                                     </div>
                                     <div class="col-xs-6 stat-col">
-                                        <div class="stat-icon"><i class="fa fa-shopping-cart"></i></div>
+                                        <div class="stat-icon"><i class="fa fa-vcard"></i></div>
                                         <div class="stat">
                                             <div class="value"> {$todayuserlogin}</div>
                                             <div class="name"> {:__('Today user login')}</div>
@@ -239,40 +238,40 @@
                                         </div>
                                     </div>
                                     <div class="col-xs-6  stat-col">
-                                        <div class="stat-icon"><i class="fa fa-line-chart"></i></div>
+                                        <div class="stat-icon"><i class="fa fa-calendar"></i></div>
                                         <div class="stat">
-                                            <div class="value"> {$todayorder}</div>
-                                            <div class="name"> {:__('Today order')}</div>
+                                            <div class="value"> {$threednu}</div>
+                                            <div class="name"> {:__('Three dnu')}</div>
                                         </div>
                                         <div class="progress">
                                             <div class="progress-bar progress-bar-success" style="width: 25%"></div>
                                         </div>
                                     </div>
-                                    <div class="col-xs-6  stat-col">
-                                        <div class="stat-icon"><i class="fa fa-users"></i></div>
+                                    <div class="col-xs-6 stat-col">
+                                        <div class="stat-icon"><i class="fa fa-calendar-plus-o"></i></div>
                                         <div class="stat">
-                                            <div class="value"> {$unsettleorder}</div>
-                                            <div class="name"> {:__('Unsettle order')}</div>
+                                            <div class="value"> {$sevendnu}</div>
+                                            <div class="name"> {:__('Seven dnu')}</div>
                                         </div>
                                         <div class="progress">
                                             <div class="progress-bar progress-bar-success" style="width: 25%"></div>
                                         </div>
                                     </div>
                                     <div class="col-xs-6  stat-col">
-                                        <div class="stat-icon"><i class="fa fa-list-alt"></i></div>
+                                        <div class="stat-icon"><i class="fa fa-user-circle"></i></div>
                                         <div class="stat">
-                                            <div class="value"> {$sevendnu}</div>
-                                            <div class="name"> {:__('Seven dnu')}</div>
+                                            <div class="value"> {$sevendau}</div>
+                                            <div class="name"> {:__('Seven dau')}</div>
                                         </div>
                                         <div class="progress">
                                             <div class="progress-bar progress-bar-success" style="width: 25%"></div>
                                         </div>
                                     </div>
-                                    <div class="col-xs-6 stat-col">
-                                        <div class="stat-icon"><i class="fa fa-dollar"></i></div>
+                                    <div class="col-xs-6  stat-col">
+                                        <div class="stat-icon"><i class="fa fa-user-circle-o"></i></div>
                                         <div class="stat">
-                                            <div class="value"> {$sevendau}</div>
-                                            <div class="name"> {:__('Seven dau')}</div>
+                                            <div class="value"> {$thirtydau}</div>
+                                            <div class="name"> {:__('Thirty dau')}</div>
                                         </div>
                                         <div class="progress">
                                             <div class="progress-bar progress-bar-success" style="width: 25%"></div>
@@ -296,9 +295,14 @@
                                     <h5>{:__('Category count')}</h5>
                                 </div>
                                 <div class="panel-content">
-                                    <h1 class="no-margins">1234</h1>
-                                    <div class="stat-percent font-bold text-gray"><i class="fa fa-commenting"></i> 1234</div>
-                                    <small>{:__('Category count tips')}</small>
+                                    <div class="row">
+                                        <div class="col-md-12">
+                                            <h1 class="no-margins">{$totalcategory}</h1>
+                                            <div class="font-bold"><i class="fa fa-magic"></i>
+                                                <small>{:__('Category count tips')}</small>
+                                            </div>
+                                        </div>
+                                    </div>
                                 </div>
                             </div>
                         </div>
@@ -308,12 +312,23 @@
                             <div class="panel-body">
                                 <div class="ibox-title">
                                     <span class="label label-primary pull-right">{:__('Real time')}</span>
-                                    <h5>{:__('Attachment count')}</h5>
+                                    <h5>{:__('Database count')}</h5>
                                 </div>
                                 <div class="ibox-content">
-                                    <h1 class="no-margins">1043</h1>
-                                    <div class="stat-percent font-bold text-gray"><i class="fa fa-modx"></i> 2592</div>
-                                    <small>{:__('Attachment count tips')}</small>
+                                    <div class="row">
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins">{$dbtablenums}</h1>
+                                            <div class="font-bold"><i class="fa fa-database"></i>
+                                                <small>{:__('Database table nums')}</small>
+                                            </div>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <h1 class="no-margins">{$dbsize|format_bytes=###,'',0}</h1>
+                                            <div class="font-bold"><i class="fa fa-filter"></i>
+                                                <small>{:__('Database size')}</small>
+                                            </div>
+                                        </div>
+                                    </div>
                                 </div>
                             </div>
                         </div>
@@ -324,21 +339,21 @@
                             <div class="panel-body">
                                 <div class="ibox-title">
                                     <span class="label label-primary pull-right">{:__('Real time')}</span>
-                                    <h5>{:__('Article count')}</h5>
+                                    <h5>{:__('Attachment count')}</h5>
                                 </div>
                                 <div class="ibox-content">
 
                                     <div class="row">
                                         <div class="col-md-6">
-                                            <h1 class="no-margins">1234</h1>
-                                            <div class="font-bold"><i class="fa fa-commenting"></i>
-                                                <small>{:__('Comment count')}</small>
+                                            <h1 class="no-margins">{$attachmentnums}</h1>
+                                            <div class="font-bold"><i class="fa fa-files-o"></i>
+                                                <small>{:__('Attachment nums')}</small>
                                             </div>
                                         </div>
                                         <div class="col-md-6">
-                                            <h1 class="no-margins">6754</h1>
-                                            <div class="font-bold"><i class="fa fa-heart"></i>
-                                                <small>{:__('Like count')}</small>
+                                            <h1 class="no-margins">{$attachmentsize|format_bytes=###,'',0}</h1>
+                                            <div class="font-bold"><i class="fa fa-filter"></i>
+                                                <small>{:__('Attachment size')}</small>
                                             </div>
                                         </div>
                                     </div>
@@ -351,21 +366,21 @@
                             <div class="panel-body">
                                 <div class="ibox-title">
                                     <span class="label label-primary pull-right">{:__('Real time')}</span>
-                                    <h5>{:__('News count')}</h5>
+                                    <h5>{:__('Picture count')}</h5>
                                 </div>
                                 <div class="ibox-content">
 
                                     <div class="row">
                                         <div class="col-md-6">
-                                            <h1 class="no-margins">5302</h1>
-                                            <div class="font-bold"><i class="fa fa-commenting"></i>
-                                                <small>{:__('Comment count')}</small>
+                                            <h1 class="no-margins">{$picturenums}</h1>
+                                            <div class="font-bold"><i class="fa fa-picture-o"></i>
+                                                <small>{:__('Picture nums')}</small>
                                             </div>
                                         </div>
                                         <div class="col-md-6">
-                                            <h1 class="no-margins">8205</h1>
-                                            <div class="font-bold"><i class="fa fa-user"></i>
-                                                <small>{:__('Like count')}</small>
+                                            <h1 class="no-margins">{$picturesize|format_bytes=###,'',0}</h1>
+                                            <div class="font-bold"><i class="fa fa-filter"></i>
+                                                <small>{:__('Picture size')}</small>
                                             </div>
                                         </div>
                                     </div>
@@ -385,12 +400,3 @@
         </div>
     </div>
 </div>
-<!--@formatter:off-->
-<script>
-    var Orderdata = {
-        column: {:json_encode(array_keys($paylist))},
-        paydata: {:json_encode(array_values($paylist))},
-        createdata: {:json_encode(array_values($createlist))},
-    };
-</script>
-<!--@formatter:on-->

+ 3 - 2
application/common.php

@@ -33,15 +33,16 @@ if (!function_exists('format_bytes')) {
      * 将字节转换为可读文本
      * @param int    $size      大小
      * @param string $delimiter 分隔符
+     * @param int    $precision 小数位数
      * @return string
      */
-    function format_bytes($size, $delimiter = '')
+    function format_bytes($size, $delimiter = '', $precision = 2)
     {
         $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
         for ($i = 0; $size >= 1024 && $i < 6; $i++) {
             $size /= 1024;
         }
-        return round($size, 2) . $delimiter . $units[$i];
+        return round($size, $precision) . $delimiter . $units[$i];
     }
 }
 

+ 13 - 47
public/assets/js/backend/dashboard.js

@@ -11,11 +11,19 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
                     text: '',
                     subtext: ''
                 },
+                color: [
+                    "#18d1b1",
+                    "#3fb1e3",
+                    "#626c91",
+                    "#a0a7e6",
+                    "#c4ebad",
+                    "#96dee8"
+                ],
                 tooltip: {
                     trigger: 'axis'
                 },
                 legend: {
-                    data: [__('Sales'), __('Orders')]
+                    data: [__('Register user')]
                 },
                 toolbox: {
                     show: false,
@@ -27,7 +35,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
                 xAxis: {
                     type: 'category',
                     boundaryGap: false,
-                    data: Orderdata.column
+                    data: Config.column
                 },
                 yAxis: {},
                 grid: [{
@@ -37,7 +45,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
                     bottom: 30
                 }],
                 series: [{
-                    name: __('Sales'),
+                    name: __('Register user'),
                     type: 'line',
                     smooth: true,
                     areaStyle: {
@@ -48,55 +56,13 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
                             width: 1.5
                         }
                     },
-                    data: Orderdata.paydata
-                },
-                    {
-                        name: __('Orders'),
-                        type: 'line',
-                        smooth: true,
-                        areaStyle: {
-                            normal: {}
-                        },
-                        lineStyle: {
-                            normal: {
-                                width: 1.5
-                            }
-                        },
-                        data: Orderdata.createdata
-                    }]
+                    data: Config.userdata
+                }]
             };
 
             // 使用刚指定的配置项和数据显示图表。
             myChart.setOption(option);
 
-            //动态添加数据,可以通过Ajax获取数据然后填充
-            setInterval(function () {
-                Orderdata.column.push((new Date()).toLocaleTimeString().replace(/^\D*/, ''));
-                var amount = Math.floor(Math.random() * 200) + 20;
-                Orderdata.createdata.push(amount);
-                Orderdata.paydata.push(Math.floor(Math.random() * amount) + 1);
-
-                //按自己需求可以取消这个限制
-                if (Orderdata.column.length >= 20) {
-                    //移除最开始的一条数据
-                    Orderdata.column.shift();
-                    Orderdata.paydata.shift();
-                    Orderdata.createdata.shift();
-                }
-                myChart.setOption({
-                    xAxis: {
-                        data: Orderdata.column
-                    },
-                    series: [{
-                        name: __('Sales'),
-                        data: Orderdata.paydata
-                    },
-                        {
-                            name: __('Orders'),
-                            data: Orderdata.createdata
-                        }]
-                });
-            }, 2000);
             $(window).resize(function () {
                 myChart.resize();
             });