10 changed files with 680 additions and 162 deletions
-
20app/AdminAgent/Controllers/HomeController.php
-
13app/AdminAgent/Metrics/Examples/Dashboard.php
-
152app/AdminAgent/Metrics/Examples/NewDevices.php
-
189app/AdminAgent/Metrics/Examples/NewUsers.php
-
160app/AdminAgent/Metrics/Examples/OrderExamples.php
-
179app/AdminAgent/Metrics/Examples/SalesExamples.php
-
78app/Common/DataTime.php
-
6app/Http/Controllers/Api/UserController.php
-
2config/database.php
-
43resources/views/admin/pages/agent-home.blade.php
@ -0,0 +1,13 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\AdminAgent\Metrics\Examples; |
||||
|
|
||||
|
use Dcat\Admin\Admin; |
||||
|
|
||||
|
class Dashboard |
||||
|
{ |
||||
|
public static function title() |
||||
|
{ |
||||
|
return view('admin::pages.agent-home', ['admin' => Admin::user()]); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,160 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\AdminAgent\Metrics\Examples; |
||||
|
|
||||
|
use App\Models\Order; |
||||
|
use Carbon\Carbon; |
||||
|
use Dcat\Admin\Admin; |
||||
|
use Dcat\Admin\Widgets\Metrics\RadialBar; |
||||
|
use Illuminate\Http\Request; |
||||
|
use Illuminate\Support\Arr; |
||||
|
use Illuminate\Support\Facades\DB; |
||||
|
|
||||
|
class OrderExamples extends RadialBar |
||||
|
{ |
||||
|
/** |
||||
|
* 初始化卡片内容 |
||||
|
*/ |
||||
|
protected function init() |
||||
|
{ |
||||
|
parent::init(); |
||||
|
|
||||
|
$this->title('订单统计'); |
||||
|
$this->height(400); |
||||
|
$this->chartHeight(300); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理请求 |
||||
|
* |
||||
|
* @param Request $request |
||||
|
* |
||||
|
* @return mixed|void |
||||
|
*/ |
||||
|
public function handle(Request $request) |
||||
|
{ |
||||
|
//总订单数
|
||||
|
$count = Order::query()->where('agent_id',Admin::user()->id)->count(); |
||||
|
// 卡片内容
|
||||
|
$this->withContent($count); |
||||
|
// 卡片底部
|
||||
|
//今日订单
|
||||
|
$countToday = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::today())->count(); |
||||
|
$countYesterday = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::yesterday())->count(); |
||||
|
$price = Order::query()->where('agent_id',Admin::user()->id)->whereDate('created_at',Carbon::today())->sum('price'); |
||||
|
$this->withFooter($countToday, $countYesterday, $price); |
||||
|
$order = Order::query() |
||||
|
->select('*') |
||||
|
->addSelect(DB::raw("COUNT(id) as count_id,CONCAT(YEAR(created_at),'-',MONTH(created_at),'-',DAY(created_at)) AS statistics_time")) |
||||
|
->where('agent_id',Admin::user()->id) |
||||
|
->limit(30) |
||||
|
->orderBy('created_at', 'asc') |
||||
|
->groupBy('statistics_time') |
||||
|
->get() |
||||
|
->toArray(); |
||||
|
|
||||
|
$categories = Arr::pluck($order,'statistics_time'); |
||||
|
// 图表数据
|
||||
|
$data = Arr::pluck($order,'count_id'); |
||||
|
$this->withChart($data,$categories); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 设置图表数据. |
||||
|
* |
||||
|
* @param int $data |
||||
|
* |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function withChart(array $data,array $categories) |
||||
|
{ |
||||
|
return $this->chart([ |
||||
|
'series' => [ |
||||
|
[ |
||||
|
'name' => '订单量', |
||||
|
'data' => $data |
||||
|
] |
||||
|
], |
||||
|
'chart' => [ |
||||
|
'type' => 'line', |
||||
|
'zoom' => [ |
||||
|
'enabled' => false |
||||
|
], |
||||
|
'toolbar' => [ |
||||
|
'show' => false |
||||
|
], |
||||
|
], |
||||
|
'colors' => [ |
||||
|
Admin::color()->green(), |
||||
|
], |
||||
|
'dataLabels' => [ |
||||
|
'enabled' => false |
||||
|
], |
||||
|
'stroke' => [ |
||||
|
'curve' => 'smooth' |
||||
|
], |
||||
|
'legend' => [ |
||||
|
'position' =>'top', |
||||
|
//'horizontalAlign' => 'right'
|
||||
|
], |
||||
|
'fill' => [ |
||||
|
'opacity' => 1, |
||||
|
'type' => 'solid', |
||||
|
], |
||||
|
'xaxis' => [ |
||||
|
'categories' => $categories, |
||||
|
] |
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 卡片内容 |
||||
|
* |
||||
|
* @param string $content |
||||
|
* |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function withContent($content) |
||||
|
{ |
||||
|
return $this->content( |
||||
|
<<<HTML |
||||
|
<div class="d-flex flex-column flex-wrap text-left p-1"> |
||||
|
<h1 class="font-lg-2 mt-2 mb-0">{$content}</h1> |
||||
|
<small>总订单数</small> |
||||
|
</div> |
||||
|
HTML |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 卡片底部内容. |
||||
|
* |
||||
|
* @param string $new |
||||
|
* @param string $open |
||||
|
* @param string $response |
||||
|
* |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function withFooter($new, $open, $response) |
||||
|
{ |
||||
|
return $this->footer( |
||||
|
<<<HTML |
||||
|
<div class="d-flex justify-content-between p-1" style="padding-top: 0!important;"> |
||||
|
<div class="text-center"> |
||||
|
<p>今日订单</p> |
||||
|
<span class="font-lg-1">{$new}</span> |
||||
|
</div> |
||||
|
<div class="text-center"> |
||||
|
<p>昨日订单</p> |
||||
|
<span class="font-lg-1">{$open}</span> |
||||
|
</div> |
||||
|
<div class="text-center"> |
||||
|
<p>今日成交(元)</p> |
||||
|
<span class="font-lg-1">{$response}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
HTML |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,179 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\AdminAgent\Metrics\Examples; |
||||
|
|
||||
|
use App\Common\OrderStatus; |
||||
|
use App\Models\Order; |
||||
|
use Dcat\Admin\Admin; |
||||
|
use Dcat\Admin\Widgets\Metrics\Bar; |
||||
|
|
||||
|
use Illuminate\Support\Facades\DB; |
||||
|
|
||||
|
class SalesExamples extends Bar |
||||
|
{ |
||||
|
protected $labels = []; |
||||
|
protected $colors; |
||||
|
|
||||
|
/** |
||||
|
* 初始化卡片内容 |
||||
|
*/ |
||||
|
protected function init() |
||||
|
{ |
||||
|
parent::init(); |
||||
|
|
||||
|
$color = Admin::color(); |
||||
|
$this->colors = [$color->green(), $color->red(), $color->yellow(), $color->orange1(), $color->dark90(), $color->dark70(), $color->custom()]; |
||||
|
$this->contentWidth(3, 9); |
||||
|
$this->title('销售排行'); |
||||
|
//$this->chartPullRight = false;
|
||||
|
//$this->subTitle('Last 30 days');
|
||||
|
$this->height = 280; |
||||
|
$this->chartHeight = 250; |
||||
|
// 设置图表颜色
|
||||
|
$this->chartColors($this->colors); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 渲染模板 |
||||
|
* |
||||
|
* @return string |
||||
|
*/ |
||||
|
public function render() |
||||
|
{ |
||||
|
$this->fill(); |
||||
|
|
||||
|
return parent::render(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入数据. |
||||
|
* |
||||
|
* @return void |
||||
|
*/ |
||||
|
public function fill() |
||||
|
{ |
||||
|
$warehouse = Order::query() |
||||
|
->with('agentProduct') |
||||
|
->select('*') |
||||
|
->addSelect(DB::raw('count(id) as count_id')) |
||||
|
->where([ |
||||
|
//'status' => OrderStatus::SUCCESS,
|
||||
|
'agent_id' => Admin::user()->id, |
||||
|
]) |
||||
|
->orderByDesc('count_id') |
||||
|
->groupBy('agent_product_id') |
||||
|
->limit(5) |
||||
|
->get(); |
||||
|
//$warehouse = [];
|
||||
|
$data = $categories = []; |
||||
|
foreach ($warehouse as $v) { |
||||
|
array_push($this->labels, $v->title); |
||||
|
array_push($data, $v->count_id); |
||||
|
$categories[] = [$v->title]; |
||||
|
} |
||||
|
|
||||
|
$this->withChart($data, $categories); |
||||
|
//$this->chartLabels($this->labels);
|
||||
|
|
||||
|
$count = Order::query() |
||||
|
->where([ |
||||
|
//'status' => OrderStatus::SUCCESS,
|
||||
|
'agent_id' => Admin::user()->id, |
||||
|
]) |
||||
|
->count(); |
||||
|
//$count = 0;
|
||||
|
if ($count > 0) { |
||||
|
array_unshift($data, $count); |
||||
|
array_unshift($this->labels, '总销售量'); |
||||
|
$color = Admin::color(); |
||||
|
array_unshift($this->colors, $color->primary()); |
||||
|
} |
||||
|
$this->withContent($data); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 设置图表数据. |
||||
|
* |
||||
|
* @param array $data |
||||
|
* |
||||
|
* @return $this |
||||
|
*/ |
||||
|
public function withChart($data, $categories) |
||||
|
{ |
||||
|
return $this->chart([ |
||||
|
|
||||
|
'series' => [[ |
||||
|
'name' => '出库数量', |
||||
|
'data' => $data |
||||
|
]], |
||||
|
'chart' => [ |
||||
|
//'width' => '180%',
|
||||
|
'type' => 'bar', |
||||
|
'events' => [ |
||||
|
], |
||||
|
'toolbar' => ['show' => false], |
||||
|
], |
||||
|
'colors' => $this->colors, |
||||
|
'plotOptions' => [ |
||||
|
'bar' => [ |
||||
|
//'columnWidth' => '45%',
|
||||
|
'distributed' => true, |
||||
|
] |
||||
|
], |
||||
|
'dataLabels' => [ |
||||
|
'enabled' => false |
||||
|
], |
||||
|
'legend' => [ |
||||
|
'show' => false |
||||
|
], |
||||
|
'xaxis' => [ |
||||
|
'categories' => |
||||
|
$categories |
||||
|
, |
||||
|
'labels' => [ |
||||
|
'show' => false, |
||||
|
'style' => [ |
||||
|
'colors' => $this->colors, |
||||
|
'fontSize' => '12px' |
||||
|
] |
||||
|
], |
||||
|
], |
||||
|
'yaxis' => [ |
||||
|
'show' => false |
||||
|
], |
||||
|
'tooltip' => [ |
||||
|
'x' => ['show' => true], |
||||
|
], |
||||
|
|
||||
|
]); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 设置卡片头部内容. |
||||
|
* |
||||
|
* @param mixed $desktop |
||||
|
* @param mixed $mobile |
||||
|
* |
||||
|
* @return $this |
||||
|
*/ |
||||
|
protected function withContent($data) |
||||
|
{ |
||||
|
$content = ''; |
||||
|
foreach ($data as $k => $v) { |
||||
|
$content .= ' |
||||
|
<div class="d-flex pl-1 mt-2"> |
||||
|
<div style="width:100%;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;"> |
||||
|
<i class="fa fa-circle" style="color:' . $this->colors[$k] . '"></i> ' . $this->labels[$k] . ' |
||||
|
<div style="display:inline-block">' . $v . '</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
'; |
||||
|
} |
||||
|
return $this->content( |
||||
|
<<<HTML |
||||
|
$content |
||||
|
HTML |
||||
|
); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,78 @@ |
|||||
|
<?php |
||||
|
|
||||
|
|
||||
|
namespace App\Common; |
||||
|
|
||||
|
|
||||
|
class DataTime |
||||
|
{ |
||||
|
/** |
||||
|
* 处理时间为空时的时间显示格式 |
||||
|
* @param $time |
||||
|
* @return string |
||||
|
*/ |
||||
|
public static function format($time) |
||||
|
{ |
||||
|
if (is_numeric($time)&&$time>0) { |
||||
|
return date('Y-m-d H:i', $time); |
||||
|
} elseif (empty($time) || $time->format('Y-m-d') == '1970-01-01') { |
||||
|
return '-'; |
||||
|
} |
||||
|
return $time->format('Y-m-d H:i'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 查询时间范围 |
||||
|
* @param $option |
||||
|
* @return array |
||||
|
*/ |
||||
|
public static function beginAndEnd($option) |
||||
|
{ |
||||
|
$t = time(); |
||||
|
switch ($option) { |
||||
|
case 'today': |
||||
|
$beginTime = date('Y-m-d H:i:s', mktime(0, 0, 0, date("m", $t), date("d", $t), date("Y", $t))); |
||||
|
$endTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1); |
||||
|
break; |
||||
|
case 'yesterday': |
||||
|
$beginTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'))); |
||||
|
$endTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1); |
||||
|
break; |
||||
|
case '7day': |
||||
|
$beginTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') - 7, date('Y'))); |
||||
|
$endTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1); |
||||
|
break; |
||||
|
case 'week': |
||||
|
$timestamp = mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y')); |
||||
|
$beginTime = date('Y-m-d H:i:s', $timestamp); |
||||
|
|
||||
|
//本周结束日期
|
||||
|
$timestamp = mktime(23, 59, 59, date('m'), date('d') - date('w') + 7, date('Y')); |
||||
|
$endTime= date('Y-m-d H:i:s',$timestamp); |
||||
|
break; |
||||
|
case 'last_week': |
||||
|
$beginTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 - 7, date("Y"))); |
||||
|
$endTime = date('Y-m-d H:i:s',mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 - 7, date("Y"))); |
||||
|
break; |
||||
|
case 'month': |
||||
|
$beginTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m'), 1, date('Y'))); |
||||
|
$endTime = date('Y-m-d H:i:s',mktime(23, 59, 59, date('m'), date('t'), date('Y'))); |
||||
|
break; |
||||
|
case 'last_month': |
||||
|
$beginTime = date('Y-m-d H:i:s',mktime(0, 0, 0, date('m') - 1, 1, date('Y'))); |
||||
|
$endTime = date('Y-m-d H:i:s',strtotime(date("Y-m-d H:i:s", mktime(23, 59, 59, date("m"), 0, date("Y"))))); |
||||
|
break; |
||||
|
default: |
||||
|
$searchTime = request()->input('created_at'); |
||||
|
if ($searchTime){ |
||||
|
$beginTime = date('Y-m-d H:i:s',strtotime($searchTime['start'])); |
||||
|
$endTime = date('Y-m-d H:i:s',strtotime($searchTime['end'])); |
||||
|
}else{ |
||||
|
$beginTime = 0; |
||||
|
$endTime = 999999999999; |
||||
|
} |
||||
|
break; |
||||
|
} |
||||
|
return [$beginTime,$endTime]; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
<style> |
||||
|
.dashboard-title .links { |
||||
|
text-align: center; |
||||
|
margin-bottom: 2.5rem; |
||||
|
} |
||||
|
.dashboard-title .links > a { |
||||
|
padding: 0 25px; |
||||
|
font-size: 12px; |
||||
|
font-weight: 600; |
||||
|
letter-spacing: .1rem; |
||||
|
text-decoration: none; |
||||
|
text-transform: uppercase; |
||||
|
color: #fff;
|
||||
|
} |
||||
|
.dashboard-title h1 { |
||||
|
font-weight: 200; |
||||
|
font-size: 2.5rem; |
||||
|
} |
||||
|
.dashboard-title .avatar { |
||||
|
background: #fff;
|
||||
|
border: 2px solid #fff;
|
||||
|
width: 70px; |
||||
|
height: 70px; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
<div class="dashboard-title card bg-primary"> |
||||
|
<div class="card-body"> |
||||
|
<div class="text-center "> |
||||
|
<img class="avatar img-circle shadow mt-1" src="{{config('filesystems.disks.oss.cdnDomain').'/'.$admin->avatar}}"> |
||||
|
|
||||
|
<div class="text-center mb-1"> |
||||
|
<h1 class="mb-3 mt-2 text-white">{{$admin->name}}</h1> |
||||
|
<div class="links"> |
||||
|
<a href="{{ admin_url('/auth/users') }}">用户管理</a> |
||||
|
<a href="{{ admin_url('/order/list') }}" id="doc-link">订单管理</a> |
||||
|
<a href="{{ admin_url('/advertising/list') }}" id="demo-link">广告管理</a> |
||||
|
<a href="{{ admin_url('/product/list') }}" id="demo-link">产品管理</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue