Browse Source

2.2 版本 BUG修复与使用优化

0. 更新项目依赖包;
1. 适配Payment依赖包5.0的代码修改;
2. 独立化节点阻断检测功能; 现在运行管理在节点页面,单独测试节点;
3. 节点阻断检测通知功能不再是一个报告一个报告发,改为一次检测只在有阻断出现情况下,统一发送结果;
4. 修改激活逻辑;
5. 修复重复优惠券SN码无报错的问题;现在优惠码为唯一码,不允许重复码出现;
6. 添加用户获取节点信息时按钮的动画加载效果;
7. 修复管理系统页面部分选项输入任何值都会报错的问题;
8. 代码命名与书写规范化;
兔姬桑 5 years ago
parent
commit
71ffad2718

+ 1 - 1
app/Components/Curl.php

@@ -14,7 +14,7 @@ class Curl
 	{
 		$ch = curl_init();
 		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
-		curl_setopt($ch, CURLOPT_TIMEOUT, 10);
+		curl_setopt($ch, CURLOPT_TIMEOUT, 60);
 		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 		curl_setopt($ch, CURLOPT_URL, $url);

+ 10 - 1
app/Console/Commands/NodeBlockedDetection.php

@@ -28,7 +28,13 @@ class NodeBlockedDetection extends Command
 	{
 		$jobStartTime = microtime(TRUE);
 		if(self::$systemConfig['nodes_detection']){
-			$this->checkNodes();
+			if(!Cache::has('LastCheckTime')){
+				$this->checkNodes();
+			}elseif(Cache::get('LastCheckTime') <= time()){
+				$this->checkNodes();
+			}else{
+				Log::info('下次节点阻断检测时间:'.date('Y-m-d H:i:s', Cache::get('LastCheckTime')));
+			}
 		}
 
 		$jobEndTime = microtime(TRUE);
@@ -105,6 +111,9 @@ class NodeBlockedDetection extends Command
 			$this->notifyMaster("节点阻断警告", "**阻断日志**: \r\n\r\n".$message.$additionalMessage);
 			Log::info("阻断日志: \r\n".$message.$additionalMessage);
 		}
+
+		// 随机生成下次检测时间
+		Cache::put('LastCheckTime', time()+mt_rand(3000, 3600), 3600);
 	}
 
 	/**

+ 1 - 1
app/Console/Kernel.php

@@ -55,7 +55,7 @@ class Kernel extends ConsoleKernel
 		$schedule->command('autoJob')->everyMinute();
 		$schedule->command('serviceTimer')->everyTenMinutes();
 		$schedule->command('autoClearLog')->everyThirtyMinutes();
-		$schedule->command('nodeBlockedDetection')->hourly();
+		$schedule->command('nodeBlockedDetection')->everyTenMinutes();
 		$schedule->command('autoStatisticsNodeHourlyTraffic')->hourly();
 		$schedule->command('autoStatisticsUserHourlyTraffic')->hourly();
 		$schedule->command('userTrafficAbnormalAutoWarning')->hourly();

+ 2 - 2
app/Http/Controllers/AdminController.php

@@ -535,10 +535,10 @@ class AdminController extends Controller
 					return Response::json(['status' => 'fail', 'title' => 'IP获取错误', 'message' => $node->name.'IP获取失败']);
 				}
 			}
-			$data[0] = NetworkDetection::networkCheck($node->ip,TRUE); //ICMP
+			$data[0] = NetworkDetection::networkCheck($node->ip, TRUE); //ICMP
 			$data[1] = NetworkDetection::networkCheck($node->ip, FALSE, $node->single? $node->port : NULL); //TCP
 
-			return Response::json(['status' => 'success', 'title' => '['.$node->name.']阻断信息', 'message'=>$data]);
+			return Response::json(['status' => 'success', 'title' => '['.$node->name.']阻断信息', 'message' => $data]);
 		}else{
 			$status = $request->input('status');
 

+ 10 - 10
app/Http/Controllers/UserController.php

@@ -135,20 +135,20 @@ class UserController extends Controller
 			return Response::json(['status' => 'fail', 'message' => '已经签到过了,明天再来吧']);
 		}
 
-		$traffic = mt_rand(self::$systemConfig['min_rand_traffic'], self::$systemConfig['max_rand_traffic']);
-		$ret = User::uid()->increment('transfer_enable', $traffic*1048576);
+		$traffic = mt_rand((int)self::$systemConfig['min_rand_traffic'], (int)self::$systemConfig['max_rand_traffic']) * 1048576;
+		$ret = User::uid()->increment('transfer_enable', $traffic);
 		if(!$ret){
 			return Response::json(['status' => 'fail', 'message' => '签到失败,系统异常']);
 		}
 
 		// 写入用户流量变动记录
-		Helpers::addUserTrafficModifyLog(Auth::user()->id, 0, Auth::user()->transfer_enable, Auth::user()->transfer_enable+$traffic*1048576, '[签到]');
+		Helpers::addUserTrafficModifyLog(Auth::user()->id, 0, Auth::user()->transfer_enable, Auth::user()->transfer_enable+$traffic, '[签到]');
 
 		// 多久后可以再签到
 		$ttl = self::$systemConfig['traffic_limit_time']? self::$systemConfig['traffic_limit_time']*60 : 86400;
 		Cache::put('userCheckIn_'.Auth::user()->id, '1', $ttl);
 
-		return Response::json(['status' => 'success', 'message' => '签到成功,系统送您 '.$traffic.'M 流量']);
+		return Response::json(['status' => 'success', 'message' => '签到成功,系统送您 '.flowAutoShow($traffic).'流量']);
 	}
 
 	// 节点列表
@@ -197,8 +197,8 @@ class UserController extends Controller
 		if($request->isMethod('POST')){
 			$old_password = trim($request->input('old_password'));
 			$new_password = trim($request->input('new_password'));
-			$wechat = $request->input('wechat');
-			$qq = $request->input('qq');
+			$wechat = trim($request->input('wechat'));
+			$qq = trim($request->input('qq'));
 			$passwd = trim($request->input('passwd'));
 
 			// 修改密码
@@ -310,11 +310,11 @@ class UserController extends Controller
 		$prepaidOrder = Order::query()->where('oid', $oid)->first();
 		if(!$prepaidOrder){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '查无此单!']);
-		}
-		if($prepaidOrder->status != 3){
+		}elseif($prepaidOrder->status != 3){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '非预支付订单,无需再次启动!']);
+		}else{
+			$this->activePrepaidOrder($oid);
 		}
-		$this->activePrepaidOrder($oid);
 
 		return Response::json(['status' => 'success', 'data' => '', 'message' => '激活成功']);
 	}
@@ -592,7 +592,7 @@ class UserController extends Controller
 		$view['subscribe_status'] = $subscribe->status;
 		$subscribe_link = (self::$systemConfig['subscribe_domain']? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url']).'/s/'.$subscribe->code;
 		$view['link'] = $subscribe_link;
-		$view['subscribe_link'] ='sub://'.base64url_encode($subscribe_link);
+		$view['subscribe_link'] = 'sub://'.base64url_encode($subscribe_link);
 		$view['Shadowrocket_link'] = 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(self::$systemConfig['website_name'].'-'.self::$systemConfig['website_url']);
 		$view['Shadowrocket_linkQrcode'] = 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(self::$systemConfig['website_name']);
 		$view['Quantumult_linkOut'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf');

+ 1 - 1
app/Http/Models/SsNodeLabel.php

@@ -11,8 +11,8 @@ use Illuminate\Database\Eloquent\Model;
  * Class SsNodeLabel
  *
  * @package App\Http\Models
- * @property-read Label $labelInfo
  * @mixin Eloquent
+ * @property-read Label $labelInfo
  * @property int        $id
  * @property int        $node_id  用户ID
  * @property int        $label_id 标签ID

+ 1 - 1
app/Http/Models/Ticket.php

@@ -14,7 +14,6 @@ use Illuminate\Support\Carbon;
  *
  * @package App\Http\Models
  * @mixin Eloquent
- * @property-read mixed  $status_label
  * @property int         $id
  * @property int         $user_id
  * @property string      $title      标题
@@ -22,6 +21,7 @@ use Illuminate\Support\Carbon;
  * @property int         $status     状态:0-待处理、1-已处理未关闭、2-已关闭
  * @property Carbon|null $created_at 创建时间
  * @property Carbon|null $updated_at 最后更新时间
+ * @property-read mixed  $status_label
  * @property-read User   $user
  * @method static Builder|Ticket newModelQuery()
  * @method static Builder|Ticket newQuery()

+ 170 - 171
composer.lock

@@ -8,16 +8,16 @@
     "packages": [
         {
             "name": "barryvdh/laravel-debugbar",
-            "version": "v3.2.8",
+            "version": "v3.2.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-debugbar.git",
-                "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0"
+                "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/18208d64897ab732f6c04a19b319fe8f1d57a9c0",
-                "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0",
+                "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/42d5da5379a7860093f8e4032167e4cb5ebec180",
+                "reference": "42d5da5379a7860093f8e4032167e4cb5ebec180",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -27,13 +27,13 @@
                 ]
             },
             "require": {
-                "illuminate/routing": "^5.5|^6",
-                "illuminate/session": "^5.5|^6",
-                "illuminate/support": "^5.5|^6",
-                "maximebf/debugbar": "~1.15.0",
+                "illuminate/routing": "^5.5|^6|^7",
+                "illuminate/session": "^5.5|^6|^7",
+                "illuminate/support": "^5.5|^6|^7",
+                "maximebf/debugbar": "^1.15.1",
                 "php": ">=7.0",
-                "symfony/debug": "^3|^4",
-                "symfony/finder": "^3|^4"
+                "symfony/debug": "^3|^4|^5",
+                "symfony/finder": "^3|^4|^5"
             },
             "require-dev": {
                 "laravel/framework": "5.5.x"
@@ -78,20 +78,20 @@
                 "profiler",
                 "webprofiler"
             ],
-            "time": "2019-08-29T07:01:03+00:00"
+            "time": "2020-02-25T20:42:23+00:00"
         },
         {
             "name": "barryvdh/laravel-ide-helper",
-            "version": "v2.6.6",
+            "version": "v2.6.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-ide-helper.git",
-                "reference": "b91b959364d97af658f268c733c75dccdbff197e"
+                "reference": "edd69c5e0508972c81f1f7173236de2459c45814"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/b91b959364d97af658f268c733c75dccdbff197e",
-                "reference": "b91b959364d97af658f268c733c75dccdbff197e",
+                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/edd69c5e0508972c81f1f7173236de2459c45814",
+                "reference": "edd69c5e0508972c81f1f7173236de2459c45814",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -104,17 +104,17 @@
                 "barryvdh/reflection-docblock": "^2.0.6",
                 "composer/composer": "^1.6",
                 "doctrine/dbal": "~2.3",
-                "illuminate/console": "^5.5|^6",
-                "illuminate/filesystem": "^5.5|^6",
-                "illuminate/support": "^5.5|^6",
-                "php": ">=7"
+                "illuminate/console": "^5.5|^6|^7",
+                "illuminate/filesystem": "^5.5|^6|^7",
+                "illuminate/support": "^5.5|^6|^7",
+                "php": ">=7.2"
             },
             "require-dev": {
-                "illuminate/config": "^5.5|^6",
-                "illuminate/view": "^5.5|^6",
-                "phpro/grumphp": "^0.14",
-                "phpunit/phpunit": "4.*",
-                "scrutinizer/ocular": "~1.1",
+                "illuminate/config": "^5.5|^6|^7",
+                "illuminate/view": "^5.5|^6|^7",
+                "mockery/mockery": "^1.3",
+                "orchestra/testbench": "^3|^4",
+                "phpro/grumphp": "^0.17.1",
                 "squizlabs/php_codesniffer": "^3"
             },
             "type": "library",
@@ -155,7 +155,7 @@
                 "phpstorm",
                 "sublime"
             ],
-            "time": "2019-10-30T20:53:27+00:00"
+            "time": "2020-02-25T20:41:32+00:00"
         },
         {
             "name": "barryvdh/reflection-docblock",
@@ -214,16 +214,16 @@
         },
         {
             "name": "caouecs/laravel-lang",
-            "version": "4.0.9",
+            "version": "4.0.10",
             "source": {
                 "type": "git",
                 "url": "https://github.com/caouecs/Laravel-lang.git",
-                "reference": "99b43723eff9a454c1c7e7124e5b1fa560a97c81"
+                "reference": "db23833785bb4e675ed1d06582f375ccbb8d4e6a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/caouecs/Laravel-lang/zipball/99b43723eff9a454c1c7e7124e5b1fa560a97c81",
-                "reference": "99b43723eff9a454c1c7e7124e5b1fa560a97c81",
+                "url": "https://api.github.com/repos/caouecs/Laravel-lang/zipball/db23833785bb4e675ed1d06582f375ccbb8d4e6a",
+                "reference": "db23833785bb4e675ed1d06582f375ccbb8d4e6a",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -262,7 +262,7 @@
                 "laravel",
                 "lpm"
             ],
-            "time": "2020-02-02T13:13:33+00:00"
+            "time": "2020-03-01T14:11:14+00:00"
         },
         {
             "name": "composer/ca-bundle",
@@ -547,16 +547,16 @@
         },
         {
             "name": "composer/xdebug-handler",
-            "version": "1.4.0",
+            "version": "1.4.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/xdebug-handler.git",
-                "reference": "cbe23383749496fe0f373345208b79568e4bc248"
+                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248",
-                "reference": "cbe23383749496fe0f373345208b79568e4bc248",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7",
+                "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -593,7 +593,7 @@
                 "Xdebug",
                 "performance"
             ],
-            "time": "2019-11-06T16:40:04+00:00"
+            "time": "2020-03-01T12:26:26+00:00"
         },
         {
             "name": "dnoegel/php-xdg-base-dir",
@@ -1827,16 +1827,16 @@
         },
         {
             "name": "jaybizzle/crawler-detect",
-            "version": "v1.2.93",
+            "version": "v1.2.94",
             "source": {
                 "type": "git",
                 "url": "https://github.com/JayBizzle/Crawler-Detect.git",
-                "reference": "608ec84bdf85fa8200c0f36f455483698b450ecd"
+                "reference": "fbd4c12741583fb9d8f0bcbf65248a34eed68fc9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/608ec84bdf85fa8200c0f36f455483698b450ecd",
-                "reference": "608ec84bdf85fa8200c0f36f455483698b450ecd",
+                "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/fbd4c12741583fb9d8f0bcbf65248a34eed68fc9",
+                "reference": "fbd4c12741583fb9d8f0bcbf65248a34eed68fc9",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -1878,7 +1878,7 @@
                 "crawlerdetect",
                 "php crawler detect"
             ],
-            "time": "2020-02-16T12:34:48+00:00"
+            "time": "2020-02-20T21:42:59+00:00"
         },
         {
             "name": "jenssegers/agent",
@@ -2518,16 +2518,16 @@
         },
         {
             "name": "maximebf/debugbar",
-            "version": "v1.15.1",
+            "version": "v1.16.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maximebf/php-debugbar.git",
-                "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e"
+                "reference": "58998b818c6567fac01e35b8a4b70c1a64530556"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6c4277f6117e4864966c9cb58fb835cee8c74a1e",
-                "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e",
+                "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/58998b818c6567fac01e35b8a4b70c1a64530556",
+                "reference": "58998b818c6567fac01e35b8a4b70c1a64530556",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -2537,9 +2537,9 @@
                 ]
             },
             "require": {
-                "php": ">=5.6",
+                "php": "^7.1",
                 "psr/log": "^1.0",
-                "symfony/var-dumper": "^2.6|^3|^4"
+                "symfony/var-dumper": "^2.6|^3|^4|^5"
             },
             "require-dev": {
                 "phpunit/phpunit": "^5"
@@ -2552,7 +2552,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.15-dev"
+                    "dev-master": "1.16-dev"
                 }
             },
             "autoload": {
@@ -2581,7 +2581,7 @@
                 "debug",
                 "debugbar"
             ],
-            "time": "2019-09-24T14:55:42+00:00"
+            "time": "2019-11-24T09:46:11+00:00"
         },
         {
             "name": "mews/captcha",
@@ -2660,16 +2660,16 @@
         },
         {
             "name": "mews/purifier",
-            "version": "3.1.3",
+            "version": "3.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/mewebstudio/Purifier.git",
-                "reference": "f0a258d04e681267cfc8b8e0711050fad6fec2c0"
+                "reference": "261ac8abb0298e853af22ca4ef57bc2a5a723d22"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/mewebstudio/Purifier/zipball/f0a258d04e681267cfc8b8e0711050fad6fec2c0",
-                "reference": "f0a258d04e681267cfc8b8e0711050fad6fec2c0",
+                "url": "https://api.github.com/repos/mewebstudio/Purifier/zipball/261ac8abb0298e853af22ca4ef57bc2a5a723d22",
+                "reference": "261ac8abb0298e853af22ca4ef57bc2a5a723d22",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -2680,9 +2680,9 @@
             },
             "require": {
                 "ezyang/htmlpurifier": "4.12.*",
-                "illuminate/config": "5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ~6",
-                "illuminate/filesystem": "5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ~6",
-                "illuminate/support": "5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.* || ~6",
+                "illuminate/config": "^5.1|^6.0|^7.0",
+                "illuminate/filesystem": "^5.1|^6.0|^7.0",
+                "illuminate/support": "^5.1|^6.0|^7.0",
                 "php": "^7.2"
             },
             "require-dev": {
@@ -2726,7 +2726,7 @@
                     "role": "Developer"
                 }
             ],
-            "description": "Laravel 5/6 HtmlPurifier Package",
+            "description": "Laravel 5/6/7 HtmlPurifier Package",
             "homepage": "https://github.com/mewebstudio/purifier",
             "keywords": [
                 "Purifier",
@@ -2740,7 +2740,7 @@
                 "security",
                 "xss"
             ],
-            "time": "2019-12-05T11:14:40+00:00"
+            "time": "2020-03-06T00:05:13+00:00"
         },
         {
             "name": "misechow/geetest",
@@ -2998,16 +2998,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.30.0",
+            "version": "2.31.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4"
+                "reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/912dff66d2690ca66abddb9b291a1df5f371d3b4",
-                "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
+                "reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3070,7 +3070,7 @@
                 "datetime",
                 "time"
             ],
-            "time": "2020-02-07T15:25:46+00:00"
+            "time": "2020-03-01T11:11:58+00:00"
         },
         {
             "name": "nikic/php-parser",
@@ -3356,16 +3356,16 @@
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.10.1",
+            "version": "1.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "1648dc9ebef6ebe0c5a172e16cf66732918416e0"
+                "reference": "c2a205e82f9cf1cc9fab86b79e808d86dd680470"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/1648dc9ebef6ebe0c5a172e16cf66732918416e0",
-                "reference": "1648dc9ebef6ebe0c5a172e16cf66732918416e0",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/c2a205e82f9cf1cc9fab86b79e808d86dd680470",
+                "reference": "c2a205e82f9cf1cc9fab86b79e808d86dd680470",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3451,7 +3451,7 @@
                 "xls",
                 "xlsx"
             ],
-            "time": "2019-12-01T23:13:51+00:00"
+            "time": "2020-03-02T13:09:03+00:00"
         },
         {
             "name": "phpoption/phpoption",
@@ -4009,16 +4009,16 @@
         },
         {
             "name": "rap2hpoutre/laravel-log-viewer",
-            "version": "v1.3.3",
+            "version": "v1.4.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/rap2hpoutre/laravel-log-viewer.git",
-                "reference": "031ed45cd09814f5ab3c03a235b4511994911683"
+                "reference": "3506baaddbe5661fc4482b048db2ec5cfc5f9025"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/031ed45cd09814f5ab3c03a235b4511994911683",
-                "reference": "031ed45cd09814f5ab3c03a235b4511994911683",
+                "url": "https://api.github.com/repos/rap2hpoutre/laravel-log-viewer/zipball/3506baaddbe5661fc4482b048db2ec5cfc5f9025",
+                "reference": "3506baaddbe5661fc4482b048db2ec5cfc5f9025",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4028,7 +4028,7 @@
                 ]
             },
             "require": {
-                "illuminate/support": "4.2.*|5.*|^6.0",
+                "illuminate/support": "4.2.*|5.*|^6.0|^7.0",
                 "php": ">=5.4.0"
             },
             "require-dev": {
@@ -4070,20 +4070,20 @@
                 "logging",
                 "lumen"
             ],
-            "time": "2019-12-03T22:00:29+00:00"
+            "time": "2020-03-05T20:25:07+00:00"
         },
         {
             "name": "riverslei/payment",
-            "version": "v5.0.0",
+            "version": "v5.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/helei112g/payment.git",
-                "reference": "cea25ef54cbcf7a1707a7ce1940ed5cfcda195e3"
+                "reference": "a9c222693f888b15337758486f56a9ea6ee9d31f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/helei112g/payment/zipball/cea25ef54cbcf7a1707a7ce1940ed5cfcda195e3",
-                "reference": "cea25ef54cbcf7a1707a7ce1940ed5cfcda195e3",
+                "url": "https://api.github.com/repos/helei112g/payment/zipball/a9c222693f888b15337758486f56a9ea6ee9d31f",
+                "reference": "a9c222693f888b15337758486f56a9ea6ee9d31f",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4133,7 +4133,7 @@
                 "支付宝支付",
                 "集成支付接口SDK"
             ],
-            "time": "2020-02-03T07:50:08+00:00"
+            "time": "2020-02-29T11:53:41+00:00"
         },
         {
             "name": "seld/jsonlint",
@@ -4242,16 +4242,16 @@
         },
         {
             "name": "spatie/laravel-permission",
-            "version": "3.8.0",
+            "version": "3.11.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/laravel-permission.git",
-                "reference": "2339b6fae8f8aa5af047e1a0c54b6fb37546058a"
+                "reference": "e90ed6242a8fa29735529160b9c21cb77b233e7f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/2339b6fae8f8aa5af047e1a0c54b6fb37546058a",
-                "reference": "2339b6fae8f8aa5af047e1a0c54b6fb37546058a",
+                "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/e90ed6242a8fa29735529160b9c21cb77b233e7f",
+                "reference": "e90ed6242a8fa29735529160b9c21cb77b233e7f",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4265,11 +4265,11 @@
                 "illuminate/container": "^5.8|^6.0|^7.0",
                 "illuminate/contracts": "^5.8|^6.0|^7.0",
                 "illuminate/database": "^5.8|^6.0|^7.0",
-                "php": "^7.2"
+                "php": "^7.2.5"
             },
             "require-dev": {
                 "orchestra/testbench": "^3.8|^4.0|^5.0",
-                "phpunit/phpunit": "^8.0",
+                "phpunit/phpunit": "^8.0|^9.0",
                 "predis/predis": "^1.1"
             },
             "type": "library",
@@ -4312,7 +4312,7 @@
                 "security",
                 "spatie"
             ],
-            "time": "2020-02-18T21:16:24+00:00"
+            "time": "2020-03-03T21:31:02+00:00"
         },
         {
             "name": "swiftmailer/swiftmailer",
@@ -4384,16 +4384,16 @@
         },
         {
             "name": "symfony/console",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "f512001679f37e6a042b51897ed24a2f05eba656"
+                "reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/f512001679f37e6a042b51897ed24a2f05eba656",
-                "reference": "f512001679f37e6a042b51897ed24a2f05eba656",
+                "url": "https://api.github.com/repos/symfony/console/zipball/4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
+                "reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4462,20 +4462,20 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-25T12:44:29+00:00"
+            "time": "2020-02-24T13:10:00+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v5.0.4",
+            "version": "v5.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f"
+                "reference": "a0b51ba9938ccc206d9284de7eb527c2d4550b44"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/ff60c90cb7950b592ebc84ad1289d0345bf24f9f",
-                "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/a0b51ba9938ccc206d9284de7eb527c2d4550b44",
+                "reference": "a0b51ba9938ccc206d9284de7eb527c2d4550b44",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4521,20 +4521,20 @@
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T14:08:26+00:00"
+            "time": "2020-02-04T09:41:09+00:00"
         },
         {
             "name": "symfony/debug",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/debug.git",
-                "reference": "20236471058bbaa9907382500fc14005c84601f0"
+                "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/20236471058bbaa9907382500fc14005c84601f0",
-                "reference": "20236471058bbaa9907382500fc14005c84601f0",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21",
+                "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4583,20 +4583,20 @@
             ],
             "description": "Symfony Debug Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-25T12:44:29+00:00"
+            "time": "2020-02-23T14:41:43+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1"
+                "reference": "89aa4b9ac6f1f35171b8621b24f60477312085be"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/d2721499ffcaf246a743e01cdf6696d3d5dd74c1",
-                "reference": "d2721499ffcaf246a743e01cdf6696d3d5dd74c1",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/89aa4b9ac6f1f35171b8621b24f60477312085be",
+                "reference": "89aa4b9ac6f1f35171b8621b24f60477312085be",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4608,7 +4608,7 @@
             "require": {
                 "php": "^7.1.3",
                 "psr/log": "~1.0",
-                "symfony/debug": "^4.4",
+                "symfony/debug": "^4.4.5",
                 "symfony/var-dumper": "^4.4|^5.0"
             },
             "require-dev": {
@@ -4645,20 +4645,20 @@
             ],
             "description": "Symfony ErrorHandler Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-27T09:48:47+00:00"
+            "time": "2020-02-26T11:45:31+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b"
+                "reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9e3de195e5bc301704dd6915df55892f6dfc208b",
-                "reference": "9e3de195e5bc301704dd6915df55892f6dfc208b",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4ad8e149799d3128621a3a1f70e92b9897a8930d",
+                "reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4721,7 +4721,7 @@
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-10T21:54:01+00:00"
+            "time": "2020-02-04T09:32:40+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
@@ -4789,7 +4789,7 @@
         },
         {
             "name": "symfony/filesystem",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/filesystem.git",
@@ -4845,16 +4845,16 @@
         },
         {
             "name": "symfony/finder",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "3a50be43515590faf812fbd7708200aabc327ec3"
+                "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3",
-                "reference": "3a50be43515590faf812fbd7708200aabc327ec3",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
+                "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4896,20 +4896,20 @@
             ],
             "description": "Symfony Finder Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-04T13:00:46+00:00"
+            "time": "2020-02-14T07:42:58+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "491a20dfa87e0b3990170593bc2de0bb34d828a5"
+                "reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/491a20dfa87e0b3990170593bc2de0bb34d828a5",
-                "reference": "491a20dfa87e0b3990170593bc2de0bb34d828a5",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7e41b4fcad4619535f45f8bfa7744c4f384e1648",
+                "reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -4957,20 +4957,20 @@
             ],
             "description": "Symfony HttpFoundation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-31T09:11:17+00:00"
+            "time": "2020-02-13T19:40:01+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5"
+                "reference": "8c8734486dada83a6041ab744709bdc1651a8462"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/62116a9c8fb15faabb158ad9cb785c353c2572e5",
-                "reference": "62116a9c8fb15faabb158ad9cb785c353c2572e5",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8c8734486dada83a6041ab744709bdc1651a8462",
+                "reference": "8c8734486dada83a6041ab744709bdc1651a8462",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5053,20 +5053,20 @@
             ],
             "description": "Symfony HttpKernel Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-31T12:45:06+00:00"
+            "time": "2020-02-29T10:31:38+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v5.0.4",
+            "version": "v5.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59"
+                "reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/2a3c7fee1f1a0961fa9cf360d5da553d05095e59",
-                "reference": "2a3c7fee1f1a0961fa9cf360d5da553d05095e59",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
+                "reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5121,7 +5121,7 @@
                 "mime",
                 "mime-type"
             ],
-            "time": "2020-01-04T14:08:26+00:00"
+            "time": "2020-02-04T09:41:09+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
@@ -5512,16 +5512,16 @@
         },
         {
             "name": "symfony/process",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36"
+                "reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/f5697ab4cb14a5deed7473819e63141bf5352c36",
-                "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36",
+                "url": "https://api.github.com/repos/symfony/process/zipball/bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
+                "reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5563,20 +5563,20 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-09T09:50:08+00:00"
+            "time": "2020-02-07T20:06:44+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a"
+                "reference": "4124d621d0e445732520037f888a0456951bde8c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/7bf4e38573728e317b926ca4482ad30470d0e86a",
-                "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/4124d621d0e445732520037f888a0456951bde8c",
+                "reference": "4124d621d0e445732520037f888a0456951bde8c",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5645,7 +5645,7 @@
                 "uri",
                 "url"
             ],
-            "time": "2020-01-08T17:29:02+00:00"
+            "time": "2020-02-25T12:41:09+00:00"
         },
         {
             "name": "symfony/service-contracts",
@@ -5713,16 +5713,16 @@
         },
         {
             "name": "symfony/translation",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c"
+                "reference": "0a19a77fba20818a969ef03fdaf1602de0546353"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c",
-                "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/0a19a77fba20818a969ef03fdaf1602de0546353",
+                "reference": "0a19a77fba20818a969ef03fdaf1602de0546353",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5791,7 +5791,7 @@
             ],
             "description": "Symfony Translation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-01-15T13:29:06+00:00"
+            "time": "2020-02-04T09:32:40+00:00"
         },
         {
             "name": "symfony/translation-contracts",
@@ -5858,16 +5858,16 @@
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v4.4.4",
+            "version": "v4.4.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "46b53fd714568af343953c039ff47b67ce8af8d6"
+                "reference": "2572839911702b0405479410ea7a1334bfab0b96"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/46b53fd714568af343953c039ff47b67ce8af8d6",
-                "reference": "46b53fd714568af343953c039ff47b67ce8af8d6",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96",
+                "reference": "2572839911702b0405479410ea7a1334bfab0b96",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5936,7 +5936,7 @@
                 "debug",
                 "dump"
             ],
-            "time": "2020-01-25T12:44:29+00:00"
+            "time": "2020-02-24T13:10:00+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
@@ -6666,16 +6666,16 @@
         },
         {
             "name": "phpdocumentor/reflection-docblock",
-            "version": "5.0.0",
+            "version": "5.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f"
+                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/a48807183a4b819072f26e347bbd0b5199a9d15f",
-                "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
+                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -6721,20 +6721,20 @@
                 }
             ],
             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
-            "time": "2020-02-09T09:16:15+00:00"
+            "time": "2020-02-22T12:28:44+00:00"
         },
         {
             "name": "phpdocumentor/type-resolver",
-            "version": "1.0.1",
+            "version": "1.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
+                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
-                "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
+                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -6744,13 +6744,12 @@
                 ]
             },
             "require": {
-                "php": "^7.1",
+                "php": "^7.2",
                 "phpdocumentor/reflection-common": "^2.0"
             },
             "require-dev": {
-                "ext-tokenizer": "^7.1",
-                "mockery/mockery": "~1",
-                "phpunit/phpunit": "^7.0"
+                "ext-tokenizer": "^7.2",
+                "mockery/mockery": "~1"
             },
             "type": "library",
             "extra": {
@@ -6774,20 +6773,20 @@
                 }
             ],
             "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
-            "time": "2019-08-22T18:11:29+00:00"
+            "time": "2020-02-18T18:59:58+00:00"
         },
         {
             "name": "phpspec/prophecy",
-            "version": "v1.10.2",
+            "version": "v1.10.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9"
+                "reference": "451c3cd1418cf640de218914901e51b064abb093"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
-                "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+                "reference": "451c3cd1418cf640de218914901e51b064abb093",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -6843,7 +6842,7 @@
                 "spy",
                 "stub"
             ],
-            "time": "2020-01-20T15:57:02+00:00"
+            "time": "2020-03-05T15:02:03+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",

+ 44 - 39
resources/views/admin/index.blade.php

@@ -4,9 +4,9 @@
 @endsection
 @section('content')
 	<div class="page-content container-fluid">
-		<div class="row" data-plugin="matchHeight" data-by-row="true">
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList" class="card card-shadow h-full">
+		<div class="row" data-by-row="true">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-account"></i>
@@ -18,8 +18,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?enable=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?enable=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-info">
 							<i class="icon md-account"></i>
@@ -31,8 +31,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?active=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?active=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-success">
 							<i class="icon md-account"></i>
@@ -44,8 +44,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?unActive=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?unActive=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-warning">
 							<i class="icon md-account"></i>
@@ -57,8 +57,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?online=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?online=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-success">
 							<i class="icon md-account"></i>
@@ -70,8 +70,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?expireWarning=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?expireWarning=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-danger">
 							<i class="icon md-account"></i>
@@ -83,8 +83,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?largeTraffic=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?largeTraffic=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-warning">
 							<i class="icon md-account"></i>
@@ -96,8 +96,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userList?flowAbnormal=1" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userList?flowAbnormal=1" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-danger">
 							<i class="icon md-account"></i>
@@ -109,8 +109,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/nodeList" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/nodeList" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-cloud"></i>
@@ -122,8 +122,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/nodeList?status=0" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/nodeList?status=0" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-info">
 							<i class="icon md-cloud-off"></i>
@@ -135,8 +135,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/trafficLog" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/trafficLog" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-time-countdown"></i>
@@ -148,8 +148,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/trafficLog" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/trafficLog" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-time-countdown"></i>
@@ -161,8 +161,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/orderList" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/orderList" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-ticket-star"></i>
@@ -174,8 +174,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/orderList" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/orderList" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-info">
 							<i class="icon md-ticket-star"></i>
@@ -187,8 +187,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/orderList?status=2" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/orderList?status=2" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-success">
 							<i class="icon md-ticket-star"></i>
@@ -200,8 +200,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/orderList?status=2&range_time={{date('Y-m-d 00:00:00') . ',' . date('Y-m-d 23:59:59')}}" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/orderList?status=2&range_time={{date('Y-m-d 00:00:00') . ',' . date('Y-m-d 23:59:59')}}" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-success">
 							<i class="icon md-ticket-star"></i>
@@ -213,8 +213,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<div class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<div class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-money"></i>
@@ -226,8 +226,8 @@
 					</div>
 				</div>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<a href="/admin/userRebateList" class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<a href="/admin/userRebateList" class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-warning">
 							<i class="icon md-money"></i>
@@ -239,8 +239,8 @@
 					</div>
 				</a>
 			</div>
-			<div class="col-xl-3 col-md-6 info-panel pb-30">
-				<div class="card card-shadow h-full">
+			<div class="col-xl-3 col-md-6 info-panel">
+				<div class="card card-shadow">
 					<div class="card-block bg-white">
 						<button type="button" class="btn btn-floating btn-sm btn-dark">
 							<i class="icon md-money"></i>
@@ -258,4 +258,9 @@
 @section('script')
 	<script src="/assets/global/vendor/matchheight/jquery.matchHeight-min.js" type="text/javascript"></script>
 	<script src="/assets/global/js/Plugin/matchheight.js" type="text/javascript"></script>
+	<script type="text/javascript">
+        $(function () {
+            $('.card').matchHeight();
+        });
+	</script>
 @endsection

+ 20 - 9
resources/views/admin/nodeList.blade.php

@@ -2,8 +2,8 @@
 @section('css')
 	<link href="/assets/global/vendor/bootstrap-table/bootstrap-table.min.css" type="text/css" rel="stylesheet">
 	<style>
-		#swal2-content{
-			display:grid !important;
+		#swal2-content {
+			display: grid !important;
 		}
 	</style>
 @endsection
@@ -67,7 +67,7 @@
 								</td>
 								<td>
 									<div class="btn-group">
-										<a href="javascript:testNode('{{$node->id}}','{{$node->name}}')" class="btn btn-primary"><i class="icon wb-signal"></i></a>
+										<a href="javascript:testNode('{{$node->id}}')" class="btn btn-primary"><i id="node{{$node->id}}" class="icon wb-signal"></i></a>
 										<a href="/admin/editNode?id={{$node->id}}&page={{Request::get('page', 1)}}" class="btn btn-primary"><i class="icon wb-edit"></i></a>
 										<a href="javascript:delNode('{{$node->id}}','{{$node->name}}')" class="btn btn-danger"><i class="icon wb-trash"></i></a>
 										<a href="/admin/nodeMonitor/{{$node->id}})" class="btn btn-primary"><i class="icon wb-stats-bars"></i></a>
@@ -99,12 +99,23 @@
 	<script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js" type="text/javascript"></script>
 	<script type="text/javascript">
         //节点连通性测试
-        function testNode(id, name) {
-            $.post("/admin/nodeList", {id: id, _token: '{{csrf_token()}}'}, function (ret) {
-                if (ret.status === 'success') {
-                    swal.fire({title: ret.title, type: 'info', html: '<table class="my-20"><thead class="thead-default"><tr><th> ICMP </th> <th> TCP </th></thead><tbody><tr><td>' + ret.message[0] + '</td><td>' + ret.message[1] + '</td></tr></tbody></table>', showConfirmButton: false})
-                } else {
-                    swal.fire({title: ret.title, type: "error"})
+        function testNode(id) {
+            $.ajax({
+                type: "POST",
+                url: '/admin/nodeList',
+                data: {_token: '{{csrf_token()}}', id: id},
+                beforeSend: function () {
+                    $("#node" + id).removeClass("wb-signal").addClass("wb-loop icon-spin");
+                },
+                success: function (ret) {
+                    if (ret.status === 'success') {
+                        swal.fire({title: ret.title, type: 'info', html: '<table class="my-20"><thead class="thead-default"><tr><th> ICMP </th> <th> TCP </th></thead><tbody><tr><td>' + ret.message[0] + '</td><td>' + ret.message[1] + '</td></tr></tbody></table>', showConfirmButton: false})
+                    } else {
+                        swal.fire({title: ret.title, type: "error"})
+                    }
+                },
+                complete: function () {
+                    $("#node" + id).removeClass("wb-loop icon-spin").addClass("wb-signal");
                 }
             });
         }

+ 2 - 7
resources/views/ticket/replyTicket.blade.php

@@ -127,6 +127,7 @@
             swal.fire({
                 title: '确定回复工单?',
                 type: 'question',
+                allowEnterKey: false,
                 showCancelButton: true,
                 cancelButtonText: '{{trans('home.ticket_close')}}',
                 confirmButtonText: '{{trans('home.ticket_confirm')}}',
@@ -138,13 +139,7 @@
                         content: content
                     }, function (ret) {
                         if (ret.status === 'success') {
-                            swal.fire({
-                                title: ret.message,
-                                type: 'success',
-                                timer: 1000,
-                                showConfirmButton: false
-                            })
-                                .then(() => window.location.reload())
+                            swal.fire({title: ret.message, type: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload())
                         } else {
                             swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
                         }

+ 6 - 6
resources/views/user/index.blade.php

@@ -121,7 +121,7 @@
 					</div>
 				@endif
 			</div>
-			<div class="col-xxl-9 col-xl-4col-xl-8 col-lg-7 col-md-6 col-12">
+			<div class="col-xxl-9 col-xl-8 col-lg-7 col-md-6 col-12">
 				<div class="row" data-plugin="matchHeight" data-by-row="true">
 					<div class="col-xl-4 col-lg-6 pb-30">
 						<div class="card card-shadow h-full">
@@ -133,16 +133,16 @@
 							</div>
 						</div>
 					</div>
-					@if(\App\Components\Helpers::systemConfig()['is_push_bear'] && \App\Components\Helpers::systemConfig()['push_bear_qrcode'])
-						<div class="col-xl-4 col-lg-6 pb-30">
-							<div class="card card-shadow text-center h-full">
-								<div class="card-block">
+					<div class="col-xl-4 col-lg-6 pb-30">
+						<div class="card card-shadow text-center h-full">
+							<div class="card-block">
+								@if(\App\Components\Helpers::systemConfig()['is_push_bear'] && \App\Components\Helpers::systemConfig()['push_bear_qrcode'])
 									<h4 class="card-title"><i class="wb-bell mr-10 yellow-600"></i>微信公告推送</h4>
 									<p class="card-text" id="subscribe_qrcode"></p>
+								@endif
 								</div>
 							</div>
 						</div>
-					@endif
 				</div>
 				<div class="row" data-plugin="matchHeight" data-by-row="true">
 					<div class="col-xxl-6 mb-35">

+ 49 - 32
resources/views/user/nodeList.blade.php

@@ -32,9 +32,9 @@
 									{{$node->desc}}
 								</blockquote>
 								<p class="font-size-14">
-									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','code')"><i class="icon fa-code"></i></button>
-									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','qrcode')"><i class="icon fa-qrcode"></i></button>
-									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','text')"><i class="icon fa-list"></i></button>
+									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','code')"><i id="code{{$node->id}}" class="icon fa-code"></i></button>
+									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','qrcode')"><i id="qrcode{{$node->id}}" class="icon fa-qrcode"></i></button>
+									<button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','text')"><i id="text{{$node->id}}" class="icon fa-list"></i></button>
 								</p>
 							</div>
 						</div>
@@ -44,41 +44,58 @@
 		</div>
 	</div>
 @endsection @section('script')
+	<script src="/assets/global/vendor/matchheight/jquery.matchHeight-min.js" type="text/javascript"></script>
+	<script src="/assets/global/js/Plugin/matchheight.js" type="text/javascript"></script>
 	<script src="/assets/custom/Plugin/jquery-qrcode/jquery.qrcode.min.js" type="text/javascript"></script>
 	<script src="/assets/global/js/Plugin/webui-popover.js" type="text/javascript"></script>
 
 	<script type="text/javascript">
+        $(function() {
+            $('.card').matchHeight();
+        });
         function getInfo(id, type) {
-            $.post("/nodeList", {_token: '{{csrf_token()}}', id: id, type: type}, function (ret) {
-                if (ret.status === 'success') {
-                    switch (type) {
-                        case 'code':
-                            swal.fire({
-                                html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data + '</textarea>' +
-                                    '<a href="' + ret.data + '" class="btn btn-danger btn-block mt-10">打开' + ret.title + '</a>',
-                                showConfirmButton: false
-                            });
-                            break;
-                        case 'qrcode':
-                            swal.fire({
-                                title: '{{trans('home.scan_qrcode')}}',
-                                html: '<div id="qrcode"></div>',
-                                onBeforeOpen: () => {
-                                    $("#qrcode").qrcode({text: ret.data});
-                                },
-                                showConfirmButton: false
-                            });
-                            break;
-                        case 'text':
-                            swal.fire({
-                                title: '{{trans('home.setting_info')}}',
-                                html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data + '</textarea>',
-                                showConfirmButton: false
-                            });
-                            break;
-                        default:
-                            swal.fire({title: ret.title, text: ret.data});
+            const oldClass = $("#" + type + id).attr("class");
+            $.ajax({
+                type: "POST",
+                url: '/nodeList',
+                data: {_token: '{{csrf_token()}}', id: id, type: type},
+                beforeSend: function () {
+                    $("#" + type + id).removeAttr("class").addClass("icon wb-loop icon-spin");
+                },
+                success: function (ret) {
+                    if (ret.status === 'success') {
+                        switch (type) {
+                            case 'code':
+                                swal.fire({
+                                    html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data + '</textarea>' +
+                                        '<a href="' + ret.data + '" class="btn btn-danger btn-block mt-10">打开' + ret.title + '</a>',
+                                    showConfirmButton: false
+                                });
+                                break;
+                            case 'qrcode':
+                                swal.fire({
+                                    title: '{{trans('home.scan_qrcode')}}',
+                                    html: '<div id="qrcode"></div>',
+                                    onBeforeOpen: () => {
+                                        $("#qrcode").qrcode({text: ret.data});
+                                    },
+                                    showConfirmButton: false
+                                });
+                                break;
+                            case 'text':
+                                swal.fire({
+                                    title: '{{trans('home.setting_info')}}',
+                                    html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data + '</textarea>',
+                                    showConfirmButton: false
+                                });
+                                break;
+                            default:
+                                swal.fire({title: ret.title, text: ret.data});
+                        }
                     }
+                },
+                complete: function () {
+                    $("#" + type + id).removeAttr("class").addClass(oldClass);
                 }
             });
         }

+ 15 - 14
resources/views/user/profile.blade.php

@@ -2,18 +2,6 @@
 @section('content')
 	<div class="page-content container">
 		<div class="row">
-			@if (Session::has('successMsg'))
-				<div class="alert alert-success alert-dismissable">
-					<button class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-					{{Session::get('successMsg')}}
-				</div>
-			@endif
-			@if($errors->any())
-				<div class="alert alert-danger alert-dismissable">
-					<button class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-					<strong>{{trans('home.error')}}:</strong> {{$errors->first()}}
-				</div>
-			@endif
 			<div class="col-lg-5">
 				<div class="card">
 					<div class="card-header white bg-cyan-600 p-30 clearfix">
@@ -34,6 +22,18 @@
 			</div>
 			<div class="col-lg-7">
 				<div class="panel">
+					@if (Session::has('successMsg'))
+						<div class="alert alert-success alert-dismissable">
+							<button class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+							{{Session::get('successMsg')}}
+						</div>
+					@endif
+					@if($errors->any())
+						<div class="alert alert-danger alert-dismissable">
+							<button class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+							<strong>{{trans('home.error')}}:</strong> {{$errors->first()}}
+						</div>
+					@endif
 					<div class="panel-body nav-tabs-animate nav-tabs-horizontal" data-plugin="tabs">
 						<ul class="nav nav-tabs nav-tabs-line" role="tablist">
 							<li class="nav-item" role="presentation">
@@ -67,12 +67,12 @@
 								<form action="/profile" method="post" enctype="multipart/form-data" class="form-horizontal">
 									<div class="form-group row">
 										<label for="wechat" class="col-md-2 col-form-label">{{trans('home.wechat')}}</label>
-										<input type="text" class="form-control col-md-5 round" name="wechat" id="wechat" value="{{Auth::user()->wechat}}" required/>
+										<input type="text" class="form-control col-md-5 round" name="wechat" id="wechat" value="{{Auth::user()->wechat}}"/>
 										{{csrf_field()}}
 									</div>
 									<div class="form-group row">
 										<label for="qq" class="col-md-2 col-form-label">QQ</label>
-										<input type="number" class="form-control col-md-5 round" name="qq" id="qq" value="{{Auth::user()->qq}}" required/>
+										<input type="number" class="form-control col-md-5 round" name="qq" id="qq" value="{{Auth::user()->qq}}"/>
 									</div>
 									<div class="form-actions">
 										<button type="submit" class="btn btn-info">{{trans('home.submit')}}</button>
@@ -100,4 +100,5 @@
 @endsection
 @section('script')
 	<script src="/assets/global/js/Plugin/tabs.js" type="text/javascript"></script>
+	<script src="/assets/custom/jump-tab.js" type="text/javascript"></script>
 @endsection

+ 1 - 2
resources/views/user/replyTicket.blade.php

@@ -137,8 +137,7 @@
                         content: content
                     }, function (ret) {
                         if (ret.status === 'success') {
-                            swal.fire({title: ret.message, type: 'success', timer: 800, showConfirmButton: false})
-                                .then(() => window.location.reload())
+                            swal.fire({title: ret.message, type: 'success', timer: 800, showConfirmButton: false}).then(() => window.location.reload())
                         } else {
                             swal.fire({title: ret.message, type: "error"}).then(() => window.location.reload())
                         }