发布测试版 2.5.0
This commit is contained in:
@@ -8,6 +8,7 @@ use App\Support\Pinyin;
|
||||
|
||||
use Gdoo\User\Models\User;
|
||||
use Gdoo\Index\Models\Notification;
|
||||
use Cron\CronExpression;
|
||||
|
||||
class ApiController extends Controller
|
||||
{
|
||||
@@ -36,7 +37,7 @@ class ApiController extends Controller
|
||||
$rows = DB::table('cron')->where('status', 1)->get();
|
||||
if ($rows) {
|
||||
foreach ($rows as $row) {
|
||||
$cron = \Cron\CronExpression::factory($row['expression']);
|
||||
$cron = new \Cron\CronExpression($row['expression']);
|
||||
|
||||
// 由于定时任务无法定义秒这里特殊处理一下
|
||||
if (strtotime($row['next_run']) <= time()) {
|
||||
|
||||
@@ -15,7 +15,7 @@ class Controller extends BaseController
|
||||
/**
|
||||
* @var 程序版本
|
||||
*/
|
||||
public $version = '2.4.0';
|
||||
public $version = '2.5.0';
|
||||
|
||||
/**
|
||||
* @var 配置参数
|
||||
|
||||
@@ -29,6 +29,7 @@ class DashboardController extends DefaultController
|
||||
$widgets->transform(function ($row) use($user_widgets) {
|
||||
$user_widget = $user_widgets[$row['id']];
|
||||
if (not_empty($user_widget)) {
|
||||
$row['id'] = $user_widget['id'];
|
||||
$row['status'] = $user_widget['status'];
|
||||
$row['grid'] = $user_widget['grid'];
|
||||
$row['sort'] = $user_widget['sort'];
|
||||
@@ -41,10 +42,11 @@ class DashboardController extends DefaultController
|
||||
if ($user_widget['icon']) {
|
||||
$row['icon'] = $user_widget['icon'];
|
||||
}
|
||||
$row['params'] = json_decode($user_widget['params'], true);
|
||||
} else {
|
||||
$row['status'] = $row['default'] == 1;
|
||||
}
|
||||
$row['params'] = json_decode($user_widget['params'], true);
|
||||
$row['key'] = str_replace(['/', '?', '='], ['_', '_', '_'], $row['url']);
|
||||
return $row;
|
||||
});
|
||||
$widgets = $widgets->sortBy('sort')->values();
|
||||
@@ -64,6 +66,7 @@ class DashboardController extends DefaultController
|
||||
$infos->transform(function ($row) use($user_infos) {
|
||||
$user_info = $user_infos[$row['id']];
|
||||
if (not_empty($user_info)) {
|
||||
$row['id'] = $user_info['id'];
|
||||
$row['status'] = $user_info['status'];
|
||||
$row['sort'] = $user_info['sort'];
|
||||
if ($user_info['name']) {
|
||||
@@ -75,10 +78,13 @@ class DashboardController extends DefaultController
|
||||
if ($user_info['icon']) {
|
||||
$row['icon'] = $user_info['icon'];
|
||||
}
|
||||
$row['params'] = json_decode($user_info['params'], true);
|
||||
$params = $user_info['params'];
|
||||
} else {
|
||||
$row['status'] = $row['default'] == 1;
|
||||
$params = $row['params'];
|
||||
}
|
||||
$row['params'] = json_decode($params, true);
|
||||
$row['key'] = str_replace(['/', '?', '='], ['_', '_', '_'], $row['more_url']);
|
||||
return $row;
|
||||
});
|
||||
$infos = $infos->sortBy('sort')->values();
|
||||
@@ -99,14 +105,57 @@ class DashboardController extends DefaultController
|
||||
return $row;
|
||||
});
|
||||
|
||||
$dates = [
|
||||
'day' => '今天',
|
||||
'day2' => '昨天',
|
||||
'week' => '本周',
|
||||
'week2' => '上周',
|
||||
'month' => '本月',
|
||||
'month2' => '上月',
|
||||
'season' => '本季度',
|
||||
'season2' => '上季度',
|
||||
'year' => '本年',
|
||||
'year2' => '去年',
|
||||
];
|
||||
$dates2 = [
|
||||
'day' => '昨天',
|
||||
'day2' => '前天',
|
||||
'week' => '上周',
|
||||
'week2' => '前周',
|
||||
'month' => '上月',
|
||||
'month2' => '前月',
|
||||
'season' => '上季度',
|
||||
'season2' => '前季度',
|
||||
'year' => '去年',
|
||||
'year2' => '前年',
|
||||
];
|
||||
|
||||
$dates3 = [
|
||||
'last_day7' => '最近7天',
|
||||
'last_day28' => '最近28天',
|
||||
'last_month' => '上个月',
|
||||
'last_year' => '去年',
|
||||
];
|
||||
|
||||
$cards = [];
|
||||
$grids = ['8', '4'];
|
||||
|
||||
return $this->display([
|
||||
$vars = [
|
||||
'dates' => $dates,
|
||||
'dates2' => $dates2,
|
||||
'dates3' => $dates3,
|
||||
'cards' => $cards,
|
||||
'widgets' => $widgets,
|
||||
'infos' => $infos,
|
||||
'grids' => $grids,
|
||||
'quicks' => $quicks,
|
||||
]);
|
||||
];
|
||||
|
||||
if (Request::method() == 'POST') {
|
||||
return $this->json($vars, true);
|
||||
}
|
||||
|
||||
return $this->display($vars);
|
||||
}
|
||||
|
||||
// 仪表板设置
|
||||
@@ -120,6 +169,9 @@ class DashboardController extends DefaultController
|
||||
$sort = 1;
|
||||
foreach($widgets as $widget) {
|
||||
$widget['sort'] = $sort;
|
||||
if ($widget['permission'] && $widget['date']) {
|
||||
$widget['params'] = json_encode(['permission' => $widget['permission'], 'date' => $widget['date']], JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
$sort ++;
|
||||
$model = UserWidget::firstOrNew(['type' => 1, 'node_id' => $widget['id'], 'user_id' => $auth['id']]);
|
||||
$model->fill($widget);
|
||||
@@ -185,6 +237,8 @@ class DashboardController extends DefaultController
|
||||
if ($user_widget['icon']) {
|
||||
$row['icon'] = $user_widget['icon'];
|
||||
}
|
||||
} else {
|
||||
$row['status'] = 0;
|
||||
}
|
||||
return $row;
|
||||
});
|
||||
@@ -219,6 +273,8 @@ class DashboardController extends DefaultController
|
||||
$row['icon'] = $user_info['icon'];
|
||||
}
|
||||
$row['params'] = json_decode($user_info['params'], true);
|
||||
} else {
|
||||
$row['status'] = 0;
|
||||
}
|
||||
return $row;
|
||||
});
|
||||
@@ -261,6 +317,41 @@ class DashboardController extends DefaultController
|
||||
// 设置单个组件
|
||||
public function settingInfo()
|
||||
{
|
||||
$auth = auth()->user();
|
||||
|
||||
$id = Request::input('id');
|
||||
|
||||
$info = Widget::where('id', $id)
|
||||
->selectRaw('*,name as info_name')
|
||||
->first();
|
||||
|
||||
$user_info = UserWidget::where('user_id', $auth['id'])
|
||||
->where('node_id', $info['id'])
|
||||
->first();
|
||||
|
||||
$params = json_decode($info['params'], true);
|
||||
$user_params = json_decode($user_info['params'], true);
|
||||
|
||||
$params['date'] = not_empty($params['date']) ? $params['date'] : 'month';
|
||||
$params['permission'] = not_empty($params['permission']) ? $params['permission'] : 'dept2';
|
||||
|
||||
if ($user_info['name']) {
|
||||
$info['name'] = $user_info['name'];
|
||||
}
|
||||
if ($user_info['icon']) {
|
||||
$info['icon'] = $user_info['icon'];
|
||||
}
|
||||
if ($user_info['color']) {
|
||||
$info['color'] = $user_info['color'];
|
||||
}
|
||||
if ($user_params['date']) {
|
||||
$params['date'] = $user_params['date'];
|
||||
}
|
||||
if ($user_params['permission']) {
|
||||
$params['permission'] = $user_params['permission'];
|
||||
}
|
||||
$info['params'] = $params;
|
||||
|
||||
// 定义权限
|
||||
$permissions = option('role.access')->pluck('name', 'id');
|
||||
$dates = [
|
||||
@@ -275,49 +366,68 @@ class DashboardController extends DefaultController
|
||||
'year' => '本年',
|
||||
'year2' => '去年',
|
||||
];
|
||||
|
||||
$info_id = Request::input('info_id');
|
||||
$row = UserWidget::where('id', $info_id)->first();
|
||||
$widget = Widget::where('id', $row['node_id'])->first();
|
||||
$params = json_decode($row['params'], true);
|
||||
|
||||
if (empty($params['date'])) {
|
||||
$params['date'] = 'month';
|
||||
}
|
||||
if (empty($params['permission'])) {
|
||||
$params['permission'] = 'dept';
|
||||
}
|
||||
$row['params'] = $params;
|
||||
|
||||
$row['widget_name'] = $widget['name'];
|
||||
|
||||
return $this->render([
|
||||
'permissions' => $permissions,
|
||||
'dates' => $dates,
|
||||
'row' => $row,
|
||||
'info' => $info,
|
||||
]);
|
||||
}
|
||||
|
||||
// 设置单个组件
|
||||
public function settingWidget()
|
||||
{
|
||||
$widget_id = Request::input('widget_id');
|
||||
$row = UserWidget::where('id', $widget_id)->first();
|
||||
$widget = Widget::where('id', $row['node_id'])->first();
|
||||
$params = json_decode($row['params'], true);
|
||||
$auth = auth()->user();
|
||||
|
||||
$id = Request::input('id');
|
||||
|
||||
if (empty($params['date'])) {
|
||||
$params['date'] = 'month';
|
||||
$widget = Widget::where('id', $id)
|
||||
->selectRaw('*,name as widget_name')
|
||||
->first();
|
||||
|
||||
$user_widget = UserWidget::where('user_id', $auth['id'])
|
||||
->where('node_id', $widget['id'])
|
||||
->first();
|
||||
|
||||
$params = json_decode($widget['params'], true);
|
||||
$user_params = json_decode($user_widget['params'], true);
|
||||
|
||||
if ($params['date']) {
|
||||
if ($user_params['date']) {
|
||||
$params['date'] = $user_params['date'];
|
||||
}
|
||||
}
|
||||
if (empty($params['permission'])) {
|
||||
$params['permission'] = 'dept';
|
||||
|
||||
if ($params['permission']) {
|
||||
if ($user_params['permission']) {
|
||||
$params['permission'] = $user_params['permission'];
|
||||
}
|
||||
}
|
||||
$row['params'] = $params;
|
||||
|
||||
$row['widget_name'] = $widget['name'];
|
||||
if ($user_widget['name']) {
|
||||
$info['name'] = $user_widget['name'];
|
||||
}
|
||||
if ($user_widget['icon']) {
|
||||
$widget['icon'] = $user_widget['icon'];
|
||||
}
|
||||
if ($user_widget['color']) {
|
||||
$widget['color'] = $user_widget['color'];
|
||||
}
|
||||
|
||||
$widget['params'] = $params;
|
||||
|
||||
// 定义权限
|
||||
$permissions = option('role.access')->pluck('name', 'id');
|
||||
$dates = [
|
||||
'last_day7' => '最近7天',
|
||||
'last_day28' => '最近28天',
|
||||
'last_month' => '上个月',
|
||||
'last_year' => '去年',
|
||||
];
|
||||
return $this->render([
|
||||
'row' => $row,
|
||||
'permissions' => $permissions,
|
||||
'dates' => $dates,
|
||||
'widget' => $widget,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -62,6 +62,7 @@ class DefaultController extends Controller
|
||||
if (Request::method() == 'POST') {
|
||||
// 检查表单
|
||||
$valid = Form::flowRules($models, $gets);
|
||||
|
||||
if ($valid['rules']) {
|
||||
$v = Validator::make($gets, $valid['rules'], $valid['messages'], $valid['attributes']);
|
||||
if ($v->fails()) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php namespace Gdoo\Index\Controllers;
|
||||
|
||||
use App\Jobs\SendSms;
|
||||
use DB;
|
||||
use URL;
|
||||
use Request;
|
||||
@@ -14,5 +15,7 @@ class DemoController extends Controller
|
||||
|
||||
public function hello()
|
||||
{
|
||||
$abc = SendSms::dispatch([1], '我是测试', '我也是测试');
|
||||
print_r($abc);
|
||||
}
|
||||
}
|
||||
@@ -18,50 +18,34 @@ class InfoService
|
||||
return [$a, $b];
|
||||
}
|
||||
|
||||
public static function getInfo($table)
|
||||
public static function getInfo($table, $field = 'created_at', $type = 'ts')
|
||||
{
|
||||
$auth = auth()->user();
|
||||
$gets = Request::all();
|
||||
|
||||
$dates = [
|
||||
'day' => '昨天',
|
||||
'day2' => '前天',
|
||||
'week' => '上周',
|
||||
'week2' => '前周',
|
||||
'month' => '上月',
|
||||
'month2' => '前月',
|
||||
'quarter' => '上季度',
|
||||
'quarter2' => '前季度',
|
||||
'year' => '去年',
|
||||
'year2' => '前年',
|
||||
];
|
||||
$params = $gets['params'];
|
||||
|
||||
$info = Widget::where('id', $gets['id'])
|
||||
->first();
|
||||
|
||||
$user_info = UserWidget::where('user_id', $auth['id'])
|
||||
->where('node_id', $gets['id'])->first();
|
||||
->where('node_id', $gets['id'])
|
||||
->first();
|
||||
|
||||
if (not_empty($user_info)) {
|
||||
$info['id'] = $user_info['id'];
|
||||
if ($user_info['name']) {
|
||||
$info['name'] = $user_info['name'];
|
||||
}
|
||||
if ($user_info['color']) {
|
||||
$info['color'] = $user_info['color'];
|
||||
}
|
||||
if ($user_info['icon']) {
|
||||
$info['icon'] = $user_info['icon'];
|
||||
}
|
||||
if ($user_info['name']) {
|
||||
$info['name'] = $user_info['name'];
|
||||
}
|
||||
if ($user_info['color']) {
|
||||
$info['color'] = $user_info['color'];
|
||||
}
|
||||
if ($user_info['icon']) {
|
||||
$info['icon'] = $user_info['icon'];
|
||||
}
|
||||
if ($user_info['params']) {
|
||||
$info['params'] = json_decode($user_info['params'], true);
|
||||
}
|
||||
$params = $info['params'];
|
||||
|
||||
$permission = empty($params['permission']) ? 'department' : $params['permission'];
|
||||
$permission = empty($params['permission']) ? 'dept2' : $params['permission'];
|
||||
$date = empty($params['date']) ? 'month' : $params['date'];
|
||||
$params['permission'] = $permission;
|
||||
$params['date'] = $date;
|
||||
$info['params'] = $params;
|
||||
|
||||
switch ($date) {
|
||||
case 'day':
|
||||
@@ -100,53 +84,116 @@ class InfoService
|
||||
// 年
|
||||
$year = date('Y');
|
||||
$year2 = $year - 1;
|
||||
$year3 = $year - 2;
|
||||
$year3 = $year - 2;
|
||||
break;
|
||||
}
|
||||
|
||||
$sql = $sql2 = '';
|
||||
$key = $table.'.'.$field;
|
||||
switch ($date) {
|
||||
case 'day':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')."='$day'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')."='$day2'";
|
||||
$sql = sql_year_month_day($key, $type)." = '$day'";
|
||||
$sql2 = sql_year_month_day($key, $type)." = '$day2'";
|
||||
break;
|
||||
case 'day2':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')."='$day2'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')."='$day3'";
|
||||
$sql = sql_year_month_day($key, $type)." = '$day2'";
|
||||
$sql2 = sql_year_month_day($key, $type)." = '$day3'";
|
||||
break;
|
||||
case 'week':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')." between '$week[0]' and '$week[1]'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')." between '$week2[0]' and '$week2[1]'";
|
||||
$sql = sql_year_month_day($key, $type)." between '$week[0]' and '$week[1]'";
|
||||
$sql2 = sql_year_month_day($key, $type)." between '$week2[0]' and '$week2[1]'";
|
||||
break;
|
||||
case 'week2':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')." between '$week2[0]' and '$week2[1]'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')." between '$week3[0]' and '$week3[1]'";
|
||||
$sql = sql_year_month_day($key, $type)." between '$week2[0]' and '$week2[1]'";
|
||||
$sql2 = sql_year_month_day($key, $type)." between '$week3[0]' and '$week3[1]'";
|
||||
break;
|
||||
case 'month':
|
||||
$sql = sql_year_month($table.'.created_at','ts')."='$month'";
|
||||
$sql2 = sql_year_month($table.'.created_at','ts')."='$month2'";
|
||||
$sql = sql_year_month($key, $type)." = '$month'";
|
||||
$sql2 = sql_year_month($key, $type)." = '$month2'";
|
||||
break;
|
||||
case 'month2':
|
||||
$sql = sql_year_month($table.'.created_at','ts')."='$month2'";
|
||||
$sql2 = sql_year_month($table.'.created_at','ts')."='$month3'";
|
||||
$sql = sql_year_month($key, $type)." = '$month2'";
|
||||
$sql2 = sql_year_month($key, $type)." = '$month3'";
|
||||
break;
|
||||
case 'season':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')." between '$season[0]' and '$season[1]'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')." between '$season2[0]' and '$season2[1]'";
|
||||
$sql = sql_year_month_day($key, $type)." between '$season[0]' and '$season[1]'";
|
||||
$sql2 = sql_year_month_day($key, $type)." between '$season2[0]' and '$season2[1]'";
|
||||
break;
|
||||
case 'season2':
|
||||
$sql = sql_year_month_day($table.'.created_at','ts')." between '$season2[0]' and '$season2[1]'";
|
||||
$sql2 = sql_year_month_day($table.'.created_at','ts')." between '$season3[0]' and '$season3[1]'";
|
||||
$sql = sql_year_month_day($key, $type)." between '$season2[0]' and '$season2[1]'";
|
||||
$sql2 = sql_year_month_day($key, $type)." between '$season3[0]' and '$season3[1]'";
|
||||
break;
|
||||
case 'year':
|
||||
$sql = sql_year($table.'.created_at','ts')."='$year'";
|
||||
$sql2 = sql_year($table.'.created_at','ts')."='$year2'";
|
||||
$sql = sql_year($key, $type)." = '$year'";
|
||||
$sql2 = sql_year($key, $type)." = '$year2'";
|
||||
break;
|
||||
case 'year2':
|
||||
$sql = sql_year($table.'.created_at','ts')."='$year2'";
|
||||
$sql2 = sql_year($table.'.created_at','ts')."='$year3'";
|
||||
$sql = sql_year($key, $type)." = '$year2'";
|
||||
$sql2 = sql_year($key, $type)." = '$year3'";
|
||||
break;
|
||||
}
|
||||
return ['info' => $info, 'dates' => $dates, 'sql' => $sql, 'sql2' => $sql2, 'gets' => $gets, 'params' => $params, 'auth' => $auth];
|
||||
return ['info' => $info, 'sql' => $sql, 'sql2' => $sql2, 'gets' => $gets, 'params' => $params, 'auth' => $auth];
|
||||
}
|
||||
|
||||
public static function getWidget($table, $field = 'created_at', $type = 'ts')
|
||||
{
|
||||
$auth = auth()->user();
|
||||
$gets = Request::all();
|
||||
$params = $gets['params'];
|
||||
|
||||
$widget = Widget::where('id', $gets['id'])
|
||||
->first();
|
||||
|
||||
$user_widget = UserWidget::where('user_id', $auth['id'])
|
||||
->where('node_id', $gets['id'])
|
||||
->first();
|
||||
|
||||
if ($user_widget['name']) {
|
||||
$widget['name'] = $user_widget['name'];
|
||||
}
|
||||
if ($user_widget['color']) {
|
||||
$widget['color'] = $user_widget['color'];
|
||||
}
|
||||
if ($user_widget['icon']) {
|
||||
$widget['icon'] = $user_widget['icon'];
|
||||
}
|
||||
if ($user_widget['params']) {
|
||||
$widget['params'] = json_decode($user_widget['params'], true);
|
||||
}
|
||||
|
||||
$permission = empty($params['permission']) ? 'dept2' : $params['permission'];
|
||||
$date = empty($params['date']) ? 'month' : $params['date'];
|
||||
|
||||
switch ($date) {
|
||||
case 'last_day7':
|
||||
$day = date('Y-m-d');
|
||||
$day2 = date('Y-m-d', strtotime('-7 day'));
|
||||
case 'last_day28':
|
||||
$day = date('Y-m-d');
|
||||
$day2 = date('Y-m-d', strtotime('-28 day'));
|
||||
break;
|
||||
case 'last_month':
|
||||
$month2 = date('Y-m', strtotime("-1 month"));
|
||||
break;
|
||||
case 'year2':
|
||||
$year2 = date('Y', strtotime("-1 year"));
|
||||
break;
|
||||
}
|
||||
|
||||
$sql = '';
|
||||
$key = $table.'.'.$field;
|
||||
switch ($date) {
|
||||
case 'day7':
|
||||
case 'day28':
|
||||
$sql = sql_year_month_day($key, $type)." between '$day' and '$day2'";
|
||||
break;
|
||||
case 'last_month':
|
||||
$sql = sql_year_month($key, $type)." = '$month2'";
|
||||
break;
|
||||
case 'year2':
|
||||
$sql = sql_year($key, $type)." = '$year2'";
|
||||
break;
|
||||
}
|
||||
return ['widget' => $widget, 'sql' => $sql, 'gets' => $gets, 'params' => $params, 'auth' => $auth];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,20 +11,18 @@ class ShareService
|
||||
public static function getItemsSourceBy(array $source_type, $user_id, $start_at = null, $end_at = null)
|
||||
{
|
||||
$user = User::find($user_id);
|
||||
|
||||
$model = Share::leftJoin('user', 'share.created_id', '=', 'user.id')
|
||||
$model = Share::leftJoin('user', 'share.created_by', '=', 'user.id')
|
||||
->permission('share.receive_id', $user)
|
||||
->whereIn('share.source_type', $source_type);
|
||||
|
||||
$start_at = strtotime($start_at);
|
||||
$end_at = strtotime($end_at) + 86400;
|
||||
if ($start_at > 0 && $end_at > 0) {
|
||||
$model->whereRaw('
|
||||
$model->whereRaw('(
|
||||
(share.start_at between '.$start_at.' and '.$end_at.' or share.end_at between '.$start_at.' and '.$end_at.')
|
||||
or (share.is_repeat = 1 and share.start_at <= '.$end_at.')
|
||||
');
|
||||
)');
|
||||
}
|
||||
|
||||
return $model->get(['share.*', 'user.name', 'user.username']);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
<link href="{{$asset_url}}/vendor/element-plus/index.css" rel="stylesheet" type="text/css" />
|
||||
<script src="{{$asset_url}}/vendor/element-plus/index.js" type="text/javascript"></script>
|
||||
|
||||
<style type="text/css">
|
||||
html {
|
||||
overflow: hidden;
|
||||
@@ -85,17 +88,23 @@ a { outline: none; }
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.row-info .panel { display: flex; padding-bottom: 10px; position: relative; text-align: center; border-radius: 4px !important; }
|
||||
.info-skin1 .info-l { color: #fff; margin-top:16px; margin-left: 15px; border-radius: 50%; width: 50px; height:50px; line-height:58px; vertical-align: middle; }
|
||||
.info-skin1 { padding-bottom: 10px; display: flex; position: relative; text-align: center; border-radius: 4px !important; }
|
||||
.info-skin1 .info-l { color: #fff; margin-top:18px; margin-left: 15px; border-radius: 50%; width: 50px; height:50px; line-height:55px; vertical-align: middle; }
|
||||
.info-skin1 .info-l .fa { font-size: 19px; }
|
||||
|
||||
.info-skin1 .info-c { flex:1; margin-left: 15px; text-align: left; }
|
||||
.info-skin1 .info-c .info-name { margin-top:18px; font-size: 14px; color: #666; }
|
||||
.info-skin1 .info-c .info-item { font-size: 24px; color: #333; }
|
||||
.info-skin1 .info-r {
|
||||
flex:1;
|
||||
padding-right:5px;
|
||||
}
|
||||
.info-skin1 .info-a { display: flex; align-items:center; justify-content:space-between; padding-left: 15px; text-align: left; }
|
||||
.info-skin1 .info-a .info-name { padding-top:15px; font-size: 14px; color: #666; }
|
||||
.info-skin1 .info-a .el-input__inner { border: 0; text-align: right; }
|
||||
|
||||
.info-skin1 .info-r { margin-left: auto; margin-top:18px; width: 70px; line-height:22px; }
|
||||
.info-skin1 .info-r .rate { color: #2bbf24; }
|
||||
.info-skin1 .info-r .red { color:#f00; }
|
||||
.info-skin1 .info-r::before { position:absolute;top:22px;content:"";width:1px;height:40px;background-color:#e6e6e6;display:block; }
|
||||
.info-skin1 .info-b { padding-right:10px; display: flex; align-items:center; justify-content:space-between; padding-left: 15px; padding-top:5px; }
|
||||
.info-skin1 .info-b .info-item { font-size: 24px; color: #333; }
|
||||
.info-skin1 .info-b .rate { color: #999; }
|
||||
.info-skin1 .info-b .red { color:#f00; }
|
||||
.info-skin1 .info-b .green { color: #39c15b; }
|
||||
.info-items { height: 94px; }
|
||||
|
||||
.app-title {
|
||||
@@ -119,16 +128,21 @@ a { outline: none; }
|
||||
}
|
||||
|
||||
.row-widget .panel-heading {
|
||||
padding: 10px;
|
||||
padding: 8px;
|
||||
height: 45px;
|
||||
color: #2490f8;
|
||||
font-size: 14px;
|
||||
text-align: left;
|
||||
}
|
||||
.row-widget .panel-heading .widget_name {
|
||||
font-size: 15px;
|
||||
padding-top: 4px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
.row-widget .widget-item {
|
||||
text-align: left;
|
||||
}
|
||||
.row-widget .widget-item .red {
|
||||
font-size: 15px;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
@@ -173,7 +187,6 @@ a { outline: none; }
|
||||
}
|
||||
|
||||
.row-quick {
|
||||
margin-bottom: 10px;
|
||||
padding: 10px;
|
||||
}
|
||||
.quick-text {
|
||||
@@ -200,7 +213,6 @@ a { outline: none; }
|
||||
background: #f00;
|
||||
border-radius: 100%;
|
||||
border: solid 1px #f05050;
|
||||
display: none;
|
||||
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
@@ -222,76 +234,145 @@ a { outline: none; }
|
||||
.dropdown-toggle {
|
||||
border: solid 1px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
[v-cloak] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.gd-el-card { margin-left: 0; margin-right: 0; }
|
||||
.gd-el-card .el-col { padding: 5px; }
|
||||
.gd-el-card-header {
|
||||
display:flex; align-items:center; justify-content:space-between; padding: 10px 0px;
|
||||
}
|
||||
.gd-el-card-header .gd-el-left {
|
||||
font-size: 16px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
.gd-el-card-header .gd-el-right {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<div class="dashboard-widget">
|
||||
|
||||
@verbatim
|
||||
<div id="gdoo-app" v-cloak>
|
||||
|
||||
<div class="pull-right hidden-xs">
|
||||
<a class="dashboard-config" data-toggle="dashboard-config" title="仪表盘设置">
|
||||
<a href="javascript:;" class="dashboard-config" @click="dashboardConfig" title="仪表盘设置">
|
||||
<i class="fa fa-gear"></i>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="row-quick">
|
||||
<div class="row row-sm">
|
||||
@forelse($quicks as $quick)
|
||||
<div class="quick-text">
|
||||
<a href="javascript:;" data-toggle="addtab" data-url="{{$quick['url']}}" data-id="{{$quick['key']}}" data-name="{{$quick['name']}}">
|
||||
<div class="quick-icon quick-item" style="background-color:{{$quick['color']}}" data-url="{{$quick['url']}}" data-key="{{$quick['key']}}">
|
||||
<i class="fa fa-3x {{$quick['icon']}}"></i>
|
||||
<span class="quick-num">0</span>
|
||||
</div>
|
||||
<div class="title">{{$quick['name']}}</div>
|
||||
</a>
|
||||
</div>
|
||||
@empty
|
||||
<div class="quick-text">
|
||||
<a href="javascript:;" data-toggle="dashboard-config">
|
||||
<div class="quick-text" v-for="quick in dashboard.quicks">
|
||||
<a href="javascript:;" data-toggle="addtab" :data-url="quick.url" :data-id="quick.key" :data-name="quick.name">
|
||||
<div class="quick-icon quick-item" :style="'background-color:' + quick.color" :data-url="quick.url" :data-key="quick.key">
|
||||
<i :class="'fa fa-3x ' + quick.icon"></i>
|
||||
<span class="quick-num" v-if="quick.total > 0">{{quick.total}}</span>
|
||||
</div>
|
||||
<div class="title">{{quick.name}}</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="quick-text" v-if="dashboard.add_quick">
|
||||
<a href="javascript:;" @click="dashboardConfig">
|
||||
<div class="quick-icon" style="background-color:#13D06C;">
|
||||
<i class="fa fa-3x fa-plus"></i>
|
||||
</div>
|
||||
<div class="title">添加快捷</div>
|
||||
</a>
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row row-sm row-info">
|
||||
@foreach($infos as $info)
|
||||
@if($info['status'])
|
||||
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">
|
||||
<div class="info-items" data-id="{{$info['id']}}" data-url="{{$info['url']}}" data-more_url="{{$info['more_url']}}"></div>
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
<div class="row row-sm row-widget">
|
||||
@foreach($grids as $grid)
|
||||
<div class="col-xs-12 col-sm-{{$grid}}">
|
||||
@foreach($widgets as $widget)
|
||||
@if($widget['status'])
|
||||
@if($widget['grid'] == $grid)
|
||||
<div class="panel panel-shadow">
|
||||
<div class="panel-heading text-base b-b">
|
||||
<div class="pull-right"></div>
|
||||
<a data-toggle='widget-refresh' data-url="{{$widget['url']}}" data-key="{{str_replace(['/', '?', '='], ['_', '_', '_'], $widget['url'])}}" data-id="{{$widget['id']}}">{{$widget['name']}}</a>
|
||||
<div class="row row-sm gd-el-card">
|
||||
<el-row>
|
||||
<template v-for="info in dashboard.infos">
|
||||
<el-col :xs="24" :sm="12" :md="8" :lg="6" v-if="info.status">
|
||||
<el-card class="box-card panel-shadow" shadow="hover" body-style="padding:0px;">
|
||||
<div class="info-skin1">
|
||||
<div class="info-l" :style="'background-color:' + info.color">
|
||||
<i :class="'fa fa-2x ' + info.icon"></i>
|
||||
</div>
|
||||
<div class="info-r">
|
||||
<div class="info-a">
|
||||
<div class="info-name">{{info.name}}</div>
|
||||
<div>
|
||||
<el-select @change="getInfoData(info)" style="width:90px;padding-top:10px;" v-model="info.params.date" size="mini" placeholder="请选择">
|
||||
<el-option v-for="(v, k) in dashboard.dates" :key="k" :label="v" :value="k">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info-b">
|
||||
<div>
|
||||
<a href="javascript:;" data-toggle="addtab" :data-url="info.more_url" :data-id="info.key" :data-name="info.name">
|
||||
<div class="text-info info-item">{{info.res.count || 0}}</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="rate" v-if="info.params.date">
|
||||
<span>比{{dashboard.dates2[info.params.date]}}:</span>
|
||||
<span :class="info.res.rate > 0 ? 'red' : 'green'">
|
||||
{{info.res.rate}}%<i :class="info.res.rate > 0 ? 'el-icon-caret-top' : 'el-icon-caret-bottom'"></i>
|
||||
</span>
|
||||
</div>
|
||||
<div class="widget-item" id="widget_item_{{$widget['id']}}" data-id="{{$widget['id']}}" data-url="{{$widget['url']}}">
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</template>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<div class="row row-sm gd-el-card">
|
||||
<el-row>
|
||||
<el-col :xs="24" :sm="12" :md="6" :lg="6" v-for="card in dashboard.cards">
|
||||
<el-card class="box-card panel-shadow" shadow="hover" body-style="padding:0px;">
|
||||
<div class="gd-el-card-header">
|
||||
<span class="gd-el-left">名称</span>
|
||||
<span class="gd-el-right">
|
||||
<el-select style="width:90px;" v-model="value" size="mini" placeholder="请选择">
|
||||
<el-option v-for="(v, k) in dashboard.dates" :key="k" :label="v" :value="k"></el-option>
|
||||
</el-select>
|
||||
</span>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
<div class="row row-sm row-widget m-t-xs">
|
||||
<div :class="'col-xs-12 col-sm-' + grid" v-for="grid in dashboard.grids">
|
||||
<template v-for="widget in dashboard.widgets">
|
||||
<div class="panel panel-shadow" v-if="widget.status && widget.grid == grid">
|
||||
<div class="panel-heading text-base b-b">
|
||||
<div class="pull-right">
|
||||
<el-select @change="getWidgetData(widget)" style="width:100px;" v-if="widget.params && widget.params.date" v-model="widget.params.date" size="mini" placeholder="请选择">
|
||||
<el-option v-for="(v, k) in dashboard.dates3" :key="k" :label="v" :value="k">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="widget_name">
|
||||
<a @click="widgetRefresh(widget.key)">{{widget.name}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="widget-item" :id="'widget_item_' + widget.id"></div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endverbatim
|
||||
|
||||
</div>
|
||||
|
||||
<div class="dashboard-footer">
|
||||
<div class="box">
|
||||
{{$edition}} {{$version}}
|
||||
{{$version}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -318,28 +399,117 @@ a { outline: none; }
|
||||
</style>
|
||||
|
||||
<script>
|
||||
(function($) {
|
||||
var $document = $(document);
|
||||
(function(window, undefined) {
|
||||
|
||||
var myProcess = null;
|
||||
|
||||
function widgetRefresh() {
|
||||
if (myProcess) {
|
||||
var items = $('.widget-item');
|
||||
items.each(function(index, item) {
|
||||
var data = $(item).data();
|
||||
if (data.key) {
|
||||
gdoo.widgets[data.key].remoteData({page: 1});
|
||||
console.log('refresh item:' + data.key);
|
||||
const GdooApp = {
|
||||
data() {
|
||||
return {
|
||||
dashboard: {
|
||||
add_quick: 0,
|
||||
infos: [],
|
||||
quicks: [],
|
||||
widgets: [],
|
||||
cards: [],
|
||||
grids: [],
|
||||
dates: {},
|
||||
dates2: {}
|
||||
},
|
||||
};
|
||||
},
|
||||
created() {
|
||||
var me = this;
|
||||
$.post('index/dashboard/index', function(res) {
|
||||
if (res.status) {
|
||||
me.dashboard = res.data;
|
||||
|
||||
me.dashboard.add_quick = me.dashboard.quicks.length > 0 ? 0 : 1;
|
||||
me.dashboard.quicks.forEach((quick) => {
|
||||
me.getBadge(quick);
|
||||
});
|
||||
|
||||
me.dashboard.infos.forEach((info) => {
|
||||
me.getInfoData(info);
|
||||
});
|
||||
|
||||
me.dashboard.widgets.forEach((widget) => {
|
||||
me.getWidgetData(widget);
|
||||
});
|
||||
} else {
|
||||
toastrError(res.data);
|
||||
}
|
||||
});
|
||||
me.widgetsRefresh();
|
||||
},
|
||||
methods: {
|
||||
dashboardConfig() {
|
||||
formDialog({
|
||||
title: '仪表盘设置',
|
||||
url: '/index/dashboard/config',
|
||||
id: 'widget-edit',
|
||||
dialogClass:'modal-lg',
|
||||
onSubmit: function() {
|
||||
var me = this;
|
||||
var data = settingWidget.save();
|
||||
$.post('/index/dashboard/config', data, function(res) {
|
||||
if (res.status) {
|
||||
location.reload();
|
||||
toastrSuccess(res.data);
|
||||
$(me).dialog("close");
|
||||
} else {
|
||||
toastrError(res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
getBadge(quick) {
|
||||
$.get('/index/index/badge', {key: quick.key}, function(res) {
|
||||
quick.total = res.total;
|
||||
});
|
||||
},
|
||||
getInfoData(info) {
|
||||
info.res = {};
|
||||
$.post('/' + info.url, info, function(res) {
|
||||
info.res = res.data;
|
||||
});
|
||||
},
|
||||
getWidgetData(widget) {
|
||||
if (widget.url) {
|
||||
$.get('/' + widget.url, {id: widget.id}, function(res) {
|
||||
$('#widget_item_' + widget.id).html(res);
|
||||
});
|
||||
}
|
||||
},
|
||||
widgetRefresh(key) {
|
||||
if (key) {
|
||||
gdoo.widgets[key].remoteData({page: 1});
|
||||
}
|
||||
},
|
||||
widgetsRefresh() {
|
||||
var me = this;
|
||||
if (myProcess) {
|
||||
me.dashboard.widgets.forEach((widget) => {
|
||||
me.widgetRefresh(widget.key);
|
||||
});
|
||||
}
|
||||
myProcess = setTimeout(function() {
|
||||
me.widgetsRefresh();
|
||||
}, 1000 * 60 * 3);
|
||||
}
|
||||
}
|
||||
myProcess = setTimeout(function() {
|
||||
widgetRefresh();
|
||||
}, 1000 * 60 * 5);
|
||||
}
|
||||
};
|
||||
const app = Vue.createApp(GdooApp);
|
||||
app.use(ElementPlus);
|
||||
app.mount("#gdoo-app");
|
||||
})(window);
|
||||
</script>
|
||||
|
||||
widgetRefresh();
|
||||
<script>
|
||||
|
||||
(function($) {
|
||||
var $document = $(document);
|
||||
|
||||
$document.on('click', '[data-toggle="addtab"]', function(event) {
|
||||
event.preventDefault();
|
||||
@@ -357,69 +527,5 @@ a { outline: none; }
|
||||
}
|
||||
top.addTab(data.url, data.id, data.name);
|
||||
});
|
||||
|
||||
$('[data-toggle="dashboard-config"]').on('click', function() {
|
||||
formDialog({
|
||||
title: '仪表盘设置',
|
||||
url: app.url('index/dashboard/config'),
|
||||
id: 'widget-edit',
|
||||
dialogClass:'modal-lg',
|
||||
onSubmit: function() {
|
||||
var me = this;
|
||||
var data = settingWidget.save();
|
||||
$.post(app.url('index/dashboard/config'), data, function(res) {
|
||||
if (res.status) {
|
||||
location.reload();
|
||||
toastrSuccess(res.data);
|
||||
$(me).dialog("close");
|
||||
} else {
|
||||
toastrError(res.data);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('[data-toggle="widget-refresh"]').on('click', function() {
|
||||
var data = $(this).data();
|
||||
if (data.key) {
|
||||
gdoo.widgets[data.key].remoteData({page: 1});
|
||||
}
|
||||
});
|
||||
|
||||
function widgetInit() {
|
||||
var items = $('.widget-item');
|
||||
items.each(function(index, item) {
|
||||
var data = $(item).data();
|
||||
if (data == undefined) {
|
||||
return false;
|
||||
}
|
||||
if (data.url) {
|
||||
$(item).load(app.url(data.url, {id: data.id}));
|
||||
}
|
||||
});
|
||||
|
||||
var items = $('.info-items');
|
||||
items.each(function(index, item) {
|
||||
var me = $(item);
|
||||
var data = me.data();
|
||||
if (data.url) {
|
||||
$(item).load(app.url(data.url, {id: data.id}));
|
||||
}
|
||||
});
|
||||
|
||||
var items = $('.quick-item');
|
||||
items.each(function(index, item) {
|
||||
var me = $(item);
|
||||
var data = me.data();
|
||||
$.get(app.url('index/index/badge', {key: data.key}), function(res) {
|
||||
if(res.total > 0) {
|
||||
me.find('.quick-num').show().text(res.total);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
widgetInit();
|
||||
|
||||
})(jQuery);
|
||||
</script>
|
||||
@@ -3,13 +3,13 @@
|
||||
<tr>
|
||||
<td align="right">名称</td>
|
||||
<td align="left">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" readonly="readonly" value="{{$row['widget_name']}}">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" readonly="readonly" value="{{$info['info_name']}}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">显示名称</td>
|
||||
<td align="left">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" id="name" name="name" value="{{$row['name']}}">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" id="name" name="name" value="{{$info['name']}}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@@ -17,7 +17,7 @@
|
||||
<td>
|
||||
<select class="form-control input-sm" name="permission" id="permission">
|
||||
@foreach($permissions as $key => $permission)
|
||||
<option value="{{$key}}" @if($row['params']['permission'] == $key) selected="selected" @endif>{{$permission}}</option>
|
||||
<option value="{{$key}}" @if($info['params']['permission'] == $key) selected="selected" @endif>{{$permission}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</td>
|
||||
@@ -27,7 +27,7 @@
|
||||
<td>
|
||||
<select class="form-control input-sm" name="date" id="date">
|
||||
@foreach($dates as $key => $date)
|
||||
<option value="{{$key}}" @if($row['params']['date'] == $key) selected="selected" @endif>{{$date}}</option>
|
||||
<option value="{{$key}}" @if($info['params']['date'] == $key) selected="selected" @endif>{{$date}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</td>
|
||||
@@ -37,7 +37,7 @@
|
||||
<td align="left">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon" id="icon-picker"></span>
|
||||
<input data-placement="bottomLeft" type="text" autocomplete="off" value="{{$row['icon']}}" class="form-control icp icp-auto input-sm" id="icon" name="icon">
|
||||
<input data-placement="bottomLeft" type="text" autocomplete="off" value="{{$info['icon']}}" class="form-control icp icp-auto input-sm" id="icon" name="icon">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -45,9 +45,9 @@
|
||||
<td align="right">图标颜色</td>
|
||||
<td align="left">
|
||||
<div class="colorpicker-controller" title="选择颜色">
|
||||
<div id="color-picker" class="colorpicker" style="background-color:{{$row['color']}}"></div>
|
||||
<div id="color-picker" class="colorpicker" style="background-color:{{$info['color']}}"></div>
|
||||
</div>
|
||||
<input type="hidden" id="color" name="color" value="{{$row['color']}}">
|
||||
<input type="hidden" id="color" name="color" value="{{$info['color']}}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -3,33 +3,58 @@
|
||||
<tr>
|
||||
<td align="right">名称</td>
|
||||
<td align="left">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" readonly="readonly" value="{{$row['widget_name']}}">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" readonly="readonly" value="{{$widget['widget_name']}}">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">显示名称</td>
|
||||
<td align="left">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" id="name" name="name" value="{{$row['name']}}">
|
||||
<input type="text" autocomplete="off" class="form-control input-sm" id="name" name="name" value="{{$widget['name']}}">
|
||||
</td>
|
||||
</tr>
|
||||
<!--
|
||||
|
||||
@if($widget['params']['permission'])
|
||||
<tr>
|
||||
<td align="right">权限</td>
|
||||
<td>
|
||||
<select class="form-control input-sm" name="permission" id="permission">
|
||||
@foreach($permissions as $key => $permission)
|
||||
<option value="{{$key}}" @if($widget['params']['permission'] == $key) selected="selected" @endif>{{$permission}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
@if($widget['params']['date'])
|
||||
<tr>
|
||||
<td align="right">日期</td>
|
||||
<td>
|
||||
<select class="form-control input-sm" name="date" id="date">
|
||||
@foreach($dates as $key => $date)
|
||||
<option value="{{$key}}" @if($widget['params']['date'] == $key) selected="selected" @endif>{{$date}}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
|
||||
<tr>
|
||||
<td align="right">图标</td>
|
||||
<td align="left">
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon" id="icon-picker"></span>
|
||||
<input data-placement="bottomLeft" type="text" autocomplete="off" class="form-control icp icp-auto input-sm" id="icon" name="icon">
|
||||
<input data-placement="bottomLeft" type="text" autocomplete="off" value="{{$widget['icon']}}" class="form-control icp icp-auto input-sm" id="icon" name="icon">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
-->
|
||||
<tr>
|
||||
<td align="right">背景颜色</td>
|
||||
<td align="left">
|
||||
<div class="colorpicker-controller" title="选择颜色">
|
||||
<div id="color-picker" class="colorpicker"></div>
|
||||
<div id="color-picker" class="colorpicker" style="background-color:{{$widget['color']}}"></div>
|
||||
</div>
|
||||
<input type="hidden" id="color" name="color">
|
||||
<input type="hidden" id="color" name="color" value="{{$widget['color']}}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -47,12 +47,11 @@
|
||||
</a>
|
||||
|
||||
<a href="{{url('/')}}" class="navbar-brand">
|
||||
|
||||
<img src="{{$asset_url}}/images/logo.svg" width="18" />
|
||||
<!--
|
||||
<i class="fa text-lg fa-buysellads"></i>
|
||||
-->
|
||||
<span class="navbar-brand-min-title">
|
||||
<img src="{{$asset_url}}/images/white-logo.svg" width="20" />
|
||||
</span>
|
||||
<span class="navbar-brand-title">
|
||||
<img src="{{$asset_url}}/images/white-logo.svg" width="20" />
|
||||
{{$setting['title']}}
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
软件版本
|
||||
</td>
|
||||
<td align="left" style="border-top:0;">
|
||||
{{$edition}} {{$version}}
|
||||
{{$version}}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
Reference in New Issue
Block a user