mirror of https://gitee.com/karson/fastadmin.git
优化控制台数据显示
parent
ab89d2d506
commit
e2772b164b
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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' => '环境信息',
|
||||
|
|
|
|||
|
|
@ -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,27 +238,17 @@
|
|||
</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="stat">
|
||||
<div class="value"> {$unsettleorder}</div>
|
||||
<div class="name"> {:__('Unsettle order')}</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="col-xs-6 stat-col">
|
||||
<div class="stat-icon"><i class="fa fa-calendar-plus-o"></i></div>
|
||||
<div class="stat">
|
||||
<div class="value"> {$sevendnu}</div>
|
||||
<div class="name"> {:__('Seven dnu')}</div>
|
||||
|
|
@ -268,8 +257,8 @@
|
|||
<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"></i></div>
|
||||
<div class="stat">
|
||||
<div class="value"> {$sevendau}</div>
|
||||
<div class="name"> {:__('Seven dau')}</div>
|
||||
|
|
@ -278,6 +267,16 @@
|
|||
<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-user-circle-o"></i></div>
|
||||
<div class="stat">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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-->
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue