Преглед изворни кода

修复与规范日期有关代码

1. 修复原版本中节点/用户每日流量日志记录错误;
原版:在30号看到的29号的总流量,其实是28号当天产生的流量;依次类推全部流量都错位1天;
现:日流量表精确到当天,天流量表精确到当前;
2. 修复原流量折线图的日期-流量配对错误;
原版:并不是按照记录日期,而是按照有的记录;
现:按照记录日期排序;
----- 以上皆为SSRPanel中遗留的问题代码-----
3. 简化,规范化日期转换
4. 清理多余代码;
兔姬桑 пре 4 година
родитељ
комит
8f06a74b48
100 измењених фајлова са 840 додато и 755 уклоњено
  1. 0 1
      .gitignore
  2. 1 3
      app/Components/Helpers.php
  3. 3 3
      app/Components/NetworkDetection.php
  4. 0 2
      app/Components/PushNotification.php
  5. 1 1
      app/Console/Commands/AutoClearLog.php
  6. 7 8
      app/Console/Commands/AutoJob.php
  7. 3 4
      app/Console/Commands/AutoReportNode.php
  8. 4 6
      app/Console/Commands/AutoStatisticsNodeDailyTraffic.php
  9. 4 6
      app/Console/Commands/AutoStatisticsNodeHourlyTraffic.php
  10. 7 9
      app/Console/Commands/AutoStatisticsUserDailyTraffic.php
  11. 4 6
      app/Console/Commands/AutoStatisticsUserHourlyTraffic.php
  12. 2 6
      app/Console/Commands/ServiceTimer.php
  13. 1 1
      app/Console/Commands/UserExpireAutoWarning.php
  14. 4 4
      app/Console/Commands/UserTrafficAbnormalAutoWarning.php
  15. 101 0
      app/Console/Commands/fixDailyTrafficLogError.php
  16. 1 1
      app/Console/Commands/updateUserName.php
  17. 10 2
      app/Console/Kernel.php
  18. 3 5
      app/Exceptions/Handler.php
  19. 4 4
      app/Http/Controllers/Admin/AffiliateController.php
  20. 4 6
      app/Http/Controllers/Admin/CouponController.php
  21. 4 4
      app/Http/Controllers/Admin/GroupController.php
  22. 5 4
      app/Http/Controllers/Admin/MarketingController.php
  23. 6 6
      app/Http/Controllers/Admin/RuleController.php
  24. 5 9
      app/Http/Controllers/Admin/SensitiveWordsController.php
  25. 13 5
      app/Http/Controllers/Admin/ShopController.php
  26. 4 4
      app/Http/Controllers/Admin/SubscribeController.php
  27. 10 10
      app/Http/Controllers/Admin/TicketController.php
  28. 4 9
      app/Http/Controllers/Admin/ToolsController.php
  29. 115 139
      app/Http/Controllers/AdminController.php
  30. 6 6
      app/Http/Controllers/Api/LoginController.php
  31. 4 4
      app/Http/Controllers/Api/WebApi/BaseController.php
  32. 2 2
      app/Http/Controllers/Api/WebApi/TrojanController.php
  33. 3 3
      app/Http/Controllers/Api/WebApi/V2RayController.php
  34. 2 2
      app/Http/Controllers/Api/WebApi/VNetController.php
  35. 35 9
      app/Http/Controllers/AuthController.php
  36. 1 1
      app/Http/Controllers/Controller.php
  37. 1 1
      app/Http/Controllers/Gateway/AbstractPayment.php
  38. 1 1
      app/Http/Controllers/Gateway/Local.php
  39. 2 2
      app/Http/Controllers/Gateway/PayPal.php
  40. 10 10
      app/Http/Controllers/NodeController.php
  41. 6 6
      app/Http/Controllers/PaymentController.php
  42. 5 5
      app/Http/Controllers/ServiceController.php
  43. 14 21
      app/Http/Controllers/User/AffiliateController.php
  44. 1 1
      app/Http/Controllers/User/SubscribeController.php
  45. 31 24
      app/Http/Controllers/UserController.php
  46. 1 0
      app/Http/Middleware/Authenticate.php
  47. 2 2
      app/Http/Middleware/WebApi.php
  48. 1 1
      app/Mail/nodeCrashWarning.php
  49. 18 18
      app/Models/Article.php
  50. 0 1
      app/Models/Config.php
  51. 22 22
      app/Models/Coupon.php
  52. 7 9
      app/Models/CouponLog.php
  53. 28 28
      app/Models/Goods.php
  54. 18 19
      app/Models/Invite.php
  55. 8 9
      app/Models/Marketing.php
  56. 8 8
      app/Models/NodeAuth.php
  57. 5 5
      app/Models/NodeCertificate.php
  58. 5 5
      app/Models/NodeRule.php
  59. 9 9
      app/Models/NotificationLog.php
  60. 6 6
      app/Models/Order.php
  61. 13 14
      app/Models/Payment.php
  62. 8 9
      app/Models/PaymentCallback.php
  63. 7 7
      app/Models/ProductsPool.php
  64. 10 10
      app/Models/ReferralApply.php
  65. 12 12
      app/Models/ReferralLog.php
  66. 8 8
      app/Models/RuleGroup.php
  67. 5 5
      app/Models/RuleGroupNode.php
  68. 6 7
      app/Models/RuleLog.php
  69. 5 4
      app/Models/SsNode.php
  70. 0 1
      app/Models/SsNodeInfo.php
  71. 0 1
      app/Models/SsNodeOnlineLog.php
  72. 7 8
      app/Models/SsNodePing.php
  73. 9 11
      app/Models/SsNodeTrafficDaily.php
  74. 9 10
      app/Models/SsNodeTrafficHourly.php
  75. 11 12
      app/Models/Ticket.php
  76. 9 9
      app/Models/TicketReply.php
  77. 17 9
      app/Models/User.php
  78. 8 8
      app/Models/UserBanLog.php
  79. 2 2
      app/Models/UserCreditLog.php
  80. 1 1
      app/Models/UserGroup.php
  81. 10 11
      app/Models/UserLoginLog.php
  82. 10 10
      app/Models/UserSubscribe.php
  83. 4 3
      app/Models/UserSubscribeLog.php
  84. 10 11
      app/Models/UserTrafficDaily.php
  85. 10 11
      app/Models/UserTrafficHourly.php
  86. 0 1
      app/Models/UserTrafficLog.php
  87. 2 4
      app/Models/UserTrafficModifyLog.php
  88. 8 9
      app/Models/Verify.php
  89. 6 7
      app/Models/VerifyCode.php
  90. 1 1
      app/helpers.php
  91. 27 22
      composer.lock
  92. BIN
      composer.phar
  93. 1 1
      resources/lang/en/home.php
  94. 1 1
      resources/lang/ja/home.php
  95. 1 1
      resources/lang/ko/home.php
  96. 1 1
      resources/lang/zh-CN/home.php
  97. 1 1
      resources/lang/zh-tw/home.php
  98. 2 2
      resources/views/admin/index.blade.php
  99. 2 0
      resources/views/admin/logs/callbackList.blade.php
  100. 4 2
      resources/views/admin/logs/orderList.blade.php

+ 0 - 1
.gitignore

@@ -21,4 +21,3 @@ yarn-error.log
 .phpunit.result.cache
 _ide_helper_models.php
 _ide_helper.php
-/tests

+ 1 - 3
app/Components/Helpers.php

@@ -102,9 +102,7 @@ class Helpers {
 
 	// 获取系统配置
 	public static function systemConfig(): array {
-		foreach(Config::all() as $vo){
-			$data[$vo->name] = $vo->value;
-		}
+		$data = Config::all()->pluck('value', 'name')->toArray();
 		$data['is_onlinePay'] = ($data['is_AliPay'] || $data['is_QQPay'] || $data['is_WeChatPay'] || $data['is_otherPay'])?: 0;
 
 		return $data;

+ 3 - 3
app/Components/NetworkDetection.php

@@ -9,9 +9,9 @@ class NetworkDetection {
 	/**
 	 * 用api.50network.com进行节点阻断检测
 	 *
-	 * @param  string   $ip    被检测的IP
-	 * @param  boolean  $type  TRUE 为ICMP,FALSE 为tcp
-	 * @param  int      $port  检测端口,默认为空
+	 * @param  string    $ip    被检测的IP
+	 * @param  boolean   $type  TRUE 为ICMP,FALSE 为tcp
+	 * @param  int|null  $port  检测端口,默认为空
 	 *
 	 * @return bool|string
 	 */

+ 0 - 2
app/Components/PushNotification.php

@@ -11,10 +11,8 @@ class PushNotification {
 		switch(Helpers::systemConfig()['is_notification']){
 			case 'serverChan':
 				return self::ServerChan($title, $content);
-				break;
 			case 'bark':
 				return self::Bark($title, $content);
-				break;
 			default:
 				return false;
 		}

+ 1 - 1
app/Console/Commands/AutoClearLog.php

@@ -71,7 +71,7 @@ class AutoClearLog extends Command {
 			                  ->delete();
 
 			// 清除用户封禁日志
-			UserBanLog::query()->where('created_at', '<=', date('Y-m-d H:i:s', strtotime("-1 month")))->delete();
+			UserBanLog::query()->where('created_at', '<=', date('Y-m-d H:i:s', strtotime("-3 month")))->delete();
 
 			// 清除用户连接IP
 			SsNodeIp::query()->where('created_at', '<=', strtotime("-1 month"))->delete();

+ 7 - 8
app/Console/Commands/AutoJob.php

@@ -168,7 +168,7 @@ class AutoJob extends Command {
 		Coupon::query()->whereStatus(0)->where('available_end', '<=', time())->update(['status' => 2]);
 
 		// 用尽的优惠劵
-		Coupon::query()->whereStatus(0)->whereIn('type', [1, 2])->where('usage_count', '=', 0)->update(['status' => 2]);
+		Coupon::query()->whereStatus(0)->whereIn('type', [1, 2])->whereUsageCount(0)->update(['status' => 2]);
 
 		// 邀请码到期自动置无效
 		Invite::query()->whereStatus(0)->where('dateline', '<=', date('Y-m-d H:i:s'))->update(['status' => 2]);
@@ -184,8 +184,8 @@ class AutoJob extends Command {
 					$request_times = UserSubscribeLog::query()
 					                                 ->whereSid($subscribe->id)
 					                                 ->where('request_time', '>=',
-						                                 date("Y-m-d H:i:s", strtotime("-24 hours")))
-					                                 ->distinct('request_ip')
+						                                 date("Y-m-d H:i:s", strtotime("-1 days")))
+					                                 ->distinct()
 					                                 ->count('request_ip');
 					if($request_times >= self::$systemConfig['subscribe_ban_times']){
 						UserSubscribe::query()->whereId($subscribe->id)->update([
@@ -233,11 +233,10 @@ class AutoJob extends Command {
 				                                 ->userHourly($user->id)
 				                                 ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
 				                                 ->sum('total');
-				if($totalTraffic >= (self::$systemConfig['traffic_ban_value'] * GB)){
+				if($totalTraffic >= self::$systemConfig['traffic_ban_value'] * GB){
 					User::query()->whereId($user->id)->update([
 						'enable'   => 0,
-						'ban_time' => strtotime(date('Y-m-d H:i:s',
-							strtotime("+".self::$systemConfig['traffic_ban_time']." minutes")))
+						'ban_time' => strtotime("+".self::$systemConfig['traffic_ban_time']." minutes")
 					]);
 
 					// 写入日志
@@ -316,12 +315,12 @@ class AutoJob extends Command {
 	// 检测节点是否离线
 	private function checkNodeStatus(): void {
 		if(self::$systemConfig['is_node_offline']){
-			foreach(SsNode::whereIsRelay(0)->whereStatus(1)->get() as $node){
+			foreach(SsNode::query()->whereIsRelay(0)->whereStatus(1)->get() as $node){
 				// 10分钟内无节点负载信息则认为是后端炸了
 				$nodeTTL = SsNodeInfo::query()
 				                     ->whereNodeId($node->id)
 				                     ->where('log_time', '>=', strtotime("-10 minutes"))
-				                     ->orderByDesc('id')
+				                     ->latest('log_time')
 				                     ->doesntExist();
 				if($nodeTTL && self::$systemConfig['offline_check_times']){
 					// 已通知次数

+ 3 - 4
app/Console/Commands/AutoReportNode.php

@@ -18,13 +18,12 @@ class AutoReportNode extends Command {
 
 		if(Helpers::systemConfig()['node_daily_report']){
 			$nodeList = SsNode::query()->whereStatus(1)->get();
-			if(!$nodeList->isEmpty()){
+			if($nodeList->isNotEmpty()){
 				$msg = "|节点|上行流量|下行流量|合计|\r\n| :------ | :------ | :------ |\r\n";
 				foreach($nodeList as $node){
 					$log = SsNodeTrafficDaily::query()
 					                         ->whereNodeId($node->id)
-					                         ->where('created_at', '>=', date('Y-m-d 00:00:00', strtotime("-1 day")))
-					                         ->where('created_at', '<=', date('Y-m-d 23:59:59', strtotime("-1 day")))
+					                         ->whereDate('created_at', date("Y-m-d", strtotime('-1 days')))
 					                         ->first();
 
 					if($log){
@@ -34,7 +33,7 @@ class AutoReportNode extends Command {
 					}
 				}
 
-				PushNotification::send('节点日报', $msg);
+				PushNotification::send('节点昨日使用情况', $msg);
 			}
 		}
 

+ 4 - 6
app/Console/Commands/AutoStatisticsNodeDailyTraffic.php

@@ -26,15 +26,13 @@ class AutoStatisticsNodeDailyTraffic extends Command {
 	}
 
 	private function statisticsByNode($node_id): void {
-		$start_time = strtotime(date('Y-m-d 00:00:00', strtotime("-1 day")));
-		$end_time = strtotime(date('Y-m-d 23:59:59', strtotime("-1 day")));
-
-		$query = UserTrafficLog::query()->whereNodeId($node_id)->whereBetween('log_time', [$start_time, $end_time]);
+		$query = UserTrafficLog::query()
+		                       ->whereNodeId($node_id)
+		                       ->whereBetween('log_time', [strtotime(date('Y-m-d')), time()]);
 
 		$u = $query->sum('u');
 		$d = $query->sum('d');
 		$total = $u + $d;
-		$traffic = flowAutoShow($total);
 
 		if($total){ // 有数据才记录
 			$obj = new SsNodeTrafficDaily();
@@ -42,7 +40,7 @@ class AutoStatisticsNodeDailyTraffic extends Command {
 			$obj->u = $u;
 			$obj->d = $d;
 			$obj->total = $total;
-			$obj->traffic = $traffic;
+			$obj->traffic = flowAutoShow($total);
 			$obj->save();
 		}
 	}

+ 4 - 6
app/Console/Commands/AutoStatisticsNodeHourlyTraffic.php

@@ -26,15 +26,13 @@ class AutoStatisticsNodeHourlyTraffic extends Command {
 	}
 
 	private function statisticsByNode($node_id): void {
-		$start_time = strtotime(date('Y-m-d H:i:s', strtotime("-1 hour")));
-		$end_time = time();
-
-		$query = UserTrafficLog::query()->whereNodeId($node_id)->whereBetween('log_time', [$start_time, $end_time]);
+		$query = UserTrafficLog::query()
+		                       ->whereNodeId($node_id)
+		                       ->whereBetween('log_time', [strtotime("-1 hour"), time()]);
 
 		$u = $query->sum('u');
 		$d = $query->sum('d');
 		$total = $u + $d;
-		$traffic = flowAutoShow($total);
 
 		if($total){ // 有数据才记录
 			$obj = new SsNodeTrafficHourly();
@@ -42,7 +40,7 @@ class AutoStatisticsNodeHourlyTraffic extends Command {
 			$obj->u = $u;
 			$obj->d = $d;
 			$obj->total = $total;
-			$obj->traffic = $traffic;
+			$obj->traffic = flowAutoShow($total);
 			$obj->save();
 		}
 	}

+ 7 - 9
app/Console/Commands/AutoStatisticsUserDailyTraffic.php

@@ -18,11 +18,11 @@ class AutoStatisticsUserDailyTraffic extends Command {
 
 		foreach(User::query()->activeUser()->get() as $user){
 			// 统计一次所有节点的总和
-			$this->statisticsByNode($user->id);
+			$this->statisticsByUser($user->id);
 
 			// 统计每个节点产生的流量
 			foreach(SsNode::query()->whereStatus(1)->orderBy('id')->get() as $node){
-				$this->statisticsByNode($user->id, $node->id);
+				$this->statisticsByUser($user->id, $node->id);
 			}
 		}
 
@@ -32,11 +32,10 @@ class AutoStatisticsUserDailyTraffic extends Command {
 		Log::info('---【'.$this->description.'】完成---,耗时'.$jobUsedTime.'秒');
 	}
 
-	private function statisticsByNode($user_id, $node_id = 0): void {
-		$start_time = strtotime(date('Y-m-d 00:00:00', strtotime("-1 day")));
-		$end_time = strtotime(date('Y-m-d 23:59:59', strtotime("-1 day")));
-
-		$query = UserTrafficLog::query()->whereUserId($user_id)->whereBetween('log_time', [$start_time, $end_time]);
+	private function statisticsByUser($user_id, $node_id = 0): void {
+		$query = UserTrafficLog::query()
+		                       ->whereUserId($user_id)
+		                       ->whereBetween('log_time', [strtotime(date('Y-m-d')), time()]);
 
 		if($node_id){
 			$query->whereNodeId($node_id);
@@ -45,7 +44,6 @@ class AutoStatisticsUserDailyTraffic extends Command {
 		$u = $query->sum('u');
 		$d = $query->sum('d');
 		$total = $u + $d;
-		$traffic = flowAutoShow($total);
 
 		if($total){ // 有数据才记录
 			$obj = new UserTrafficDaily();
@@ -54,7 +52,7 @@ class AutoStatisticsUserDailyTraffic extends Command {
 			$obj->u = $u;
 			$obj->d = $d;
 			$obj->total = $total;
-			$obj->traffic = $traffic;
+			$obj->traffic = flowAutoShow($total);
 			$obj->save();
 		}
 	}

+ 4 - 6
app/Console/Commands/AutoStatisticsUserHourlyTraffic.php

@@ -33,10 +33,9 @@ class AutoStatisticsUserHourlyTraffic extends Command {
 	}
 
 	private function statisticsByNode($user_id, $node_id = 0): void {
-		$start_time = strtotime(date('Y-m-d H:i:s', strtotime("-1 hour")));
-		$end_time = time();
-
-		$query = UserTrafficLog::query()->whereUserId($user_id)->whereBetween('log_time', [$start_time, $end_time]);
+		$query = UserTrafficLog::query()
+		                       ->whereUserId($user_id)
+		                       ->whereBetween('log_time', [strtotime("-1 hour"), time()]);
 
 		if($node_id){
 			$query->whereNodeId($node_id);
@@ -45,7 +44,6 @@ class AutoStatisticsUserHourlyTraffic extends Command {
 		$u = $query->sum('u');
 		$d = $query->sum('d');
 		$total = $u + $d;
-		$traffic = flowAutoShow($total);
 
 		if($total){ // 有数据才记录
 			$obj = new UserTrafficHourly();
@@ -54,7 +52,7 @@ class AutoStatisticsUserHourlyTraffic extends Command {
 			$obj->u = $u;
 			$obj->d = $d;
 			$obj->total = $total;
-			$obj->traffic = $traffic;
+			$obj->traffic = flowAutoShow($total);
 			$obj->save();
 		}
 	}

+ 2 - 6
app/Console/Commands/ServiceTimer.php

@@ -37,7 +37,7 @@ class ServiceTimer extends Command {
 		                  ->whereHas('goods', static function($q) {
 			                  $q->whereType(2);
 		                  })
-		                  ->where('expire_at', '<=', date('Y-m-d H:i:s'))
+		                  ->where('expired_at', '<=', date('Y-m-d H:i:s'))
 		                  ->get();
 		if($orderList->isNotEmpty()){
 			try{
@@ -73,11 +73,7 @@ class ServiceTimer extends Command {
 						'[定时任务]用户所购商品到期,扣减商品对应的流量');
 
 					// 检查该订单对应用户是否有预支付套餐
-					$prepaidOrder = Order::query()
-					                     ->whereUserId($order->user_id)
-					                     ->whereStatus(3)
-					                     ->orderBy('oid')
-					                     ->first();
+					$prepaidOrder = Order::query()->whereUserId($order->user_id)->whereStatus(3)->oldest()->first();
 
 					if($prepaidOrder){
 						(new ServiceController)->activePrepaidOrder($prepaidOrder->oid);

+ 1 - 1
app/Console/Commands/UserExpireAutoWarning.php

@@ -43,7 +43,7 @@ class UserExpireAutoWarning extends Command {
 			}
 
 			// 计算剩余可用时间
-			$lastCanUseDays = ceil(round(strtotime($user->expire_time) - strtotime(date('Y-m-d H:i:s'))) / Day);
+			$lastCanUseDays = ceil(round(strtotime($user->expire_time) - time()) / Day);
 			if($lastCanUseDays == 0){
 				$title = '账号过期提醒';
 				$content = '您的账号将于今天晚上【24:00】过期。';

+ 4 - 4
app/Console/Commands/UserTrafficAbnormalAutoWarning.php

@@ -36,7 +36,7 @@ class UserTrafficAbnormalAutoWarning extends Command {
 		// 1小时内流量异常用户(多往前取5分钟,防止数据统计任务执行时间过长导致没有数据)
 		$userTotalTrafficList = UserTrafficHourly::query()
 		                                         ->whereNodeId(0)
-		                                         ->where('total', '>', MB * 100)
+		                                         ->where('total', '>', MB * 50)
 		                                         ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
 		                                         ->groupBy('user_id')
 		                                         ->selectRaw("user_id, sum(total) as totalTraffic")
@@ -45,15 +45,15 @@ class UserTrafficAbnormalAutoWarning extends Command {
 			$title = "流量异常用户提醒";
 
 			foreach($userTotalTrafficList as $vo){
-				$user = User::query()->whereId($vo->user_id)->first();
+				$user = User::find($vo->user_id);
 
 				// 推送通知管理员
-				if($vo->totalTraffic > (self::$systemConfig['traffic_ban_value'] * GB)){
+				if($vo->totalTraffic > self::$systemConfig['traffic_ban_value'] * GB){
 					$traffic = UserTrafficHourly::query()
 					                            ->userHourly($vo->user_id)
 					                            ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
 					                            ->selectRaw("user_id, sum(`u`) as totalU, sum(`d`) as totalD, sum(total) as totalTraffic")
-					                            ->first();
+					                            ->firstOrFail();
 
 					$content = "用户**{$user->email}(ID:{$user->id})**,最近1小时**上行流量:".flowAutoShow($traffic->totalU).",下行流量:".flowAutoShow($traffic->totalD).",共计:".flowAutoShow($traffic->totalTraffic)."**。";
 

+ 101 - 0
app/Console/Commands/fixDailyTrafficLogError.php

@@ -0,0 +1,101 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\SsNode;
+use App\Models\SsNodeTrafficDaily;
+use App\Models\User;
+use App\Models\UserTrafficDaily;
+use App\Models\UserTrafficLog;
+use Illuminate\Console\Command;
+use Log;
+
+class fixDailyTrafficLogError extends Command {
+	protected $signature = 'fixDailyTrafficLogError';
+	protected $description = '修复原版本的每日流量计算错误';
+
+	public function handle(): void {
+		$end = date('Y-m-d 23:59:59', strtotime("-1 days"));
+
+		Log::info('----------------------------【修复原版本的每日流量计算错误】开始----------------------------');
+		Log::info('----------------------------【节点流量日志修正】开始----------------------------');
+		foreach(SsNodeTrafficDaily::all() as $log){
+			SsNodeTrafficDaily::query()->whereId($log->id)->update([
+				'created_at' => date('Y-m-d H:i:s', strtotime("-1 days", strtotime($log->created_at)))
+			]);
+		}
+
+		foreach(SsNode::query()->whereStatus(1)->orderBy('id')->get() as $node){
+			$query = UserTrafficLog::query()
+			                       ->whereNodeId($node->id)
+			                       ->whereBetween('log_time',
+				                       [strtotime(date('Y-m-d', strtotime("-1 days"))), strtotime($end)]);
+
+			$u = $query->sum('u');
+			$d = $query->sum('d');
+			$total = $u + $d;
+
+			if($total){ // 有数据才记录
+				$obj = new SsNodeTrafficDaily();
+				$obj->node_id = $node->id;
+				$obj->u = $u;
+				$obj->d = $d;
+				$obj->total = $total;
+				$obj->traffic = flowAutoShow($total);
+				$obj->created_at = $end;
+				$obj->save();
+			}
+		}
+		Log::info('----------------------------【节点流量日志修正】结束----------------------------');
+
+		Log::info('----------------------------【用户流量日志修正】开始----------------------------');
+		foreach(UserTrafficDaily::all() as $log){
+			UserTrafficDaily::query()->whereId($log->id)->update([
+				'created_at' => date('Y-m-d H:i:s', strtotime("-1 days", strtotime($log->created_at)))
+			]);
+		}
+
+		foreach(User::query()->activeUser()->get() as $user){
+			// 统计一次所有节点的总和
+			$this->statisticsByUser($user->id);
+
+			// 统计每个节点产生的流量
+			foreach(SsNode::query()->whereStatus(1)->orderBy('id')->get() as $node){
+				$this->statisticsByUser($user->id, $node->id);
+			}
+		}
+
+		Log::info('----------------------------【用户流量日志修正】结束----------------------------');
+		Log::info('----------------------------【修复原版本的每日流量计算错误】结束----------------------------');
+	}
+
+	private function statisticsByUser($user_id, $node_id = 0): void {
+		$end = date('Y-m-d 23:59:59', strtotime("-1 days"));
+
+		$query = UserTrafficLog::query()
+		                       ->whereUserId($user_id)
+		                       ->whereBetween('log_time',
+			                       [strtotime(date('Y-m-d', strtotime("-1 days"))), strtotime($end)]);
+
+		if($node_id){
+			$query->whereNodeId($node_id);
+		}
+
+		$u = $query->sum('u');
+		$d = $query->sum('d');
+		$total = $u + $d;
+
+		if($total){ // 有数据才记录
+			$obj = new UserTrafficDaily();
+			$obj->user_id = $user_id;
+			$obj->node_id = $node_id;
+			$obj->u = $u;
+			$obj->d = $d;
+			$obj->total = $total;
+			$obj->traffic = flowAutoShow($total);
+			$obj->created_at = $end;
+			$obj->save();
+		}
+	}
+
+}

+ 1 - 1
app/Console/Commands/updateUserName.php

@@ -37,7 +37,7 @@ class updateUserName extends Command {
 }
 
 function process($id) {
-	$user = User::query()->whereId($id)->first();
+	$user = User::find($id);
 	// 先设个默认值
 	$name = $user->email;
 	// 用户是否设置了QQ号

+ 10 - 2
app/Console/Kernel.php

@@ -11,8 +11,12 @@ use App\Console\Commands\AutoStatisticsNodeHourlyTraffic;
 use App\Console\Commands\AutoStatisticsUserDailyTraffic;
 use App\Console\Commands\AutoStatisticsUserHourlyTraffic;
 use App\Console\Commands\DailyJob;
+use App\Console\Commands\fixDailyTrafficLogError;
 use App\Console\Commands\NodeBlockedDetection;
 use App\Console\Commands\ServiceTimer;
+use App\Console\Commands\updateTicket;
+use App\Console\Commands\updateUserLevel;
+use App\Console\Commands\updateUserName;
 use App\Console\Commands\upgradeUserResetTime;
 use App\Console\Commands\UserExpireAutoWarning;
 use App\Console\Commands\UserTrafficAbnormalAutoWarning;
@@ -36,8 +40,12 @@ class Kernel extends ConsoleKernel {
 		AutoStatisticsUserDailyTraffic::class,
 		AutoStatisticsUserHourlyTraffic::class,
 		DailyJob::class,
+		fixDailyTrafficLogError::class,
 		NodeBlockedDetection::class,
 		ServiceTimer::class,
+		updateTicket::class,
+		updateUserLevel::class,
+		updateUserName::class,
 		upgradeUserResetTime::class,
 		UserExpireAutoWarning::class,
 		UserTrafficAbnormalAutoWarning::class,
@@ -64,8 +72,8 @@ class Kernel extends ConsoleKernel {
 		$schedule->command('autoReportNode')->dailyAt('09:00');
 		$schedule->command('userTrafficAutoWarning')->dailyAt('10:30');
 		$schedule->command('userExpireAutoWarning')->dailyAt('20:00');
-		$schedule->command('autoStatisticsUserDailyTraffic')->dailyAt('23:50');
-		$schedule->command('autoStatisticsNodeDailyTraffic')->dailyAt('23:55');
+		$schedule->command('autoStatisticsUserDailyTraffic')->dailyAt('23:55');
+		$schedule->command('autoStatisticsNodeDailyTraffic')->dailyAt('23:57');
 	}
 
 	/**

+ 3 - 5
app/Exceptions/Handler.php

@@ -70,7 +70,7 @@ class Handler extends ExceptionHandler {
 			Log::info("异常请求:".$request->fullUrl().",IP:".getClientIp());
 
 			if($request->ajax()){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => trans('error.MissingPage')]);
+				return Response::json(['status' => 'fail', 'message' => trans('error.MissingPage')]);
 			}
 
 			return Response::view('auth.error', ['message' => trans('error.MissingPage')]);
@@ -79,7 +79,7 @@ class Handler extends ExceptionHandler {
 		// 捕获身份校验异常
 		if($exception instanceof AuthenticationException){
 			if($request->ajax()){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => trans('error.Unauthorized')]);
+				return Response::json(['status' => 'fail', 'message' => trans('error.Unauthorized')]);
 			}
 
 			return Response::view('auth.error', ['message' => trans('error.Unauthorized')]);
@@ -90,7 +90,6 @@ class Handler extends ExceptionHandler {
 			if($request->ajax()){
 				return Response::json([
 					'status'  => 'fail',
-					'data'    => '',
 					'message' => trans('error.RefreshPage').'<a href="/login" target="_blank">'.trans('error.Refresh').'</a>'
 				]);
 			}
@@ -103,7 +102,7 @@ class Handler extends ExceptionHandler {
 		// 捕获反射异常
 		if($exception instanceof ReflectionException){
 			if($request->ajax()){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => trans('error.SystemError')]);
+				return Response::json(['status' => 'fail', 'message' => trans('error.SystemError')]);
 			}
 
 			return Response::view('auth.error', ['message' => trans('error.SystemError')]);
@@ -114,7 +113,6 @@ class Handler extends ExceptionHandler {
 			if($request->ajax()){
 				return Response::json([
 					'status'  => 'fail',
-					'data'    => '',
 					'message' => trans('error.SystemError').', '.trans('error.Visit').'<a href="/logs" target="_blank">'.trans('error.log').'</a>'
 				]);
 			}

+ 4 - 4
app/Http/Controllers/Admin/AffiliateController.php

@@ -40,7 +40,7 @@ class AffiliateController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['applyList'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$view['applyList'] = $query->latest()->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.affiliate.affiliateList', $view);
 	}
@@ -74,7 +74,7 @@ class AffiliateController extends Controller {
 		$ret = ReferralApply::query()->whereId($id)->update(['status' => $status]);
 		if($ret){
 			// 审核申请的时候将关联的
-			$referralApply = ReferralApply::query()->whereId($id)->first();
+			$referralApply = ReferralApply::find($id);
 			$log_ids = explode(',', $referralApply->link_logs);
 			if($referralApply && $status == 1){
 				ReferralLog::query()->whereIn('id', $log_ids)->update(['status' => 1]);
@@ -83,7 +83,7 @@ class AffiliateController extends Controller {
 			}
 		}
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
 	}
 
 	// 用户返利流水记录
@@ -92,7 +92,7 @@ class AffiliateController extends Controller {
 		$ref_email = $request->input('ref_email');
 		$status = $request->input('status');
 
-		$query = ReferralLog::query()->with(['user', 'order'])->orderBy('status')->orderByDesc('id');
+		$query = ReferralLog::query()->with(['user', 'order'])->orderBy('status')->latest();
 
 		if(isset($email)){
 			$query->whereHas('user', static function($q) use ($email) {

+ 4 - 6
app/Http/Controllers/Admin/CouponController.php

@@ -43,7 +43,7 @@ class CouponController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['couponList'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$view['couponList'] = $query->latest()->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.coupon.couponList', $view);
 	}
@@ -111,10 +111,8 @@ class CouponController extends Controller {
 					$obj->amount = $type == 2? 0 : $request->input('amount');
 					$obj->discount = $type != 2? 0 : $request->input('discount');
 					$obj->rule = $request->input('rule');
-					$obj->available_start = strtotime(date('Y-m-d 00:00:00',
-						strtotime($request->input('available_start'))));
-					$obj->available_end = strtotime(date('Y-m-d 23:59:59',
-						strtotime($request->input('available_end'))));
+					$obj->available_start = strtotime($request->input('available_start'));
+					$obj->available_end = strtotime($request->input('available_end'));
 					$obj->status = 0;
 					$obj->save();
 				}
@@ -138,7 +136,7 @@ class CouponController extends Controller {
 	public function delCoupon(Request $request): JsonResponse {
 		Coupon::query()->whereId($request->input('id'))->delete();
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+		return Response::json(['status' => 'success', 'message' => '删除成功']);
 	}
 
 	// 导出卡券

+ 4 - 4
app/Http/Controllers/Admin/GroupController.php

@@ -15,7 +15,7 @@ use Validator;
 
 class GroupController extends Controller {
 	public function userGroupList(Request $request): \Illuminate\Http\Response {
-		$view['list'] = UserGroup::query()->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$view['list'] = UserGroup::query()->paginate(15)->appends($request->except('page'));
 		return Response::view('admin.group.groupList', $view);
 	}
 
@@ -59,7 +59,7 @@ class GroupController extends Controller {
 			}
 			$name = $request->input('name');
 			$nodes = $request->input('nodes');
-			$userGroup = UserGroup::query()->find($id);
+			$userGroup = UserGroup::find($id);
 			if(!$userGroup){
 				return Redirect::back()->withInput()->withErrors('未找到需要编辑的用户分组!');
 			}
@@ -86,7 +86,7 @@ class GroupController extends Controller {
 			return Redirect::back()->withInput()->withErrors('操作失败');
 		}
 
-		$userGroup = UserGroup::query()->find($id);
+		$userGroup = UserGroup::find($id);
 		if(!$userGroup){
 			return Redirect::back();
 		}
@@ -104,7 +104,7 @@ class GroupController extends Controller {
 			return Response::json(['status' => 'fail', 'message' => '该分组下存在关联账号,请先取消关联!']);
 		}
 
-		$userGroup = UserGroup::query()->whereId($id)->first();
+		$userGroup = UserGroup::find($id);
 		if(!$userGroup){
 			return Response::json(['status' => 'fail', 'message' => '删除失败,未找到用户分组']);
 		}

+ 5 - 4
app/Http/Controllers/Admin/MarketingController.php

@@ -64,11 +64,12 @@ class MarketingController extends Controller {
 		$content = $request->input('content');
 
 		if(!self::$systemConfig['is_push_bear']){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '推送失败:请先启用并配置PushBear']);
+			return Response::json(['status' => 'fail', 'message' => '推送失败:请先启用并配置PushBear']);
 		}
 
-		DB::beginTransaction();
 		try{
+			DB::beginTransaction();
+
 			$response = (new Client())->get('https://pushbear.ftqq.com/sub', [
 				'query' => [
 					'sendkey' => self::$systemConfig['push_bear_send_key'],
@@ -88,13 +89,13 @@ class MarketingController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '推送成功']);
+			return Response::json(['status' => 'success', 'message' => '推送成功']);
 		}catch(Exception $e){
 			Log::info('PushBear消息推送失败:'.$e->getMessage());
 
 			DB::rollBack();
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '推送失败:'.$e->getMessage()]);
+			return Response::json(['status' => 'fail', 'message' => '推送失败:'.$e->getMessage()]);
 		}
 	}
 

+ 6 - 6
app/Http/Controllers/Admin/RuleController.php

@@ -48,9 +48,9 @@ class RuleController extends Controller {
 		$obj->save();
 
 		if($obj->id){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '提交成功']);
+			return Response::json(['status' => 'success', 'message' => '提交成功']);
 		}
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 编辑审计规则
@@ -144,7 +144,7 @@ class RuleController extends Controller {
 			$name = $request->input('name');
 			$type = (int) $request->input('type');
 			$rules = $request->input('rules');
-			$ruleGroup = RuleGroup::query()->find($id);
+			$ruleGroup = RuleGroup::find($id);
 			if(!$ruleGroup){
 				return Redirect::back()->withInput()->withErrors('未找到需要编辑的审计规则分组!');
 			}
@@ -173,7 +173,7 @@ class RuleController extends Controller {
 			return Redirect::back()->withInput()->withErrors('操作失败');
 		}
 
-		$ruleGroup = RuleGroup::query()->find($id);
+		$ruleGroup = RuleGroup::find($id);
 		if(!$ruleGroup){
 			return Redirect::back();
 		}
@@ -213,7 +213,7 @@ class RuleController extends Controller {
 				return Redirect::back()->withInput()->withErrors($validator->errors());
 			}
 
-			$ruleGroup = RuleGroup::query()->find($id);
+			$ruleGroup = RuleGroup::find($id);
 			if(!$ruleGroup){
 				return Redirect::back()->withInput()->withErrors('未找到审计规则分组!');
 			}
@@ -245,7 +245,7 @@ class RuleController extends Controller {
 			return Redirect::back()->with('successMsg', '操作成功');
 		}
 
-		$view['ruleGroup'] = RuleGroup::query()->find($id);
+		$view['ruleGroup'] = RuleGroup::find($id);
 		$view['nodeList'] = SsNode::all();
 
 		return Response::view('admin.rule.assignNode', $view);

+ 5 - 9
app/Http/Controllers/Admin/SensitiveWordsController.php

@@ -34,11 +34,7 @@ class SensitiveWordsController extends Controller {
 		]);
 
 		if($validator->fails()){
-			return Response::json([
-				'status'  => 'fail',
-				'data'    => '',
-				'message' => $validator->getMessageBag()->first()
-			]);
+			return Response::json(['status' => 'fail', 'message' => $validator->getMessageBag()->first()]);
 		}
 
 		$obj = new SensitiveWords();
@@ -46,19 +42,19 @@ class SensitiveWordsController extends Controller {
 		$obj->words = strtolower($request->input('words'));
 		$obj->save();
 		if($obj->id){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+			return Response::json(['status' => 'success', 'message' => '添加成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败']);
+		return Response::json(['status' => 'fail', 'message' => '添加失败']);
 	}
 
 	// 删除敏感词
 	public function delSensitiveWords(Request $request): ?JsonResponse {
 		$result = SensitiveWords::query()->whereId($request->input('id'))->delete();
 		if($result){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败']);
+		return Response::json(['status' => 'fail', 'message' => '删除失败']);
 	}
 }

+ 13 - 5
app/Http/Controllers/Admin/ShopController.php

@@ -46,7 +46,7 @@ class ShopController extends Controller {
 	// 添加商品
 	public function addGoods(Request $request) {
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'name'    => 'required',
 				'traffic' => 'required|integer|min:1024|max:10240000|nullable',
 				'price'   => 'required|numeric|min:0',
@@ -58,6 +58,10 @@ class ShopController extends Controller {
 				'traffic.max' => '内含流量不能超过10TB',
 			]);
 
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			// 商品LOGO
 			$logo = null;
 			if($request->hasFile('logo')){
@@ -111,7 +115,7 @@ class ShopController extends Controller {
 	public function editGoods(Request $request) {
 		$id = $request->input('id');
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'name'    => 'required',
 				'traffic' => 'required|integer|min:1024|max:10240000|nullable',
 				'price'   => 'required|numeric|min:0',
@@ -123,7 +127,11 @@ class ShopController extends Controller {
 				'traffic.max' => '内含流量不能超过10TB',
 			]);
 
-			$goods = Goods::query()->whereId($id)->first();
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
+			$goods = Goods::find($id);
 			if(!$goods){
 				Session::flash('errorMsg', '商品不存在');
 
@@ -175,7 +183,7 @@ class ShopController extends Controller {
 			return Redirect::to('shop/edit?id='.$id);
 		}
 
-		$goods = Goods::query()->whereId($id)->first();
+		$goods = Goods::find($id);
 		$view['levelList'] = Level::query()->orderBy('level')->get();
 
 		return view('admin.shop.goodsInfo', $view)->with(compact('goods'));
@@ -189,6 +197,6 @@ class ShopController extends Controller {
 			Session::flash('errorMsg', '编辑失败'.$e);
 		}
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+		return Response::json(['status' => 'success', 'message' => '删除成功']);
 	}
 }

+ 4 - 4
app/Http/Controllers/Admin/SubscribeController.php

@@ -46,7 +46,7 @@ class SubscribeController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['subscribeList'] = $query->orderByDesc('id')->paginate(20)->appends($request->except('page'));
+		$view['subscribeList'] = $query->latest()->paginate(20)->appends($request->except('page'));
 
 		return Response::view('admin.subscribe.subscribeList', $view);
 	}
@@ -60,7 +60,7 @@ class SubscribeController extends Controller {
 			$query->whereSid($id);
 		}
 
-		$view['subscribeLog'] = $query->orderByDesc('id')->paginate(20)->appends($request->except('page'));
+		$view['subscribeLog'] = $query->latest()->paginate(20)->appends($request->except('page'));
 
 		return Response::view('admin.subscribe.subscribeLog', $view);
 	}
@@ -71,7 +71,7 @@ class SubscribeController extends Controller {
 		$status = $request->input('status', 0);
 
 		if(empty($id)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作异常']);
+			return Response::json(['status' => 'fail', 'message' => '操作异常']);
 		}
 
 		if($status){
@@ -80,6 +80,6 @@ class SubscribeController extends Controller {
 			UserSubscribe::query()->whereId($id)->update(['status' => 0, 'ban_time' => time(), 'ban_desc' => '后台手动封禁']);
 		}
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
 	}
 }

+ 10 - 10
app/Http/Controllers/Admin/TicketController.php

@@ -42,7 +42,7 @@ class TicketController extends Controller {
 			});
 		}
 
-		$view['ticketList'] = $query->orderByDesc('id')->paginate(10)->appends($request->except('page'));
+		$view['ticketList'] = $query->latest()->paginate(10)->appends($request->except('page'));
 
 		return Response::view('admin.ticket.ticketList', $view);
 	}
@@ -54,7 +54,7 @@ class TicketController extends Controller {
 		$title = $request->input('title');
 		$content = $request->input('content');
 
-		$user = User::query()->find($id)?: User::query()->whereEmail($email)->first();
+		$user = User::find($id)?: User::query()->whereEmail($email)->first();
 
 		if(!$user){
 			return Response::json(['status' => 'fail', 'message' => '用户不存在']);
@@ -100,7 +100,7 @@ class TicketController extends Controller {
 
 			if($obj->id){
 				// 将工单置为已回复
-				$ticket = Ticket::query()->with(['user'])->whereId($id)->first();
+				$ticket = Ticket::query()->with(['user'])->whereId($id)->firstOrFail();
 				Ticket::query()->whereId($id)->update(['status' => 1]);
 
 				$title = "工单回复提醒";
@@ -121,14 +121,14 @@ class TicketController extends Controller {
 					Mail::to($ticket->user->email)->send(new replyTicket($logId, $title, $content));
 				}
 
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '回复成功']);
+				return Response::json(['status' => 'success', 'message' => '回复成功']);
 			}
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '回复失败']);
+			return Response::json(['status' => 'fail', 'message' => '回复失败']);
 		}
 
-		$view['ticket'] = Ticket::query()->whereId($id)->first();
-		$view['replyList'] = TicketReply::query()->whereTicketId($id)->orderBy('id')->get();
+		$view['ticket'] = Ticket::find($id);
+		$view['replyList'] = TicketReply::query()->whereTicketId($id)->oldest()->get();
 
 		return Response::view('admin.ticket.replyTicket', $view);
 	}
@@ -139,12 +139,12 @@ class TicketController extends Controller {
 
 		$ticket = Ticket::query()->with(['user'])->whereId($id)->first();
 		if(!$ticket){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '关闭失败']);
+			return Response::json(['status' => 'fail', 'message' => '关闭失败']);
 		}
 
 		$ret = Ticket::query()->whereId($id)->update(['status' => 2]);
 		if(!$ret){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '关闭失败']);
+			return Response::json(['status' => 'fail', 'message' => '关闭失败']);
 		}
 
 		$title = "工单关闭提醒";
@@ -154,6 +154,6 @@ class TicketController extends Controller {
 		$logId = Helpers::addNotificationLog($title, $content, 1, $ticket->user->email);
 		Mail::to($ticket->user->email)->send(new closeTicket($logId, $title, $content));
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '关闭成功']);
+		return Response::json(['status' => 'success', 'message' => '关闭成功']);
 	}
 }

+ 4 - 9
app/Http/Controllers/Admin/ToolsController.php

@@ -12,7 +12,6 @@ use Illuminate\Http\Request;
 use Redirect;
 use Response;
 use Session;
-use Symfony\Component\HttpFoundation\BinaryFileResponse;
 
 class ToolsController extends Controller {
 	// SS(R)链接反解析
@@ -21,7 +20,7 @@ class ToolsController extends Controller {
 			$content = $request->input('content');
 
 			if(empty($content)){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '请在左侧填入要反解析的SS(R)链接']);
+				return Response::json(['status' => 'fail', 'message' => '请在左侧填入要反解析的SS(R)链接']);
 			}
 
 			// 反解析处理
@@ -60,17 +59,13 @@ class ToolsController extends Controller {
 			$content = $request->input('content');
 
 			if(empty($content)){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '请在左侧填入要转换的内容']);
+				return Response::json(['status' => 'fail', 'message' => '请在左侧填入要转换的内容']);
 			}
 
 			// 校验格式
 			$content = json_decode($content, true);
 			if(empty($content->port_password)){
-				return Response::json([
-					'status'  => 'fail',
-					'data'    => '',
-					'message' => '转换失败:配置信息里缺少【port_password】字段,或者该字段为空'
-				]);
+				return Response::json(['status' => 'fail', 'message' => '转换失败:配置信息里缺少【port_password】字段,或者该字段为空']);
 			}
 
 			// 转换成SSR格式JSON
@@ -109,7 +104,7 @@ class ToolsController extends Controller {
 	}
 
 	// 下载转换好的JSON文件
-	public function download(Request $request): BinaryFileResponse {
+	public function download(Request $request) {
 		$type = $request->input('type');
 		if(empty($type)){
 			exit('参数异常');

+ 115 - 139
app/Http/Controllers/AdminController.php

@@ -44,7 +44,6 @@ use Redirect;
 use Response;
 use Session;
 use Str;
-use Symfony\Component\HttpFoundation\BinaryFileResponse;
 use Validator;
 
 /**
@@ -62,26 +61,21 @@ class AdminController extends Controller {
 	}
 
 	public function index(): \Illuminate\Http\Response {
-		$past = strtotime(date('Y-m-d', strtotime("-".self::$systemConfig['expire_days']." days")));
+		$past = strtotime("-".self::$systemConfig['expire_days']." days");
 
 		$view['expireDays'] = self::$systemConfig['expire_days'];
 		$view['totalUserCount'] = User::query()->count(); // 总用户数
 		$view['enableUserCount'] = User::query()->whereEnable(1)->count(); // 有效用户数
 		$view['activeUserCount'] = User::query()->where('t', '>=', $past)->count(); // 活跃用户数
-		$view['unActiveUserCount'] = User::query()
-		                                 ->where('t', '<=', $past)
-		                                 ->whereEnable(1)
-		                                 ->where('t', '>', 0)
-		                                 ->count(); // 不活跃用户数
-		$view['onlineUserCount'] = User::query()->where('t', '>=', time() - Minute * 10)->count(); // 10分钟内在线用户数
-		$view['expireWarningUserCount'] = User::query()
-		                                      ->where('expire_time', '>=', date('Y-m-d'))
-		                                      ->where('expire_time', '<=', date('Y-m-d',
-			                                      strtotime("+".self::$systemConfig['expire_days']." days")))
-		                                      ->count(); // 临近过期用户数
+		$view['unActiveUserCount'] = User::query()->whereBetween('t', [1, $past])->whereEnable(1)->count(); // 不活跃用户数
+		$view['onlineUserCount'] = User::query()->where('t', '>=', strtotime("-10 minutes"))->count(); // 10分钟内在线用户数
+		$view['expireWarningUserCount'] = User::query()->whereBetween('expire_time', [
+			date('Y-m-d'),
+			strtotime("+".self::$systemConfig['expire_days']." days")
+		])->count(); // 临近过期用户数
 		$view['largeTrafficUserCount'] = User::query()
 		                                     ->whereRaw('(u + d) >= 107374182400')
-		                                     ->whereIn('status', [0, 1])
+		                                     ->where('status', '<>', -1)
 		                                     ->count(); // 流量超过100G的用户
 
 		$view['flowAbnormalUserCount'] = count($this->trafficAbnormal());// 1小时内流量异常用户
@@ -89,20 +83,16 @@ class AdminController extends Controller {
 		$view['unnormalNodeCount'] = SsNode::query()->whereStatus(0)->count();
 		$view['flowCount'] = flowAutoShow(SsNodeTrafficDaily::query()
 		                                                    ->where('created_at', '>=',
-			                                                    date('Y-m-d 00:00:00', strtotime("-30 days")))
+			                                                    date('Y-m-d', strtotime("-30 days")))
 		                                                    ->sum('total'));
 		$view['totalFlowCount'] = flowAutoShow(SsNodeTrafficDaily::query()->sum('total'));
-		$view['totalCredit'] = User::query()->sum('credit') / 100;
+		$view['totalCredit'] = User::query()->where('credit', '<>', 0)->sum('credit') / 100;
 		$view['totalWaitRefAmount'] = ReferralLog::query()->whereIn('status', [0, 1])->sum('ref_amount') / 100;
 		$view['totalRefAmount'] = ReferralApply::query()->whereStatus(2)->sum('amount') / 100;
 		$view['totalOrder'] = Order::query()->count();
 		$view['totalOnlinePayOrder'] = Order::query()->wherePayWay(2)->count();
 		$view['totalSuccessOrder'] = Order::query()->whereStatus(2)->count();
-		$view['todaySuccessOrder'] = Order::query()
-		                                  ->whereStatus(2)
-		                                  ->where('created_at', '>=', date('Y-m-d 00:00:00'))
-		                                  ->where('created_at', '<=', date('Y-m-d 23:59:59'))
-		                                  ->count();
+		$view['todaySuccessOrder'] = Order::query()->whereStatus(2)->whereDate('created_at', date('Y-m-d'))->count();
 		// 今日
 		$view['todayRegister'] = User::query()->whereDate('created_at', date('Y-m-d'))->count();
 
@@ -114,13 +104,13 @@ class AdminController extends Controller {
 		$result = [];
 		$userTotalTrafficList = UserTrafficHourly::query()
 		                                         ->whereNodeId(0)
-		                                         ->where('total', '>', 50 * MB)
+		                                         ->where('total', '>', MB * 50)
 		                                         ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
 		                                         ->groupBy('user_id')
 		                                         ->selectRaw("user_id, sum(total) as totalTraffic")
 		                                         ->get(); // 只统计50M以上的记录,加快速度
 		foreach($userTotalTrafficList as $user){
-			if($user->totalTraffic > (self::$systemConfig['traffic_ban_value'] * GB)){
+			if($user->totalTraffic > self::$systemConfig['traffic_ban_value'] * GB){
 				$result[] = $user->user_id;
 			}
 		}
@@ -137,7 +127,6 @@ class AdminController extends Controller {
 		$status = $request->input('status');
 		$enable = $request->input('enable');
 		$online = $request->input('online');
-		$unActive = $request->input('unActive');
 		$flowAbnormal = $request->input('flowAbnormal');
 		$expireWarning = $request->input('expireWarning');
 		$largeTraffic = $request->input('largeTraffic');
@@ -178,22 +167,18 @@ class AdminController extends Controller {
 
 		// 临近过期提醒
 		if($expireWarning){
-			$query->where('expire_time', '>=', date('Y-m-d'))
-			      ->where('expire_time', '<=',
-				      date('Y-m-d', strtotime("+".self::$systemConfig['expire_days']." days")));
+			$query->whereBetween('expire_time',
+				[date('Y-m-d'), date('Y-m-d', strtotime("+".self::$systemConfig['expire_days']." days"))]);
 		}
 
 		// 当前在线
 		if($online){
-			$query->where('t', '>=', time() - Minute * 10);
+			$query->where('t', '>=', strtotime("-10 minutes"));
 		}
 
 		// 不活跃用户
-		if($unActive){
-			$query->where('t', '>', 0)
-			      ->where('t', '<=',
-				      strtotime(date('Y-m-d', strtotime("-".self::$systemConfig['expire_days']." days"))))
-			      ->whereEnable(1);
+		if($request->input('unActive')){
+			$query->whereBetween('t', [1, strtotime("-".self::$systemConfig['expire_days']." days")])->whereEnable(1);
 		}
 
 		// 1小时内流量异常用户
@@ -201,7 +186,7 @@ class AdminController extends Controller {
 			$query->whereIn('id', $this->trafficAbnormal());
 		}
 
-		$userList = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$userList = $query->latest()->paginate(15)->appends($request->except('page'));
 		foreach($userList as $user){
 			$user->transfer_enable = flowAutoShow($user->transfer_enable);
 			$user->used_flow = flowAutoShow($user->u + $user->d);
@@ -238,7 +223,7 @@ class AdminController extends Controller {
 			// 校验email是否已存在
 			$exists = User::query()->whereEmail($request->input('email'))->first();
 			if($exists){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '用户名已存在,请重新输入']);
+				return Response::json(['status' => 'fail', 'message' => '用户名已存在,请重新输入']);
 			}
 
 			$user = new User();
@@ -279,10 +264,10 @@ class AdminController extends Controller {
 				Helpers::addUserTrafficModifyLog($user->id, 0, 0, toGB($request->input('transfer_enable', 0)),
 					'后台手动添加用户');
 
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+				return Response::json(['status' => 'success', 'message' => '添加成功']);
 			}
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败']);
+			return Response::json(['status' => 'fail', 'message' => '添加失败']);
 		}
 
 		// 生成一个可用端口
@@ -303,8 +288,9 @@ class AdminController extends Controller {
 	// 批量生成账号
 	public function batchAddUsers(Request $request): ?JsonResponse {
 		$amount = $request->input('amount');
-		DB::beginTransaction();
 		try{
+			DB::beginTransaction();
+
 			for($i = 0; $i < $amount; $i++){
 				$uid = Helpers::addUser('批量生成-'.makeRandStr(), Hash::make(makeRandStr()), toGB(1024), 365);
 				// 生成一个可用端口
@@ -324,11 +310,11 @@ class AdminController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '批量生成账号成功']);
+			return Response::json(['status' => 'success', 'message' => '批量生成账号成功']);
 		}catch(Exception $e){
 			DB::rollBack();
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '批量生成账号失败:'.$e->getMessage()]);
+			return Response::json(['status' => 'fail', 'message' => '批量生成账号失败:'.$e->getMessage()]);
 		}
 	}
 
@@ -345,22 +331,22 @@ class AdminController extends Controller {
 			// 校验email是否已存在
 			$exists = User::query()->where('id', '<>', $id)->whereEmail($email)->first();
 			if($exists){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '用户名已存在,请重新输入']);
+				return Response::json(['status' => 'fail', 'message' => '用户名已存在,请重新输入']);
 			}
 
 			// 校验端口是否已存在
 			$exists = User::query()->where('id', '<>', $id)->where('port', '>', 0)->wherePort($port)->first();
 			if($exists){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '端口已存在,请重新输入']);
+				return Response::json(['status' => 'fail', 'message' => '端口已存在,请重新输入']);
 			}
 
 			// 禁止取消默认管理员
 			if($id == 1 && $is_admin == 0){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '系统默认管理员不可取消']);
+				return Response::json(['status' => 'fail', 'message' => '系统默认管理员不可取消']);
 			}
 
 			// 用户编辑前的信息
-			$user = User::query()->whereId($id)->first();
+			$user = User::find($id);
 
 			try{
 				DB::beginTransaction();
@@ -408,12 +394,12 @@ class AdminController extends Controller {
 
 				DB::commit();
 
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '编辑成功']);
+				return Response::json(['status' => 'success', 'message' => '编辑成功']);
 			}catch(Exception $e){
 				DB::rollBack();
 				Log::error('编辑用户信息异常:'.$e->getMessage());
 
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '编辑失败']);
+				return Response::json(['status' => 'fail', 'message' => '编辑失败']);
 			}
 		}else{
 			$user = User::query()->with(['referral'])->whereId($id)->first();
@@ -437,7 +423,7 @@ class AdminController extends Controller {
 		$id = $request->input('id');
 
 		if($id <= 1){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '系统管理员不可删除']);
+			return Response::json(['status' => 'fail', 'message' => '系统管理员不可删除']);
 		}
 
 		try{
@@ -452,12 +438,12 @@ class AdminController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}catch(Exception $e){
 			Log::error($e);
 			DB::rollBack();
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败']);
+			return Response::json(['status' => 'fail', 'message' => '删除失败']);
 		}
 	}
 
@@ -557,7 +543,7 @@ class AdminController extends Controller {
 			return Redirect::to('admin/editArticle?id='.$id);
 		}
 
-		$view['article'] = Article::query()->whereId($id)->first();
+		$view['article'] = Article::find($id);
 
 		return Response::view('admin.article.editArticle', $view);
 	}
@@ -568,10 +554,10 @@ class AdminController extends Controller {
 
 		$ret = Article::query()->whereId($id)->delete();
 		if($ret){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败']);
+		return Response::json(['status' => 'fail', 'message' => '删除失败']);
 	}
 
 	// 流量日志
@@ -616,7 +602,7 @@ class AdminController extends Controller {
 		// 已使用流量
 		$view['totalTraffic'] = flowAutoShow($query->sum('u') + $query->sum('d'));
 
-		$list = $query->orderByDesc('id')->paginate(20)->appends($request->except('page'));
+		$list = $query->latest('log_time')->paginate(20)->appends($request->except('page'));
 		foreach($list as $vo){
 			$vo->u = flowAutoShow($vo->u);
 			$vo->d = flowAutoShow($vo->d);
@@ -624,7 +610,7 @@ class AdminController extends Controller {
 		}
 
 		$view['list'] = $list;
-		$view['nodeList'] = SsNode::query()->whereStatus(1)->orderByDesc('sort')->orderByDesc('id')->get();
+		$view['nodeList'] = SsNode::query()->whereStatus(1)->orderByDesc('sort')->latest()->get();
 
 		return Response::view('admin.logs.trafficLog', $view);
 	}
@@ -635,16 +621,15 @@ class AdminController extends Controller {
 			return Redirect::to('admin/userList');
 		}
 
-		$user = User::query()->whereId($id)->first();
+		$user = User::find($id);
 		if(empty($user)){
 			return Redirect::to('admin/userList');
 		}
 
 		if($request->isMethod('POST')){
-			$node_id = $request->input('id');
 			$infoType = $request->input('type');
 
-			$node = SsNode::query()->whereId($node_id)->first();
+			$node = SsNode::find($request->input('id'));
 			if($node->type == 1){
 				if($node->compatible){
 					$proxyType = 'SS';
@@ -673,7 +658,7 @@ class AdminController extends Controller {
 	}
 
 	// 导出原版SS用户配置信息
-	public function exportSSJson(): BinaryFileResponse {
+	public function exportSSJson() {
 		$userList = User::query()->where('port', '>', 0)->get();
 
 		$json = '';
@@ -737,7 +722,7 @@ class AdminController extends Controller {
 			return Redirect::to('admin/userList');
 		}
 
-		$user = User::query()->whereId($id)->first();
+		$user = User::find($id);
 		if(empty($user)){
 			return Redirect::to('admin/userList');
 		}
@@ -757,13 +742,13 @@ class AdminController extends Controller {
 			$sort = $request->input('sort', 0);
 
 			if(empty($name)){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '配置名称不能为空']);
+				return Response::json(['status' => 'fail', 'message' => '配置名称不能为空']);
 			}
 
 			// 校验是否已存在
 			$config = SsConfig::type($type)->whereName($name)->first();
 			if($config){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '配置已经存在,请勿重复添加']);
+				return Response::json(['status' => 'fail', 'message' => '配置已经存在,请勿重复添加']);
 			}
 
 			$ssConfig = new SsConfig();
@@ -773,7 +758,7 @@ class AdminController extends Controller {
 			$ssConfig->sort = $sort;
 			$ssConfig->save();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+			return Response::json(['status' => 'success', 'message' => '添加成功']);
 		}
 
 		$labelList = Label::all();
@@ -797,10 +782,10 @@ class AdminController extends Controller {
 
 		$ret = SsConfig::query()->whereId($id)->delete();
 		if($ret){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败']);
+		return Response::json(['status' => 'fail', 'message' => '删除失败']);
 	}
 
 	// 设置默认配置
@@ -808,12 +793,12 @@ class AdminController extends Controller {
 		$id = $request->input('id');
 
 		if(empty($id)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '非法请求']);
+			return Response::json(['status' => 'fail', 'message' => '非法请求']);
 		}
 
-		$config = SsConfig::query()->whereId($id)->first();
+		$config = SsConfig::find($id);
 		if(!$config){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '配置不存在']);
+			return Response::json(['status' => 'fail', 'message' => '配置不存在']);
 		}
 
 		// 去除该配置所属类型的默认值
@@ -822,7 +807,7 @@ class AdminController extends Controller {
 		// 将该ID对应记录值置为默认值
 		SsConfig::query()->whereId($id)->update(['is_default' => 1]);
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
 	}
 
 	// 设置系统扩展信息,例如客服、统计代码
@@ -887,10 +872,10 @@ class AdminController extends Controller {
 		$obj->save();
 
 		if($obj->id){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '提交成功']);
+			return Response::json(['status' => 'success', 'message' => '提交成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 编辑等级
@@ -936,12 +921,12 @@ class AdminController extends Controller {
 			return Response::json(['status' => 'fail', 'message' => $validator->errors()->all()]);
 		}
 
-		$level = Level::query()->whereId($id)->first();
+		$level = Level::find($id);
 
 		// 校验该等级下是否存在关联账号
 		$userCount = User::query()->whereLevel($level->level)->count();
 		if($userCount){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该等级下存在关联账号,请先取消关联']);
+			return Response::json(['status' => 'fail', 'message' => '该等级下存在关联账号,请先取消关联']);
 		}
 		$ret = false;
 		try{
@@ -950,10 +935,10 @@ class AdminController extends Controller {
 			Log::error('删除等级时报错:'.$e);
 		}
 		if($ret){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+			return Response::json(['status' => 'success', 'message' => '操作成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 添加国家/地区
@@ -962,16 +947,16 @@ class AdminController extends Controller {
 		$code = $request->input('country_code');
 
 		if(empty($name)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区名称不能为空']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区名称不能为空']);
 		}
 
 		if(empty($code)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区代码不能为空']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区代码不能为空']);
 		}
 
 		$exists = Country::query()->whereName($name)->first();
 		if($exists){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该国家/地区名称已存在,请勿重复添加']);
+			return Response::json(['status' => 'fail', 'message' => '该国家/地区名称已存在,请勿重复添加']);
 		}
 
 		$obj = new Country();
@@ -980,10 +965,10 @@ class AdminController extends Controller {
 		$obj->save();
 
 		if($obj->id){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '提交成功']);
+			return Response::json(['status' => 'success', 'message' => '提交成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 编辑国家/地区
@@ -993,34 +978,34 @@ class AdminController extends Controller {
 		$code = $request->input('country_code');
 
 		if(empty($id)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => 'ID不能为空']);
+			return Response::json(['status' => 'fail', 'message' => 'ID不能为空']);
 		}
 
 		if(empty($name)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区名称不能为空']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区名称不能为空']);
 		}
 
 		if(empty($code)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区代码不能为空']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区代码不能为空']);
 		}
 
-		$country = Country::query()->whereId($id)->first();
+		$country = Country::find($id);
 		if($country){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区不存在']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区不存在']);
 		}
 
 		// 校验该国家/地区下是否存在关联节点
 		$existNode = SsNode::query()->whereCountryCode($country->code)->get();
 		if(!$existNode){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
+			return Response::json(['status' => 'fail', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
 		}
 
 		$ret = Country::query()->whereId($id)->update(['name' => $name, 'code' => $code]);
 		if($ret){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+			return Response::json(['status' => 'success', 'message' => '操作成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 删除国家/地区
@@ -1028,18 +1013,18 @@ class AdminController extends Controller {
 		$id = $request->input('id');
 
 		if(empty($id)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => 'ID不能为空']);
+			return Response::json(['status' => 'fail', 'message' => 'ID不能为空']);
 		}
 
-		$country = Country::query()->whereId($id)->first();
+		$country = Country::find($id);
 		if(!$country){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '国家/地区不存在']);
+			return Response::json(['status' => 'fail', 'message' => '国家/地区不存在']);
 		}
 
 		// 校验该国家/地区下是否存在关联节点
 		$existNode = SsNode::query()->whereCountryCode($country->code)->get();
 		if(!$existNode){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
+			return Response::json(['status' => 'fail', 'message' => '该国家/地区下存在关联节点,请先取消关联']);
 		}
 		$ret = false;
 		try{
@@ -1048,10 +1033,10 @@ class AdminController extends Controller {
 			Log::error('删除国家/地区时报错:'.$e);
 		}
 		if($ret){
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+			return Response::json(['status' => 'success', 'message' => '操作成功']);
 		}
 
-		return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		return Response::json(['status' => 'fail', 'message' => '操作失败']);
 	}
 
 	// 系统设置
@@ -1128,7 +1113,6 @@ class AdminController extends Controller {
 					break;
 				default:
 					return Response::json(['status' => 'fail', 'message' => '未知支付渠道']);
-					break;
 			}
 		}
 
@@ -1157,7 +1141,7 @@ class AdminController extends Controller {
 		// 更新配置
 		Config::query()->whereName($name)->update(['value' => $value]);
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
 	}
 
 	// 推送通知测试
@@ -1174,14 +1158,12 @@ class AdminController extends Controller {
 					}
 
 					return Response::json(['status' => 'fail', 'message' => $result? $result['errmsg'] : '未知']);
-					break;
 				case 'bark':
 					if($result['code'] == 200){
 						return Response::json(['status' => 'success', 'message' => '发送成功,请查看手机是否收到推送消息']);
 					}
 
 					return Response::json(['status' => 'fail', 'message' => $result['message']]);
-					break;
 				default:
 			}
 		}
@@ -1194,7 +1176,7 @@ class AdminController extends Controller {
 		$view['inviteList'] = Invite::query()
 		                            ->with(['generator', 'user'])
 		                            ->orderBy('status')
-		                            ->orderByDesc('id')
+		                            ->latest()
 		                            ->paginate(15)
 		                            ->appends($request->except('page'));
 
@@ -1213,7 +1195,7 @@ class AdminController extends Controller {
 			$obj->save();
 		}
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '生成成功']);
+		return Response::json(['status' => 'success', 'message' => '生成成功']);
 	}
 
 	// 导出邀请码
@@ -1322,7 +1304,7 @@ class AdminController extends Controller {
 
 		User::query()->whereId($id)->update(['u' => 0, 'd' => 0]);
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
 	}
 
 	// 操作用户余额
@@ -1332,42 +1314,35 @@ class AdminController extends Controller {
 			$amount = $request->input('amount');
 
 			if(empty($userId) || empty($amount)){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '充值异常']);
+				return Response::json(['status' => 'fail', 'message' => '充值异常']);
 			}
+			$user = User::find($userId);
 
-			try{
-				DB::beginTransaction();
-
-				$user = User::query()->whereId($userId)->first();
+			// 写入余额变动日志
+			Helpers::addUserCreditLog($userId, 0, $user->credit, $user->credit + $amount, $amount, '后台手动充值');
 
-				// 写入余额变动日志
-				Helpers::addUserCreditLog($userId, 0, $user->credit, $user->credit + $amount, $amount, '后台手动充值');
-
-				// 加减余额
-				if($amount < 0){
-					$user->decrement('credit', abs($amount) * 100);
-				}else{
-					$user->increment('credit', abs($amount) * 100);
-				}
-
-				DB::commit();
-
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '充值成功']);
-			}catch(Exception $e){
-				DB::rollBack();
+			// 加减余额
+			if($amount < 0){
+				$ret = User::whereId($user->id)->decrement('credit', abs($amount) * 100);
+			}else{
+				$ret = User::whereId($user->id)->increment('credit', $amount * 100);
+			}
 
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '充值失败:'.$e->getMessage()]);
+			if($ret){
+				return Response::json(['status' => 'success', 'message' => '充值成功']);
 			}
-		}else{
-			return Response::view('admin.handleUserCredit');
+
+			return Response::json(['status' => 'fail', 'message' => '充值失败']);
 		}
+
+		return Response::view('admin.handleUserCredit');
 	}
 
 	// 用户余额变动记录
 	public function userCreditLogList(Request $request): \Illuminate\Http\Response {
 		$email = $request->input('email');
 
-		$query = UserCreditLog::query()->with(['user'])->orderByDesc('id');
+		$query = UserCreditLog::query()->with(['user'])->latest();
 
 		if(isset($email)){
 			$query->whereHas('user', static function($q) use ($email) {
@@ -1384,7 +1359,7 @@ class AdminController extends Controller {
 	public function userBanLogList(Request $request): \Illuminate\Http\Response {
 		$email = $request->input('email');
 
-		$query = UserBanLog::query()->with(['user'])->orderByDesc('id');
+		$query = UserBanLog::query()->with(['user'])->latest();
 
 		if(isset($email)){
 			$query->whereHas('user', static function($q) use ($email) {
@@ -1409,7 +1384,7 @@ class AdminController extends Controller {
 			});
 		}
 
-		$view['list'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$view['list'] = $query->latest()->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.logs.userTrafficLogList', $view);
 	}
@@ -1448,7 +1423,7 @@ class AdminController extends Controller {
 				                              ->whereType('tcp')
 				                              ->wherePort($user->port)
 				                              ->where('created_at', '>=', strtotime("-10 minutes"))
-				                              ->orderByDesc('id')
+				                              ->latest()
 				                              ->limit(5)
 				                              ->get();
 			}
@@ -1463,16 +1438,16 @@ class AdminController extends Controller {
 	public function switchToUser(Request $request): JsonResponse {
 		$id = $request->input('user_id');
 
-		$user = User::query()->find($id);
+		$user = User::find($id);
 		if(!$user){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => "用户不存在"]);
+			return Response::json(['status' => 'fail', 'message' => "用户不存在"]);
 		}
 
 		// 存储当前管理员ID,并将当前登录信息改成要切换的用户的身份信息
 		Session::put('admin', Auth::id());
 		Auth::login($user);
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => "身份切换成功"]);
+		return Response::json(['status' => 'success', 'message' => "身份切换成功"]);
 	}
 
 	// 添加标签
@@ -1486,7 +1461,7 @@ class AdminController extends Controller {
 			$label->sort = $sort;
 			$label->save();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+			return Response::json(['status' => 'success', 'message' => '添加成功']);
 		}
 
 		return Response::view('admin.label.addLabel');
@@ -1501,11 +1476,11 @@ class AdminController extends Controller {
 
 			Label::query()->whereId($id)->update(['name' => $name, 'sort' => $sort]);
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+			return Response::json(['status' => 'success', 'message' => '添加成功']);
 		}
 
 		$id = $request->input('id');
-		$view['label'] = Label::query()->whereId($id)->first();
+		$view['label'] = Label::find($id);
 
 		return Response::view('admin.label.editLabel', $view);
 	}
@@ -1514,18 +1489,19 @@ class AdminController extends Controller {
 	public function delLabel(Request $request): ?JsonResponse {
 		$id = $request->input('id');
 
-		DB::beginTransaction();
 		try{
+			DB::beginTransaction();
+
 			Label::query()->whereId($id)->delete();
 			SsNodeLabel::query()->whereLabelId($id)->delete(); // 删除节点关联
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}catch(Exception $e){
 			DB::rollBack();
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败:'.$e->getMessage()]);
+			return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]);
 		}
 	}
 
@@ -1544,7 +1520,7 @@ class AdminController extends Controller {
 			$query->whereType($type);
 		}
 
-		$view['list'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
+		$view['list'] = $query->latest()->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.logs.notificationLog', $view);
 	}
@@ -1587,7 +1563,7 @@ class AdminController extends Controller {
 			});
 		}
 
-		$list = $query->groupBy('user_id', 'node_id')->orderByDesc('id');
+		$list = $query->groupBy('user_id', 'node_id')->latest();
 		foreach($list as $vo){
 			// 跳过上报多IP的
 			if($vo->ip == null || strpos($vo->ip, ',') === true){
@@ -1608,7 +1584,7 @@ class AdminController extends Controller {
 		}
 
 		$view['list'] = $list->paginate(20)->appends($request->except('page'));
-		$view['nodeList'] = SsNode::query()->whereStatus(1)->orderByDesc('sort')->orderByDesc('id')->get();
+		$view['nodeList'] = SsNode::query()->whereStatus(1)->orderByDesc('sort')->latest()->get();
 
 		return Response::view('admin.logs.onlineIPMonitor', $view);
 	}

+ 6 - 6
app/Http/Controllers/Api/LoginController.php

@@ -39,13 +39,13 @@ class LoginController extends Controller {
 		if(!$email || !$password){
 			Cache::increment($cacheKey);
 
-			return Response::json(['status' => 'fail', 'data' => [], 'message' => '请输入用户名和密码']);
+			return Response::json(['status' => 'fail', 'message' => '请输入用户名和密码']);
 		}
 
 		// 连续请求失败15次,则封IP一小时
 		if(Cache::has($cacheKey)){
 			if(Cache::get($cacheKey) >= 15){
-				return Response::json(['status' => 'fail', 'data' => [], 'message' => '请求失败超限,禁止访问1小时']);
+				return Response::json(['status' => 'fail', 'message' => '请求失败超限,禁止访问1小时']);
 			}
 		}else{
 			Cache::put($cacheKey, 1, Hour);
@@ -55,17 +55,17 @@ class LoginController extends Controller {
 		if(!$user){
 			Cache::increment($cacheKey);
 
-			return Response::json(['status' => 'fail', 'data' => [], 'message' => '账号不存在或已被禁用']);
+			return Response::json(['status' => 'fail', 'message' => '账号不存在或已被禁用']);
 		}
 
 		if(!Hash::check($password, $user->password)){
-			return Response::json(['status' => 'fail', 'data' => [], 'message' => '用户名或密码错误']);
+			return Response::json(['status' => 'fail', 'message' => '用户名或密码错误']);
 		}
 
 		try{
 			DB::beginTransaction();
 			// 如果未生成过订阅链接则生成一个
-			$subscribe = UserSubscribe::query()->whereUserId($user->id)->first();
+			$subscribe = UserSubscribe::query()->whereUserId($user->id)->firstOrFail();
 
 			// 更新订阅链接访问次数
 			$subscribe->increment('times', 1);
@@ -127,7 +127,7 @@ class LoginController extends Controller {
 		}catch(Exception $e){
 			DB::rollBack();
 
-			return Response::json(['status' => 'success', 'data' => [], 'message' => '登录失败']);
+			return Response::json(['status' => 'success', 'message' => '登录失败']);
 		}
 	}
 

+ 4 - 4
app/Http/Controllers/Api/WebApi/BaseController.php

@@ -43,7 +43,7 @@ class BaseController {
 	}
 
 	// 返回数据
-	public function returnData($message, $status = 'fail', $code = 400, $data = '', $addition = []): JsonResponse {
+	public function returnData($message, $status = 'fail', $code = 400, $data = [], $addition = []): JsonResponse {
 		$data = ['status' => $status, 'code' => $code, 'data' => $data, 'message' => $message];
 
 		if($addition){
@@ -122,14 +122,14 @@ class BaseController {
 
 	// 获取节点的审计规则
 	public function getNodeRule($id): JsonResponse {
-		$nodeRule = RuleGroupNode::whereNodeId($id)->first();
+		$nodeRule = RuleGroupNode::query()->whereNodeId($id)->first();
 		$data = [];
 		//节点未设置任何审计规则
 		if($nodeRule){
-			$ruleGroup = RuleGroup::query()->whereId($nodeRule->rule_group_id)->first();
+			$ruleGroup = RuleGroup::find($nodeRule->rule_group_id);
 			if($ruleGroup){
 				foreach(explode(',', $ruleGroup->rules) as $ruleId){
-					$rule = Rule::query()->whereId($ruleId)->first();
+					$rule = Rule::find($ruleId);
 					if($rule){
 						$new = [
 							'id'      => $rule->id,

+ 2 - 2
app/Http/Controllers/Api/WebApi/TrojanController.php

@@ -10,7 +10,7 @@ use Illuminate\Http\JsonResponse;
 class TrojanController extends BaseController {
 	// 获取节点信息
 	public function getNodeInfo($id): JsonResponse {
-		$node = SsNode::query()->find($id);
+		$node = SsNode::find($id);
 
 		return $this->returnData('获取节点信息成功', 'success', 200, [
 			'id'           => $node->id,
@@ -27,7 +27,7 @@ class TrojanController extends BaseController {
 
 	// 获取节点可用的用户列表
 	public function getUserList($id): JsonResponse {
-		$node = SsNode::query()->find($id);
+		$node = SsNode::find($id);
 		$users = User::query()
 		             ->where('status', '<>', -1)
 		             ->whereEnable(1)

+ 3 - 3
app/Http/Controllers/Api/WebApi/V2RayController.php

@@ -12,8 +12,8 @@ use Illuminate\Http\Request;
 class V2RayController extends BaseController {
 	// 获取节点信息
 	public function getNodeInfo($id): JsonResponse {
-		$node = SsNode::query()->find($id);
-		$nodeDv = NodeCertificate::query()->whereId($node->server)->first();
+		$node = SsNode::find($id);
+		$nodeDv = NodeCertificate::query()->whereDomain($node->v2_host)->first();
 
 		return $this->returnData('获取节点信息成功', 'success', 200, [
 			'id'              => $node->id,
@@ -40,7 +40,7 @@ class V2RayController extends BaseController {
 
 	// 获取节点可用的用户列表
 	public function getUserList($id): JsonResponse {
-		$node = SsNode::query()->find($id);
+		$node = SsNode::find($id);
 		$users = User::query()
 		             ->where('status', '<>', -1)
 		             ->whereEnable(1)

+ 2 - 2
app/Http/Controllers/Api/WebApi/VNetController.php

@@ -10,7 +10,7 @@ use Illuminate\Http\JsonResponse;
 class VNetController extends BaseController {
 	// 获取节点信息
 	public function getNodeInfo($id): JsonResponse {
-		$node = SsNode::query()->find($id);
+		$node = SsNode::find($id);
 
 		return $this->returnData('获取节点信息成功', 'success', 200, [
 			'id'           => $node->id,
@@ -32,7 +32,7 @@ class VNetController extends BaseController {
 
 	// 获取节点可用的用户列表
 	public function getUserList($id): JsonResponse {
-		$node = SsNode::query()->find($id);
+		$node = SsNode::find($id);
 		$users = User::query()
 		             ->where('status', '<>', -1)
 		             ->whereEnable(1)

+ 35 - 9
app/Http/Controllers/AuthController.php

@@ -46,7 +46,7 @@ class AuthController extends Controller {
 	// 登录
 	public function login(Request $request) {
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'email'    => 'required|email',
 				'password' => 'required'
 			], [
@@ -54,6 +54,10 @@ class AuthController extends Controller {
 				'password.required' => trans('auth.password_null')
 			]);
 
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			$email = $request->input('email');
 			$password = $request->input('password');
 			$remember = $request->input('remember');
@@ -70,6 +74,10 @@ class AuthController extends Controller {
 			}
 			$user = Auth::getUser();
 
+			if(!$user){
+				return Redirect::back()->withInput()->withErrors(trans('auth.login_error'));
+			}
+
 			// 校验普通用户账号状态
 			if(!$user->is_admin){
 				if($user->status < 0){
@@ -218,7 +226,7 @@ class AuthController extends Controller {
 		$cacheKey = 'register_times_'.md5(getClientIp()); // 注册限制缓存key
 
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'username'        => 'required',
 				'email'           => 'required|email|unique:user',
 				'password'        => 'required|min:6',
@@ -236,6 +244,10 @@ class AuthController extends Controller {
 				'term.accepted'            => trans('auth.unaccepted')
 			]);
 
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			$username = $request->input('username');
 			$email = $request->input('email');
 			$password = $request->input('password');
@@ -379,7 +391,7 @@ class AuthController extends Controller {
 			}else{
 				// 则直接给推荐人加流量
 				if($referral_uid){
-					$referralUser = User::query()->whereId($referral_uid)->first();
+					$referralUser = User::find($referral_uid);
 					if($referralUser && $referralUser->expire_time >= date('Y-m-d')){
 						User::query()
 						    ->whereId($referral_uid)
@@ -441,8 +453,8 @@ class AuthController extends Controller {
 	/**
 	 * 获取AFF
 	 *
-	 * @param  string  $code  邀请码
-	 * @param  int     $aff   URL中的aff参数
+	 * @param  string    $code  邀请码
+	 * @param  int|null  $aff   URL中的aff参数
 	 *
 	 * @return array
 	 */
@@ -498,13 +510,17 @@ class AuthController extends Controller {
 	public function resetPassword(Request $request) {
 		if($request->isMethod('POST')){
 			// 校验请求
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'email' => 'required|email'
 			], [
 				'email.required' => trans('auth.email_null'),
 				'email.email'    => trans('auth.email_legitimate')
 			]);
 
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			$email = $request->input('email');
 
 			// 是否开启重设密码
@@ -553,7 +569,7 @@ class AuthController extends Controller {
 		}
 
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'password'        => 'required|min:6',
 				'confirmPassword' => 'required|same:password'
 			], [
@@ -563,6 +579,11 @@ class AuthController extends Controller {
 				'confirmPassword.min'      => trans('auth.password_limit'),
 				'confirmPassword.same'     => trans('auth.password_same'),
 			]);
+
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			$password = $request->input('password');
 			// 校验账号
 			$verify = Verify::type(1)->with('user')->whereToken($token)->first();
@@ -615,13 +636,18 @@ class AuthController extends Controller {
 	// 激活账号页
 	public function activeUser(Request $request) {
 		if($request->isMethod('POST')){
-			Validator::make($request->all(), [
+			$validator = Validator::make($request->all(), [
 				'email' => 'required|email|exists:user,email'
 			], [
 				'email.required' => trans('auth.email_null'),
 				'email.email'    => trans('auth.email_legitimate'),
 				'email.exists'   => trans('auth.email_notExist')
 			]);
+
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
 			$email = $request->input('email');
 
 			// 是否开启账号激活
@@ -631,7 +657,7 @@ class AuthController extends Controller {
 			}
 
 			// 查找账号
-			$user = User::query()->whereEmail($email)->first();
+			$user = User::query()->whereEmail($email)->firstOrFail();
 			if($user->status < 0){
 				return Redirect::back()->withErrors(trans('auth.login_ban',
 					['email' => self::$systemConfig['webmaster_email']]));

+ 1 - 1
app/Http/Controllers/Controller.php

@@ -150,7 +150,7 @@ class Controller extends BaseController {
 		$node = SsNode::whereId($nodeId)->firstOrFail();
 		$scheme = null;
 		// 获取分组名称
-		$group = $node->getLevel->name;
+		$group = $node->level_name;
 		$host = $node->server?: $node->ip;
 		$data = null;
 		switch($node->type){

+ 1 - 1
app/Http/Controllers/Gateway/AbstractPayment.php

@@ -85,7 +85,7 @@ abstract class AbstractPayment {
 					Order::query()->whereUserId($user->id)->with(['goods'])->whereHas('goods', static function($q) {
 						$q->where('type', '<=', 2);
 					})->whereIsExpire(0)->whereStatus(2)->where('oid', '<>', $order->oid)->update([
-						'expire_at' => date('Y-m-d H:i:s'),
+						'expired_at' => date('Y-m-d H:i:s'),
 						'is_expire' => 1
 					]);
 

+ 1 - 1
app/Http/Controllers/Gateway/Local.php

@@ -14,7 +14,7 @@ use Response;
 class Local extends AbstractPayment {
 	public function purchase($request): JsonResponse {
 		$amount = $request->input('amount');
-		$order = Order::whereOid($request->input('oid'))->first();
+		$order = Order::find($request->input('oid'));
 		$goods = Goods::query()->whereStatus(1)->whereId($request->input('goods_id'))->first();
 		$user = Auth::getUser();
 

+ 2 - 2
app/Http/Controllers/Gateway/PayPal.php

@@ -98,7 +98,7 @@ class PayPal extends AbstractPayment {
 		$response = $this->provider->getExpressCheckoutDetails($token);
 
 		if(in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])){
-			$payment = Payment::whereTradeNo($response['INVNUM'])->first();
+			$payment = Payment::query()->whereTradeNo($response['INVNUM'])->firstOrFail();
 			$data = $this->getCheckoutData($payment->trade_no, $payment->amount);
 			// Perform transaction on PayPal
 			$payment_status = $this->provider->doExpressCheckoutPayment($data, $token, $PayerID);
@@ -127,7 +127,7 @@ class PayPal extends AbstractPayment {
 		$response = (string) $this->provider->verifyIPN($post);
 
 		if($response === 'VERIFIED' && $request['invoice']){
-			if(Payment::whereTradeNo($request['invoice'])->first()->status == 0){
+			if(Payment::query()->whereTradeNo($request['invoice'])->first()->status == 0){
 				$this->postPayment($request['invoice'], 'PayPal');
 			}
 			exit("success");

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

@@ -49,7 +49,7 @@ class NodeController extends Controller {
 			$online_log = SsNodeOnlineLog::query()
 			                             ->whereNodeId($node->id)
 			                             ->where('log_time', '>=', strtotime("-5 minutes"))
-			                             ->orderByDesc('id')
+			                             ->latest('log_time')
 			                             ->first();
 			$node->online_users = empty($online_log)? 0 : $online_log->online_user;
 
@@ -61,7 +61,7 @@ class NodeController extends Controller {
 			$node_info = SsNodeInfo::query()
 			                       ->whereNodeId($node->id)
 			                       ->where('log_time', '>=', strtotime("-10 minutes"))
-			                       ->orderByDesc('id')
+			                       ->latest('log_time')
 			                       ->first();
 			$node->isOnline = empty($node_info) || empty($node_info->load)? 0 : 1;
 			$node->load = $node->isOnline? $node_info->load : '离线';
@@ -75,7 +75,7 @@ class NodeController extends Controller {
 
 	public function checkNode(Request $request): JsonResponse {
 		$id = $request->input('id');
-		$node = SsNode::query()->whereId($id)->first();
+		$node = SsNode::find($id);
 		// 使用DDNS的node先获取ipv4地址
 		if($node->is_ddns){
 			$ip = gethostbyname($node->server);
@@ -364,9 +364,9 @@ class NodeController extends Controller {
 	public function delNode(Request $request): ?JsonResponse {
 		$id = $request->input('id');
 
-		$node = SsNode::query()->whereId($id)->first();
+		$node = SsNode::find($id);
 		if(!$node){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '节点不存在,请重试']);
+			return Response::json(['status' => 'fail', 'message' => '节点不存在,请重试']);
 		}
 
 		try{
@@ -401,12 +401,12 @@ class NodeController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
+			return Response::json(['status' => 'success', 'message' => '删除成功']);
 		}catch(Exception $e){
 			DB::rollBack();
 			Log::error('删除节点信息异常:'.$e->getMessage());
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败:'.$e->getMessage()]);
+			return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]);
 		}
 	}
 
@@ -429,7 +429,7 @@ class NodeController extends Controller {
 
 	// Ping节点延迟
 	public function pingNode(Request $request): ?JsonResponse {
-		$node = SsNode::query()->whereId($request->input('id'))->first();
+		$node = SsNode::find($request->input('id'));
 		if(!$node){
 			return Response::json(['status' => 'fail', 'message' => '节点不存在,请重试']);
 		}
@@ -460,7 +460,7 @@ class NodeController extends Controller {
 		}
 
 		$view['nodeList'] = SsNode::query()->orderBy('id')->get();
-		$view['pingLogs'] = $query->orderBy('id')->paginate(15)->appends($request->except('page'));
+		$view['pingLogs'] = $query->latest()->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.logs.nodePingLog', $view);
 	}
@@ -550,7 +550,7 @@ class NodeController extends Controller {
 
 	// 编辑域名证书
 	public function editCertificate(Request $request) {
-		$Dv = NodeCertificate::query()->find($request->input('id'));
+		$Dv = NodeCertificate::find($request->input('id'));
 		if($request->isMethod('POST')){
 			if($Dv){
 				$ret = NodeCertificate::query()->update([

+ 6 - 6
app/Http/Controllers/PaymentController.php

@@ -59,12 +59,12 @@ class PaymentController extends Controller {
 			default:
 				Log::error("未知支付:".self::$method);
 
-				return null;
+				return false;
 		}
 	}
 
 	public static function getStatus(Request $request): JsonResponse {
-		$payment = Payment::whereTradeNo($request->input('trade_no'))->first();
+		$payment = Payment::query()->whereTradeNo($request->input('trade_no'))->first();
 		if($payment){
 			if($payment->status == 1){
 				return Response::json(['status' => 'success', 'message' => '支付成功']);
@@ -176,7 +176,7 @@ class PaymentController extends Controller {
 		$order->coupon_id = !empty($coupon)? $coupon->id : 0;
 		$order->origin_amount = $credit?: $goods->price;
 		$order->amount = $amount;
-		$order->expire_at = $credit? null : date("Y-m-d H:i:s", strtotime("+".$goods->days." days"));
+		$order->expired_at = $credit? null : date("Y-m-d H:i:s", strtotime("+".$goods->days." days"));
 		$order->is_expire = 0;
 		$order->pay_type = $pay_type;
 		$order->pay_way = self::$method;
@@ -200,7 +200,7 @@ class PaymentController extends Controller {
 
 	public function close(Request $request): JsonResponse {
 		$oid = $request->input('oid');
-		$order = Order::query()->whereOid($oid)->first();
+		$order = Order::find($oid);
 		$payment = Payment::query()->whereOid($oid)->first();
 		if($order){
 			$ret = Order::query()->whereOid($oid)->update(['status' => -1]);
@@ -221,7 +221,7 @@ class PaymentController extends Controller {
 
 	// 支付单详情
 	public function detail($trade_no): \Illuminate\Http\Response {
-		$payment = Payment::uid()->with(['order', 'order.goods'])->whereTradeNo($trade_no)->first();
+		$payment = Payment::uid()->with(['order', 'order.goods'])->whereTradeNo($trade_no)->firstOrFail();
 		$view['payment'] = $payment;
 		$goods = $payment->order->goods;
 		$view['name'] = $goods? $goods->name : '余额充值';
@@ -242,7 +242,7 @@ class PaymentController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['list'] = $query->orderByDesc('id')->paginate(10)->appends($request->except('page'));
+		$view['list'] = $query->latest()->paginate(10)->appends($request->except('page'));
 
 		return Response::view('admin.logs.callbackList', $view);
 	}

+ 5 - 5
app/Http/Controllers/ServiceController.php

@@ -17,16 +17,16 @@ class ServiceController extends Controller {
 		     ->whereUserId($prepaidOrder->user_id)
 		     ->whereStatus(2)
 		     ->whereIsExpire(0)
-		     ->update(['expire_at' => date('Y-m-d H:i:s'), 'is_expire' => 1]);
+		     ->update(['expired_at' => date('Y-m-d H:i:s'), 'is_expire' => 1]);
 		//取出对应套餐信息
-		$prepaidGood = Goods::query()->whereId($prepaidOrder->goods_id)->first();
+		$prepaidGood = Goods::find($prepaidOrder->goods_id);
 		//激活预支付套餐
 		Order::query()->whereOid($prepaidOrder->oid)->update([
-			'expire_at' => date("Y-m-d H:i:s", strtotime("+".$prepaidGood->days." days")),
+			'expired_at' => date("Y-m-d H:i:s", strtotime("+".$prepaidGood->days." days")),
 			'status'    => 2
 		]);
 		//取出用户信息
-		$user = User::query()->whereId($prepaidOrder->user_id)->first();
+		$user = User::find($prepaidOrder->user_id);
 
 		$userTraffic = $prepaidGood->traffic * MB;
 		//拿出可能存在的其余套餐, 推算 最新的到期时间
@@ -34,7 +34,7 @@ class ServiceController extends Controller {
 		$prepaidOrders = Order::query()->whereUserId($prepaidOrder->user_id)->whereStatus(3)->get();
 		foreach($prepaidOrders as $paidOrder){
 			//取出对应套餐信息
-			$goods = Goods::query()->whereId($paidOrder->goods_id)->first();
+			$goods = Goods::find($paidOrder->goods_id);
 			$expire_time = date('Y-m-d', strtotime("+".$goods->days." days", strtotime($expire_time)));
 		}
 		//计算账号下一个重置时间

+ 14 - 21
app/Http/Controllers/User/AffiliateController.php

@@ -31,15 +31,12 @@ class AffiliateController extends Controller {
 		$view['totalAmount'] = ReferralLog::uid()->sum('ref_amount') / 100;
 		$view['canAmount'] = ReferralLog::uid()->whereStatus(0)->sum('ref_amount') / 100;
 		$view['link'] = self::$systemConfig['website_url'].'/register?aff='.Auth::id();
-		$view['referralLogList'] = ReferralLog::uid()->with('user')->orderByDesc('id')->paginate(10, ['*'], 'log_page');
-		$view['referralApplyList'] = ReferralApply::uid()
-		                                          ->with('user')
-		                                          ->orderByDesc('id')
-		                                          ->paginate(10, ['*'], 'apply_page');
+		$view['referralLogList'] = ReferralLog::uid()->with('user')->latest()->paginate(10, ['*'], 'log_page');
+		$view['referralApplyList'] = ReferralApply::uid()->with('user')->latest()->paginate(10, ['*'], 'apply_page');
 		$view['referralUserList'] = User::query()
 		                                ->select(['email', 'created_at'])
 		                                ->whereReferralUid(Auth::id())
-		                                ->orderByDesc('id')
+		                                ->latest()
 		                                ->paginate(10, ['*'], 'user_page');
 
 		return Response::view('user.referral', $view);
@@ -68,22 +65,18 @@ class AffiliateController extends Controller {
 			]);
 		}
 
-		// 取出本次申请关联返利日志ID
-		$link_logs = '';
-		foreach(ReferralLog::uid()->whereStatus(0)->get() as $log){
-			$link_logs .= $log->id.',';
+		$ret = ReferralApply::query()->insert([
+			'user_id'   => Auth::id(),
+			'before'    => $ref_amount,
+			'after'     => 0,
+			'amount'    => $ref_amount,
+			'link_logs' => implode(',', ReferralLog::uid()->whereStatus(0)->pluck('id')->toArray()),// 取出本次申请关联返利日志ID
+			'status'    => 0
+		]);
+		if($ret){
+			return Response::json(['status' => 'success', 'message' => '申请成功,请等待管理员审核']);
 		}
-		$link_logs = rtrim($link_logs, ',');
 
-		$obj = new ReferralApply();
-		$obj->user_id = Auth::id();
-		$obj->before = $ref_amount;
-		$obj->after = 0;
-		$obj->amount = $ref_amount;
-		$obj->link_logs = $link_logs;
-		$obj->status = 0;
-		$obj->save();
-
-		return Response::json(['status' => 'success', 'message' => '申请成功,请等待管理员审核']);
+		return Response::json(['status' => 'fail', 'message' => '申请失败,返利单建立失败,请稍后尝试或通知管理员']);
 	}
 }

+ 1 - 1
app/Http/Controllers/User/SubscribeController.php

@@ -39,7 +39,7 @@ class SubscribeController extends Controller {
 		}
 
 		// 检查用户是否有效
-		$user = User::query()->whereId($subscribe->user_id)->first();
+		$user = User::find($subscribe->user_id);
 		if(!$user){
 			exit($this->infoGenerator('错误订阅链接,账号不存在!请前往官网重新获取订阅链接'));
 		}

+ 31 - 24
app/Http/Controllers/UserController.php

@@ -56,13 +56,13 @@ class UserController extends Controller {
 		$usedTransfer = $user->u + $user->d;
 		$unusedTransfer = $totalTransfer - $usedTransfer > 0? $totalTransfer - $usedTransfer : 0;
 		$expireTime = $user->expire_time;
-		$view['remainDays'] = $expireTime < date('Y-m-d')? -1 : (strtotime($expireTime) - strtotime(date('Y-m-d'))) / Day;
-		$view['resetDays'] = $user->reset_time? round((strtotime($user->reset_time) - strtotime(date('Y-m-d'))) / Day) : 0;
+		$view['remainDays'] = $expireTime < date('Y-m-d')? -1 : ceil((strtotime($expireTime) - time()) / Day);
+		$view['resetDays'] = $user->reset_time? ceil((strtotime($user->reset_time) - time()) / Day) : 0;
 		$view['unusedTransfer'] = $unusedTransfer;
 		$view['expireTime'] = $expireTime;
 		$view['banedTime'] = $user->ban_time? date('Y-m-d H:i:s', $user->ban_time) : 0;
 		$view['unusedPercent'] = $totalTransfer > 0? round($unusedTransfer / $totalTransfer, 2) : 0;
-		$view['noticeList'] = Article::type(2)->orderByDesc('id')->Paginate(1); // 公告
+		$view['noticeList'] = Article::type(2)->latest()->Paginate(1); // 公告
 		//流量异常判断
 		$hourlyTraffic = UserTrafficHourly::query()
 		                                  ->userHourly($user->id)
@@ -75,7 +75,7 @@ class UserController extends Controller {
 		                                ->whereIsExpire(0)
 		                                ->where('origin_amount', '>', 0)
 		                                ->doesntExist();
-		$view['userLoginLog'] = UserLoginLog::query()->whereUserId($user->id)->orderByDesc('id')->first(); // 近期登录日志
+		$view['userLoginLog'] = UserLoginLog::query()->whereUserId($user->id)->latest()->first(); // 近期登录日志
 		$view = array_merge($view, $this->dataFlowChart($user->id));
 
 		return Response::view('user.index', $view);
@@ -116,10 +116,9 @@ class UserController extends Controller {
 	public function nodeList(Request $request) {
 		$user = Auth::getUser();
 		if($request->isMethod('POST')){
-			$node_id = $request->input('id');
 			$infoType = $request->input('type');
 
-			$node = SsNode::query()->whereId($node_id)->first();
+			$node = SsNode::find($request->input('id'));
 			// 生成节点信息
 			if($node->type == 1){
 				$proxyType = $node->compatible? 'SS' : 'SSR';
@@ -155,7 +154,7 @@ class UserController extends Controller {
 			$node->offline = SsNodeInfo::query()
 			                           ->whereNodeId($node->id)
 			                           ->where('log_time', '>=', strtotime("-10 minutes"))
-			                           ->orderByDesc('id')
+			                           ->latest('log_time')
 			                           ->doesntExist();
 			// 节点标签
 			$node->labels = SsNodeLabel::query()->whereNodeId($node->id)->get();
@@ -254,11 +253,11 @@ class UserController extends Controller {
 			                   $q->whereType(2);
 		                   })
 		                   ->first();
-		$renewPrice = $renewOrder? Goods::query()->whereId($renewOrder->goods_id)->first() : 0;
+		$renewPrice = $renewOrder? Goods::find($renewOrder->goods_id) : 0;
 		$view['renewTraffic'] = $renewPrice? $renewPrice->renew : 0;
 		// 有重置日时按照重置日为标准,否者就以过期日为标准
 		$dataPlusDays = $user->reset_time?: $user->expire_time;
-		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? round((strtotime($dataPlusDays) - strtotime(date('Y-m-d'))) / Day) : 0;
+		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? ceil((strtotime($dataPlusDays) - time()) / Day) : 0;
 
 		return Response::view('user.services', $view);
 	}
@@ -266,10 +265,15 @@ class UserController extends Controller {
 	//重置流量
 	public function resetUserTraffic(): ?JsonResponse {
 		$user = Auth::getUser();
-		$temp = Order::uid()->whereStatus(2)->whereIsExpire(0)->with(['goods'])->whereHas('goods', static function($q) {
-			$q->whereType(2);
-		})->first();
-		$renewCost = Goods::query()->whereId($temp->goods_id)->first()->renew;
+		$order = Order::uid()
+		              ->whereStatus(2)
+		              ->whereIsExpire(0)
+		              ->with(['goods'])
+		              ->whereHas('goods', static function($q) {
+			              $q->whereType(2);
+		              })
+		              ->first();
+		$renewCost = Goods::find($order->goods_id)->renew;
 		if($user->credit < $renewCost){
 			return Response::json(['status' => 'fail', 'message' => '余额不足,请充值余额']);
 		}
@@ -288,7 +292,7 @@ class UserController extends Controller {
 
 	// 工单
 	public function ticketList(Request $request): \Illuminate\Http\Response {
-		$view['ticketList'] = Ticket::uid()->orderByDesc('id')->paginate(10)->appends($request->except('page'));
+		$view['ticketList'] = Ticket::uid()->latest()->paginate(10)->appends($request->except('page'));
 
 		return Response::view('user.ticketList', $view);
 	}
@@ -306,7 +310,7 @@ class UserController extends Controller {
 
 	public function activeOrder(Request $request): JsonResponse {
 		$oid = $request->input('oid');
-		$prepaidOrder = Order::query()->whereOid($oid)->first();
+		$prepaidOrder = Order::find($oid);
 		if(!$prepaidOrder){
 			return Response::json(['status' => 'fail', 'message' => '查无此单!']);
 		}
@@ -411,7 +415,7 @@ class UserController extends Controller {
 		}
 
 		$view['ticket'] = $ticket;
-		$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->orderBy('id')->get();
+		$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->oldest()->get();
 
 		return Response::view('user.replyTicket', $view);
 	}
@@ -521,7 +525,7 @@ class UserController extends Controller {
 		}
 		// 有重置日时按照重置日为标准,否者就以过期日为标准
 		$dataPlusDays = $user->reset_time?: $user->expire_time;
-		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? round((strtotime($dataPlusDays) - strtotime(date('Y-m-d'))) / Day) : 0;
+		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? ceil((strtotime($dataPlusDays) - time()) / Day) : 0;
 		$view['activePlan'] = Order::uid()
 		                           ->with(['goods'])
 		                           ->whereIsExpire(0)
@@ -537,7 +541,7 @@ class UserController extends Controller {
 
 	// 帮助中心
 	public function help(): \Illuminate\Http\Response {
-		//$view['articleList'] = Article::type(1)->orderByDesc('sort')->orderByDesc('id')->limit(10)->paginate(5);
+		//$view['articleList'] = Article::type(1)->orderByDesc('sort')->latest()->limit(10)->paginate(5);
 		$data = [];
 		if(SsNode::query()->whereIn('type', [1, 4])->whereStatus(1)->exists()){
 			$data[] = 'ss';
@@ -562,7 +566,7 @@ class UserController extends Controller {
 		$view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/clients/Shadowrocket.plist';
 		$view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.self::$systemConfig['website_url'].'/clients/Quantumult.plist';
 		// 订阅连接
-		$subscribe = UserSubscribe::query()->whereUserId(Auth::id())->first();
+		$subscribe = UserSubscribe::query()->whereUserId(Auth::id())->firstOrFail();
 		$view['subscribe_status'] = $subscribe->status;
 		$subscribe_link = (self::$systemConfig['subscribe_domain']?: self::$systemConfig['website_url']).'/s/'.$subscribe->code;
 		$view['link'] = $subscribe_link;
@@ -577,8 +581,9 @@ class UserController extends Controller {
 
 	// 更换订阅地址
 	public function exchangeSubscribe(): ?JsonResponse {
-		DB::beginTransaction();
 		try{
+			DB::beginTransaction();
+
 			// 更换订阅码
 			UserSubscribe::uid()->update(['code' => Helpers::makeSubscribeCode()]);
 
@@ -604,10 +609,12 @@ class UserController extends Controller {
 		}
 
 		// 管理员信息重新写入user
-		Auth::loginUsingId(Session::get('admin'));
+		$user = Auth::loginUsingId(Session::get('admin'));
 		Session::forget('admin');
-
-		return Response::json(['status' => 'success', 'message' => "身份切换成功"]);
+		if($user){
+			return Response::json(['status' => 'success', 'message' => "身份切换成功"]);
+		}
+		return Response::json(['status' => 'fail', 'message' => '身份切换失败']);
 	}
 
 	// 卡券余额充值
@@ -625,7 +632,7 @@ class UserController extends Controller {
 			return Response::json(['status' => 'fail', 'message' => $validator->getMessageBag()->first()]);
 		}
 
-		$coupon = Coupon::query()->whereSn($request->input('coupon_sn'))->first();
+		$coupon = Coupon::query()->whereSn($request->input('coupon_sn'))->firstOrFail();
 
 		try{
 			DB::beginTransaction();

+ 1 - 0
app/Http/Middleware/Authenticate.php

@@ -15,5 +15,6 @@ class Authenticate extends Middleware {
 		if(!$request->expectsJson()){
 			return route('login');
 		}
+		return $request;
 	}
 }

+ 2 - 2
app/Http/Middleware/WebApi.php

@@ -30,7 +30,7 @@ class WebApi {
 			return $this->returnData('Your Node Id is null!');
 		}
 
-		$node = SsNode::query()->whereId($id)->first();
+		$node = SsNode::find($id);
 		if(!$node){// node不存在
 			return $this->returnData('Unknown Node!');
 		}
@@ -49,6 +49,6 @@ class WebApi {
 
 	// 返回数据
 	public function returnData($message): JsonResponse {
-		return Response::json(['status' => 'fail', 'code' => 404, 'data' => '', 'message' => $message]);
+		return Response::json(['status' => 'fail', 'code' => 404, 'message' => $message]);
 	}
 }

+ 1 - 1
app/Mail/nodeCrashWarning.php

@@ -21,7 +21,7 @@ class nodeCrashWarning extends Mailable implements ShouldQueue {
 	public function build(): nodeCrashWarning {
 
 		return $this->view('emails.nodeCrashWarning')->subject('节点阻断警告')->with([
-			'content' => NotificationLog::query()->whereId($this->id)->first()->content
+			'content' => NotificationLog::find($this->id)->content
 		]);
 	}
 

+ 18 - 18
app/Models/Article.php

@@ -2,9 +2,9 @@
 
 namespace App\Models;
 
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Database\Query\Builder;
 
 /**
  * 文章
@@ -17,25 +17,25 @@ use Illuminate\Database\Query\Builder;
  * @property string|null                     $logo       LOGO
  * @property string|null                     $content    内容
  * @property int                             $sort       排序
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property \Illuminate\Support\Carbon      $created_at 创建时间
+ * @property \Illuminate\Support\Carbon      $updated_at 最后更新时间
  * @property \Illuminate\Support\Carbon|null $deleted_at 删除时间
- * @method static \Illuminate\Database\Eloquent\Builder|Article newModelQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|Article newQuery()
+ * @method static Builder|Article newModelQuery()
+ * @method static Builder|Article newQuery()
  * @method static Builder|Article onlyTrashed()
- * @method static \Illuminate\Database\Eloquent\Builder|Article query()
- * @method static \Illuminate\Database\Eloquent\Builder|Article type($type)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereAuthor($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereContent($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereCreatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereDeletedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereLogo($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereSort($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereSummary($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereTitle($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereType($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Article whereUpdatedAt($value)
+ * @method static Builder|Article query()
+ * @method static Builder|Article type($type)
+ * @method static Builder|Article whereAuthor($value)
+ * @method static Builder|Article whereContent($value)
+ * @method static Builder|Article whereCreatedAt($value)
+ * @method static Builder|Article whereDeletedAt($value)
+ * @method static Builder|Article whereId($value)
+ * @method static Builder|Article whereLogo($value)
+ * @method static Builder|Article whereSort($value)
+ * @method static Builder|Article whereSummary($value)
+ * @method static Builder|Article whereTitle($value)
+ * @method static Builder|Article whereType($value)
+ * @method static Builder|Article whereUpdatedAt($value)
  * @method static Builder|Article withTrashed()
  * @method static Builder|Article withoutTrashed()
  * @mixin \Eloquent

+ 0 - 1
app/Models/Config.php

@@ -22,5 +22,4 @@ use Illuminate\Database\Eloquent\Model;
 class Config extends Model {
 	public $timestamps = false;
 	protected $table = 'config';
-
 }

+ 22 - 22
app/Models/Coupon.php

@@ -2,9 +2,9 @@
 
 namespace App\Models;
 
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Database\Query\Builder;
 
 /**
  * 优惠券
@@ -21,29 +21,29 @@ use Illuminate\Database\Query\Builder;
  * @property int                             $available_start 有效期开始
  * @property int                             $available_end   有效期结束
  * @property int                             $status          状态:0-未使用、1-已使用、2-已失效
- * @property \Illuminate\Support\Carbon|null $created_at      创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at      最后更新时间
+ * @property \Illuminate\Support\Carbon      $created_at      创建时间
+ * @property \Illuminate\Support\Carbon      $updated_at      最后更新时间
  * @property \Illuminate\Support\Carbon|null $deleted_at      删除时间
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon newModelQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon newQuery()
+ * @method static Builder|Coupon newModelQuery()
+ * @method static Builder|Coupon newQuery()
  * @method static Builder|Coupon onlyTrashed()
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon query()
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon type($type)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereAmount($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereAvailableEnd($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereAvailableStart($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereCreatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereDeletedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereDiscount($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereLogo($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereName($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereRule($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereSn($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereStatus($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereType($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereUpdatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereUsageCount($value)
+ * @method static Builder|Coupon query()
+ * @method static Builder|Coupon type($type)
+ * @method static Builder|Coupon whereAmount($value)
+ * @method static Builder|Coupon whereAvailableEnd($value)
+ * @method static Builder|Coupon whereAvailableStart($value)
+ * @method static Builder|Coupon whereCreatedAt($value)
+ * @method static Builder|Coupon whereDeletedAt($value)
+ * @method static Builder|Coupon whereDiscount($value)
+ * @method static Builder|Coupon whereId($value)
+ * @method static Builder|Coupon whereLogo($value)
+ * @method static Builder|Coupon whereName($value)
+ * @method static Builder|Coupon whereRule($value)
+ * @method static Builder|Coupon whereSn($value)
+ * @method static Builder|Coupon whereStatus($value)
+ * @method static Builder|Coupon whereType($value)
+ * @method static Builder|Coupon whereUpdatedAt($value)
+ * @method static Builder|Coupon whereUsageCount($value)
  * @method static Builder|Coupon withTrashed()
  * @method static Builder|Coupon withoutTrashed()
  * @mixin \Eloquent

+ 7 - 9
app/Models/CouponLog.php

@@ -8,13 +8,12 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 优惠券使用日志
  *
- * @property int                             $id
- * @property int                             $coupon_id   优惠券ID
- * @property int                             $goods_id    商品ID
- * @property int                             $order_id    订单ID
- * @property string                          $description 备注
- * @property \Illuminate\Support\Carbon|null $created_at  创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at  最后更新时间
+ * @property int                        $id
+ * @property int                        $coupon_id   优惠券ID
+ * @property int                        $goods_id    商品ID
+ * @property int                        $order_id    订单ID
+ * @property string                     $description 备注
+ * @property \Illuminate\Support\Carbon $created_at  创建时间
  * @method static Builder|CouponLog newModelQuery()
  * @method static Builder|CouponLog newQuery()
  * @method static Builder|CouponLog query()
@@ -24,10 +23,9 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|CouponLog whereGoodsId($value)
  * @method static Builder|CouponLog whereId($value)
  * @method static Builder|CouponLog whereOrderId($value)
- * @method static Builder|CouponLog whereUpdatedAt($value)
  * @mixin \Eloquent
  */
 class CouponLog extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'coupon_log';
-
 }

+ 28 - 28
app/Models/Goods.php

@@ -2,9 +2,9 @@
 
 namespace App\Models;
 
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Database\Query\Builder;
 
 /**
  * 商品
@@ -27,36 +27,36 @@ use Illuminate\Database\Query\Builder;
  * @property int                             $sort        排序
  * @property int                             $is_hot      是否热销:0-否、1-是
  * @property int                             $status      状态:0-下架、1-上架
- * @property \Illuminate\Support\Carbon|null $created_at  创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at  最后更新时间
+ * @property \Illuminate\Support\Carbon      $created_at  创建时间
+ * @property \Illuminate\Support\Carbon      $updated_at  最后更新时间
  * @property \Illuminate\Support\Carbon|null $deleted_at  删除时间
  * @property-read mixed                      $traffic_label
- * @method static \Illuminate\Database\Eloquent\Builder|Goods newModelQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|Goods newQuery()
+ * @method static Builder|Goods newModelQuery()
+ * @method static Builder|Goods newQuery()
  * @method static Builder|Goods onlyTrashed()
- * @method static \Illuminate\Database\Eloquent\Builder|Goods query()
- * @method static \Illuminate\Database\Eloquent\Builder|Goods type($type)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereColor($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereCreatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereDays($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereDeletedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereDescription($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereInfo($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereInviteNum($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereIsHot($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereLevel($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereLimitNum($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereLogo($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereName($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods wherePeriod($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods wherePrice($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereRenew($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereSort($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereStatus($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereTraffic($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereType($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Goods whereUpdatedAt($value)
+ * @method static Builder|Goods query()
+ * @method static Builder|Goods type($type)
+ * @method static Builder|Goods whereColor($value)
+ * @method static Builder|Goods whereCreatedAt($value)
+ * @method static Builder|Goods whereDays($value)
+ * @method static Builder|Goods whereDeletedAt($value)
+ * @method static Builder|Goods whereDescription($value)
+ * @method static Builder|Goods whereId($value)
+ * @method static Builder|Goods whereInfo($value)
+ * @method static Builder|Goods whereInviteNum($value)
+ * @method static Builder|Goods whereIsHot($value)
+ * @method static Builder|Goods whereLevel($value)
+ * @method static Builder|Goods whereLimitNum($value)
+ * @method static Builder|Goods whereLogo($value)
+ * @method static Builder|Goods whereName($value)
+ * @method static Builder|Goods wherePeriod($value)
+ * @method static Builder|Goods wherePrice($value)
+ * @method static Builder|Goods whereRenew($value)
+ * @method static Builder|Goods whereSort($value)
+ * @method static Builder|Goods whereStatus($value)
+ * @method static Builder|Goods whereTraffic($value)
+ * @method static Builder|Goods whereType($value)
+ * @method static Builder|Goods whereUpdatedAt($value)
  * @method static Builder|Goods withTrashed()
  * @method static Builder|Goods withoutTrashed()
  * @mixin \Eloquent

+ 18 - 19
app/Models/Invite.php

@@ -3,10 +3,10 @@
 namespace App\Models;
 
 use Auth;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\HasOne;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Database\Query\Builder;
 
 /**
  * 邀请码
@@ -16,27 +16,27 @@ use Illuminate\Database\Query\Builder;
  * @property int                             $fuid       受邀人ID
  * @property string                          $code       邀请码
  * @property int                             $status     邀请码状态:0-未使用、1-已使用、2-已过期
- * @property string|null                     $dateline   有效期至
- * @property \Illuminate\Support\Carbon|null $created_at
- * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property \Illuminate\Support\Carbon      $dateline   有效期至
+ * @property \Illuminate\Support\Carbon      $created_at 创建时间
+ * @property \Illuminate\Support\Carbon      $updated_at 最后更新时间
  * @property \Illuminate\Support\Carbon|null $deleted_at 删除时间
  * @property-read \App\Models\User|null      $generator
  * @property-read string                     $status_label
  * @property-read \App\Models\User|null      $user
- * @method static \Illuminate\Database\Eloquent\Builder|Invite newModelQuery()
- * @method static \Illuminate\Database\Eloquent\Builder|Invite newQuery()
+ * @method static Builder|Invite newModelQuery()
+ * @method static Builder|Invite newQuery()
  * @method static Builder|Invite onlyTrashed()
- * @method static \Illuminate\Database\Eloquent\Builder|Invite query()
- * @method static \Illuminate\Database\Eloquent\Builder|Invite uid()
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereCode($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereCreatedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereDateline($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereDeletedAt($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereFuid($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereId($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereStatus($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereUid($value)
- * @method static \Illuminate\Database\Eloquent\Builder|Invite whereUpdatedAt($value)
+ * @method static Builder|Invite query()
+ * @method static Builder|Invite uid()
+ * @method static Builder|Invite whereCode($value)
+ * @method static Builder|Invite whereCreatedAt($value)
+ * @method static Builder|Invite whereDateline($value)
+ * @method static Builder|Invite whereDeletedAt($value)
+ * @method static Builder|Invite whereFuid($value)
+ * @method static Builder|Invite whereId($value)
+ * @method static Builder|Invite whereStatus($value)
+ * @method static Builder|Invite whereUid($value)
+ * @method static Builder|Invite whereUpdatedAt($value)
  * @method static Builder|Invite withTrashed()
  * @method static Builder|Invite withoutTrashed()
  * @mixin \Eloquent
@@ -45,7 +45,7 @@ class Invite extends Model {
 	use SoftDeletes;
 
 	protected $table = 'invite';
-	protected $dates = ['deleted_at'];
+	protected $dates = ['dateline', 'deleted_at'];
 
 	public function scopeUid($query) {
 		return $query->whereUid(Auth::id());
@@ -76,5 +76,4 @@ class Invite extends Model {
 
 		return $status_label;
 	}
-
 }

+ 8 - 9
app/Models/Marketing.php

@@ -9,14 +9,14 @@ use Illuminate\Database\Eloquent\Model;
  * 营销
  *
  * @property int                        $id
- * @property int                        $type     类型:1-邮件群发
- * @property string                     $receiver 接收者
- * @property string                     $title    标题
- * @property string                     $content  内容
- * @property string|null                $error    错误信息
- * @property int                        $status   状态:-1-失败、0-待发送、1-成功
- * @property \Illuminate\Support\Carbon $created_at
- * @property \Illuminate\Support\Carbon $updated_at
+ * @property int                        $type       类型:1-邮件群发
+ * @property string                     $receiver   接收者
+ * @property string                     $title      标题
+ * @property string                     $content    内容
+ * @property string|null                $error      错误信息
+ * @property int                        $status     状态:-1-失败、0-待发送、1-成功
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @property-read string                $status_label
  * @method static Builder|Marketing newModelQuery()
  * @method static Builder|Marketing newQuery()
@@ -34,7 +34,6 @@ use Illuminate\Database\Eloquent\Model;
  */
 class Marketing extends Model {
 	protected $table = 'marketing';
-	protected $appends = ['status_label'];
 
 	public function getStatusLabelAttribute(): string {
 		$status_label = '';

+ 8 - 8
app/Models/NodeAuth.php

@@ -7,15 +7,15 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\HasOne;
 
 /**
- * App\Models\NodeAuth
+ * 节点授权密钥
  *
- * @property int                             $id
- * @property int                             $node_id    授权节点ID
- * @property string|null                     $key        认证KEY
- * @property string|null                     $secret     通信密钥
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\SsNode|null    $node
+ * @property int                          $id
+ * @property int                          $node_id    授权节点ID
+ * @property string                       $key        认证KEY
+ * @property string                       $secret     通信密钥
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
+ * @property \Illuminate\Support\Carbon   $updated_at 最后更新时间
+ * @property-read \App\Models\SsNode|null $node
  * @method static Builder|NodeAuth newModelQuery()
  * @method static Builder|NodeAuth newQuery()
  * @method static Builder|NodeAuth query()

+ 5 - 5
app/Models/NodeCertificate.php

@@ -9,11 +9,11 @@ use Illuminate\Database\Eloquent\Model;
  * 伪装域名证书
  *
  * @property int                        $id
- * @property string                     $domain 域名
- * @property string|null                $key    域名证书KEY
- * @property string|null                $pem    域名证书PEM
- * @property \Illuminate\Support\Carbon $created_at
- * @property \Illuminate\Support\Carbon $updated_at
+ * @property string                     $domain     域名
+ * @property string|null                $key        域名证书KEY
+ * @property string|null                $pem        域名证书PEM
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @method static Builder|NodeCertificate newModelQuery()
  * @method static Builder|NodeCertificate newQuery()
  * @method static Builder|NodeCertificate query()

+ 5 - 5
app/Models/NodeRule.php

@@ -9,11 +9,11 @@ use Illuminate\Database\Eloquent\Model;
  * 节点审计规则关联
  *
  * @property int                        $id
- * @property int                        $node_id  节点ID
- * @property int                        $rule_id  审计规则ID
- * @property int                        $is_black 是否黑名单模式:0-不是、1-是
- * @property \Illuminate\Support\Carbon $created_at
- * @property \Illuminate\Support\Carbon $updated_at
+ * @property int|null                   $node_id    节点ID
+ * @property int|null                   $rule_id    审计规则ID
+ * @property int                        $is_black   是否黑名单模式:0-不是、1-是
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @method static Builder|NodeRule newModelQuery()
  * @method static Builder|NodeRule newQuery()
  * @method static Builder|NodeRule query()

+ 9 - 9
app/Models/NotificationLog.php

@@ -8,15 +8,15 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 推送通知日志
  *
- * @property int                             $id
- * @property int                             $type       类型:1-邮件、2-ServerChan、3-Bark、4-Telegram
- * @property string                          $address    收信地址
- * @property string                          $title      标题
- * @property string                          $content    内容
- * @property int                             $status     状态:-1发送失败、0-等待发送、1-发送成功
- * @property string|null                     $error      发送失败抛出的异常信息
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property int                        $id
+ * @property int                        $type       类型:1-邮件、2-ServerChan、3-Bark、4-Telegram
+ * @property string                     $address    收信地址
+ * @property string                     $title      标题
+ * @property string                     $content    内容
+ * @property int                        $status     状态:-1发送失败、0-等待发送、1-发送成功
+ * @property string|null                $error      发送失败抛出的异常信息
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @method static Builder|NotificationLog newModelQuery()
  * @method static Builder|NotificationLog newQuery()
  * @method static Builder|NotificationLog query()

+ 6 - 6
app/Models/Order.php

@@ -17,13 +17,13 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @property int                             $coupon_id     优惠券ID
  * @property int                             $origin_amount 订单原始总价,单位分
  * @property int                             $amount        订单总价,单位分
- * @property string|null                     $expire_at     过期时间
+ * @property \Illuminate\Support\Carbon|null $expired_at    过期时间
  * @property int                             $is_expire     是否已过期:0-未过期、1-已过期
- * @property int|null                        $pay_type      支付渠道:0-余额、1-支付宝、2-QQ、3-微信、4-虚拟货币、5-paypal
+ * @property int                             $pay_type      支付渠道:0-余额、1-支付宝、2-QQ、3-微信、4-虚拟货币、5-paypal
  * @property string                          $pay_way       支付方式:balance、f2fpay、codepay、payjs、bitpayx等
  * @property int                             $status        订单状态:-1-已关闭、0-待支付、1-已支付待确认、2-已完成
- * @property \Illuminate\Support\Carbon|null $created_at    创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at    最后一次更新时间
+ * @property \Illuminate\Support\Carbon      $created_at    创建时间
+ * @property \Illuminate\Support\Carbon      $updated_at    最后更新时间
  * @property-read \App\Models\Coupon|null    $coupon
  * @property-read string                     $pay_type_icon
  * @property-read string                     $pay_type_label
@@ -39,7 +39,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|Order whereAmount($value)
  * @method static Builder|Order whereCouponId($value)
  * @method static Builder|Order whereCreatedAt($value)
- * @method static Builder|Order whereExpireAt($value)
+ * @method static Builder|Order whereExpiredAt($value)
  * @method static Builder|Order whereGoodsId($value)
  * @method static Builder|Order whereIsExpire($value)
  * @method static Builder|Order whereOid($value)
@@ -55,7 +55,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 class Order extends Model {
 	protected $table = 'order';
 	protected $primaryKey = 'oid';
-	protected $appends = ['status_label'];
+	protected $dates = ['expired_at'];
 
 	public function scopeUid($query) {
 		return $query->whereUserId(Auth::id());

+ 13 - 14
app/Models/Payment.php

@@ -10,19 +10,19 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
 /**
  * 支付单
  *
- * @property int                         $id
- * @property string|null                 $trade_no 支付单号(本地订单号)
- * @property int                         $user_id  用户ID
- * @property int|null                    $oid      本地订单ID
- * @property int                         $amount   金额,单位分
- * @property string|null                 $qr_code  支付二维码
- * @property string|null                 $url      支付链接
- * @property int                         $status   支付状态:-1-支付失败、0-等待支付、1-支付成功
- * @property \Illuminate\Support\Carbon  $created_at
- * @property \Illuminate\Support\Carbon  $updated_at
- * @property-read string                 $status_label
- * @property-read \App\Models\Order|null $order
- * @property-read \App\Models\User       $user
+ * @property int                        $id
+ * @property string                     $trade_no   支付单号(本地订单号)
+ * @property int                        $user_id    用户ID
+ * @property int                        $oid        本地订单ID
+ * @property int                        $amount     金额,单位分
+ * @property string|null                $qr_code    支付二维码
+ * @property string|null                $url        支付链接
+ * @property int                        $status     支付状态:-1-支付失败、0-等待支付、1-支付成功
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read string                $status_label
+ * @property-read \App\Models\Order     $order
+ * @property-read \App\Models\User      $user
  * @method static Builder|Payment newModelQuery()
  * @method static Builder|Payment newQuery()
  * @method static Builder|Payment query()
@@ -41,7 +41,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  */
 class Payment extends Model {
 	protected $table = 'payment';
-	protected $appends = ['status_label'];
 
 	public function scopeUid($query) {
 		return $query->whereUserId(Auth::id());

+ 8 - 9
app/Models/PaymentCallback.php

@@ -8,14 +8,14 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 支付回调日志
  *
- * @property int                             $id
- * @property string|null                     $trade_no     本地订单号
- * @property string|null                     $out_trade_no 外部订单号(支付平台)
- * @property int|null                        $amount       交易金额,单位分
- * @property int|null                        $status       交易状态:0-失败、1-成功
- * @property \Illuminate\Support\Carbon|null $created_at
- * @property \Illuminate\Support\Carbon|null $updated_at
- * @property-read string                     $status_label
+ * @property int                        $id
+ * @property string                     $trade_no     本地订单号
+ * @property string                     $out_trade_no 外部订单号(支付平台)
+ * @property int                        $amount       交易金额,单位分
+ * @property int                        $status       交易状态:0-失败、1-成功
+ * @property \Illuminate\Support\Carbon $created_at   创建时间
+ * @property \Illuminate\Support\Carbon $updated_at   最后更新时间
+ * @property-read string                $status_label
  * @method static Builder|PaymentCallback newModelQuery()
  * @method static Builder|PaymentCallback newQuery()
  * @method static Builder|PaymentCallback query()
@@ -30,7 +30,6 @@ use Illuminate\Database\Eloquent\Model;
  */
 class PaymentCallback extends Model {
 	protected $table = 'payment_callback';
-	protected $appends = ['status_label'];
 
 	public function getStatusLabelAttribute(): string {
 		$status_label = '';

+ 7 - 7
app/Models/ProductsPool.php

@@ -8,13 +8,13 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 产品名称池
  *
- * @property int                             $id
- * @property string|null                     $name       名称
- * @property int|null                        $min_amount 适用最小金额,单位分
- * @property int|null                        $max_amount 适用最大金额,单位分
- * @property int                             $status     状态:0-未启用、1-已启用
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property int                        $id
+ * @property string                     $name       名称
+ * @property int                        $min_amount 适用最小金额,单位分
+ * @property int                        $max_amount 适用最大金额,单位分
+ * @property int                        $status     状态:0-未启用、1-已启用
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @method static Builder|ProductsPool newModelQuery()
  * @method static Builder|ProductsPool newQuery()
  * @method static Builder|ProductsPool query()

+ 10 - 10
app/Models/ReferralApply.php

@@ -10,16 +10,16 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 返利申请
  *
- * @property int                             $id
- * @property int                             $user_id    用户ID
- * @property int                             $before     操作前可提现金额,单位分
- * @property int                             $after      操作后可提现金额,单位分
- * @property int                             $amount     本次提现金额,单位分
- * @property string                          $link_logs  关联返利日志ID,例如:1,3,4
- * @property int                             $status     状态:-1-驳回、0-待审核、1-审核通过待打款、2-已打款
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\User|null      $User
+ * @property int                        $id
+ * @property int                        $user_id    用户ID
+ * @property int                        $before     操作前可提现金额,单位分
+ * @property int                        $after      操作后可提现金额,单位分
+ * @property int                        $amount     本次提现金额,单位分
+ * @property string                     $link_logs  关联返利日志ID,例如:1,3,4
+ * @property int                        $status     状态:-1-驳回、0-待审核、1-审核通过待打款、2-已打款
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read \App\Models\User|null $User
  * @method static Builder|ReferralApply newModelQuery()
  * @method static Builder|ReferralApply newQuery()
  * @method static Builder|ReferralApply query()

+ 12 - 12
app/Models/ReferralLog.php

@@ -10,18 +10,18 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 返利日志
  *
- * @property int                             $id
- * @property int                             $user_id     用户ID
- * @property int                             $ref_user_id 推广人ID
- * @property int                             $order_id    关联订单ID
- * @property int                             $amount      消费金额,单位分
- * @property int                             $ref_amount  返利金额
- * @property int                             $status      状态:0-未提现、1-审核中、2-已提现
- * @property \Illuminate\Support\Carbon|null $created_at  创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at  最后更新时间
- * @property-read \App\Models\Order|null     $order
- * @property-read \App\Models\User|null      $ref_user
- * @property-read \App\Models\User|null      $user
+ * @property int                         $id
+ * @property int                         $user_id     用户ID
+ * @property int                         $ref_user_id 推广人ID
+ * @property int                         $order_id    关联订单ID
+ * @property int                         $amount      消费金额,单位分
+ * @property int                         $ref_amount  返利金额
+ * @property int                         $status      状态:0-未提现、1-审核中、2-已提现
+ * @property \Illuminate\Support\Carbon  $created_at  创建时间
+ * @property \Illuminate\Support\Carbon  $updated_at  最后更新时间
+ * @property-read \App\Models\Order|null $order
+ * @property-read \App\Models\User|null  $ref_user
+ * @property-read \App\Models\User|null  $user
  * @method static Builder|ReferralLog newModelQuery()
  * @method static Builder|ReferralLog newQuery()
  * @method static Builder|ReferralLog query()

+ 8 - 8
app/Models/RuleGroup.php

@@ -8,14 +8,14 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 审计规则分组
  *
- * @property int                             $id
- * @property int|null                        $type  模式:1-阻断、0-放行
- * @property string|null                     $name  分组名称
- * @property string|null                     $rules 关联的规则ID,多个用,号分隔
- * @property string|null                     $nodes 关联的节点ID,多个用,号分隔
- * @property \Illuminate\Support\Carbon|null $created_at
- * @property \Illuminate\Support\Carbon|null $updated_at
- * @property-read string                     $type_label
+ * @property int                        $id
+ * @property int                        $type       模式:1-阻断、0-放行
+ * @property string                     $name       分组名称
+ * @property string|null                $rules      关联的规则ID,多个用,号分隔
+ * @property string|null                $nodes      关联的节点ID,多个用,号分隔
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read string                $type_label
  * @method static Builder|RuleGroup newModelQuery()
  * @method static Builder|RuleGroup newQuery()
  * @method static Builder|RuleGroup query()

+ 5 - 5
app/Models/RuleGroupNode.php

@@ -8,11 +8,11 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 审计规则分组节点关联
  *
- * @property int                             $id
- * @property int|null                        $rule_group_id 规则分组ID
- * @property int|null                        $node_id       节点ID
- * @property \Illuminate\Support\Carbon|null $created_at
- * @property \Illuminate\Support\Carbon|null $updated_at
+ * @property int                        $id
+ * @property int                        $rule_group_id 规则分组ID
+ * @property int                        $node_id       节点ID
+ * @property \Illuminate\Support\Carbon $created_at    创建时间
+ * @property \Illuminate\Support\Carbon $updated_at    最后更新时间
  * @method static Builder|RuleGroupNode newModelQuery()
  * @method static Builder|RuleGroupNode newQuery()
  * @method static Builder|RuleGroupNode query()

+ 6 - 7
app/Models/RuleLog.php

@@ -10,12 +10,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * 触发审计规则日志
  *
  * @property int                          $id
- * @property int                          $user_id 用户ID
- * @property int                          $node_id 节点ID
- * @property int                          $rule_id 规则ID,0表示白名单模式下访问访问了非规则允许的网址
- * @property string                       $reason  触发原因
- * @property \Illuminate\Support\Carbon   $created_at
- * @property \Illuminate\Support\Carbon   $updated_at
+ * @property int                          $user_id    用户ID
+ * @property int                          $node_id    节点ID
+ * @property int                          $rule_id    规则ID,0表示白名单模式下访问访问了非规则允许的网址
+ * @property string                       $reason     触发原因
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
  * @property-read \App\Models\SsNode|null $node
  * @property-read \App\Models\Rule|null   $rule
  * @property-read \App\Models\User|null   $user
@@ -27,11 +26,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|RuleLog whereNodeId($value)
  * @method static Builder|RuleLog whereReason($value)
  * @method static Builder|RuleLog whereRuleId($value)
- * @method static Builder|RuleLog whereUpdatedAt($value)
  * @method static Builder|RuleLog whereUserId($value)
  * @mixin \Eloquent
  */
 class RuleLog extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'rule_log';
 
 	public function user(): HasOne {

+ 5 - 4
app/Models/SsNode.php

@@ -51,9 +51,10 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @property string                                                                  $v2_path        V2Ray的WS/H2路径
  * @property int                                                                     $v2_tls         V2Ray连接TLS:0-未开启、1-开启
  * @property string|null                                                             $tls_provider   V2Ray节点的TLS提供商授权信息
- * @property \Illuminate\Support\Carbon                                              $created_at
- * @property \Illuminate\Support\Carbon                                              $updated_at
+ * @property \Illuminate\Support\Carbon                                              $created_at     创建时间
+ * @property \Illuminate\Support\Carbon                                              $updated_at     最后更新时间
  * @property-read \App\Models\NodeAuth|null                                          $auth
+ * @property-read string                                                             $level_name
  * @property-read string                                                             $type_label
  * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\SsNodeLabel[] $label
  * @property-read int|null                                                           $label_count
@@ -117,8 +118,8 @@ class SsNode extends Model {
 		return $this->hasOne(NodeAuth::class, 'node_id', 'id');
 	}
 
-	public function getLevel(): HasOne {
-		return $this->hasOne(Level::class, 'level', 'level');
+	public function getLevelNameAttribute(): string {
+		return Level::whereLevel($this->attributes['level'])->first()->name;
 	}
 
 	// Node查询,查用户所在分组Node权限

+ 0 - 1
app/Models/SsNodeInfo.php

@@ -26,5 +26,4 @@ use Illuminate\Database\Eloquent\Model;
 class SsNodeInfo extends Model {
 	public $timestamps = false;
 	protected $table = 'ss_node_info';
-
 }

+ 0 - 1
app/Models/SsNodeOnlineLog.php

@@ -24,5 +24,4 @@ use Illuminate\Database\Eloquent\Model;
 class SsNodeOnlineLog extends Model {
 	public $timestamps = false;
 	protected $table = 'ss_node_online_log';
-
 }

+ 7 - 8
app/Models/SsNodePing.php

@@ -10,13 +10,12 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * 节点定时Ping测速
  *
  * @property int                          $id
- * @property int                          $node_id 对应节点id
- * @property int                          $ct      电信
- * @property int                          $cu      联通
- * @property int                          $cm      移动
- * @property int                          $hk      香港
- * @property \Illuminate\Support\Carbon   $created_at
- * @property \Illuminate\Support\Carbon   $updated_at
+ * @property int                          $node_id    对应节点id
+ * @property int                          $ct         电信
+ * @property int                          $cu         联通
+ * @property int                          $cm         移动
+ * @property int                          $hk         香港
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
  * @property-read \App\Models\SsNode|null $node
  * @method static Builder|SsNodePing newModelQuery()
  * @method static Builder|SsNodePing newQuery()
@@ -28,10 +27,10 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|SsNodePing whereHk($value)
  * @method static Builder|SsNodePing whereId($value)
  * @method static Builder|SsNodePing whereNodeId($value)
- * @method static Builder|SsNodePing whereUpdatedAt($value)
  * @mixin \Eloquent
  */
 class SsNodePing extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'ss_node_ping';
 
 	public function node(): HasOne {

+ 9 - 11
app/Models/SsNodeTrafficDaily.php

@@ -9,15 +9,14 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 节点每日流量统计
  *
- * @property int                             $id
- * @property int                             $node_id    节点ID
- * @property int                             $u          上传流量
- * @property int                             $d          下载流量
- * @property int                             $total      总流量
- * @property string|null                     $traffic    总流量(带单位)
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\SsNode|null    $info
+ * @property int                          $id
+ * @property int                          $node_id    节点ID
+ * @property int                          $u          上传流量
+ * @property int                          $d          下载流量
+ * @property int                          $total      总流量
+ * @property string|null                  $traffic    总流量(带单位)
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
+ * @property-read \App\Models\SsNode|null $info
  * @method static Builder|SsNodeTrafficDaily newModelQuery()
  * @method static Builder|SsNodeTrafficDaily newQuery()
  * @method static Builder|SsNodeTrafficDaily query()
@@ -28,14 +27,13 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|SsNodeTrafficDaily whereTotal($value)
  * @method static Builder|SsNodeTrafficDaily whereTraffic($value)
  * @method static Builder|SsNodeTrafficDaily whereU($value)
- * @method static Builder|SsNodeTrafficDaily whereUpdatedAt($value)
  * @mixin \Eloquent
  */
 class SsNodeTrafficDaily extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'ss_node_traffic_daily';
 
 	public function info(): HasOne {
 		return $this->hasOne(SsNode::class, 'id', 'node_id');
 	}
-
 }

+ 9 - 10
app/Models/SsNodeTrafficHourly.php

@@ -9,15 +9,14 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 节点每日流量统计
  *
- * @property int                             $id
- * @property int                             $node_id    节点ID
- * @property int                             $u          上传流量
- * @property int                             $d          下载流量
- * @property int                             $total      总流量
- * @property string|null                     $traffic    总流量(带单位)
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\SsNode|null    $info
+ * @property int                          $id
+ * @property int                          $node_id    节点ID
+ * @property int                          $u          上传流量
+ * @property int                          $d          下载流量
+ * @property int                          $total      总流量
+ * @property string|null                  $traffic    总流量(带单位)
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
+ * @property-read \App\Models\SsNode|null $info
  * @method static Builder|SsNodeTrafficHourly newModelQuery()
  * @method static Builder|SsNodeTrafficHourly newQuery()
  * @method static Builder|SsNodeTrafficHourly query()
@@ -28,10 +27,10 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|SsNodeTrafficHourly whereTotal($value)
  * @method static Builder|SsNodeTrafficHourly whereTraffic($value)
  * @method static Builder|SsNodeTrafficHourly whereU($value)
- * @method static Builder|SsNodeTrafficHourly whereUpdatedAt($value)
  * @mixin \Eloquent
  */
 class SsNodeTrafficHourly extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'ss_node_traffic_hourly';
 
 	public function info(): HasOne {

+ 11 - 12
app/Models/Ticket.php

@@ -10,17 +10,17 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 工单
  *
- * @property int                             $id
- * @property int                             $user_id    用户ID
- * @property int|null                        $admin_id   管理员ID
- * @property string                          $title      标题
- * @property string                          $content    内容
- * @property int                             $status     状态:0-待处理、1-已处理未关闭、2-已关闭
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\User|null      $admin
- * @property-read string                     $status_label
- * @property-read \App\Models\User|null      $user
+ * @property int                        $id
+ * @property int                        $user_id    用户ID
+ * @property int                        $admin_id   管理员ID
+ * @property string                     $title      标题
+ * @property string                     $content    内容
+ * @property int                        $status     状态:0-待处理、1-已处理未关闭、2-已关闭
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read \App\Models\User|null $admin
+ * @property-read string                $status_label
+ * @property-read \App\Models\User|null $user
  * @method static Builder|Ticket newModelQuery()
  * @method static Builder|Ticket newQuery()
  * @method static Builder|Ticket query()
@@ -67,5 +67,4 @@ class Ticket extends Model {
 
 		return $status_label;
 	}
-
 }

+ 9 - 9
app/Models/TicketReply.php

@@ -9,15 +9,15 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 工单回复
  *
- * @property int                             $id
- * @property int                             $ticket_id  工单ID
- * @property int                             $user_id    回复用户ID
- * @property int                             $admin_id   管理员ID
- * @property string                          $content    回复内容
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\User|null      $admin
- * @property-read \App\Models\User|null      $user
+ * @property int                        $id
+ * @property int                        $ticket_id  工单ID
+ * @property int                        $user_id    回复用户ID
+ * @property int                        $admin_id   管理员ID
+ * @property string                     $content    回复内容
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read \App\Models\User|null $admin
+ * @property-read \App\Models\User|null $user
  * @method static Builder|TicketReply newModelQuery()
  * @method static Builder|TicketReply newQuery()
  * @method static Builder|TicketReply query()

+ 17 - 9
app/Models/User.php

@@ -22,7 +22,7 @@ use Illuminate\Notifications\Notifiable;
  * @property int                                                                                                            $transfer_enable 可用流量,单位字节,默认1TiB
  * @property int                                                                                                            $u               已上传流量,单位字节
  * @property int                                                                                                            $d               已下载流量,单位字节
- * @property int                                                                                                            $t               最后使用时间
+ * @property int|null                                                                                                       $t               最后使用时间
  * @property string|null                                                                                                    $ip              最后连接IP
  * @property int                                                                                                            $enable          代理状态
  * @property string                                                                                                         $method          加密方式
@@ -33,9 +33,9 @@ use Illuminate\Notifications\Notifiable;
  * @property string|null                                                                                                    $wechat          微信
  * @property string|null                                                                                                    $qq              QQ
  * @property int                                                                                                            $credit          余额,单位分
- * @property string|null                                                                                                    $enable_time     开通日期
- * @property string                                                                                                         $expire_time     过期时间
- * @property int                                                                                                            $ban_time        封禁到期时间
+ * @property mixed|null                                                                                                     $enable_time     开通日期
+ * @property mixed                                                                                                          $expire_time     过期时间
+ * @property int|null                                                                                                       $ban_time        封禁到期时间
  * @property string|null                                                                                                    $remark          备注
  * @property int                                                                                                            $level           等级,默认0级
  * @property int                                                                                                            $group_id        所属分组
@@ -43,12 +43,13 @@ use Illuminate\Notifications\Notifiable;
  * @property string                                                                                                         $reg_ip          注册IP
  * @property int                                                                                                            $last_login      最后登录时间
  * @property int                                                                                                            $referral_uid    邀请人
- * @property string|null                                                                                                    $reset_time      流量重置日期,NULL表示不重置
+ * @property mixed|null                                                                                                     $reset_time      流量重置日期
  * @property int                                                                                                            $invite_num      可生成邀请码数
  * @property int                                                                                                            $status          状态:-1-禁用、0-未激活、1-正常
  * @property string|null                                                                                                    $remember_token
- * @property \Illuminate\Support\Carbon|null                                                                                $created_at
- * @property \Illuminate\Support\Carbon|null                                                                                $updated_at
+ * @property \Illuminate\Support\Carbon                                                                                     $created_at      创建时间
+ * @property \Illuminate\Support\Carbon                                                                                     $updated_at      最后更新时间
+ * @property-read string                                                                                                    $level_name
  * @property-read \App\Models\UserGroup|null                                                                                $group
  * @property-read \Illuminate\Notifications\DatabaseNotificationCollection|\Illuminate\Notifications\DatabaseNotification[] $notifications
  * @property-read int|null                                                                                                  $notifications_count
@@ -106,6 +107,13 @@ class User extends Authenticatable {
 
 	protected $table = 'user';
 
+	protected $dates = ['enable_time', 'expire_time', 'reset_time'];
+	protected $casts = [
+		'enable_time' => 'date:Y-m-d',
+		'expire_time' => 'date:Y-m-d',
+		'reset_time'  => 'date:Y-m-d',
+	];
+
 	public function scopeUid($query) {
 		return $query->whereId(Auth::id());
 	}
@@ -114,8 +122,8 @@ class User extends Authenticatable {
 		return $this->hasMany(Payment::class, 'user_id', 'id');
 	}
 
-	public function getLevel(): HasOne {
-		return $this->hasOne(Level::class, 'level', 'level');
+	public function getLevelNameAttribute(): string {
+		return Level::whereLevel($this->attributes['level'])->first()->name;
 	}
 
 	public function group(): HasOne {

+ 8 - 8
app/Models/UserBanLog.php

@@ -9,14 +9,14 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 用户封禁日志
  *
- * @property int                             $id
- * @property int                             $user_id     用户ID
- * @property int                             $minutes     封禁账号时长,单位分钟
- * @property string                          $description 操作描述
- * @property int                             $status      状态:0-未处理、1-已处理
- * @property \Illuminate\Support\Carbon|null $created_at  创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at  最后更新时间
- * @property-read \App\Models\User|null      $user
+ * @property int                        $id
+ * @property int                        $user_id     用户ID
+ * @property int                        $minutes     封禁账号时长,单位分钟
+ * @property string                     $description 操作描述
+ * @property int                        $status      状态:0-未处理、1-已处理
+ * @property \Illuminate\Support\Carbon $created_at  创建时间
+ * @property \Illuminate\Support\Carbon $updated_at  最后更新时间
+ * @property-read \App\Models\User|null $user
  * @method static Builder|UserBanLog newModelQuery()
  * @method static Builder|UserBanLog newQuery()
  * @method static Builder|UserBanLog query()

+ 2 - 2
app/Models/UserCreditLog.php

@@ -16,7 +16,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @property int                        $after       发生后金额,单位分
  * @property int                        $amount      发生金额,单位分
  * @property string|null                $description 操作描述
- * @property string|null                $created_at  创建时间
+ * @property \Illuminate\Support\Carbon $created_at  创建时间
  * @property-read \App\Models\User|null $user
  * @method static Builder|UserCreditLog newModelQuery()
  * @method static Builder|UserCreditLog newQuery()
@@ -32,7 +32,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @mixin \Eloquent
  */
 class UserCreditLog extends Model {
-	public $timestamps = false;
+	const UPDATED_AT = null;
 	protected $table = 'user_credit_log';
 
 	public function user(): HasOne {

+ 1 - 1
app/Models/UserGroup.php

@@ -9,7 +9,7 @@ use Illuminate\Database\Eloquent\Model;
  * 用户分组控制
  *
  * @property int         $id
- * @property string|null $name  分组名称
+ * @property string      $name  分组名称
  * @property string|null $nodes 关联的节点ID,多个用,号分隔
  * @method static Builder|UserGroup newModelQuery()
  * @method static Builder|UserGroup newQuery()

+ 10 - 11
app/Models/UserLoginLog.php

@@ -10,16 +10,15 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * 用户登录日志
  *
  * @property int                        $id
- * @property int                        $user_id
- * @property string                     $ip
- * @property string                     $country
- * @property string                     $province
- * @property string                     $city
- * @property string                     $county
- * @property string                     $isp
- * @property string                     $area
- * @property \Illuminate\Support\Carbon $created_at
- * @property \Illuminate\Support\Carbon $updated_at
+ * @property int                        $user_id    用户ID
+ * @property string                     $ip         IP地址
+ * @property string                     $country    国家
+ * @property string                     $province   省份
+ * @property string                     $city       城市
+ * @property string                     $county     郡县
+ * @property string                     $isp        运营商
+ * @property string                     $area       地区
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
  * @property-read \App\Models\User|null $user
  * @method static Builder|UserLoginLog newModelQuery()
  * @method static Builder|UserLoginLog newQuery()
@@ -33,11 +32,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|UserLoginLog whereIp($value)
  * @method static Builder|UserLoginLog whereIsp($value)
  * @method static Builder|UserLoginLog whereProvince($value)
- * @method static Builder|UserLoginLog whereUpdatedAt($value)
  * @method static Builder|UserLoginLog whereUserId($value)
  * @mixin \Eloquent
  */
 class UserLoginLog extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'user_login_log';
 
 	public function user(): HasOne {

+ 10 - 10
app/Models/UserSubscribe.php

@@ -10,16 +10,16 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 用户订阅地址
  *
- * @property int                             $id
- * @property int                             $user_id    用户ID
- * @property string|null                     $code       订阅地址唯一识别码
- * @property int                             $times      地址请求次数
- * @property int                             $status     状态:0-禁用、1-启用
- * @property int                             $ban_time   封禁时间
- * @property string                          $ban_desc   封禁理由
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\User|null      $user
+ * @property int                        $id
+ * @property int                        $user_id    用户ID
+ * @property string                     $code       订阅地址唯一识别码
+ * @property int                        $times      地址请求次数
+ * @property int                        $status     状态:0-禁用、1-启用
+ * @property int                        $ban_time   封禁时间
+ * @property string                     $ban_desc   封禁理由
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read \App\Models\User|null $user
  * @method static Builder|UserSubscribe newModelQuery()
  * @method static Builder|UserSubscribe newQuery()
  * @method static Builder|UserSubscribe query()

+ 4 - 3
app/Models/UserSubscribeLog.php

@@ -10,9 +10,9 @@ use Illuminate\Database\Eloquent\Relations\HasManyThrough;
  * 用户订阅地址请求日志
  *
  * @property int                                                              $id
- * @property int|null                                                         $sid            对应user_subscribe的id
+ * @property int                                                              $sid            对应user_subscribe的id
  * @property string|null                                                      $request_ip     请求IP
- * @property string|null                                                      $request_time   请求时间
+ * @property \Illuminate\Support\Carbon                                       $request_time   请求时间
  * @property string|null                                                      $request_header 请求头部信息
  * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\User[] $user
  * @property-read int|null                                                    $user_count
@@ -27,7 +27,8 @@ use Illuminate\Database\Eloquent\Relations\HasManyThrough;
  * @mixin \Eloquent
  */
 class UserSubscribeLog extends Model {
-	public $timestamps = false;
+	const CREATED_AT = 'request_time';
+	const UPDATED_AT = null;
 	protected $table = 'user_subscribe_log';
 
 	public function user(): HasManyThrough {

+ 10 - 11
app/Models/UserTrafficDaily.php

@@ -9,16 +9,15 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 用户每日流量统计
  *
- * @property int                             $id
- * @property int                             $user_id    用户ID
- * @property int                             $node_id    节点ID,0表示统计全部节点
- * @property int                             $u          上传流量
- * @property int                             $d          下载流量
- * @property int                             $total      总流量
- * @property string|null                     $traffic    总流量(带单位)
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\SsNode|null    $node
+ * @property int                          $id
+ * @property int                          $user_id    用户ID
+ * @property int                          $node_id    节点ID,0表示统计全部节点
+ * @property int                          $u          上传流量
+ * @property int                          $d          下载流量
+ * @property int                          $total      总流量
+ * @property string|null                  $traffic    总流量(带单位)
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
+ * @property-read \App\Models\SsNode|null $node
  * @method static Builder|UserTrafficDaily newModelQuery()
  * @method static Builder|UserTrafficDaily newQuery()
  * @method static Builder|UserTrafficDaily query()
@@ -30,11 +29,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|UserTrafficDaily whereTotal($value)
  * @method static Builder|UserTrafficDaily whereTraffic($value)
  * @method static Builder|UserTrafficDaily whereU($value)
- * @method static Builder|UserTrafficDaily whereUpdatedAt($value)
  * @method static Builder|UserTrafficDaily whereUserId($value)
  * @mixin \Eloquent
  */
 class UserTrafficDaily extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'user_traffic_daily';
 
 	public function node(): HasOne {

+ 10 - 11
app/Models/UserTrafficHourly.php

@@ -9,16 +9,15 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 用户流量每小时统计
  *
- * @property int                             $id
- * @property int                             $user_id    用户ID
- * @property int                             $node_id    节点ID,0表示统计全部节点
- * @property int                             $u          上传流量
- * @property int                             $d          下载流量
- * @property int                             $total      总流量
- * @property string|null                     $traffic    总流量(带单位)
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\SsNode|null    $node
+ * @property int                          $id
+ * @property int                          $user_id    用户ID
+ * @property int                          $node_id    节点ID,0表示统计全部节点
+ * @property int                          $u          上传流量
+ * @property int                          $d          下载流量
+ * @property int                          $total      总流量
+ * @property string|null                  $traffic    总流量(带单位)
+ * @property \Illuminate\Support\Carbon   $created_at 创建时间
+ * @property-read \App\Models\SsNode|null $node
  * @method static Builder|UserTrafficHourly newModelQuery()
  * @method static Builder|UserTrafficHourly newQuery()
  * @method static Builder|UserTrafficHourly query()
@@ -30,11 +29,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|UserTrafficHourly whereTotal($value)
  * @method static Builder|UserTrafficHourly whereTraffic($value)
  * @method static Builder|UserTrafficHourly whereU($value)
- * @method static Builder|UserTrafficHourly whereUpdatedAt($value)
  * @method static Builder|UserTrafficHourly whereUserId($value)
  * @mixin \Eloquent
  */
 class UserTrafficHourly extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'user_traffic_hourly';
 
 	public function node(): HasOne {

+ 0 - 1
app/Models/UserTrafficLog.php

@@ -45,5 +45,4 @@ class UserTrafficLog extends Model {
 	public function node(): BelongsTo {
 		return $this->belongsTo(SsNode::class, 'node_id', 'id');
 	}
-
 }

+ 2 - 4
app/Models/UserTrafficModifyLog.php

@@ -15,8 +15,7 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @property int                         $before      操作前流量
  * @property int                         $after       操作后流量
  * @property string                      $description 描述
- * @property \Illuminate\Support\Carbon  $created_at
- * @property \Illuminate\Support\Carbon  $updated_at
+ * @property \Illuminate\Support\Carbon  $created_at  创建时间
  * @property-read \App\Models\Order|null $order
  * @property-read \App\Models\User|null  $user
  * @method static Builder|UserTrafficModifyLog newModelQuery()
@@ -28,11 +27,11 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
  * @method static Builder|UserTrafficModifyLog whereDescription($value)
  * @method static Builder|UserTrafficModifyLog whereId($value)
  * @method static Builder|UserTrafficModifyLog whereOrderId($value)
- * @method static Builder|UserTrafficModifyLog whereUpdatedAt($value)
  * @method static Builder|UserTrafficModifyLog whereUserId($value)
  * @mixin \Eloquent
  */
 class UserTrafficModifyLog extends Model {
+	const UPDATED_AT = null;
 	protected $table = 'user_traffic_modify_log';
 
 	// 关联账号
@@ -52,5 +51,4 @@ class UserTrafficModifyLog extends Model {
 	public function getAfterAttribute($value) {
 		return $this->attributes['after'] = flowAutoShow($value);
 	}
-
 }

+ 8 - 9
app/Models/Verify.php

@@ -9,14 +9,14 @@ use Illuminate\Database\Eloquent\Relations\HasOne;
 /**
  * 注册时的验证激活地址
  *
- * @property int                             $id
- * @property int                             $type       激活类型:1-自行激活、2-管理员激活
- * @property int                             $user_id    用户ID
- * @property string                          $token      校验token
- * @property int                             $status     状态:0-未使用、1-已使用、2-已失效
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
- * @property-read \App\Models\User|null      $user
+ * @property int                        $id
+ * @property int                        $type       激活类型:1-自行激活、2-管理员激活
+ * @property int                        $user_id    用户ID
+ * @property string                     $token      校验token
+ * @property int                        $status     状态:0-未使用、1-已使用、2-已失效
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
+ * @property-read \App\Models\User|null $user
  * @method static Builder|Verify newModelQuery()
  * @method static Builder|Verify newQuery()
  * @method static Builder|Verify query()
@@ -41,5 +41,4 @@ class Verify extends Model {
 	public function user(): HasOne {
 		return $this->hasOne(User::class, 'id', 'user_id');
 	}
-
 }

+ 6 - 7
app/Models/VerifyCode.php

@@ -8,12 +8,12 @@ use Illuminate\Database\Eloquent\Model;
 /**
  * 注册时的激活验证码
  *
- * @property int                             $id
- * @property string                          $address    用户邮箱
- * @property string                          $code       验证码
- * @property int                             $status     状态:0-未使用、1-已使用、2-已失效
- * @property \Illuminate\Support\Carbon|null $created_at 创建时间
- * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property int                        $id
+ * @property string                     $address    用户邮箱
+ * @property string                     $code       验证码
+ * @property int                        $status     状态:0-未使用、1-已使用、2-已失效
+ * @property \Illuminate\Support\Carbon $created_at 创建时间
+ * @property \Illuminate\Support\Carbon $updated_at 最后更新时间
  * @method static Builder|VerifyCode newModelQuery()
  * @method static Builder|VerifyCode newQuery()
  * @method static Builder|VerifyCode query()
@@ -27,5 +27,4 @@ use Illuminate\Database\Eloquent\Model;
  */
 class VerifyCode extends Model {
 	protected $table = 'verify_code';
-
 }

+ 1 - 1
app/helpers.php

@@ -49,7 +49,7 @@ if(!function_exists('base64url_decode')){
 
 // 根据流量值自动转换单位输出
 if(!function_exists('flowAutoShow')){
-	function flowAutoShow($value = 0) {
+	function flowAutoShow($value) {
 		$value = abs($value);
 		if($value >= PB){
 			return round($value / PB, 2)."PB";

+ 27 - 22
composer.lock

@@ -575,16 +575,16 @@
         },
         {
             "name": "dasprid/enum",
-            "version": "1.0.0",
+            "version": "1.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/DASPRiD/Enum.git",
-                "reference": "631ef6e638e9494b0310837fa531bedd908fc22b"
+                "reference": "6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/631ef6e638e9494b0310837fa531bedd908fc22b",
-                "reference": "631ef6e638e9494b0310837fa531bedd908fc22b",
+                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07",
+                "reference": "6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -594,8 +594,8 @@
                 ]
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.4",
-                "squizlabs/php_codesniffer": "^3.1"
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "^3.4"
             },
             "type": "library",
             "autoload": {
@@ -611,7 +611,8 @@
                 {
                     "name": "Ben Scholzen 'DASPRiD'",
                     "email": "mail@dasprids.de",
-                    "homepage": "https://dasprids.de/"
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
                 }
             ],
             "description": "PHP 7.1 enum implementation",
@@ -619,7 +620,7 @@
                 "enum",
                 "map"
             ],
-            "time": "2017-10-25T22:45:27+00:00"
+            "time": "2020-07-30T16:37:13+00:00"
         },
         {
             "name": "dnoegel/php-xdg-base-dir",
@@ -3093,16 +3094,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.36.1",
+            "version": "2.37.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "ee7378a36cc62952100e718bcc58be4c7210e55f"
+                "reference": "1f61206de973d67f36ce50f041c792ddac663c3e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/ee7378a36cc62952100e718bcc58be4c7210e55f",
-                "reference": "ee7378a36cc62952100e718bcc58be4c7210e55f",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/1f61206de973d67f36ce50f041c792ddac663c3e",
+                "reference": "1f61206de973d67f36ce50f041c792ddac663c3e",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3174,7 +3175,7 @@
                 "datetime",
                 "time"
             ],
-            "time": "2020-07-04T12:29:56+00:00"
+            "time": "2020-07-28T06:04:54+00:00"
         },
         {
             "name": "nikic/php-parser",
@@ -8136,12 +8137,12 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/Roave/SecurityAdvisories.git",
-                "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db"
+                "reference": "f693c37873d31bff5adb1279cb05a2f4ce5efb43"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9f386dba391018e90a5f1e51abeffc6bf27583db",
-                "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db",
+                "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/f693c37873d31bff5adb1279cb05a2f4ce5efb43",
+                "reference": "f693c37873d31bff5adb1279cb05a2f4ce5efb43",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -8214,6 +8215,7 @@
                 "friendsofsymfony/oauth2-php": "<1.3",
                 "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
                 "friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
+                "friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
                 "fuel/core": "<1.8.1",
                 "getgrav/grav": "<1.7-beta.8",
                 "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
@@ -8240,11 +8242,15 @@
                 "magento/magento1ce": "<1.9.4.3",
                 "magento/magento1ee": ">=1,<1.14.4.3",
                 "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2",
+                "marcwillmann/turn": "<0.3.3",
+                "mittwald/typo3_forum": "<1.2.1",
                 "monolog/monolog": ">=1.8,<1.12",
                 "namshi/jose": "<2.2",
                 "nystudio107/craft-seomatic": "<3.3",
                 "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
-                "october/october": ">=1.0.319,<1.0.467",
+                "october/backend": ">=1.0.319,<1.0.467",
+                "october/cms": ">=1.0.319,<1.0.466",
+                "october/october": ">=1.0.319,<1.0.466",
                 "onelogin/php-saml": "<2.10.4",
                 "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5",
                 "openid/php-openid": "<2.3",
@@ -8347,8 +8353,8 @@
                 "titon/framework": ">=0,<9.9.99",
                 "truckersmp/phpwhois": "<=4.3.1",
                 "twig/twig": "<1.38|>=2,<2.7",
-                "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2",
-                "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2",
+                "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6",
+                "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.20|>=10,<10.4.6",
                 "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5",
                 "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4",
                 "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1",
@@ -8411,7 +8417,7 @@
                 }
             ],
             "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it",
-            "time": "2020-07-16T05:17:29+00:00"
+            "time": "2020-07-29T19:02:51+00:00"
         },
         {
             "name": "sebastian/code-unit-reverse-lookup",
@@ -9216,6 +9222,5 @@
         "ext-json": "*",
         "ext-openssl": "*"
     },
-    "platform-dev": [],
-    "plugin-api-version": "1.1.0"
+    "platform-dev": []
 }


+ 1 - 1
resources/lang/en/home.php

@@ -144,7 +144,7 @@ return [
 	'invoice_table_pay_way'           => 'Pay Method',
 	'invoice_table_price'             => 'Amount',
 	'invoice_table_create_date'       => 'Created On',
-	'invoice_table_expire_at'         => 'Expire Time',
+	'invoice_table_expired_at'        => 'Expire Time',
 	'invoice_table_status'            => 'Status',
 	'invoice_table_none'              => 'None Data',
 	'invoice_table_closed'            => 'Closed',

+ 1 - 1
resources/lang/ja/home.php

@@ -141,7 +141,7 @@ return [
 	'invoice_table_pay_way'           => '支払い方式',
 	'invoice_table_price'             => '金額',
 	'invoice_table_create_date'       => '購入日',
-	'invoice_table_expire_at'         => '有効期限',
+	'invoice_table_expired_at'        => '有効期限',
 	'invoice_table_status'            => '状態',
 	'invoice_table_none'              => 'データなし',
 	'invoice_table_closed'            => '閉鎖された',

+ 1 - 1
resources/lang/ko/home.php

@@ -138,7 +138,7 @@ return [
 	'invoice_table_pay_way'           => '지불 방식',
 	'invoice_table_price'             => '금액',
 	'invoice_table_create_date'       => '구입일자',
-	'invoice_table_expire_at'         => '만료 시간',
+	'invoice_table_expired_at'        => '만료 시간',
 	'invoice_table_status'            => '상태',
 	'invoice_table_none'              => '데이터 없음',
 	'invoice_table_closed'            => '닫혔어',

+ 1 - 1
resources/lang/zh-CN/home.php

@@ -146,7 +146,7 @@ return [
 	'invoice_table_pay_way'           => '支付方式',
 	'invoice_table_price'             => '金额',
 	'invoice_table_create_date'       => '购买日期',
-	'invoice_table_expire_at'         => '到期时间',
+	'invoice_table_expired_at'        => '到期时间',
 	'invoice_table_status'            => '状态',
 	'invoice_table_actions'           => '操作',
 	'invoice_table_none'              => '暂无数据',

+ 1 - 1
resources/lang/zh-tw/home.php

@@ -142,7 +142,7 @@ return [
 	'invoice_table_pay_way'           => '支付方式',
 	'invoice_table_price'             => '金額',
 	'invoice_table_create_date'       => '購買日期',
-	'invoice_table_expire_at'         => '到期時間',
+	'invoice_table_expired_at'        => '到期時間',
 	'invoice_table_status'            => '狀態',
 	'invoice_table_none'              => '暫無數據',
 	'invoice_table_closed'            => '關閉',

+ 2 - 2
resources/views/admin/index.blade.php

@@ -141,7 +141,7 @@
 						<button type="button" class="btn btn-floating btn-sm btn-primary">
 							<i class="icon md-time-countdown"></i>
 						</button>
-						<span class="ml-15 font-weight-400">消耗流量</span>
+						<span class="ml-15 font-weight-400">记录的消耗流量</span>
 						<div class="content-text text-center mb-0">
 							<span class="font-size-40 font-weight-100">{{$totalFlowCount}}</span>
 						</div>
@@ -201,7 +201,7 @@
 				</a>
 			</div>
 			<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')}}"
+				<a href="/admin/orderList?status=2&range_time={{date('Y-m-d') . ',' . 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">

+ 2 - 0
resources/views/admin/logs/callbackList.blade.php

@@ -27,6 +27,8 @@
 							<option value="codepay">码支付</option>
 							<option value="payjs">PayJs</option>
 							<option value="bitpayx">麻瓜宝</option>
+							<option value="paypal">PayPal</option>
+							<option value="epay">易支付</option>
 						</select>
 					</div>
 					<div class="form-group col-lg-2 col-sm-4">

+ 4 - 2
resources/views/admin/logs/orderList.blade.php

@@ -54,10 +54,12 @@
 							<option value="" hidden>支付方式</option>
 							<option value="credit">余额</option>
 							<option value="youzan">有赞云</option>
-							<option value="f2fpay">支付宝当面付</option>
+							<option value="f2fpay">当面付</option>
 							<option value="codepay">码支付</option>
 							<option value="payjs">PayJs</option>
 							<option value="bitpayx">麻瓜宝</option>
+							<option value="paypal">PayPal</option>
+							<option value="epay">易支付</option>
 						</select>
 					</div>
 					<div class="form-group col-lg-2 col-sm-6">
@@ -117,7 +119,7 @@
 							</td>
 							<td> {{$order->order_sn}}</td>
 							<td> {{empty($order->goods) ? ($order->goods_id == 0 ? '余额充值': trans('home.invoice_table_goods_deleted')) : $order->goods->name}} </td>
-							<td> {{$order->is_expire ? '已过期' : $order->expire_at}} </td>
+							<td> {{$order->is_expire ? '已过期' : $order->expired_at}} </td>
 							<td> {{$order->coupon ? $order->coupon->name . ' - ' . $order->coupon->sn : ''}} </td>
 							<td> ¥{{$order->origin_amount}} </td>
 							<td> ¥{{$order->amount}} </td>

Неке датотеке нису приказане због велике количине промена