Quellcode durchsuchen

数据库改版 +Rule 编辑相关 (Rule未实际应用)

1. 规范化数据库数据;
2. 添加Rule相关页面
为未来加入web api做准备
兔姬桑 vor 4 Jahren
Ursprung
Commit
71828a0ac5
100 geänderte Dateien mit 2194 neuen und 2103 gelöschten Zeilen
  1. 1 1
      app/Components/CaptchaVerify.php
  2. 53 45
      app/Components/Helpers.php
  3. 3 5
      app/Components/Namesilo.php
  4. 0 2
      app/Components/NetworkDetection.php
  5. 12 12
      app/Console/Commands/AutoClearLog.php
  6. 61 42
      app/Console/Commands/AutoJob.php
  7. 3 3
      app/Console/Commands/AutoPingNode.php
  8. 2 2
      app/Console/Commands/AutoReportNode.php
  9. 4 4
      app/Console/Commands/AutoStatisticsNodeDailyTraffic.php
  10. 4 4
      app/Console/Commands/AutoStatisticsNodeHourlyTraffic.php
  11. 5 5
      app/Console/Commands/AutoStatisticsUserDailyTraffic.php
  12. 5 5
      app/Console/Commands/AutoStatisticsUserHourlyTraffic.php
  13. 31 35
      app/Console/Commands/DailyJob.php
  14. 5 5
      app/Console/Commands/NodeBlockedDetection.php
  15. 14 17
      app/Console/Commands/ServiceTimer.php
  16. 1 1
      app/Console/Commands/UserExpireAutoWarning.php
  17. 2 2
      app/Console/Commands/UserTrafficAbnormalAutoWarning.php
  18. 1 1
      app/Console/Commands/UserTrafficAutoWarning.php
  19. 1 1
      app/Console/Commands/updateUserName.php
  20. 1 1
      app/Console/Commands/upgradeUserResetTime.php
  21. 18 18
      app/Exceptions/Handler.php
  22. 4 4
      app/Http/Controllers/Admin/AffiliateController.php
  23. 45 45
      app/Http/Controllers/Admin/CouponController.php
  24. 2 2
      app/Http/Controllers/Admin/MarketingController.php
  25. 287 0
      app/Http/Controllers/Admin/RuleController.php
  26. 9 9
      app/Http/Controllers/Admin/SensitiveWordsController.php
  27. 63 137
      app/Http/Controllers/Admin/ShopController.php
  28. 4 49
      app/Http/Controllers/Admin/SubscribeController.php
  29. 10 14
      app/Http/Controllers/Admin/TicketController.php
  30. 243 0
      app/Http/Controllers/Admin/ToolsController.php
  31. 281 451
      app/Http/Controllers/AdminController.php
  32. 7 19
      app/Http/Controllers/Api/LoginController.php
  33. 68 79
      app/Http/Controllers/AuthController.php
  34. 59 57
      app/Http/Controllers/Controller.php
  35. 25 53
      app/Http/Controllers/Gateway/AbstractPayment.php
  36. 10 10
      app/Http/Controllers/Gateway/BitpayX.php
  37. 5 5
      app/Http/Controllers/Gateway/CodePay.php
  38. 7 16
      app/Http/Controllers/Gateway/F2Fpay.php
  39. 7 6
      app/Http/Controllers/Gateway/Local.php
  40. 10 10
      app/Http/Controllers/Gateway/PayJs.php
  41. 12 12
      app/Http/Controllers/Gateway/PayPal.php
  42. 41 42
      app/Http/Controllers/PaymentController.php
  43. 17 31
      app/Http/Controllers/ServiceController.php
  44. 15 18
      app/Http/Controllers/User/AffiliateController.php
  45. 7 22
      app/Http/Controllers/User/SubscribeController.php
  46. 86 100
      app/Http/Controllers/UserController.php
  47. 1 1
      app/Http/Middleware/Affiliate.php
  48. 1 4
      app/Http/Middleware/TrimStrings.php
  49. 9 9
      app/Http/Middleware/WebApi.php
  50. 1 1
      app/Http/Middleware/isAdmin.php
  51. 0 63
      app/Http/Models/Device.php
  52. 0 26
      app/Http/Models/GoodsLabel.php
  53. 0 30
      app/Http/Models/SsGroup.php
  54. 0 28
      app/Http/Models/SsGroupNode.php
  55. 0 120
      app/Http/Models/SsNode.php
  56. 0 68
      app/Http/Models/UserBalanceLog.php
  57. 0 32
      app/Http/Models/UserLabel.php
  58. 3 3
      app/Mail/activeUser.php
  59. 4 4
      app/Mail/closeTicket.php
  60. 4 4
      app/Mail/newTicket.php
  61. 3 5
      app/Mail/nodeCrashWarning.php
  62. 4 4
      app/Mail/replyTicket.php
  63. 3 3
      app/Mail/resetPassword.php
  64. 3 3
      app/Mail/sendUserInfo.php
  65. 3 3
      app/Mail/sendVerifyCode.php
  66. 3 3
      app/Mail/userExpireWarning.php
  67. 1 1
      app/Mail/userExpireWarningToday.php
  68. 3 3
      app/Mail/userTrafficWarning.php
  69. 13 15
      app/Models/Article.php
  70. 2 3
      app/Models/Config.php
  71. 2 3
      app/Models/Country.php
  72. 18 20
      app/Models/Coupon.php
  73. 9 11
      app/Models/CouponLog.php
  74. 27 36
      app/Models/Goods.php
  75. 2 2
      app/Models/Invite.php
  76. 2 3
      app/Models/Label.php
  77. 9 4
      app/Models/Level.php
  78. 12 14
      app/Models/Marketing.php
  79. 31 0
      app/Models/NodeRule.php
  80. 11 14
      app/Models/NotificationLog.php
  81. 26 25
      app/Models/Order.php
  82. 16 18
      app/Models/Payment.php
  83. 10 12
      app/Models/PaymentCallback.php
  84. 33 0
      app/Models/ProductsPool.php
  85. 13 15
      app/Models/ReferralApply.php
  86. 15 17
      app/Models/ReferralLog.php
  87. 53 0
      app/Models/Rule.php
  88. 43 0
      app/Models/RuleGroup.php
  89. 29 0
      app/Models/RuleGroupNode.php
  90. 48 0
      app/Models/RuleLog.php
  91. 2 3
      app/Models/SensitiveWords.php
  92. 2 3
      app/Models/SsConfig.php
  93. 115 0
      app/Models/SsNode.php
  94. 2 3
      app/Models/SsNodeInfo.php
  95. 11 13
      app/Models/SsNodeIp.php
  96. 6 7
      app/Models/SsNodeLabel.php
  97. 2 3
      app/Models/SsNodeOnlineLog.php
  98. 11 13
      app/Models/SsNodePing.php
  99. 11 13
      app/Models/SsNodeTrafficDaily.php
  100. 11 13
      app/Models/SsNodeTrafficHourly.php

+ 1 - 1
app/Components/CaptchaVerify.php

@@ -35,4 +35,4 @@ class CaptchaVerify {
 	}
 }
 
-?>
+

+ 53 - 45
app/Components/Helpers.php

@@ -2,24 +2,40 @@
 
 namespace App\Components;
 
-use App\Http\Models\Config;
-use App\Http\Models\CouponLog;
-use App\Http\Models\Level;
-use App\Http\Models\NotificationLog;
-use App\Http\Models\SsConfig;
-use App\Http\Models\User;
-use App\Http\Models\UserBalanceLog;
-use App\Http\Models\UserSubscribe;
-use App\Http\Models\UserTrafficModifyLog;
+use App\Models\Config;
+use App\Models\CouponLog;
+use App\Models\NotificationLog;
+use App\Models\SsConfig;
+use App\Models\User;
+use App\Models\UserCreditLog;
+use App\Models\UserSubscribe;
+use App\Models\UserTrafficModifyLog;
 
 class Helpers {
 	// 不生成的端口
 	private static $denyPorts = [
-		1068, 1109, 1434, 3127, 3128,
-		3129, 3130, 3332, 4444, 5554,
-		6669, 8080, 8081, 8082, 8181,
-		8282, 9996, 17185, 24554, 35601,
-		60177, 60179
+		1068,
+		1109,
+		1434,
+		3127,
+		3128,
+		3129,
+		3130,
+		3332,
+		4444,
+		5554,
+		6669,
+		8080,
+		8081,
+		8082,
+		8181,
+		8282,
+		9996,
+		17185,
+		24554,
+		35601,
+		60177,
+		60179
 	];
 
 	// 加密方式
@@ -37,11 +53,6 @@ class Helpers {
 		return SsConfig::type(3)->get();
 	}
 
-	// 等级
-	public static function levelList() {
-		return Level::query()->get()->sortBy('level');
-	}
-
 	// 生成用户的订阅码
 	public static function makeSubscribeCode() {
 		$code = makeRandStr(5);
@@ -71,14 +82,11 @@ class Helpers {
 		// 生成一个可用端口
 		$user->port = self::systemConfig()['is_rand_port']? Helpers::getRandPort() : Helpers::getOnlyPort();
 		$user->passwd = makeRandStr();
-		$user->vmess_id = createGuid();
+		$user->uuid = createGuid();
 		$user->enable = 1;
 		$user->method = Helpers::getDefaultMethod();
 		$user->protocol = Helpers::getDefaultProtocol();
-		$user->protocol_param = '';
 		$user->obfs = Helpers::getDefaultObfs();
-		$user->obfs_param = '';
-		$user->usage = 1;
 		$user->transfer_enable = $transfer_enable;
 		$user->enable_time = date('Y-m-d');
 		$user->expire_time = date('Y-m-d', strtotime("+".$data." days"));
@@ -179,19 +187,19 @@ class Helpers {
 	/**
 	 * 添加优惠券操作日志
 	 *
-	 * @param  int     $couponId  优惠券ID
-	 * @param  int     $goodsId   商品ID
-	 * @param  int     $orderId   订单ID
-	 * @param  string  $desc      备注
+	 * @param  int     $couponId     优惠券ID
+	 * @param  int     $goodsId      商品ID
+	 * @param  int     $orderId      订单ID
+	 * @param  string  $description  备注
 	 *
 	 * @return int
 	 */
-	public static function addCouponLog($couponId, $goodsId, $orderId, $desc = '') {
+	public static function addCouponLog($couponId, $goodsId, $orderId, $description = '') {
 		$log = new CouponLog();
 		$log->coupon_id = $couponId;
 		$log->goods_id = $goodsId;
 		$log->order_id = $orderId;
-		$log->desc = $desc;
+		$log->description = $description;
 
 		return $log->save();
 	}
@@ -199,23 +207,23 @@ class Helpers {
 	/**
 	 * 记录余额操作日志
 	 *
-	 * @param  int     $userId  用户ID
-	 * @param  string  $oid     订单ID
-	 * @param  int     $before  记录前余额
-	 * @param  int     $after   记录后余额
-	 * @param  int     $amount  发生金额
-	 * @param  string  $desc    描述
+	 * @param  int     $userId       用户ID
+	 * @param  string  $oid          订单ID
+	 * @param  int     $before       记录前余额
+	 * @param  int     $after        记录后余额
+	 * @param  int     $amount       发生金额
+	 * @param  string  $description  描述
 	 *
 	 * @return int
 	 */
-	public static function addUserBalanceLog($userId, $oid, $before, $after, $amount, $desc = '') {
-		$log = new UserBalanceLog();
+	public static function addUserCreditLog($userId, $oid, $before, $after, $amount, $description = '') {
+		$log = new UserCreditLog();
 		$log->user_id = $userId;
 		$log->order_id = $oid;
 		$log->before = $before;
 		$log->after = $after;
 		$log->amount = $amount;
-		$log->desc = $desc;
+		$log->description = $description;
 		$log->created_at = date('Y-m-d H:i:s');
 
 		return $log->save();
@@ -224,21 +232,21 @@ class Helpers {
 	/**
 	 * 记录流量变动日志
 	 *
-	 * @param  int     $userId  用户ID
-	 * @param  string  $oid     订单ID
-	 * @param  int     $before  记录前的值
-	 * @param  int     $after   记录后的值
-	 * @param  string  $desc    描述
+	 * @param  int     $userId       用户ID
+	 * @param  string  $oid          订单ID
+	 * @param  int     $before       记录前的值
+	 * @param  int     $after        记录后的值
+	 * @param  string  $description  描述
 	 *
 	 * @return int
 	 */
-	public static function addUserTrafficModifyLog($userId, $oid, $before, $after, $desc = '') {
+	public static function addUserTrafficModifyLog($userId, $oid, $before, $after, $description = '') {
 		$log = new UserTrafficModifyLog();
 		$log->user_id = $userId;
 		$log->order_id = $oid;
 		$log->before = $before;
 		$log->after = $after;
-		$log->desc = $desc;
+		$log->description = $description;
 
 		return $log->save();
 	}

+ 3 - 5
app/Components/Namesilo.php

@@ -38,19 +38,17 @@ class Namesilo {
 			// 出错
 			if(empty($result['namesilo']) || $result['namesilo']['reply']['code'] != 300 || $result['namesilo']['reply']['detail'] != 'success'){
 				Helpers::addNotificationLog('[Namesilo API] - ['.$operation.']', $content, 1,
-				                            self::$systemConfig['webmaster_email'], 0,
-				                            $result['namesilo']['reply']['detail']);
+					self::$systemConfig['webmaster_email'], 0, $result['namesilo']['reply']['detail']);
 			}else{
 				Helpers::addNotificationLog('[Namesilo API] - ['.$operation.']', $content, 1,
-				                            self::$systemConfig['webmaster_email'], 1,
-				                            $result['namesilo']['reply']['detail']);
+					self::$systemConfig['webmaster_email'], 1, $result['namesilo']['reply']['detail']);
 			}
 
 			return $result['namesilo']['reply'];
 		}catch(Exception $e){
 			Log::error('CURL请求失败:'.$e->getMessage().' --- '.$e->getLine());
 			Helpers::addNotificationLog('[Namesilo API] - ['.$operation.']', $content, 1,
-			                            self::$systemConfig['webmaster_email'], 0, $e->getMessage());
+				self::$systemConfig['webmaster_email'], 0, $e->getMessage());
 
 			return false;
 		}

+ 0 - 2
app/Components/NetworkDetection.php

@@ -85,5 +85,3 @@ class NetworkDetection {
 		return $ret['data']; // 服务器宕机
 	}
 }
-
-?>

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

@@ -3,17 +3,17 @@
 namespace App\Console\Commands;
 
 use App\Components\Helpers;
-use App\Http\Models\SsNodeInfo;
-use App\Http\Models\SsNodeIp;
-use App\Http\Models\SsNodeOnlineLog;
-use App\Http\Models\SsNodeTrafficDaily;
-use App\Http\Models\SsNodeTrafficHourly;
-use App\Http\Models\UserBanLog;
-use App\Http\Models\UserLoginLog;
-use App\Http\Models\UserSubscribeLog;
-use App\Http\Models\UserTrafficDaily;
-use App\Http\Models\UserTrafficHourly;
-use App\Http\Models\UserTrafficLog;
+use App\Models\SsNodeInfo;
+use App\Models\SsNodeIp;
+use App\Models\SsNodeOnlineLog;
+use App\Models\SsNodeTrafficDaily;
+use App\Models\SsNodeTrafficHourly;
+use App\Models\UserBanLog;
+use App\Models\UserLoginLog;
+use App\Models\UserSubscribeLog;
+use App\Models\UserTrafficDaily;
+use App\Models\UserTrafficHourly;
+use App\Models\UserTrafficLog;
 use Exception;
 use Illuminate\Console\Command;
 use Log;
@@ -42,8 +42,8 @@ class AutoClearLog extends Command {
 
 	// 清除日志
 	private function clearLog() {
-		// 自动清除30分钟以前的节点负载信息日志
 		try{
+			// 自动清除30分钟以前的节点负载信息日志
 			SsNodeInfo::query()->where('log_time', '<=', strtotime("-30 minutes"))->delete();
 
 			// 自动清除1小时以前的节点在线用户数日志

+ 61 - 42
app/Console/Commands/AutoJob.php

@@ -4,19 +4,19 @@ namespace App\Console\Commands;
 
 use App\Components\Helpers;
 use App\Components\PushNotification;
-use App\Http\Models\Config;
-use App\Http\Models\Coupon;
-use App\Http\Models\Invite;
-use App\Http\Models\Order;
-use App\Http\Models\Payment;
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodeInfo;
-use App\Http\Models\User;
-use App\Http\Models\UserBanLog;
-use App\Http\Models\UserSubscribe;
-use App\Http\Models\UserSubscribeLog;
-use App\Http\Models\UserTrafficHourly;
-use App\Http\Models\VerifyCode;
+use App\Models\Config;
+use App\Models\Coupon;
+use App\Models\Invite;
+use App\Models\Order;
+use App\Models\Payment;
+use App\Models\SsNode;
+use App\Models\SsNodeInfo;
+use App\Models\User;
+use App\Models\UserBanLog;
+use App\Models\UserSubscribe;
+use App\Models\UserSubscribeLog;
+use App\Models\UserTrafficHourly;
+use App\Models\VerifyCode;
 use Cache;
 use DB;
 use Exception;
@@ -79,14 +79,15 @@ class AutoJob extends Command {
 
 	// 关闭超时未在线支付订单
 	private function closePayments() {
-		// 关闭超时未支付的在线支付订单(在线支付收款二维码超过30分钟自动关闭,关闭后无法再支付,所以我们限制15分钟内必须付款
+		// 关闭超时未支付的在线订单(15分钟关闭订单
 		$paymentList = Payment::query()
 		                      ->whereStatus(0)
 		                      ->where('created_at', '<=', date("Y-m-d H:i:s", strtotime("-15 minutes")))
 		                      ->get();
 		if($paymentList->isNotEmpty()){
-			DB::beginTransaction();
 			try{
+				DB::beginTransaction();
+
 				foreach($paymentList as $payment){
 					// 关闭支付单
 					Payment::query()->whereId($payment->id)->update(['status' => -1]);
@@ -96,10 +97,11 @@ class AutoJob extends Command {
 
 					// 退回优惠券
 					if($payment->order->coupon_id){
-						Coupon::query()->whereId($payment->order->coupon_id)->update(['status' => 0]);
-
-						Helpers::addCouponLog($payment->order->coupon_id, $payment->order->goods_id, $payment->oid,
-						                      '在线订单超时未支付,自动退回');
+						$result = $this->returnCoupon($payment->order->coupon_id);
+						if($result){
+							Helpers::addCouponLog($payment->order->coupon_id, $payment->order->goods_id, $payment->oid,
+								'在线订单超时未支付,自动退回');
+						}
 					}
 				}
 
@@ -112,25 +114,39 @@ class AutoJob extends Command {
 		}
 	}
 
+	//返回优惠券
+	private function returnCoupon($coupon_id) {
+		$coupon = Coupon::query()->whereId($coupon_id)->get();
+		if($coupon){
+			if($coupon->type < 3){
+				Coupon::query()->whereId($coupon_id)->increment('usage_count', 1, ['status' => 0]);
+				return true;
+			}
+		}
+		return false;
+	}
+
 	// 关闭超时未支付订单
 	private function closeOrders() {
-		// 关闭超时未支付的在线支付订单(在线支付收款二维码超过30分钟自动关闭,关闭后无法再支付,所以我们限制15分钟内必须付款)
+		// 关闭超时未支付的支付订单(15分钟关闭订单
 		$orderList = Order::query()
 		                  ->whereStatus(0)
-		                  ->where('created_at', '<=', date("Y-m-d H:i:s", strtotime("-30 minutes")))
+		                  ->where('created_at', '<=', date("Y-m-d H:i:s", strtotime("-15 minutes")))
 		                  ->get();
 		if($orderList->isNotEmpty()){
-			DB::beginTransaction();
 			try{
+				DB::beginTransaction();
+
 				foreach($orderList as $order){
 					// 关闭订单
 					Order::query()->whereOid($order->oid)->update(['status' => -1]);
 
 					// 退回优惠券
 					if($order->coupon_id){
-						Coupon::query()->whereId($order->coupon_id)->update(['status' => 0]);
-
-						Helpers::addCouponLog($order->coupon_id, $order->goods_id, $order->oid, '订单超时未支付,自动退回');
+						$result = $this->returnCoupon($order->coupon_id);
+						if($result){
+							Helpers::addCouponLog($order->coupon_id, $order->goods_id, $order->oid, '订单超时未支付,自动退回');
+						}
 					}
 				}
 
@@ -143,7 +159,7 @@ class AutoJob extends Command {
 		}
 	}
 
-	// 注册验证码自动置无效
+	// 注册验证码自动置无效 & 优惠券无效化
 	private function expireCode() {
 		// 注册验证码自动置无效
 		VerifyCode::query()
@@ -154,6 +170,9 @@ 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]);
+
 		// 邀请码到期自动置无效
 		Invite::query()->whereStatus(0)->where('dateline', '<=', date('Y-m-d H:i:s'))->update(['status' => 2]);
 	}
@@ -169,15 +188,15 @@ class AutoJob extends Command {
 					$request_times = UserSubscribeLog::query()
 					                                 ->whereSid($subscribe->id)
 					                                 ->where('request_time', '>=',
-					                                         date("Y-m-d H:i:s", strtotime("-24 hours")))
+						                                 date("Y-m-d H:i:s", strtotime("-24 hours")))
 					                                 ->distinct('request_ip')
 					                                 ->count('request_ip');
 					if($request_times >= self::$systemConfig['subscribe_ban_times']){
 						UserSubscribe::query()->whereId($subscribe->id)->update([
-							                                                        'status'   => 0,
-							                                                        'ban_time' => time(),
-							                                                        'ban_desc' => '存在异常,自动封禁'
-						                                                        ]);
+							'status'   => 0,
+							'ban_time' => time(),
+							'ban_desc' => '存在异常,自动封禁'
+						]);
 
 						// 记录封禁日志
 						$this->addUserBanLog($subscribe->user_id, 0, '【完全封禁订阅】-订阅24小时内请求异常');
@@ -190,15 +209,15 @@ class AutoJob extends Command {
 	/**
 	 * 添加用户封禁日志
 	 *
-	 * @param  int     $userId   用户ID
-	 * @param  int     $minutes  封禁时长,单位分钟
-	 * @param  string  $desc     封禁理由
+	 * @param  int     $userId       用户ID
+	 * @param  int     $minutes      封禁时长,单位分钟
+	 * @param  string  $description  封禁理由
 	 */
-	private function addUserBanLog($userId, $minutes, $desc) {
+	private function addUserBanLog($userId, $minutes, $description) {
 		$log = new UserBanLog();
 		$log->user_id = $userId;
 		$log->minutes = $minutes;
-		$log->desc = $desc;
+		$log->description = $description;
 		$log->save();
 	}
 
@@ -221,10 +240,10 @@ class AutoJob extends Command {
 				                                 ->sum('total');
 				if($totalTraffic >= (self::$systemConfig['traffic_ban_value'] * 1073741824)){
 					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")))
-					                                          ]);
+						'enable'   => 0,
+						'ban_time' => strtotime(date('Y-m-d H:i:s',
+							strtotime("+".self::$systemConfig['traffic_ban_time']." minutes")))
+					]);
 
 					// 写入日志
 					$this->addUserBanLog($user->id, self::$systemConfig['traffic_ban_time'], '【临时封禁代理】-1小时内流量异常');
@@ -302,13 +321,13 @@ class AutoJob extends Command {
 	// 检测节点是否离线
 	private function checkNodeStatus() {
 		if(self::$systemConfig['is_node_offline']){
-			$nodeList = SsNode::query()->whereIsTransit(0)->whereStatus(1)->get();
+			$nodeList = SsNode::whereIsRelay(0)->whereStatus(1)->get();
 			foreach($nodeList as $node){
 				// 10分钟内无节点负载信息则认为是后端炸了
 				$nodeTTL = SsNodeInfo::query()
 				                     ->whereNodeId($node->id)
 				                     ->where('log_time', '>=', strtotime("-10 minutes"))
-				                     ->orderBy('id', 'desc')
+				                     ->orderByDesc('id')
 				                     ->doesntExist();
 				if($nodeTTL){
 					if(self::$systemConfig['offline_check_times']){

+ 3 - 3
app/Console/Commands/AutoPingNode.php

@@ -3,8 +3,8 @@
 namespace App\Console\Commands;
 
 use App\Components\NetworkDetection;
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodePing;
+use App\Models\SsNode;
+use App\Models\SsNodePing;
 use Illuminate\Console\Command;
 use Log;
 
@@ -19,7 +19,7 @@ class AutoPingNode extends Command {
 	public function handle() {
 		$jobStartTime = microtime(true);
 
-		$nodeList = SsNode::query()->whereIsTransit(0)->whereStatus(1)->get();
+		$nodeList = SsNode::query()->whereIsRelay(0)->whereStatus(1)->get();
 		foreach($nodeList as $node){
 			$this->pingNode($node->id, $node->is_ddns? $node->server : $node->ip);
 		}

+ 2 - 2
app/Console/Commands/AutoReportNode.php

@@ -4,8 +4,8 @@ namespace App\Console\Commands;
 
 use App\Components\Helpers;
 use App\Components\PushNotification;
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodeTrafficDaily;
+use App\Models\SsNode;
+use App\Models\SsNodeTrafficDaily;
 use Illuminate\Console\Command;
 use Log;
 

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

@@ -2,9 +2,9 @@
 
 namespace App\Console\Commands;
 
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodeTrafficDaily;
-use App\Http\Models\UserTrafficLog;
+use App\Models\SsNode;
+use App\Models\SsNodeTrafficDaily;
+use App\Models\UserTrafficLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -19,7 +19,7 @@ class AutoStatisticsNodeDailyTraffic extends Command {
 	public function handle() {
 		$jobStartTime = microtime(true);
 
-		$nodeList = SsNode::query()->whereStatus(1)->orderBy('id', 'asc')->get();
+		$nodeList = SsNode::query()->whereStatus(1)->orderBy('id')->get();
 		foreach($nodeList as $node){
 			$this->statisticsByNode($node->id);
 		}

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

@@ -2,9 +2,9 @@
 
 namespace App\Console\Commands;
 
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodeTrafficHourly;
-use App\Http\Models\UserTrafficLog;
+use App\Models\SsNode;
+use App\Models\SsNodeTrafficHourly;
+use App\Models\UserTrafficLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -19,7 +19,7 @@ class AutoStatisticsNodeHourlyTraffic extends Command {
 	public function handle() {
 		$jobStartTime = microtime(true);
 
-		$nodeList = SsNode::query()->whereStatus(1)->orderBy('id', 'asc')->get();
+		$nodeList = SsNode::query()->whereStatus(1)->orderBy('id')->get();
 		foreach($nodeList as $node){
 			$this->statisticsByNode($node->id);
 		}

+ 5 - 5
app/Console/Commands/AutoStatisticsUserDailyTraffic.php

@@ -2,10 +2,10 @@
 
 namespace App\Console\Commands;
 
-use App\Http\Models\SsNode;
-use App\Http\Models\User;
-use App\Http\Models\UserTrafficDaily;
-use App\Http\Models\UserTrafficLog;
+use App\Models\SsNode;
+use App\Models\User;
+use App\Models\UserTrafficDaily;
+use App\Models\UserTrafficLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -26,7 +26,7 @@ class AutoStatisticsUserDailyTraffic extends Command {
 			$this->statisticsByNode($user->id);
 
 			// 统计每个节点产生的流量
-			$nodeList = SsNode::query()->whereStatus(1)->orderBy('id', 'asc')->get();
+			$nodeList = SsNode::query()->whereStatus(1)->orderBy('id')->get();
 			foreach($nodeList as $node){
 				$this->statisticsByNode($user->id, $node->id);
 			}

+ 5 - 5
app/Console/Commands/AutoStatisticsUserHourlyTraffic.php

@@ -2,10 +2,10 @@
 
 namespace App\Console\Commands;
 
-use App\Http\Models\SsNode;
-use App\Http\Models\User;
-use App\Http\Models\UserTrafficHourly;
-use App\Http\Models\UserTrafficLog;
+use App\Models\SsNode;
+use App\Models\User;
+use App\Models\UserTrafficHourly;
+use App\Models\UserTrafficLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -26,7 +26,7 @@ class AutoStatisticsUserHourlyTraffic extends Command {
 			$this->statisticsByNode($user->id);
 
 			// 统计每个节点产生的流量
-			$nodeList = SsNode::query()->whereStatus(1)->orderBy('id', 'asc')->get();
+			$nodeList = SsNode::query()->whereStatus(1)->orderBy('id')->get();
 			foreach($nodeList as $node){
 				$this->statisticsByNode($user->id, $node->id);
 			}

+ 31 - 35
app/Console/Commands/DailyJob.php

@@ -4,12 +4,11 @@ namespace App\Console\Commands;
 
 use App\Components\Helpers;
 use App\Components\PushNotification;
-use App\Http\Models\Invite;
-use App\Http\Models\Order;
-use App\Http\Models\Ticket;
-use App\Http\Models\User;
-use App\Http\Models\UserBanLog;
-use App\Http\Models\UserLabel;
+use App\Models\Invite;
+use App\Models\Order;
+use App\Models\Ticket;
+use App\Models\User;
+use App\Models\UserBanLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -53,14 +52,14 @@ class DailyJob extends Command {
 		foreach($userList as $user){
 			if(self::$systemConfig['is_ban_status']){
 				User::query()->whereId($user->id)->update([
-					                                          'u'               => 0,
-					                                          'd'               => 0,
-					                                          'transfer_enable' => 0,
-					                                          'enable'          => 0,
-					                                          'reset_time'      => null,
-					                                          'ban_time'        => 0,
-					                                          'status'          => -1
-				                                          ]);
+					'u'               => 0,
+					'd'               => 0,
+					'transfer_enable' => 0,
+					'enable'          => 0,
+					'reset_time'      => null,
+					'ban_time'        => 0,
+					'status'          => -1
+				]);
 
 				$this->addUserBanLog($user->id, 0, '【禁止登录,清空账户】-账号已过期');
 
@@ -71,37 +70,34 @@ class DailyJob extends Command {
 				Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(禁止登录,清空账户)');
 			}else{
 				User::query()->whereId($user->id)->update([
-					                                          'u'               => 0,
-					                                          'd'               => 0,
-					                                          'transfer_enable' => 0,
-					                                          'enable'          => 0,
-					                                          'reset_time'      => null,
-					                                          'ban_time'        => 0
-				                                          ]);
+					'u'               => 0,
+					'd'               => 0,
+					'transfer_enable' => 0,
+					'enable'          => 0,
+					'reset_time'      => null,
+					'ban_time'        => 0
+				]);
 
 				$this->addUserBanLog($user->id, 0, '【封禁代理,清空账户】-账号已过期');
 
 				// 写入用户流量变动记录
 				Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, 0, '[定时任务]账号已过期(封禁代理,清空账户)');
 			}
-
-			// 移除标签
-			UserLabel::query()->whereUserId($user->id)->delete();
 		}
 	}
 
 	/**
 	 * 添加用户封禁日志
 	 *
-	 * @param  int     $userId   用户ID
-	 * @param  int     $minutes  封禁时长,单位分钟
-	 * @param  string  $desc     封禁理由
+	 * @param  int     $userId       用户ID
+	 * @param  int     $minutes      封禁时长,单位分钟
+	 * @param  string  $description  封禁理由
 	 */
-	private function addUserBanLog($userId, $minutes, $desc) {
+	private function addUserBanLog($userId, $minutes, $description) {
 		$log = new UserBanLog();
 		$log->user_id = $userId;
 		$log->minutes = $minutes;
-		$log->desc = $desc;
+		$log->description = $description;
 		$log->save();
 	}
 
@@ -167,15 +163,15 @@ class DailyJob extends Command {
 			// 可用流量 变动日志
 			if($user->transfer_enable != $order->goods->traffic * 1048576){
 				Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable,
-				                                 $order->goods->traffic * 1048576, '【流量重置】重置可用流量');
+					$order->goods->traffic * 1048576, '【流量重置】重置可用流量');
 			}
 			// 重置流量
 			User::query()->whereId($user->id)->update([
-				                                          'u'               => 0,
-				                                          'd'               => 0,
-				                                          'transfer_enable' => $order->goods->traffic * 1048576,
-				                                          'reset_time'      => $nextResetTime
-			                                          ]);
+				'u'               => 0,
+				'd'               => 0,
+				'transfer_enable' => $order->goods->traffic * 1048576,
+				'reset_time'      => $nextResetTime
+			]);
 			Log::info('用户[ID:'.$user->id.'  昵称: '.$user->username.'  邮箱: '.$user->email.'] 流量重置为 '.($order->goods->traffic * 1048576).'. 重置日期为 '.($nextResetTime?: '【无】'));
 		}
 	}

+ 5 - 5
app/Console/Commands/NodeBlockedDetection.php

@@ -5,8 +5,8 @@ namespace App\Console\Commands;
 use App\Components\Helpers;
 use App\Components\NetworkDetection;
 use App\Components\PushNotification;
-use App\Http\Models\SsNode;
 use App\Mail\nodeCrashWarning;
+use App\Models\SsNode;
 use Cache;
 use Illuminate\Console\Command;
 use Log;
@@ -42,13 +42,13 @@ class NodeBlockedDetection extends Command {
 
 	// 监测节点状态
 	private function checkNodes() {
-		$nodeList = SsNode::query()->whereIsTransit(0)->whereStatus(1)->where('detectionType', '>', 0)->get();
+		$nodeList = SsNode::query()->whereIsRelay(0)->whereStatus(1)->where('detection_type', '>', 0)->get();
 		$sendText = false;
 		$message = "| 线路 | 协议 | 状态 |\r\n| ------ | ------ | ------ |\r\n";
 		$additionalMessage = '';
 		foreach($nodeList as $node){
 			$info = false;
-			if($node->detectionType == 0){
+			if($node->detection_type == 0){
 				continue;
 			}
 			// 使用DDNS的node先通过gethostbyname获取ipv4地址
@@ -61,7 +61,7 @@ class NodeBlockedDetection extends Command {
 					$this->notifyMaster("{$node->name}动态IP获取失败", "节点 {$node->name} : IP获取失败 ");
 				}
 			}
-			if($node->detectionType != 1){
+			if($node->detection_type != 1){
 				$icmpCheck = NetworkDetection::networkCheck($node->ip, true);
 				if($icmpCheck != false && $icmpCheck != "通讯正常"){
 					$message .= "| ".$node->name." | ICMP | ".$icmpCheck." |\r\n";
@@ -69,7 +69,7 @@ class NodeBlockedDetection extends Command {
 					$info = true;
 				}
 			}
-			if($node->detectionType != 2){
+			if($node->detection_type != 2){
 				$tcpCheck = NetworkDetection::networkCheck($node->ip, false, $node->single? $node->port : null);
 				if($tcpCheck != false && $tcpCheck != "通讯正常"){
 					$message .= "| ".$node->name." | TCP | ".$tcpCheck." |\r\n";

+ 14 - 17
app/Console/Commands/ServiceTimer.php

@@ -4,9 +4,8 @@ namespace App\Console\Commands;
 
 use App\Components\Helpers;
 use App\Http\Controllers\ServiceController;
-use App\Http\Models\Order;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
+use App\Models\Order;
+use App\Models\User;
 use DB;
 use Exception;
 use Illuminate\Console\Command;
@@ -36,8 +35,8 @@ class ServiceTimer extends Command {
 	private function decGoodsTraffic() {
 		//获取失效的套餐
 		$orderList = Order::query()->with(['goods'])->whereStatus(2)->whereIsExpire(0)->whereHas('goods', function($q) {
-				$q->whereType(2);
-			})->where('expire_at', '<=', date('Y-m-d H:i:s'))->get();
+			$q->whereType(2);
+		})->where('expire_at', '<=', date('Y-m-d H:i:s'))->get();
 		if($orderList->isNotEmpty()){
 			try{
 				DB::beginTransaction();
@@ -60,24 +59,22 @@ class ServiceTimer extends Command {
 						continue;
 					}
 
-					// 清理全部流量
-					Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $order->user->transfer_enable, 0,
-					                                 '[定时任务]用户所购商品到期,扣减商品对应的流量');
+					// 清理全部流量,重置重置日期和等级
 					User::query()->whereId($order->user_id)->update([
-						                                                'u'               => 0,
-						                                                'd'               => 0,
-						                                                'transfer_enable' => 0,
-						                                                'reset_time'      => null
-					                                                ]);
-
-					// 删除对应用户的所有标签
-					UserLabel::query()->whereUserId($order->user_id)->delete();
+						'u'               => 0,
+						'd'               => 0,
+						'transfer_enable' => 0,
+						'reset_time'      => null,
+						'level'           => 0
+					]);
+					Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $order->user->transfer_enable, 0,
+						'[定时任务]用户所购商品到期,扣减商品对应的流量');
 
 					// 检查该订单对应用户是否有预支付套餐
 					$prepaidOrder = Order::query()
 					                     ->whereUserId($order->user_id)
 					                     ->whereStatus(3)
-					                     ->orderBy('oid', 'asc')
+					                     ->orderBy('oid')
 					                     ->first();
 
 					if($prepaidOrder){

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

@@ -3,9 +3,9 @@
 namespace App\Console\Commands;
 
 use App\Components\Helpers;
-use App\Http\Models\User;
 use App\Mail\userExpireWarning;
 use App\Mail\userExpireWarningToday;
+use App\Models\User;
 use Illuminate\Console\Command;
 use Log;
 use Mail;

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

@@ -4,8 +4,8 @@ namespace App\Console\Commands;
 
 use App\Components\Helpers;
 use App\Components\PushNotification;
-use App\Http\Models\User;
-use App\Http\Models\UserTrafficHourly;
+use App\Models\User;
+use App\Models\UserTrafficHourly;
 use Illuminate\Console\Command;
 use Log;
 

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

@@ -3,8 +3,8 @@
 namespace App\Console\Commands;
 
 use App\Components\Helpers;
-use App\Http\Models\User;
 use App\Mail\userTrafficWarning;
+use App\Models\User;
 use Illuminate\Console\Command;
 use Log;
 use Mail;

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

@@ -3,7 +3,7 @@
 namespace App\Console\Commands;
 
 use App\Components\QQInfo;
-use App\Http\Models\User;
+use App\Models\User;
 use Illuminate\Console\Command;
 use Log;
 

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

@@ -2,7 +2,7 @@
 
 namespace App\Console\Commands;
 
-use App\Http\Models\User;
+use App\Models\User;
 use Illuminate\Console\Command;
 use Log;
 

+ 18 - 18
app/Exceptions/Handler.php

@@ -70,31 +70,31 @@ 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', 'data' => '', 'message' => trans('error.MissingPage')]);
 			}else{
-				return response()->view('auth.error', ['message' => trans('error.MissingPage')]);
+				return Response::view('auth.error', ['message' => trans('error.MissingPage')]);
 			}
 		}
 
 		// 捕获身份校验异常
 		if($exception instanceof AuthenticationException){
 			if($request->ajax()){
-				return response()->json(['status' => 'fail', 'data' => '', 'message' => trans('error.Unauthorized')]);
+				return Respone::json(['status' => 'fail', 'data' => '', 'message' => trans('error.Unauthorized')]);
 			}else{
-				return response()->view('auth.error', ['message' => trans('error.Unauthorized')]);
+				return Respone::view('auth.error', ['message' => trans('error.Unauthorized')]);
 			}
 		}
 
 		// 捕获CSRF异常
 		if($exception instanceof TokenMismatchException){
 			if($request->ajax()){
-				return response()->json([
-					                        'status'  => 'fail',
-					                        'data'    => '',
-					                        'message' => trans('error.RefreshPage').'<a href="/login" target="_blank">'.trans('error.Refresh').'</a>'
-				                        ]);
+				return Respone::json([
+					'status'  => 'fail',
+					'data'    => '',
+					'message' => trans('error.RefreshPage').'<a href="/login" target="_blank">'.trans('error.Refresh').'</a>'
+				]);
 			}else{
-				return response()->view('auth.error', [
+				return Respone::view('auth.error', [
 					'message' => trans('error.RefreshPage').'<a href="/login" target="_blank">'.trans('error.Refresh').'</a>'
 				]);
 			}
@@ -103,22 +103,22 @@ class Handler extends ExceptionHandler {
 		// 捕获反射异常
 		if($exception instanceof ReflectionException){
 			if($request->ajax()){
-				return response()->json(['status' => 'fail', 'data' => '', 'message' => trans('error.SystemError')]);
+				return Respone::json(['status' => 'fail', 'data' => '', 'message' => trans('error.SystemError')]);
 			}else{
-				return response()->view('auth.error', ['message' => trans('error.SystemError')]);
+				return Respone::view('auth.error', ['message' => trans('error.SystemError')]);
 			}
 		}
 
 		// 捕获系统错误异常
 		if($exception instanceof ErrorException){
 			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>'
-				                        ]);
+				return Respone::json([
+					'status'  => 'fail',
+					'data'    => '',
+					'message' => trans('error.SystemError').', '.trans('error.Visit').'<a href="/logs" target="_blank">'.trans('error.log').'</a>'
+				]);
 			}else{
-				return response()->view('auth.error', [
+				return Respone::view('auth.error', [
 					'message' => trans('error.SystemError').', '.trans('error.Visit').'<a href="/logs" target="_blank">'.trans('error.log').'</a>'
 				]);
 			}

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

@@ -4,8 +4,8 @@ namespace App\Http\Controllers\Admin;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\ReferralApply;
-use App\Http\Models\ReferralLog;
+use App\Models\ReferralApply;
+use App\Models\ReferralLog;
 use Illuminate\Http\Request;
 use Response;
 
@@ -39,7 +39,7 @@ class AffiliateController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['applyList'] = $query->orderBy('id', 'desc')->paginate(15)->appends($request->except('page'));
+		$view['applyList'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.affiliate.affiliateList', $view);
 	}
@@ -91,7 +91,7 @@ class AffiliateController extends Controller {
 		$ref_email = $request->input('ref_email');
 		$status = $request->input('status');
 
-		$query = ReferralLog::query()->with(['user', 'order'])->orderBy('status', 'asc')->orderBy('id', 'desc');
+		$query = ReferralLog::query()->with(['user', 'order'])->orderBy('status')->orderByDesc('id');
 
 		if(isset($email)){
 			$query->whereHas('user', function($q) use ($email) {

+ 45 - 45
app/Http/Controllers/Admin/CouponController.php

@@ -3,7 +3,7 @@
 namespace App\Http\Controllers\Admin;
 
 use App\Http\Controllers\Controller;
-use App\Http\Models\Coupon;
+use App\Models\Coupon;
 use DB;
 use Exception;
 use Illuminate\Http\Request;
@@ -12,6 +12,7 @@ use PhpOffice\PhpSpreadsheet\Spreadsheet;
 use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 use Redirect;
 use Response;
+use Validator;
 
 /**
  * 优惠券控制器
@@ -41,7 +42,7 @@ class CouponController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['couponList'] = $query->orderBy('id', 'desc')->paginate(15)->appends($request->except('page'));
+		$view['couponList'] = $query->orderByDesc('id')->paginate(15)->appends($request->except('page'));
 
 		return Response::view('admin.coupon.couponList', $view);
 	}
@@ -49,40 +50,40 @@ class CouponController extends Controller {
 	// 添加商品
 	public function addCoupon(Request $request) {
 		if($request->isMethod('POST')){
-			$this->validate($request, [
+			Validator::make($request->all(), [
 				'name'            => 'required',
 				'sn'              => 'unique:coupon',
 				'type'            => 'required|integer|between:1,3',
-				'usage'           => 'required|integer|between:1,2',
+				'usage_count'     => 'required|integer',
 				'num'             => 'required|integer|min:1',
 				'amount'          => 'required_unless:type,2|numeric|min:0.01|nullable',
 				'discount'        => 'required_if:type,2|numeric|between:1,9.9|nullable',
 				'available_start' => 'required|date|before_or_equal:available_end',
 				'available_end'   => 'required|date|after_or_equal:available_start',
 			], [
-				                'name.required'                   => '请填入卡券名称',
-				                'type.required'                   => '请选择卡券类型',
-				                'type.integer'                    => '卡券类型不合法,请重选',
-				                'type.between'                    => '卡券类型不合法,请重选',
-				                'usage.required'                  => '请选择卡券用途',
-				                'usage.integer'                   => '卡券用途不合法,请重选',
-				                'usage.between'                   => '卡券用途不合法,请重选',
-				                'num.required'                    => '请填写卡券数量',
-				                'num.integer'                     => '卡券数量不合法',
-				                'num.min'                         => '卡券数量不合法,最小1',
-				                'amount.required_unless'          => '请填入卡券面值',
-				                'amount.numeric'                  => '卡券金额不合法',
-				                'amount.min'                      => '卡券金额不合法,最小0.01',
-				                'discount.required_if'            => '请填入卡券折扣',
-				                'discount.numeric'                => '卡券折扣不合法',
-				                'discount.between'                => '卡券折扣不合法,有效范围:1 ~ 9.9',
-				                'available_start.required'        => '请填入有效期',
-				                'available_start.date'            => '有效期不合法',
-				                'available_start.before_or_equal' => '有效期不合法',
-				                'available_end.required'          => '请填入有效期',
-				                'available_end.date'              => '有效期不合法',
-				                'available_end.after_or_equal'    => '有效期不合法'
-			                ]);
+				'name.required'                   => '请填入卡券名称',
+				'type.required'                   => '请选择卡券类型',
+				'type.integer'                    => '卡券类型不合法,请重选',
+				'type.between'                    => '卡券类型不合法,请重选',
+				'usage_count.required'            => '请选择卡券用途',
+				'usage_count.integer'             => '卡券用途不合法,请重选',
+				'usage_count.between'             => '卡券用途不合法,请重选',
+				'num.required'                    => '请填写卡券数量',
+				'num.integer'                     => '卡券数量不合法',
+				'num.min'                         => '卡券数量不合法,最小1',
+				'amount.required_unless'          => '请填入卡券面值',
+				'amount.numeric'                  => '卡券金额不合法',
+				'amount.min'                      => '卡券金额不合法,最小0.01',
+				'discount.required_if'            => '请填入卡券折扣',
+				'discount.numeric'                => '卡券折扣不合法',
+				'discount.between'                => '卡券折扣不合法,有效范围:1 ~ 9.9',
+				'available_start.required'        => '请填入有效期',
+				'available_start.date'            => '有效期不合法',
+				'available_start.before_or_equal' => '有效期不合法',
+				'available_end.required'          => '请填入有效期',
+				'available_end.date'              => '有效期不合法',
+				'available_end.after_or_equal'    => '有效期不合法'
+			]);
 
 			$type = $request->input('type');
 
@@ -102,23 +103,23 @@ class CouponController extends Controller {
 			}else{
 				$logo = '';
 			}
-
-			DB::beginTransaction();
 			try{
-				for($i = 0; $i < $request->input('num'); $i++){
+				DB::beginTransaction();
+				$num = $request->input('num');
+				for($i = 0; $i < $num; $i++){
 					$obj = new Coupon();
 					$obj->name = $request->input('name');
-					$obj->sn = $request->input('sn')?: strtoupper(makeRandStr(8));
 					$obj->logo = $logo;
+					$obj->sn = $num == 1? ($request->input('sn')?: makeRandStr(8)) : makeRandStr(8);
 					$obj->type = $type;
-					$obj->usage = $request->input('usage');
+					$obj->usage_count = $request->input('usage_count');
 					$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'))));
+						strtotime($request->input('available_start'))));
 					$obj->available_end = strtotime(date('Y-m-d 23:59:59',
-					                                     strtotime($request->input('available_end'))));
+						strtotime($request->input('available_end'))));
 					$obj->status = 0;
 					$obj->save();
 				}
@@ -154,8 +155,8 @@ class CouponController extends Controller {
 		$filename = '卡券'.date('Ymd').'.xlsx';
 		$spreadsheet = new Spreadsheet();
 		$spreadsheet->getProperties()
-		            ->setCreator('SSRPanel')
-		            ->setLastModifiedBy('SSRPanel')
+		            ->setCreator('ProxyPanel')
+		            ->setLastModifiedBy('ProxyPanel')
 		            ->setTitle('邀请码')
 		            ->setSubject('邀请码')
 		            ->setDescription('')
@@ -166,11 +167,11 @@ class CouponController extends Controller {
 		$spreadsheet->setActiveSheetIndex(0);
 		$sheet = $spreadsheet->getActiveSheet();
 		$sheet->setTitle('抵用券');
-		$sheet->fromArray(['名称', '类型', '有效期', '券码', '金额(元)', '使用限制(元)'], null);
+		$sheet->fromArray(['名称', '使用次数', '有效期', '券码', '金额(元)', '使用限制(元)'], null);
 		foreach($voucherList as $k => $vo){
-			$usage = $vo->usage == 1? '一次性' : '重复使用';
 			$dateRange = date('Y-m-d', $vo->available_start).' ~ '.date('Y-m-d', $vo->available_end);
-			$sheet->fromArray([$vo->name, $usage, $dateRange, $vo->sn, $vo->amount, $vo->rule], null, 'A'.($k + 2));
+			$sheet->fromArray([$vo->name, $vo->usage_count, $dateRange, $vo->sn, $vo->amount, $vo->rule], null,
+				'A'.($k + 2));
 		}
 
 		// 折扣券
@@ -178,11 +179,11 @@ class CouponController extends Controller {
 		$spreadsheet->setActiveSheetIndex(1);
 		$sheet = $spreadsheet->getActiveSheet();
 		$sheet->setTitle('折扣券');
-		$sheet->fromArray(['名称', '类型', '有效期', '券码', '折扣(折)', '使用限制(元)'], null);
+		$sheet->fromArray(['名称', '使用次数', '有效期', '券码', '折扣(折)', '使用限制(元)'], null);
 		foreach($discountCouponList as $k => $vo){
-			$usage = $vo->usage == 1? '一次性' : '重复使用';
 			$dateRange = date('Y-m-d', $vo->available_start).' ~ '.date('Y-m-d', $vo->available_end);
-			$sheet->fromArray([$vo->name, $usage, $dateRange, $vo->sn, $vo->discount, $vo->rule], null, 'A'.($k + 2));
+			$sheet->fromArray([$vo->name, $vo->usage_count, $dateRange, $vo->sn, $vo->discount, $vo->rule], null,
+				'A'.($k + 2));
 		}
 
 		// 充值券
@@ -190,11 +191,10 @@ class CouponController extends Controller {
 		$spreadsheet->setActiveSheetIndex(2);
 		$sheet = $spreadsheet->getActiveSheet();
 		$sheet->setTitle('充值券');
-		$sheet->fromArray(['名称', '类型', '有效期', '券码', '金额(元)'], null);
+		$sheet->fromArray(['名称', '有效期', '券码', '金额(元)'], null);
 		foreach($refillList as $k => $vo){
-			$usage = '一次性';
 			$dateRange = date('Y-m-d', $vo->available_start).' ~ '.date('Y-m-d', $vo->available_end);
-			$sheet->fromArray([$vo->name, $usage, $dateRange, $vo->sn, $vo->amount], null, 'A'.($k + 2));
+			$sheet->fromArray([$vo->name, $dateRange, $vo->sn, $vo->amount], null, 'A'.($k + 2));
 		}
 
 		// 指针切换回第一个sheet

+ 2 - 2
app/Http/Controllers/Admin/MarketingController.php

@@ -4,7 +4,7 @@ namespace App\Http\Controllers\Admin;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\Marketing;
+use App\Models\Marketing;
 use DB;
 use Exception;
 use GuzzleHttp\Client;
@@ -58,7 +58,7 @@ class MarketingController extends Controller {
 
 	// 添加推送消息
 	public function addPushMarketing(Request $request) {
-		$title = trim($request->input('title'));
+		$title = $request->input('title');
 		$content = $request->input('content');
 
 		if(!self::$systemConfig['is_push_bear']){

+ 287 - 0
app/Http/Controllers/Admin/RuleController.php

@@ -0,0 +1,287 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\Rule;
+use App\Models\RuleGroup;
+use App\Models\RuleGroupNode;
+use App\Models\RuleLog;
+use App\Models\SsNode;
+use Exception;
+use Illuminate\Http\Request;
+use Redirect;
+use Response;
+use Validator;
+
+class RuleController extends Controller {
+	// 审计规则列表
+	public function ruleList(Request $request) {
+		$type = $request->input('type');
+		$query = Rule::query();
+
+		if($type){
+			$query->whereType($type);
+		}
+
+		$view['rules'] = $query->paginate(15)->appends($request->except('page'));
+		return Response::view('admin.rule.ruleList', $view);
+	}
+
+	// 添加审计规则
+	public function addRule(Request $request) {
+		$validator = Validator::make($request->all(), [
+			'type'    => 'required|between:1,4',
+			'name'    => 'required',
+			'pattern' => 'required',
+		]);
+
+		if($validator->fails()){
+			return Response::json(['status' => 'fail', 'message' => $validator->errors()->all()]);
+		}
+
+		$obj = new Rule();
+		$obj->type = $request->input('type');
+		$obj->name = $request->input('name');
+		$obj->pattern = $request->input('pattern');
+		$obj->save();
+
+		if($obj->id){
+			return Response::json(['status' => 'success', 'data' => '', 'message' => '提交成功']);
+		}else{
+			return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作失败']);
+		}
+	}
+
+	// 编辑审计规则
+	public function editRule(Request $request) {
+		$validator = Validator::make($request->all(), [
+			'id'           => 'required|exists:rule,id',
+			'rule_name'    => 'required',
+			'rule_pattern' => 'required',
+		]);
+
+		if($validator->fails()){
+			return Response::json(['status' => 'fail', 'message' => $validator->errors()->all()]);
+		}
+
+		$ret = Rule::query()->whereId($request->input('id'))->update([
+			'name'    => $request->input('rule_name'),
+			'pattern' => $request->input('rule_pattern')
+		]);
+		if($ret){
+			return Response::json(['status' => 'success', 'message' => '操作成功']);
+		}else{
+			return Response::json(['status' => 'fail', 'message' => '操作失败']);
+		}
+
+	}
+
+	// 删除审计规则
+	public function delRule($id) {
+		try{
+			Rule::query()->whereId($id)->delete();
+
+			$RuleGroupList = RuleGroup::query()->get();
+			foreach($RuleGroupList as $RuleGroup){
+				$rules = explode(', ', $RuleGroup->rules);
+				if(in_array($id, $rules)){
+					$rules = implode(', ', array_diff($rules, (array) $id));
+					RuleGroup::query()->whereId($RuleGroup->id)->update(['rules' => $rules]);
+				}
+			}
+		}catch(Exception $e){
+			return Response::json(['status' => 'fail', 'message' => '操作失败, '.$e->getMessage()]);
+		}
+		return Response::json(['status' => 'success', 'message' => '操作成功']);
+	}
+
+	// 审计规则分组列表
+	public function ruleGroupList(Request $request) {
+		$view['ruleGroupList'] = RuleGroup::query()->paginate(15)->appends($request->except('page'));
+		return Response::view('admin.rule.ruleGroupList', $view);
+	}
+
+	// 添加审计规则分组
+	public function addRuleGroup(Request $request) {
+		if($request->isMethod('POST')){
+			$validator = Validator::make($request->all(), [
+				'name'  => 'required',
+				'type'  => 'required|boolean',
+				'rules' => 'required',
+			]);
+
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
+			$obj = new RuleGroup();
+			$obj->name = $request->input('name');
+			$obj->type = intval($request->input('type'));
+			$obj->rules = implode(", ", $request->input('rules'));
+			$obj->save();
+
+			if($obj->id){
+				return Redirect::back()->with('successMsg', '操作成功');
+			}else{
+				return Redirect::back()->withInput()->withErrors('操作失败');
+			}
+
+		}else{
+			$view['ruleList'] = Rule::query()->get();
+			return Response::view('admin.rule.ruleGroupInfo', $view);
+		}
+	}
+
+	// 编辑审计规则分组
+	public function editRuleGroup(Request $request) {
+		$id = $request->input('id');
+		if($request->isMethod('POST')){
+			$validator = Validator::make($request->all(), [
+				'id'    => 'required',
+				'name'  => 'required',
+				'type'  => 'required|boolean',
+				'rules' => 'required',
+			]);
+
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+			$name = $request->input('name');
+			$type = intval($request->input('type'));
+			$rules = $request->input('rules');
+			$ruleGroup = RuleGroup::query()->find($id);
+			if(!$ruleGroup){
+				return Redirect::back()->withInput()->withErrors('未找到需要编辑的审计规则分组!');
+			}
+
+			$data = [];
+			if($ruleGroup->name != $name){
+				$data['name'] = $name;
+			}
+			if($ruleGroup->type != $type){
+				$data['type'] = $type;
+			}
+			if($ruleGroup->rules != $rules){
+				$data['rules'] = implode(", ", $rules);
+			}
+			$ret = RuleGroup::query()->whereId($id)->update($data);
+			if($ret){
+				return Redirect::back()->with('successMsg', '操作成功');
+			}
+			return Redirect::back()->withInput()->withErrors('操作失败');
+
+		}else{
+			$ruleGroup = RuleGroup::query()->find($id);
+			if(!$ruleGroup){
+				return Redirect::back();
+			}
+			$view['ruleList'] = Rule::query()->get();
+
+			return view('admin.rule.ruleGroupInfo', $view)->with(compact('ruleGroup'));
+		}
+	}
+
+	// 删除审计规则分组
+	public function delRuleGroup($id) {
+		$ruleGroup = RuleGroup::query()->whereId($id)->get();
+		if(!$ruleGroup){
+			return Response::json(['status' => 'fail', 'message' => '删除失败,未找到审计规则分组']);
+		}
+		try{
+			RuleGroup::query()->whereId($id)->delete();
+			RuleGroupNode::query()->whereRuleGroupId($id)->delete();
+
+		}catch(Exception $e){
+			return Response::json(['status' => 'fail', 'message' => '删除失败,'.$e->getMessage()]);
+		}
+		return Response::json(['status' => 'success', 'message' => '清理成功']);
+	}
+
+	// 规则分组关联节点
+	public function assignNode(Request $request) {
+		$id = $request->input('id');
+		if($request->isMethod('POST')){
+			$nodes = $request->input('nodes');
+			$validator = Validator::make($request->all(), [
+				'id'    => 'required',
+				'nodes' => 'required',
+			]);
+
+			if($validator->fails()){
+				return Redirect::back()->withInput()->withErrors($validator->errors());
+			}
+
+			$ruleGroup = RuleGroup::query()->find($id);
+			if(!$ruleGroup){
+				return Redirect::back()->withInput()->withErrors('未找到审计规则分组!');
+			}
+			try{
+				if($ruleGroup->nodes != $nodes){
+					RuleGroup::query()->whereId($id)->update(['nodes' => implode(", ", $nodes)]);
+				}
+				RuleGroupNode::query()->whereRuleGroupId($id)->delete();
+
+				foreach($nodes as $nodeId){
+					$obj = new RuleGroupNode();
+					$obj->rule_group_id = $id;
+					$obj->node_id = $nodeId;
+					$obj->save();
+				}
+			}catch(Exception $e){
+				return Redirect::back()->withInput()->withErrors($e->getMessage());
+			}
+			return Redirect::back()->with('successMsg', '操作成功');
+
+		}else{
+			$view['ruleGroup'] = RuleGroup::query()->find($id);
+			$view['nodeList'] = SsNode::query()->get();
+
+			return Response::view('admin.rule.assignNode', $view);
+		}
+	}
+
+	// 用户触发审计规则日志
+	public function ruleLogList(Request $request) {
+		$uid = $request->input('uid');
+		$email = $request->input('email');
+		$nodeId = $request->input('node_id');
+		$ruleId = $request->input('rule_id');
+		$query = RuleLog::query();
+
+		if($uid){
+			$query->whereUserId($uid);
+		}
+		if(isset($email)){
+			$query->whereHas('user', function($q) use ($email) {
+				$q->where('email', 'like', '%'.$email.'%');
+			});
+		}
+		if($nodeId){
+			$query->whereNodeId($nodeId);
+		}
+		if($ruleId){
+			$query->whereRuleId($ruleId);
+		}
+
+		$view['nodeList'] = SsNode::query()->get();
+		$view['ruleList'] = Rule::query()->get();
+		$view['ruleLogs'] = $query->paginate(15)->appends($request->except('page'));
+		return Response::view('admin.rule.ruleLogList', $view);
+	}
+
+	// 清除所有审计触发日志
+	public function clearLog() {
+		try{
+			$ret = RuleLog::query()->delete();
+		}catch(Exception $e){
+			return Response::json(['status' => 'fail', 'message' => '清理失败, '.$e->getMessage()]);
+		}
+		$result = RuleLog::query()->doesntExist();
+		if($ret || $result){
+			return Response::json(['status' => 'success', 'message' => '清理成功']);
+		}else{
+			return Response::json(['status' => 'fail', 'message' => '清理失败']);
+		}
+	}
+}

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

@@ -3,7 +3,7 @@
 namespace App\Http\Controllers\Admin;
 
 use App\Http\Controllers\Controller;
-use App\Http\Models\SensitiveWords;
+use App\Models\SensitiveWords;
 use Illuminate\Http\Request;
 use Response;
 use Validator;
@@ -18,7 +18,7 @@ use Validator;
 class SensitiveWordsController extends Controller {
 	// 敏感词列表
 	public function sensitiveWordsList() {
-		$view['list'] = SensitiveWords::query()->orderBy('id', 'desc')->paginate(15);
+		$view['list'] = SensitiveWords::query()->orderByDesc('id')->paginate(15);
 
 		return Response::view('admin.sensitiveWords.sensitiveWordsList', $view);
 	}
@@ -28,16 +28,16 @@ class SensitiveWordsController extends Controller {
 		$validator = Validator::make($request->all(), [
 			'words' => 'required|unique:sensitive_words'
 		], [
-			                             'words.required' => '添加失败:请填写敏感词',
-			                             'words.unique'   => '添加失败:敏感词已存在'
-		                             ]);
+			'words.required' => '添加失败:请填写敏感词',
+			'words.unique'   => '添加失败:敏感词已存在'
+		]);
 
 		if($validator->fails()){
 			return Response::json([
-				                      'status'  => 'fail',
-				                      'data'    => '',
-				                      'message' => $validator->getMessageBag()->first()
-			                      ]);
+				'status'  => 'fail',
+				'data'    => '',
+				'message' => $validator->getMessageBag()->first()
+			]);
 		}
 
 		$obj = new SensitiveWords();

+ 63 - 137
app/Http/Controllers/Admin/ShopController.php

@@ -3,9 +3,8 @@
 namespace App\Http\Controllers\Admin;
 
 use App\Http\Controllers\Controller;
-use App\Http\Models\Goods;
-use App\Http\Models\GoodsLabel;
-use App\Http\Models\Label;
+use App\Models\Goods;
+use App\Models\Level;
 use DB;
 use Exception;
 use Illuminate\Http\Request;
@@ -13,6 +12,7 @@ use Log;
 use Redirect;
 use Response;
 use Session;
+use Validator;
 
 /**
  * 商店控制器
@@ -37,7 +37,7 @@ class ShopController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['goodsList'] = $query->orderBy('status', 'desc')->paginate(10)->appends($request->except('page'));
+		$view['goodsList'] = $query->orderByDesc('status')->paginate(10)->appends($request->except('page'));
 
 		return Response::view('admin.shop.goodsList', $view);
 	}
@@ -45,44 +45,19 @@ class ShopController extends Controller {
 	// 添加商品
 	public function addGoods(Request $request) {
 		if($request->isMethod('POST')){
-			$this->validate($request, [
+			Validator::make($request->all(), [
 				'name'    => 'required',
-				'traffic' => 'required_unless:type,3|integer|min:1024|max:10240000|nullable',
+				'traffic' => 'required|integer|min:1024|max:10240000|nullable',
 				'price'   => 'required|numeric|min:0',
 				'type'    => 'required',
+				'renew'   => 'require_unless:type,2|min:0',
 				'days'    => 'required|integer',
 			], [
-				                'name.required'           => '请填入名称',
-				                'traffic.required_unless' => '请填入流量',
-				                'traffic.integer'         => '内含流量必须是整数值',
-				                'traffic.min'             => '内含流量不能低于1MB',
-				                'traffic.max'             => '内含流量不能超过10TB',
-				                'price.required'          => '请填入价格',
-				                'price.numeric'           => '价格不合法',
-				                'price.min'               => '价格最低0',
-				                'type.required'           => '请选择类型',
-				                'days.required'           => '请填入有效期',
-				                'days.integer'            => '有效期不合法',
-			                ]);
-
-			$type = $request->input('type');
-			$price = $request->input('price');
-			$renew = $request->input('renew');
-			$days = $request->input('days');
-
-			// 套餐必须有价格
-			if($type == 2 && $price <= 0){
-				return Redirect::back()->withInput()->withErrors('套餐价格必须大于0');
-			}
-
-			if($renew < 0){
-				return Redirect::back()->withInput()->withErrors('流量重置价格必须大于0');
-			}
-			// 套餐有效天数必须大于30天
-			if($type == 2 && $days < 1){
-				return Redirect::back()->withInput()->withErrors('套餐有效天数必须不能少于1天');
-			}
+				'traffic.min' => '内含流量不能低于1MB',
+				'traffic.max' => '内含流量不能超过10TB',
+			]);
 
+			$logo = null;
 			// 商品LOGO
 			if($request->hasFile('logo')){
 				$file = $request->file('logo');
@@ -96,44 +71,31 @@ class ShopController extends Controller {
 				$logoName = date('YmdHis').mt_rand(1000, 2000).'.'.$fileType;
 				$move = $file->move(base_path().'/public/upload/image/', $logoName);
 				$logo = $move? '/upload/image/'.$logoName : '';
-			}else{
-				$logo = '';
 			}
 
-			DB::beginTransaction();
 			try{
+				DB::beginTransaction();
+
 				$goods = new Goods();
 				$goods->name = $request->input('name');
-				$goods->info = $request->input('info');
-				$goods->desc = $request->input('desc');
-				$goods->logo = $logo;
+				$goods->logo = $logo?: null;
 				$goods->traffic = $request->input('traffic');
-				$goods->price = round($price, 2);
-				$goods->renew = round($renew, 2);
-				$goods->type = $type;
-				$goods->days = $days;
+				$goods->type = $request->input('type');
+				$goods->price = round($request->input('price'), 2);
+				$goods->level = $request->input('level');
+				$goods->renew = round($request->input('renew'), 2);
+				$goods->period = $request->input('period');
+				$goods->info = $request->input('info');
+				$goods->description = $request->input('description');
+				$goods->days = $request->input('days');
+				$goods->invite_num = $request->input('invite_num');
+				$goods->limit_num = $request->input('limit_num');
 				$goods->color = $request->input('color');
 				$goods->sort = $request->input('sort');
-				$goods->is_hot = $request->input('is_hot');
-				$goods->limit_num = $request->input('limit_num');
-				$goods->status = $request->input('status');
+				$goods->is_hot = $request->input('is_hot', 0);
+				$goods->status = $request->input('status', 0);
 				$goods->save();
 
-				// 生成SKU
-				$goods->sku = 'S0000'.$goods->id;
-				$goods->save();
-
-				// 生成商品标签
-				$labels = $request->input('labels');
-				if(!empty($labels)){
-					foreach($labels as $label){
-						$goodsLabel = new GoodsLabel();
-						$goodsLabel->goods_id = $goods->id;
-						$goodsLabel->label_id = $label;
-						$goodsLabel->save();
-					}
-				}
-
 				DB::commit();
 
 				return Redirect::back()->with('successMsg', '添加成功');
@@ -144,26 +106,26 @@ class ShopController extends Controller {
 				return Redirect::back()->withInput()->withErrors('添加失败');
 			}
 		}else{
-			$view['label_list'] = Label::query()->orderBy('sort', 'desc')->orderBy('id', 'asc')->get();
+			$view['level_list'] = Level::query()->orderBy('level')->get();
 
-			return Response::view('admin.shop.addGoods', $view);
+			return Response::view('admin.shop.goodsInfo', $view);
 		}
 	}
 
 	// 编辑商品
 	public function editGoods(Request $request, $id) {
 		if($request->isMethod('POST')){
-			$name = $request->input('name');
-			$info = $request->input('info');
-			$desc = $request->input('desc');
-			$price = round($request->input('price'), 2);
-			$renew = round($request->input('renew'), 2);
-			$labels = $request->input('labels');
-			$color = $request->input('color');
-			$sort = $request->input('sort');
-			$is_hot = $request->input('is_hot');
-			$limit_num = $request->input('limit_num');
-			$status = $request->input('status');
+			Validator::make($request->all(), [
+				'name'    => 'required',
+				'traffic' => 'required|integer|min:1024|max:10240000|nullable',
+				'price'   => 'required|numeric|min:0',
+				'type'    => 'required',
+				'renew'   => 'require_unless:type,2|min:0',
+				'days'    => 'required|integer',
+			], [
+				'traffic.min' => '内含流量不能低于1MB',
+				'traffic.max' => '内含流量不能超过10TB',
+			]);
 
 			$goods = Goods::query()->whereId($id)->first();
 			if(!$goods){
@@ -172,27 +134,7 @@ class ShopController extends Controller {
 				return Redirect::back();
 			}
 
-			if(empty($name)){
-				Session::flash('errorMsg', '请填写完整');
-
-				return Redirect::back()->withInput();
-			}
-
-			// 套餐必须有价格
-			if($goods->type == 2 && $price <= 0){
-				Session::flash('errorMsg', '套餐价格必须大于0');
-
-				return Redirect::back()->withInput();
-			}
-
-			if($renew < 0){
-				Session::flash('errorMsg', '流量重置价格必须大于0');
-
-				return Redirect::back()->withInput();
-			}
-
 			// 商品LOGO
-			$logo = '';
 			if($request->hasFile('logo')){
 				$file = $request->file('logo');
 				$fileType = $file->getClientOriginalExtension();
@@ -207,42 +149,30 @@ class ShopController extends Controller {
 				$logoName = date('YmdHis').mt_rand(1000, 2000).'.'.$fileType;
 				$move = $file->move(base_path().'/public/upload/image/', $logoName);
 				$logo = $move? '/upload/image/'.$logoName : '';
+				Goods::query()->whereId($id)->update(['logo' => $logo]);
 			}
 
-			DB::beginTransaction();
 			try{
+				DB::beginTransaction();
+
 				$data = [
-					'name'      => $name,
-					'info'      => $info,
-					'desc'      => $desc,
-					'price'     => $price * 100,
-					'renew'     => $renew * 100,
-					'sort'      => $sort,
-					'color'     => $color,
-					'is_hot'    => $is_hot,
-					'limit_num' => $limit_num,
-					'status'    => $status
+					'name'        => $request->input('name'),
+					'price'       => round($request->input('price'), 2) * 100,
+					'level'       => $request->input('level'),
+					'renew'       => round($request->input('renew'), 2) * 100,
+					'period'      => $request->input('period'),
+					'info'        => $request->input('info'),
+					'description' => $request->input('description'),
+					'invite_num'  => $request->input('invite_num'),
+					'limit_num'   => $request->input('limit_num'),
+					'color'       => $request->input('color'),
+					'sort'        => $request->input('sort'),
+					'is_hot'      => $request->input('is_hot', 0),
+					'status'      => $request->input('status', 0)
 				];
 
-				if($logo){
-					$data['logo'] = $logo;
-				}
-
 				Goods::query()->whereId($id)->update($data);
 
-				// 先删除该商品所有的标签
-				GoodsLabel::query()->whereGoodsId($id)->delete();
-
-				// 生成商品标签
-				if(!empty($labels)){
-					foreach($labels as $label){
-						$goodsLabel = new GoodsLabel();
-						$goodsLabel->goods_id = $id;
-						$goodsLabel->label_id = $label;
-						$goodsLabel->save();
-					}
-				}
-
 				Session::flash('successMsg', '编辑成功');
 
 				DB::commit();
@@ -254,25 +184,21 @@ class ShopController extends Controller {
 
 			return Redirect::to('shop/editGoods/'.$id);
 		}else{
-			$goods = Goods::query()->with(['label'])->whereId($id)->first();
-			if($goods){
-				$label = [];
-				foreach($goods->label as $vo){
-					$label[] = $vo->label_id;
-				}
-				$goods->labels = $label;
-			}
+			$goods = Goods::query()->whereId($id)->first();
 
-			$view['goods'] = $goods;
-			$view['label_list'] = Label::query()->orderBy('sort', 'desc')->orderBy('id', 'asc')->get();
+			$view['level_list'] = Level::query()->orderBy('level')->get();
 
-			return Response::view('admin.shop.editGoods', $view);
+			return view('admin.shop.goodsInfo', $view)->with(compact('goods'));
 		}
 	}
 
 	// 删除商品
 	public function delGoods(Request $request) {
-		Goods::query()->whereId($request->input('id'))->delete();
+		try{
+			Goods::query()->whereId($request->input('id'))->delete();
+		}catch(Exception $e){
+			Session::flash('errorMsg', '编辑失败'.$e);
+		}
 
 		return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
 	}

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

@@ -4,9 +4,8 @@ namespace App\Http\Controllers\Admin;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\Device;
-use App\Http\Models\UserSubscribe;
-use App\Http\Models\UserSubscribeLog;
+use App\Models\UserSubscribe;
+use App\Models\UserSubscribeLog;
 use Illuminate\Http\Request;
 use Response;
 
@@ -46,7 +45,7 @@ class SubscribeController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['subscribeList'] = $query->orderBy('id', 'desc')->paginate(20)->appends($request->except('page'));
+		$view['subscribeList'] = $query->orderByDesc('id')->paginate(20)->appends($request->except('page'));
 
 		return Response::view('admin.subscribe.subscribeList', $view);
 	}
@@ -60,41 +59,11 @@ class SubscribeController extends Controller {
 			$query->whereSid($id);
 		}
 
-		$view['subscribeLog'] = $query->orderBy('id', 'desc')->paginate(20)->appends($request->except('page'));
+		$view['subscribeLog'] = $query->orderByDesc('id')->paginate(20)->appends($request->except('page'));
 
 		return Response::view('admin.subscribe.subscribeLog', $view);
 	}
 
-	// 订阅设备列表
-	public function deviceList(Request $request) {
-		$type = $request->input('type');
-		$platform = $request->input('platform');
-		$name = $request->input('name');
-		$status = $request->input('status');
-
-		$query = Device::query();
-
-		if(isset($type)){
-			$query->whereType($type);
-		}
-
-		if(isset($platform)){
-			$query->wherePlatform($platform);
-		}
-
-		if(isset($name)){
-			$query->where('name', 'like', '%'.$name.'%');
-		}
-
-		if(isset($status)){
-			$query->whereStatus($status);
-		}
-
-		$view['deviceList'] = $query->paginate(20)->appends($request->except('page'));
-
-		return Response::view('admin.subscribe.deviceList', $view);
-	}
-
 	// 设置用户的订阅的状态
 	public function setSubscribeStatus(Request $request) {
 		$id = $request->input('id');
@@ -112,18 +81,4 @@ class SubscribeController extends Controller {
 
 		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
 	}
-
-	// 设置设备是否允许订阅的状态
-	public function setDeviceStatus(Request $request) {
-		$id = $request->input('id');
-		$status = $request->input('status', 0);
-
-		if(empty($id)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作异常']);
-		}
-
-		Device::query()->whereId($id)->update(['status' => $status]);
-
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
-	}
 }

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

@@ -5,10 +5,10 @@ namespace App\Http\Controllers\Admin;
 use App\Components\Helpers;
 use App\Components\PushNotification;
 use App\Http\Controllers\Controller;
-use App\Http\Models\Ticket;
-use App\Http\Models\TicketReply;
 use App\Mail\closeTicket;
 use App\Mail\replyTicket;
+use App\Models\Ticket;
+use App\Models\TicketReply;
 use Auth;
 use Illuminate\Http\Request;
 use Mail;
@@ -40,7 +40,7 @@ class TicketController extends Controller {
 			});
 		}
 
-		$view['ticketList'] = $query->orderBy('id', 'desc')->paginate(10)->appends($request->except('page'));
+		$view['ticketList'] = $query->orderByDesc('id')->paginate(10)->appends($request->except('page'));
 
 		return Response::view('admin.ticket.ticketList', $view);
 	}
@@ -56,7 +56,7 @@ class TicketController extends Controller {
 
 			$obj = new TicketReply();
 			$obj->ticket_id = $id;
-			$obj->user_id = Auth::user()->id;
+			$obj->user_id = Auth::id();
 			$obj->content = $content;
 			$obj->save();
 
@@ -66,35 +66,31 @@ class TicketController extends Controller {
 				$ticket->status = 1;
 				$ticket->save();
 
-
 				$title = "工单回复提醒";
 				$content = "标题:".$ticket->title."<br>管理员回复:".$content;
 
 				// 发通知邮件
-				if(!Auth::user()->is_admin){
+				if(!Auth::getUser()->is_admin){
 					if(self::$systemConfig['webmaster_email']){
 						$logId = Helpers::addNotificationLog($title, $content, 1,
-						                                     self::$systemConfig['webmaster_email']);
+							self::$systemConfig['webmaster_email']);
 						Mail::to(self::$systemConfig['webmaster_email'])->send(new replyTicket($logId, $title,
-						                                                                       $content));
+							$content));
 					}
+					// 推送通知管理员
+					PushNotification::send($title, $content);
 				}else{
 					$logId = Helpers::addNotificationLog($title, $content, 1, $ticket->user->email);
 					Mail::to($ticket->user->email)->send(new replyTicket($logId, $title, $content));
 				}
 
-				// 推送通知管理员
-				if(!Auth::user()->is_admin){
-					PushNotification::send($title, $content);
-				}
-
 				return Response::json(['status' => 'success', 'data' => '', 'message' => '回复成功']);
 			}else{
 				return Response::json(['status' => 'fail', 'data' => '', 'message' => '回复失败']);
 			}
 		}else{
 			$view['ticket'] = Ticket::query()->whereId($id)->with('user')->first();
-			$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->orderBy('id', 'asc')->get();
+			$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->orderBy('id')->get();
 
 			return Response::view('admin.ticket.replyTicket', $view);
 		}

+ 243 - 0
app/Http/Controllers/Admin/ToolsController.php

@@ -0,0 +1,243 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Components\Helpers;
+use App\Http\Controllers\Controller;
+use App\Models\User;
+use DB;
+use Exception;
+use Hash;
+use Illuminate\Http\Request;
+use Redirect;
+use Response;
+use Session;
+
+class ToolsController extends Controller {
+	// SS(R)链接反解析
+	public function decompile(Request $request) {
+		if($request->isMethod('POST')){
+			$content = $request->input('content');
+
+			if(empty($content)){
+				return Response::json(['status' => 'fail', 'data' => '', 'message' => '请在左侧填入要反解析的SS(R)链接']);
+			}
+
+			// 反解析处理
+			$content = str_replace("\n", ",", $content);
+			$content = explode(',', $content);
+			$txt = '';
+			foreach($content as $item){
+				// 判断是SS还是SSR链接
+				$str = '';
+				if(false !== strpos($item, 'ssr://')){
+					$str = mb_substr($item, 6);
+				}elseif(false !== strpos($item, 'ss://')){
+					$str = mb_substr($item, 5);
+				}
+
+				$txt .= "\r\n".base64url_decode($str);
+			}
+
+			// 生成转换好的JSON文件
+			file_put_contents(public_path('downloads/decompile.json'), $txt);
+
+			return Response::json(['status' => 'success', 'data' => $txt, 'message' => '反解析成功']);
+		}else{
+			return Response::view('admin.tools.decompile');
+		}
+	}
+
+	// 格式转换(SS转SSR)
+	public function convert(Request $request) {
+		if($request->isMethod('POST')){
+			$method = $request->input('method');
+			$transfer_enable = $request->input('transfer_enable');
+			$protocol = $request->input('protocol');
+			$protocol_param = $request->input('protocol_param');
+			$obfs = $request->input('obfs');
+			$obfs_param = $request->input('obfs_param');
+			$content = $request->input('content');
+
+			if(empty($content)){
+				return Response::json(['status' => 'fail', 'data' => '', 'message' => '请在左侧填入要转换的内容']);
+			}
+
+			// 校验格式
+			$content = json_decode($content);
+			if(empty($content->port_password)){
+				return Response::json([
+					'status'  => 'fail',
+					'data'    => '',
+					'message' => '转换失败:配置信息里缺少【port_password】字段,或者该字段为空'
+				]);
+			}
+
+			// 转换成SSR格式JSON
+			$data = [];
+			foreach($content->port_password as $port => $passwd){
+				$data[] = [
+					'u'               => 0,
+					'd'               => 0,
+					'enable'          => 1,
+					'method'          => $method,
+					'obfs'            => $obfs,
+					'obfs_param'      => empty($obfs_param)? "" : $obfs_param,
+					'passwd'          => $passwd,
+					'port'            => $port,
+					'protocol'        => $protocol,
+					'protocol_param'  => empty($protocol_param)? "" : $protocol_param,
+					'transfer_enable' => toGB($transfer_enable),
+					'user'            => date('Ymd').'_IMPORT_'.$port,
+				];
+			}
+
+			$json = json_encode($data);
+
+			// 生成转换好的JSON文件
+			file_put_contents(public_path('downloads/convert.json'), $json);
+
+			return Response::json(['status' => 'success', 'data' => $json, 'message' => '转换成功']);
+		}else{
+			// 加密方式、协议、混淆
+			$view['method_list'] = Helpers::methodList();
+			$view['protocol_list'] = Helpers::protocolList();
+			$view['obfs_list'] = Helpers::obfsList();
+
+			return Response::view('admin.tools.convert', $view);
+		}
+	}
+
+	// 下载转换好的JSON文件
+	public function download(Request $request) {
+		$type = $request->input('type');
+		if(empty($type)){
+			exit('参数异常');
+		}
+
+		if($type == '1'){
+			$filePath = public_path('downloads/convert.json');
+		}else{
+			$filePath = public_path('downloads/decompile.json');
+		}
+
+		if(!file_exists($filePath)){
+			exit('文件不存在,请检查目录权限');
+		}
+
+		return Response::download($filePath);
+	}
+
+	// 数据导入
+	public function import(Request $request) {
+		if($request->isMethod('POST')){
+			if(!$request->hasFile('uploadFile')){
+				Session::flash('errorMsg', '请选择要上传的文件');
+
+				return Redirect::back();
+			}
+
+			$file = $request->file('uploadFile');
+
+			// 只能上传JSON文件
+			if($file->getClientMimeType() != 'application/json' || $file->getClientOriginalExtension() != 'json'){
+				Session::flash('errorMsg', '只允许上传JSON文件');
+
+				return Redirect::back();
+			}
+
+			if(!$file->isValid()){
+				Session::flash('errorMsg', '产生未知错误,请重新上传');
+
+				return Redirect::back();
+			}
+
+			$save_path = realpath(storage_path('uploads'));
+			$new_name = md5($file->getClientOriginalExtension()).'.json';
+			$file->move($save_path, $new_name);
+
+			// 读取文件内容
+			$data = file_get_contents($save_path.'/'.$new_name);
+			$data = json_decode($data);
+			if(!$data){
+				Session::flash('errorMsg', '内容格式解析异常,请上传符合SSR(R)配置规范的JSON文件');
+
+				return Redirect::back();
+			}
+
+			try{
+				DB::beginTransaction();
+				foreach($data as $user){
+					$obj = new User();
+					$obj->username = $user->user;
+					$obj->email = $user->user;
+					$obj->password = Hash::make('123456');
+					$obj->port = $user->port;
+					$obj->passwd = $user->passwd;
+					$obj->uuid = $user->uuid;
+					$obj->transfer_enable = $user->transfer_enable;
+					$obj->method = $user->method;
+					$obj->protocol = $user->protocol;
+					$obj->obfs = $user->obfs;
+					$obj->enable_time = date('Y-m-d');
+					$obj->expire_time = '2099-01-01';
+					$obj->reg_ip = getClientIp();
+					$obj->created_at = date('Y-m-d H:i:s');
+					$obj->updated_at = date('Y-m-d H:i:s');
+					$obj->save();
+				}
+
+				DB::commit();
+			}catch(Exception $e){
+				DB::rollBack();
+
+				Session::flash('errorMsg', '出错了,可能是导入的配置中有端口已经存在了');
+
+				return Redirect::back();
+			}
+
+			Session::flash('successMsg', '导入成功');
+
+			return Redirect::back();
+		}else{
+			return Response::view('admin.tools.import');
+		}
+	}
+
+	// 日志分析
+	public function analysis() {
+		$file = storage_path('app/ssserver.log');
+		if(!file_exists($file)){
+			Session::flash('analysisErrorMsg', $file.' 不存在,请先创建文件');
+
+			return Response::view('admin.tools.analysis');
+		}
+
+		$logs = $this->tail($file, 10000);
+		if(false === $logs){
+			$view['urlList'] = [];
+		}else{
+			$url = [];
+			foreach($logs as $log){
+				if(strpos($log, 'TCP connecting')){
+					continue;
+				}
+
+				preg_match('/TCP request (\w+\.){2}\w+/', $log, $tcp_matches);
+				if(!empty($tcp_matches)){
+					$url[] = str_replace('TCP request ', '[TCP] ', $tcp_matches[0]);
+				}else{
+					preg_match('/UDP data to (25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)/',
+						$log, $udp_matches);
+					if(!empty($udp_matches)){
+						$url[] = str_replace('UDP data to ', '[UDP] ', $udp_matches[0]);
+					}
+				}
+			}
+
+			$view['urlList'] = array_unique($url);
+		}
+
+		return Response::view('admin.tools.analysis', $view);
+	}
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 281 - 451
app/Http/Controllers/AdminController.php


+ 7 - 19
app/Http/Controllers/Api/LoginController.php

@@ -4,9 +4,9 @@ namespace App\Http\Controllers\Api;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
-use App\Http\Models\UserSubscribe;
+use App\Models\SsNode;
+use App\Models\User;
+use App\Models\UserSubscribe;
 use Cache;
 use DB;
 use Exception;
@@ -30,8 +30,8 @@ class LoginController extends Controller {
 
 	// 登录返回订阅信息
 	public function login(Request $request) {
-		$email = trim($request->input('email'));
-		$password = trim($request->input('password'));
+		$email = $request->input('email');
+		$password = $request->input('password');
 		$cacheKey = 'request_times_'.md5(getClientIp());
 
 		if(!$email || !$password){
@@ -58,8 +58,8 @@ class LoginController extends Controller {
 			return Response::json(['status' => 'fail', 'data' => [], 'message' => '用户名或密码错误']);
 		}
 
-		DB::beginTransaction();
 		try{
+			DB::beginTransaction();
 			// 如果未生成过订阅链接则生成一个
 			$subscribe = UserSubscribe::query()->whereUserId($user->id)->first();
 
@@ -73,20 +73,8 @@ class LoginController extends Controller {
 			$url = self::$systemConfig['subscribe_domain']? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url'];
 
 			// 节点列表
-			$userLabelIds = UserLabel::query()->whereUserId($user->id)->pluck('label_id');
-			if(empty($userLabelIds)){
-				return Response::json(['status' => 'fail', 'message' => '', 'data' => []]);
-			}
+			$nodeList = SsNode::query()->whereStatus(1)->where('level', '<=', $user->level)->get();
 
-			$nodeList = DB::table('ss_node')
-			              ->selectRaw('ss_node.*')
-			              ->leftJoin('ss_node_label', 'ss_node.id', '=', 'ss_node_label.node_id')
-			              ->whereIn('ss_node_label.label_id', $userLabelIds)
-			              ->where('ss_node.status', 1)
-			              ->groupBy('ss_node.id')
-			              ->orderBy('ss_node.sort', 'desc')
-			              ->orderBy('ss_node.id', 'asc')
-			              ->get();
 
 			$c_nodes = collect();
 			foreach($nodeList as $node){

+ 68 - 79
app/Http/Controllers/AuthController.php

@@ -5,17 +5,16 @@ namespace App\Http\Controllers;
 use App\Components\Helpers;
 use App\Components\IPIP;
 use App\Components\QQWry;
-use App\Http\Models\Invite;
-use App\Http\Models\SensitiveWords;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
-use App\Http\Models\UserLoginLog;
-use App\Http\Models\UserSubscribe;
-use App\Http\Models\Verify;
-use App\Http\Models\VerifyCode;
 use App\Mail\activeUser;
 use App\Mail\resetPassword;
 use App\Mail\sendVerifyCode;
+use App\Models\Invite;
+use App\Models\SensitiveWords;
+use App\Models\User;
+use App\Models\UserLoginLog;
+use App\Models\UserSubscribe;
+use App\Models\Verify;
+use App\Models\VerifyCode;
 use Auth;
 use Cache;
 use Captcha;
@@ -46,13 +45,13 @@ class AuthController extends Controller {
 	// 登录
 	public function login(Request $request) {
 		if($request->isMethod('POST')){
-			$this->validate($request, [
-				'email'    => 'required',
+			Validator::make($request->all(), [
+				'email'    => 'required|email',
 				'password' => 'required'
 			], [
-				                'email.required'    => trans('auth.email_null'),
-				                'password.required' => trans('auth.password_null')
-			                ]);
+				'email.required'    => trans('auth.email_null'),
+				'password.required' => trans('auth.password_null')
+			]);
 
 			$email = $request->input('email');
 			$password = $request->input('password');
@@ -68,15 +67,16 @@ class AuthController extends Controller {
 			if(!Auth::attempt(['email' => $email, 'password' => $password], $remember)){
 				return Redirect::back()->withInput()->withErrors(trans('auth.login_error'));
 			}
+			$user = Auth::getUser();
 
 			// 校验普通用户账号状态
-			if(!Auth::user()->is_admin){
-				if(Auth::user()->status < 0){
+			if(!$user->is_admin){
+				if($user->status < 0){
 					Auth::logout(); // 强制销毁会话,因为Auth::attempt的时候会产生会话
 
 					return Redirect::back()->withInput()->withErrors(trans('auth.login_ban',
-					                                                       ['email' => self::$systemConfig['webmaster_email']]));
-				}elseif(Auth::user()->status == 0 && self::$systemConfig['is_activate_account']){
+						['email' => self::$systemConfig['webmaster_email']]));
+				}elseif($user->status == 0 && self::$systemConfig['is_activate_account']){
 					Auth::logout(); // 强制销毁会话,因为Auth::attempt的时候会产生会话
 
 					return Redirect::back()
@@ -86,20 +86,20 @@ class AuthController extends Controller {
 			}
 
 			// 写入登录日志
-			$this->addUserLoginLog(Auth::user()->id, getClientIp());
+			$this->addUserLoginLog($user->id, getClientIp());
 
 			// 更新登录信息
 			User::uid()->update(['last_login' => time()]);
 
 			// 根据权限跳转
-			if(Auth::user()->is_admin){
+			if($user->is_admin){
 				return Redirect::to('admin');
 			}
 
 			return Redirect::to('/');
 		}else{
 			if(Auth::check()){
-				if(Auth::user()->is_admin){
+				if(Auth::getUser()->is_admin){
 					return Redirect::to('admin');
 				}
 
@@ -119,32 +119,32 @@ class AuthController extends Controller {
 				}
 				break;
 			case 2: // Geetest
-				$result = $this->validate($request, [
+				$validator = Validator::make($request->all(), [
 					'geetest_challenge' => 'required|geetest'
 				], [
-					                          'geetest' => trans('auth.captcha_fail')
-				                          ]);
+					'geetest' => trans('auth.captcha_fail')
+				]);
 
-				if(!$result){
-					return Redirect::back()->withInput()->withErrors(trans('auth.fail_captcha'));
+				if($validator->fails()){
+					return Redirect::back()->withInput()->withErrors(trans('auth.captcha_fail'));
 				}
 				break;
 			case 3: // Google reCAPTCHA
-				$result = $this->validate($request, [
+				$validator = Validator::make($request->all(), [
 					'g-recaptcha-response' => 'required|NoCaptcha'
 				]);
 
-				if(!$result){
-					return Redirect::back()->withInput()->withErrors(trans('auth.fail_captcha'));
+				if($validator->fails()){
+					return Redirect::back()->withInput()->withErrors(trans('auth.captcha_fail'));
 				}
 				break;
 			case 4: // hCaptcha
-				$result = $this->validate($request, [
+				$validator = Validator::make($request->all(), [
 					'h-captcha-response' => 'required|HCaptcha'
 				]);
 
-				if(!$result){
-					return Redirect::back()->withInput()->withErrors(trans('auth.fail_captcha'));
+				if($validator->fails()){
+					return Redirect::back()->withInput()->withErrors(trans('auth.captcha_fail'));
 				}
 				break;
 			default: // 不启用验证码
@@ -215,23 +215,23 @@ class AuthController extends Controller {
 		$cacheKey = 'register_times_'.md5(getClientIp()); // 注册限制缓存key
 
 		if($request->isMethod('POST')){
-			$this->validate($request, [
+			Validator::make($request->all(), [
 				'username'        => 'required',
 				'email'           => 'required|email|unique:user',
 				'password'        => 'required|min:6',
 				'confirmPassword' => 'required|same:password',
 				'term'            => 'accepted'
 			], [
-				                'username.required'        => trans('auth.email_null'),
-				                'email.required'           => trans('auth.email_null'),
-				                'email.email'              => trans('auth.email_legitimate'),
-				                'email.unique'             => trans('auth.email_exist'),
-				                'password.required'        => trans('auth.password_null'),
-				                'password.min'             => trans('auth.password_limit'),
-				                'confirmPassword.required' => trans('auth.confirm_password'),
-				                'confirmPassword.same'     => trans('auth.password_same'),
-				                'term.accepted'            => trans('auth.unaccepted')
-			                ]);
+				'username.required'        => trans('auth.email_null'),
+				'email.required'           => trans('auth.email_null'),
+				'email.email'              => trans('auth.email_legitimate'),
+				'email.unique'             => trans('auth.email_exist'),
+				'password.required'        => trans('auth.password_null'),
+				'password.min'             => trans('auth.password_limit'),
+				'confirmPassword.required' => trans('auth.confirm_password'),
+				'confirmPassword.same'     => trans('auth.password_same'),
+				'term.accepted'            => trans('auth.unaccepted')
+			]);
 
 			$username = $request->input('username');
 			$email = $request->input('email');
@@ -334,7 +334,7 @@ class AuthController extends Controller {
 
 			// 创建新用户
 			$uid = Helpers::addUser($email, Hash::make($password), $transfer_enable,
-			                        self::$systemConfig['default_days'], $referral_uid);
+				self::$systemConfig['default_days'], $referral_uid);
 
 			// 注册失败,抛出异常
 			if(!$uid){
@@ -357,17 +357,6 @@ class AuthController extends Controller {
 				Cache::put($cacheKey, 1, 86400); // 24小时
 			}
 
-			// 初始化默认标签
-			if(strlen(self::$systemConfig['initial_labels_for_user'])){
-				$labels = explode(',', self::$systemConfig['initial_labels_for_user']);
-				foreach($labels as $label){
-					$userLabel = new UserLabel();
-					$userLabel->user_id = $uid;
-					$userLabel->label_id = $label;
-					$userLabel->save();
-				}
-			}
-
 			// 更新邀请码
 			if(self::$systemConfig['is_invite_register'] && $affArr['code_id']){
 				Invite::query()->whereId($affArr['code_id'])->update(['fuid' => $uid, 'status' => 1]);
@@ -501,19 +490,19 @@ class AuthController extends Controller {
 	public function resetPassword(Request $request) {
 		if($request->isMethod('POST')){
 			// 校验请求
-			$this->validate($request, [
+			Validator::make($request->all(), [
 				'email' => 'required|email'
 			], [
-				                'email.required' => trans('auth.email_null'),
-				                'email.email'    => trans('auth.email_legitimate')
-			                ]);
+				'email.required' => trans('auth.email_null'),
+				'email.email'    => trans('auth.email_legitimate')
+			]);
 
 			$email = $request->input('email');
 
 			// 是否开启重设密码
 			if(!self::$systemConfig['is_reset_password']){
 				return Redirect::back()->withErrors(trans('auth.reset_password_close',
-				                                          ['email' => self::$systemConfig['webmaster_email']]));
+					['email' => self::$systemConfig['webmaster_email']]));
 			}
 
 			// 查找账号
@@ -528,7 +517,7 @@ class AuthController extends Controller {
 				$resetTimes = Cache::get('resetPassword_'.md5($email));
 				if($resetTimes >= self::$systemConfig['reset_password_times']){
 					return Redirect::back()->withErrors(trans('auth.reset_password_limit',
-					                                          ['time' => self::$systemConfig['reset_password_times']]));
+						['time' => self::$systemConfig['reset_password_times']]));
 				}
 			}
 
@@ -556,16 +545,16 @@ class AuthController extends Controller {
 		}
 
 		if($request->isMethod('POST')){
-			$this->validate($request, [
+			Validator::make($request->all(), [
 				'password'        => 'required|min:6',
 				'confirmPassword' => 'required|same:password'
 			], [
-				                'password.required'        => trans('auth.password_null'),
-				                'password.min'             => trans('auth.password_limit'),
-				                'confirmPassword.required' => trans('auth.password_null'),
-				                'confirmPassword.min'      => trans('auth.password_limit'),
-				                'confirmPassword.same'     => trans('auth.password_same'),
-			                ]);
+				'password.required'        => trans('auth.password_null'),
+				'password.min'             => trans('auth.password_limit'),
+				'confirmPassword.required' => trans('auth.password_null'),
+				'confirmPassword.min'      => trans('auth.password_limit'),
+				'confirmPassword.same'     => trans('auth.password_same'),
+			]);
 			$password = $request->input('password');
 			// 校验账号
 			$verify = Verify::type(1)->with('user')->whereToken($token)->first();
@@ -610,26 +599,26 @@ class AuthController extends Controller {
 	// 激活账号页
 	public function activeUser(Request $request) {
 		if($request->isMethod('POST')){
-			$this->validate($request, [
+			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')
-			                ]);
+				'email.required' => trans('auth.email_null'),
+				'email.email'    => trans('auth.email_legitimate'),
+				'email.exists'   => trans('auth.email_notExist')
+			]);
 			$email = $request->input('email');
 
 			// 是否开启账号激活
 			if(self::$systemConfig['is_activate_account'] != 2){
 				return Redirect::back()->withInput()->withErrors(trans('auth.active_close',
-				                                                       ['email' => self::$systemConfig['webmaster_email']]));
+					['email' => self::$systemConfig['webmaster_email']]));
 			}
 
 			// 查找账号
 			$user = User::query()->whereEmail($email)->first();
 			if($user->status < 0){
 				return Redirect::back()->withErrors(trans('auth.login_ban',
-				                                          ['email' => self::$systemConfig['webmaster_email']]));
+					['email' => self::$systemConfig['webmaster_email']]));
 			}elseif($user->status > 0){
 				return Redirect::back()->withErrors(trans('auth.email_normal'));
 			}
@@ -640,7 +629,7 @@ class AuthController extends Controller {
 				$activeTimes = Cache::get('activeUser_'.md5($email));
 				if($activeTimes >= self::$systemConfig['active_times']){
 					return Redirect::back()->withErrors(trans('auth.active_limit',
-					                                          ['time' => self::$systemConfig['webmaster_email']]));
+						['time' => self::$systemConfig['webmaster_email']]));
 				}
 			}
 
@@ -723,10 +712,10 @@ class AuthController extends Controller {
 		$validator = Validator::make($request->all(), [
 			'email' => 'required|email|unique:user'
 		], [
-			                             'email.required' => trans('auth.email_null'),
-			                             'email.email'    => trans('auth.email_legitimate'),
-			                             'email.unique'   => trans('auth.email_exist')
-		                             ]);
+			'email.required' => trans('auth.email_null'),
+			'email.email'    => trans('auth.email_legitimate'),
+			'email.unique'   => trans('auth.email_exist')
+		]);
 
 		$email = $request->input('email');
 

+ 59 - 57
app/Http/Controllers/Controller.php

@@ -2,12 +2,10 @@
 
 namespace App\Http\Controllers;
 
-use App\Components\Helpers;
-use App\Http\Models\SensitiveWords;
-use App\Http\Models\SsGroup;
-use App\Http\Models\SsNode;
-use App\Http\Models\User;
-use App\Http\Models\UserSubscribeLog;
+use App\Models\SensitiveWords;
+use App\Models\SsNode;
+use App\Models\User;
+use App\Models\UserSubscribeLog;
 use Exception;
 use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
 use Illuminate\Foundation\Bus\DispatchesJobs;
@@ -22,8 +20,8 @@ class Controller extends BaseController {
 		return makeRandStr();
 	}
 
-	// 生成VmessId
-	public function makeVmessId() {
+	// 生成UUID
+	public function makeUUID() {
 		return createGuid();
 	}
 
@@ -47,7 +45,6 @@ class Controller extends BaseController {
 			try{
 				fseek($fp, -$pos, SEEK_END);
 			}catch(Exception $e){
-				fseek(0);
 				break;
 			}
 
@@ -103,7 +100,7 @@ class Controller extends BaseController {
 
 			$fileName = makeRandStr(18, true).".{$type}";
 			if(file_put_contents(public_path($path.$fileName),
-			                     base64_decode(str_replace($result[1], '', $base64_image_content)))){
+				base64_decode(str_replace($result[1], '', $base64_image_content)))){
 				chmod(public_path($path.$fileName), 0744);
 
 				return $path.$fileName;
@@ -129,58 +126,63 @@ class Controller extends BaseController {
 		$node = SsNode::whereId($nodeId)->first();
 		$scheme = null;
 		// 获取分组名称
-		$group = SsGroup::query()->whereId($node->group_id)->first();
+		$group = $node->getLevel()->first()->name;
 		$host = $node->server?: $node->ip;
+		$data = null;
+		switch($node->type){
+			case 1:
+				if($node->single){
+					$port = $node->port;
+					$protocol = $node->protocol;
+					$method = $node->method;
+					$obfs = $node->obfs;
+					$passwd = $node->passwd;
+					$protocol_param = $user->port.':'.$user->passwd;
+				}else{
+					$port = $user->port;
+					$protocol = $user->protocol;
+					$method = $user->method;
+					$obfs = $user->obfs;
+					$passwd = $user->passwd;
+					$protocol_param = $node->protocol_param;
+				}
 
-		if($node->type == 1){
-			$group = $group? $group->name : Helpers::systemConfig()['website_name'];
-			$obfs_param = $user->obfs_param?: $node->obfs_param;
-			if($node->single){
-				$port = $node->port;
-				$protocol = $node->protocol;
-				$method = $node->method;
-				$obfs = $node->obfs;
-				$passwd = $node->passwd;
-				$protocol_param = $user->port.':'.$user->passwd;
-			}else{
-				$port = $user->port;
-				$protocol = $user->protocol;
-				$method = $user->method;
-				$obfs = $user->obfs;
-				$passwd = $user->passwd;
-				$protocol_param = $user->protocol_param;
-			}
-			if($infoType != 1){
-				// 生成ss/ssr scheme
-				if($node->compatible){
-					$data = 'ss://'.base64url_encode($method.':'.$passwd.'@'.$host.':'.$port).'#'.$group;
+				if($infoType != 1){
+					// 生成ss/ssr scheme
+					if($node->compatible){
+						$data = 'ss://'.base64url_encode($method.':'.$passwd.'@'.$host.':'.$port).'#'.$group;
+					}else{
+						$data = 'ssr://'.base64url_encode($host.':'.$port.':'.$protocol.':'.$method.':'.$obfs.':'.base64url_encode($passwd).'/?obfsparam='.base64url_encode($node->obfs_param).'&protoparam='.base64url_encode($protocol_param).'&remarks='.base64url_encode($node->name).'&group='.$group.'&udpport=0&uot=0');
+					}
 				}else{
-					$data = 'ssr://'.base64url_encode($host.':'.$port.':'.$protocol.':'.$method.':'.$obfs.':'.base64url_encode($passwd).'/?obfsparam='.base64url_encode($obfs_param).'&protoparam='.base64url_encode($protocol_param).'&remarks='.base64url_encode($node->name).'&group='.base64url_encode($group).'&udpport=0&uot=0');
+					// 生成文本配置信息
+					$data = "服务器:".$host.PHP_EOL."IPv6:".$node->ipv6.PHP_EOL."服务器端口:".$port.PHP_EOL."密码:".$passwd.PHP_EOL."加密:".$method.PHP_EOL.($node->compatible? '' : "协议:".$protocol.PHP_EOL."协议参数:".$protocol_param.PHP_EOL."混淆:".$obfs.PHP_EOL."混淆参数:".$node->obfs_param.PHP_EOL);
 				}
-			}else{
-				// 生成文本配置信息
-				$data = "服务器:".$host.PHP_EOL."IPv6:".($node->ipv6?: '').PHP_EOL."远程端口:".$port.PHP_EOL."密码:".$passwd.PHP_EOL."加密方法:".$method.PHP_EOL."路由:绕过局域网及中国大陆地址".PHP_EOL."协议:".$protocol.PHP_EOL."协议参数:".$protocol_param.PHP_EOL."混淆方式:".$obfs.PHP_EOL."混淆参数:".$obfs_param.PHP_EOL."本地端口:1080".PHP_EOL;
-			}
-		}else{
-			// 生成v2ray scheme
-			if($infoType != 1){
+				break;
+			case 2:
 				// 生成v2ray scheme
-				$data = 'vmess://'.base64_encode(json_encode([
-					                                             "v"    => "2",
-					                                             "ps"   => $node->name,
-					                                             "add"  => $host,
-					                                             "port" => $node->v2_port,
-					                                             "id"   => $user->vmess_id,
-					                                             "aid"  => $node->v2_alter_id,
-					                                             "net"  => $node->v2_net,
-					                                             "type" => $node->v2_type,
-					                                             "host" => $node->v2_host,
-					                                             "path" => $node->v2_path,
-					                                             "tls"  => $node->v2_tls? "tls" : ""
-				                                             ], JSON_PRETTY_PRINT));
-			}else{
-				$data = "服务器:".$host.PHP_EOL."IPv6:".($node->ipv6?: "").PHP_EOL."端口:".$node->v2_port.PHP_EOL."加密方式:".$node->v2_method.PHP_EOL."用户ID:".$user->vmess_id.PHP_EOL."额外ID:".$node->v2_alter_id.PHP_EOL."传输协议:".$node->v2_net.PHP_EOL."伪装类型:".$node->v2_type.PHP_EOL."伪装域名:".($node->v2_host?: "").PHP_EOL."路径:".($node->v2_path?: "").PHP_EOL."TLS:".($node->v2_tls? "tls" : "").PHP_EOL;
-			}
+				if($infoType != 1){
+					// 生成v2ray scheme
+					$data = 'vmess://'.base64_encode(json_encode([
+							"v"    => "2",
+							"ps"   => $node->name,
+							"add"  => $host,
+							"port" => $node->v2_port,
+							"id"   => $user->uuid,
+							"aid"  => $node->v2_alter_id,
+							"net"  => $node->v2_net,
+							"type" => $node->v2_type,
+							"host" => $node->v2_host,
+							"path" => $node->v2_path,
+							"tls"  => $node->v2_tls? "tls" : ""
+						], JSON_PRETTY_PRINT));
+				}else{
+					$data = "服务器:".$host.PHP_EOL."IPv6:".($node->ipv6?: "").PHP_EOL."端口:".$node->v2_port.PHP_EOL."加密方式:".$node->v2_method.PHP_EOL."用户ID:".$user->uuid.PHP_EOL."额外ID:".$node->v2_alter_id.PHP_EOL."传输协议:".$node->v2_net.PHP_EOL."伪装类型:".$node->v2_type.PHP_EOL."伪装域名:".($node->v2_host?: "").PHP_EOL."路径:".($node->v2_path?: "").PHP_EOL."TLS:".($node->v2_tls? "tls" : "").PHP_EOL;
+				}
+				break;
+			case 3:
+				break;
+			default:
 		}
 
 		return $data;

+ 25 - 53
app/Http/Controllers/Gateway/AbstractPayment.php

@@ -3,13 +3,11 @@
 namespace App\Http\Controllers\Gateway;
 
 use App\Components\Helpers;
-use App\Http\Models\Goods;
-use App\Http\Models\GoodsLabel;
-use App\Http\Models\Order;
-use App\Http\Models\Payment;
-use App\Http\Models\ReferralLog;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
+use App\Models\Goods;
+use App\Models\Order;
+use App\Models\Payment;
+use App\Models\ReferralLog;
+use App\Models\User;
 use Illuminate\Http\Request;
 use Log;
 
@@ -22,14 +20,11 @@ abstract class AbstractPayment {
 
 	public static function generateGuid() {
 		mt_srand((double) microtime() * 10000);
-		$charid = strtoupper(md5(uniqid(mt_rand() + time(), true)));
+		$charId = strtoupper(md5(uniqid(mt_rand() + time(), true)));
 		$hyphen = chr(45);
-		$uuid = chr(123).substr($charid, 0, 8).$hyphen.substr($charid, 8, 4).$hyphen.substr($charid, 12,
-		                                                                                    4).$hyphen.substr($charid,
-		                                                                                                      16,
-		                                                                                                      4).$hyphen.substr($charid,
-		                                                                                                                        20,
-		                                                                                                                        12).chr(125);
+		$uuid = chr(123).substr($charId, 0, 8).$hyphen.substr($charId, 8, 4).$hyphen.substr($charId, 12,
+				4).$hyphen.substr($charId, 16, 4).$hyphen.substr($charId, 20, 12).chr(125);
+
 		$uuid = str_replace(['}', '{', '-'], '', $uuid);
 		$uuid = substr($uuid, 0, 8);
 
@@ -47,10 +42,10 @@ abstract class AbstractPayment {
 
 	public function postPayment($data, $method) {
 		// 获取需要的信息
-		$payment = Payment::whereSn($data)->first();
+		$payment = Payment::whereTradeNo($data)->first();
 		// 是否为余额购买套餐
 		if($payment){
-			Payment::whereSn($data)->update(['status' => 1]);
+			Payment::whereTradeNo($data)->update(['status' => 1]);
 			$order = Order::find($payment->oid);
 		}else{
 			$order = Order::find($data);
@@ -60,10 +55,10 @@ abstract class AbstractPayment {
 
 		//余额充值
 		if($order->goods_id == -1){
-			User::query()->whereId($order->user_id)->increment('balance', $order->amount * 100);
+			User::query()->whereId($order->user_id)->increment('credit', $order->amount * 100);
 			// 余额变动记录日志
-			Helpers::addUserBalanceLog($order->user_id, $order->oid, $order->user->balance,
-			                           $order->user->balance + $order->amount, $order->amount, '用户'.$method.'充值余额');
+			Helpers::addUserCreditLog($order->user_id, $order->oid, $order->user->credit,
+				$order->user->credit + $order->amount, $order->amount, '用户'.$method.'充值余额');
 
 			return 0;
 		}
@@ -75,8 +70,7 @@ abstract class AbstractPayment {
 				$order->save();
 				User::query()->whereId($order->user_id)->increment('transfer_enable', $goods->traffic * 1048576);
 				Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable,
-				                                 $user->transfer_enable + $goods->traffic * 1048576,
-				                                 '['.$method.']加上用户购买的套餐流量');
+					$user->transfer_enable + $goods->traffic * 1048576, '['.$method.']加上用户购买的套餐流量');
 				break;
 			case 2:
 				$activePlan = Order::query()
@@ -96,22 +90,21 @@ abstract class AbstractPayment {
 				if($activePlan){
 					// 预支付订单, 刷新账号有效时间用于流量重置判断
 					User::query()->whereId($order->user_id)->update([
-						                                                'expire_time' => date('Y-m-d',
-						                                                                      strtotime("+".$goods->days." days",
-						                                                                                strtotime($user->expire_time)))
-					                                                ]);
+						'expire_time' => date('Y-m-d',
+							strtotime("+".$goods->days." days", strtotime($user->expire_time)))
+					]);
 				}else{
 					// 如果买的是套餐,则先将之前购买的套餐都无效化,重置用户已用、可用流量为0
 					Order::query()->whereUserId($user->id)->with(['goods'])->whereHas('goods', function($q) {
 						$q->where('type', '<=', 2);
 					})->whereIsExpire(0)->whereStatus(2)->where('oid', '<>', $order->oid)->update([
-						                                                                              'expire_at' => date('Y-m-d H:i:s'),
-						                                                                              'is_expire' => 1
-					                                                                              ]);
+						'expire_at' => date('Y-m-d H:i:s'),
+						'is_expire' => 1
+					]);
 
 					User::query()->whereId($order->user_id)->update(['u' => 0, 'd' => 0, 'transfer_enable' => 0]);
 					Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable, 0,
-					                                 '['.$method.']用户购买新套餐,先清空流量');
+						'['.$method.']用户购买新套餐,先清空流量');
 
 					$userTraffic = $goods->traffic * 1048576;
 					// 添加账号有效期
@@ -122,36 +115,15 @@ abstract class AbstractPayment {
 						$nextResetTime = null;
 					}
 
-					// 写入用户标签
-					if($goods->label){
-						// 删除用户所有标签
-						UserLabel::query()->whereUserId($order->user_id)->delete();
-
-						//取出 商品默认标签  & 系统默认标签 去重
-						$newUserLabels = array_values(array_unique(array_merge(GoodsLabel::query()
-						                                                                 ->whereGoodsId($order->goods_id)
-						                                                                 ->pluck('label_id')
-						                                                                 ->toArray(),
-						                                                       self::$systemConfig['initial_labels_for_user']? explode(',',
-						                                                                                                               self::$systemConfig['initial_labels_for_user']) : [])));
-
-						// 生成标签
-						foreach($newUserLabels as $Label){
-							$obj = new UserLabel();
-							$obj->user_id = $order->user_id;
-							$obj->label_id = $Label;
-							$obj->save();
-						}
-					}
-
 					User::query()->whereId($order->user_id)->increment('invite_num', $goods->invite_num?: 0, [
 						'transfer_enable' => $userTraffic,
 						'reset_time'      => $nextResetTime,
 						'expire_time'     => $expireTime,
+						'level'           => $goods->level,
 						'enable'          => 1
 					]);
 					Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $user->transfer_enable, $userTraffic,
-					                                 '['.$method.']加上用户购买的套餐流量');
+						'['.$method.']加上用户购买的套餐流量');
 				}
 
 				// 是否返利
@@ -168,7 +140,7 @@ abstract class AbstractPayment {
 					   || (self::$systemConfig['referral_type'] == 1
 					       && !$referral)){
 						$this->addReferralLog($order->user_id, $order->user->referral_uid, $order->oid, $order->amount,
-						                      $order->amount * self::$systemConfig['referral_percent']);
+							$order->amount * self::$systemConfig['referral_percent']);
 					}
 				}
 

+ 10 - 10
app/Http/Controllers/Gateway/BitpayX.php

@@ -4,7 +4,7 @@
 namespace App\Http\Controllers\Gateway;
 
 
-use App\Http\Models\Payment;
+use App\Models\Payment;
 use Auth;
 use Illuminate\Http\Request;
 use Response;
@@ -19,23 +19,23 @@ class BitpayX extends AbstractPayment {
 	 */
 	public function purchase(Request $request) {
 		$payment = new Payment();
-		$payment->sn = self::generateGuid();
-		$payment->user_id = Auth::user()->id;
+		$payment->trade_no = self::generateGuid();
+		$payment->user_id = Auth::id();
 		$payment->oid = $request->input('oid');
 		$payment->amount = $request->input('amount');
 		$payment->save();
 
 		$data = [
-			'merchant_order_id' => $payment->sn,
+			'merchant_order_id' => $payment->trade_no,
 			'price_amount'      => (float) $request->input('amount'),
 			'price_currency'    => 'CNY',
 			'pay_currency'      => $request->input('type') == 1? 'ALIPAY' : 'WECHAT',
-			'title'             => '支付单号:'.$payment->sn,
+			'title'             => '支付单号:'.$payment->trade_no,
 			'description'       => parent::$systemConfig['subject_name']?: parent::$systemConfig['website_name'],
 			'callback_url'      => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=bitpayx',
 			'success_url'       => parent::$systemConfig['website_url'].'/invoices',
 			'cancel_url'        => parent::$systemConfig['website_url'],
-			'token'             => $this->sign($this->prepareSignId($payment->sn)),
+			'token'             => $this->sign($this->prepareSignId($payment->trade_no)),
 
 		];
 
@@ -47,10 +47,10 @@ class BitpayX extends AbstractPayment {
 			Payment::whereId($payment->id)->update(['url' => $result['payment_url']]);
 
 			return Response::json([
-				                      'status'  => 'success',
-				                      'url'     => $result['payment_url'] .= '&lang=zh',
-				                      'message' => '创建订单成功!'
-			                      ]);
+				'status'  => 'success',
+				'url'     => $result['payment_url'] .= '&lang=zh',
+				'message' => '创建订单成功!'
+			]);
 		}
 
 		return Response::json(['status' => 'fail', 'data' => $result, 'message' => '创建订单失败!']);

+ 5 - 5
app/Http/Controllers/Gateway/CodePay.php

@@ -2,22 +2,22 @@
 
 namespace App\Http\Controllers\Gateway;
 
-use App\Http\Models\Payment;
+use App\Models\Payment;
 use Auth;
 use Response;
 
 class CodePay extends AbstractPayment {
 	public function purchase($request) {
 		$payment = new Payment();
-		$payment->sn = self::generateGuid();
-		$payment->user_id = Auth::user()->id;
+		$payment->trade_no = self::generateGuid();
+		$payment->user_id = Auth::id();
 		$payment->oid = $request->input('oid');
 		$payment->amount = $request->input('amount');
 		$payment->save();
 
 		$data = [
 			'id'         => parent::$systemConfig['codepay_id'],
-			'pay_id'     => $payment->sn,
+			'pay_id'     => $payment->trade_no,
 			'type'       => $request->input('type'),            //1支付宝支付 2QQ钱包 3微信支付
 			'price'      => $payment->amount,
 			'page'       => 1,
@@ -67,7 +67,7 @@ class CodePay extends AbstractPayment {
 		if(!$_POST['pay_no'] || md5($sign.parent::$systemConfig['codepay_key']) != $_POST['sign']){
 			exit('fail');
 		}
-		$payment = Payment::whereSn($_POST['pay_id'])->first();
+		$payment = Payment::whereTradeNo($_POST['pay_id'])->first();
 
 		if($payment){
 			if($payment->status == 0){

+ 7 - 16
app/Http/Controllers/Gateway/F2Fpay.php

@@ -2,14 +2,13 @@
 
 namespace App\Http\Controllers\Gateway;
 
-use App\Http\Models\Payment;
+use App\Models\Payment;
 use Auth;
 use Exception;
 use InvalidArgumentException;
 use Log;
 use Payment\Client;
 use Payment\Exceptions\ClassNotFoundException;
-use Payment\Exceptions\GatewayException;
 use Response;
 
 class F2Fpay extends AbstractPayment {
@@ -32,8 +31,8 @@ class F2Fpay extends AbstractPayment {
 
 	public function purchase($request) {
 		$payment = new Payment();
-		$payment->sn = self::generateGuid();
-		$payment->user_id = Auth::user()->id;
+		$payment->trade_no = self::generateGuid();
+		$payment->user_id = Auth::id();
 		$payment->oid = $request->input('oid');
 		$payment->amount = $request->input('amount');
 		$payment->save();
@@ -41,7 +40,7 @@ class F2Fpay extends AbstractPayment {
 		$data = [
 			'body'        => '',
 			'subject'     => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
-			'trade_no'    => $payment->sn,
+			'trade_no'    => $payment->trade_no,
 			'time_expire' => time() + 900, // 必须 15分钟 内付款
 			'amount'      => $payment->amount,
 		];
@@ -52,10 +51,6 @@ class F2Fpay extends AbstractPayment {
 		}catch(InvalidArgumentException $e){
 			Log::error("【支付宝当面付】输入信息错误: ".$e->getMessage());
 			exit;
-		}catch(GatewayException $e){
-			Log::error("【支付宝当面付】建立支付错误: ".$e->getMessage()." | ".var_dump($e->getRaw()));
-			var_dump($e->getRaw());
-			exit;
 		}catch(ClassNotFoundException $e){
 			Log::error("【支付宝当面付】未知类型: ".$e->getMessage());
 			exit;
@@ -64,11 +59,10 @@ class F2Fpay extends AbstractPayment {
 			exit;
 		}
 
-		Payment::whereId($payment->id)->update([
-			                                       'qr_code' => 'http://qr.topscan.com/api.php?text='.$result['qr_code'].'&bg=ffffff&fg=000000&pt=1c73bd&m=10&w=400&el=1&inpt=1eabfc&logo=https://t.alipayobjects.com/tfscom/T1Z5XfXdxmXXXXXXXX.png'
-		                                       ]);//后备:https://cli.im/api/qrcode/code?text=".$result['qr_code']."&mhid=5EfGCwztyckhMHcmI9ZcOKs
+		Payment::whereId($payment->id)
+		       ->update(['qr_code' => 'http://qr.topscan.com/api.php?text='.$result['qr_code'].'&bg=ffffff&fg=000000&pt=1c73bd&m=10&w=400&el=1&inpt=1eabfc&logo=https://t.alipayobjects.com/tfscom/T1Z5XfXdxmXXXXXXXX.png']);//后备:https://cli.im/api/qrcode/code?text=".$result['qr_code']."&mhid=5EfGCwztyckhMHcmI9ZcOKs
 
-		return Response::json(['status' => 'success', 'data' => $payment->sn, 'message' => '创建订单成功!']);
+		return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
 	}
 
 	public function notify($request) {
@@ -84,9 +78,6 @@ class F2Fpay extends AbstractPayment {
 		}catch(InvalidArgumentException $e){
 			Log::error("【支付宝当面付】回调信息错误: ".$e->getMessage());
 			exit;
-		}catch(GatewayException $e){
-			Log::error("【支付宝当面付】建立支付错误: ".$e->getMessage());
-			exit;
 		}catch(ClassNotFoundException $e){
 			Log::error("【支付宝当面付】未知类型: ".$e->getMessage());
 			exit;

+ 7 - 6
app/Http/Controllers/Gateway/Local.php

@@ -4,9 +4,9 @@
 namespace App\Http\Controllers\Gateway;
 
 use App\Components\Helpers;
-use App\Http\Models\Goods;
-use App\Http\Models\Order;
-use App\Http\Models\User;
+use App\Models\Goods;
+use App\Models\Order;
+use App\Models\User;
 use Auth;
 use Illuminate\Http\Request;
 use Response;
@@ -16,12 +16,13 @@ class Local extends AbstractPayment {
 		$amount = $request->input('amount');
 		$order = Order::whereOid($request->input('oid'))->first();
 		$goods = Goods::query()->whereStatus(1)->whereId($request->input('goods_id'))->first();
+		$user = Auth::getUser();
 
 		if($goods){
-			User::query()->whereId(Auth::user()->id)->decrement('balance', $amount * 100);
+			User::query()->whereId($user->id)->decrement('credit', $amount * 100);
 			// 记录余额操作日志
-			Helpers::addUserBalanceLog(Auth::user()->id, $order->oid, Auth::user()->balance,
-			                           Auth::user()->balance - $amount, -1 * $amount, '购买商品:'.$goods->name);
+			Helpers::addUserCreditLog($user->id, $order->oid, $user->credit, $user->credit - $amount, -1 * $amount,
+				'购买商品:'.$goods->name);
 		}
 
 		self::postPayment($order->oid, '余额');

+ 10 - 10
app/Http/Controllers/Gateway/PayJs.php

@@ -2,7 +2,7 @@
 
 namespace App\Http\Controllers\Gateway;
 
-use App\Http\Models\Payment;
+use App\Models\Payment;
 use Auth;
 use Log;
 use Response;
@@ -21,19 +21,19 @@ class PayJs extends AbstractPayment {
 
 	public function purchase($request) {
 		$payment = new Payment();
-		$payment->sn = self::generateGuid();
-		$payment->user_id = Auth::user()->id;
+		$payment->trade_no = self::generateGuid();
+		$payment->user_id = Auth::id();
 		$payment->oid = $request->input('oid');
 		$payment->amount = $request->input('amount');
 		$payment->save();
 
 		$result = (new Pay($this::$config))->native([
-			                                            'body'         => parent::$systemConfig['subject_name']?: parent::$systemConfig['website_name'],
-			                                            'total_fee'    => $payment->amount * 100,
-			                                            'out_trade_no' => $payment->sn,
-			                                            'attach'       => '',
-			                                            'notify_url'   => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=payjs',
-		                                            ]);
+			'body'         => parent::$systemConfig['subject_name']?: parent::$systemConfig['website_name'],
+			'total_fee'    => $payment->amount * 100,
+			'out_trade_no' => $payment->trade_no,
+			'attach'       => '',
+			'notify_url'   => (parent::$systemConfig['website_callback_url']?: parent::$systemConfig['website_url']).'/callback/notify?method=payjs',
+		]);
 
 		if(!$result->return_code){
 			Log::error('PayJs '.$result->return_msg);
@@ -41,7 +41,7 @@ class PayJs extends AbstractPayment {
 		// 获取收款二维码内容
 		Payment::whereId($payment->id)->update(['qr_code' => $result->qrcode]);
 
-		return Response::json(['status' => 'success', 'data' => $payment->sn, 'message' => '创建订单成功!']);
+		return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
 	}
 
 	public function notify($request) {

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

@@ -4,8 +4,8 @@
 namespace App\Http\Controllers\Gateway;
 
 use App\Components\Curl;
-use App\Http\Models\Order;
-use App\Http\Models\Payment;
+use App\Models\Order;
+use App\Models\Payment;
 use Auth;
 use Exception;
 use Illuminate\Http\Request;
@@ -40,7 +40,7 @@ class PayPal extends AbstractPayment {
 		$this->provider->setApiCredentials($config);
 		$this->exChange = 7;
 		$exChangeRate = json_decode(Curl::send('http://api.k780.com/?app=finance.rate&scur=USD&tcur=CNY&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4'),
-		                            true);
+			true);
 		if($exChangeRate){
 			if($exChangeRate['success']){
 				$this->exChange = $exChangeRate['result']['rate'];
@@ -50,13 +50,13 @@ class PayPal extends AbstractPayment {
 
 	public function purchase(Request $request) {
 		$payment = new Payment();
-		$payment->sn = self::generateGuid();
-		$payment->user_id = Auth::user()->id;
+		$payment->trade_no = self::generateGuid();
+		$payment->user_id = Auth::id();
 		$payment->oid = $request->input('oid');
 		$payment->amount = $request->input('amount');
 		$payment->save();
 
-		$data = $this->getCheckoutData($payment->sn, $payment->amount);
+		$data = $this->getCheckoutData($payment->trade_no, $payment->amount);
 
 		try{
 			$response = $this->provider->setExpressCheckout($data);
@@ -74,11 +74,11 @@ class PayPal extends AbstractPayment {
 		}
 	}
 
-	protected function getCheckoutData($sn, $amount) {
+	protected function getCheckoutData($trade_no, $amount) {
 		$amount = 0.3 + ceil($amount / $this->exChange * 100) / 100;
 
 		return [
-			'invoice_id'          => $sn,
+			'invoice_id'          => $trade_no,
 			'items'               => [
 				[
 					'name'  => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
@@ -87,7 +87,7 @@ class PayPal extends AbstractPayment {
 					'qty'   => 1
 				]
 			],
-			'invoice_description' => $sn,
+			'invoice_description' => $trade_no,
 			'return_url'          => self::$systemConfig['website_url'].'/callback/checkout',
 			'cancel_url'          => self::$systemConfig['website_url'].'/invoices',
 			'total'               => $amount,
@@ -102,8 +102,8 @@ class PayPal extends AbstractPayment {
 		$response = $this->provider->getExpressCheckoutDetails($token);
 
 		if(in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])){
-			$payment = Payment::whereSn($response['INVNUM'])->first();
-			$data = $this->getCheckoutData($payment->sn, $payment->amount);
+			$payment = Payment::whereTradeNo($response['INVNUM'])->first();
+			$data = $this->getCheckoutData($payment->trade_no, $payment->amount);
 			// Perform transaction on PayPal
 			$payment_status = $this->provider->doExpressCheckoutPayment($data, $token, $PayerID);
 			$status = $payment_status['PAYMENTINFO_0_PAYMENTSTATUS'];
@@ -131,7 +131,7 @@ class PayPal extends AbstractPayment {
 		$response = (string) $this->provider->verifyIPN($post);
 
 		if($response === 'VERIFIED' && $request['invoice']){
-			if(Payment::whereSn($request['invoice'])->first()->status == 0){
+			if(Payment::whereTradeNo($request['invoice'])->first()->status == 0){
 				self::postPayment($request['invoice'], 'PayPal');
 			}
 			exit("success");

+ 41 - 42
app/Http/Controllers/PaymentController.php

@@ -9,11 +9,11 @@ use App\Http\Controllers\Gateway\F2Fpay;
 use App\Http\Controllers\Gateway\Local;
 use App\Http\Controllers\Gateway\PayJs;
 use App\Http\Controllers\Gateway\PayPal;
-use App\Http\Models\Coupon;
-use App\Http\Models\Goods;
-use App\Http\Models\Order;
-use App\Http\Models\Payment;
-use App\Http\Models\PaymentCallback;
+use App\Models\Coupon;
+use App\Models\Goods;
+use App\Models\Order;
+use App\Models\Payment;
+use App\Models\PaymentCallback;
 use Auth;
 use Illuminate\Http\Request;
 use Log;
@@ -40,7 +40,7 @@ class PaymentController extends Controller {
 
 	public static function getClient() {
 		switch(self::$method){
-			case 'balance':
+			case 'credit':
 				return new Local();
 			case 'f2fpay':
 				return new F2Fpay();
@@ -68,18 +68,18 @@ class PaymentController extends Controller {
 	}
 
 	public static function getStatus(Request $request) {
-		$payment = Payment::whereSn($request->input('sn'))->first();
+		$payment = Payment::whereTradeNo($request->input('trade_no'))->first();
 		if($payment){
 			if($payment->status == 1){
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '支付成功']);
+				return Response::json(['status' => 'success', 'message' => '支付成功']);
 			}elseif($payment->status == -1){
-				return Response::json(['status' => 'error', 'data' => '', 'message' => '订单超时未支付,已自动关闭']);
+				return Response::json(['status' => 'error', 'message' => '订单超时未支付,已自动关闭']);
 			}else{
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '等待支付']);
+				return Response::json(['status' => 'fail', 'message' => '等待支付']);
 			}
 		}
 
-		return Response::json(['status' => 'error', 'data' => '', 'message' => '未知订单']);
+		return Response::json(['status' => 'error', 'message' => '未知订单']);
 	}
 
 	// 创建支付订单
@@ -87,19 +87,20 @@ class PaymentController extends Controller {
 		$goods_id = $request->input('goods_id');
 		$coupon_sn = $request->input('coupon_sn');
 		self::$method = $request->input('method');
-		$balance = $request->input('amount');
+		$credit = $request->input('amount');
+		$amount = 0;
 
 		$goods = Goods::query()->whereStatus(1)->whereId($goods_id)->first();
 		// 充值余额
-		if($balance){
-			if(!is_numeric($balance) || $balance <= 0){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '充值余额不合规']);
+		if($credit){
+			if(!is_numeric($credit) || $credit <= 0){
+				return Response::json(['status' => 'fail', 'message' => '充值余额不合规']);
 			}
-			$amount = $balance;
+			$amount = $credit;
 			// 购买服务
 		}elseif($goods_id && self::$method){
 			if(!$goods){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:商品或服务已下架']);
+				return Response::json(['status' => 'fail', 'message' => '订单创建失败:商品或服务已下架']);
 			}
 
 			// 是否有生效的套餐
@@ -109,20 +110,20 @@ class PaymentController extends Controller {
 
 			//无生效套餐,禁止购买加油包
 			if($goods->type == 1 && $activePlan){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '购买加油包前,请先购买套餐']);
+				return Response::json(['status' => 'fail', 'message' => '购买加油包前,请先购买套餐']);
 			}
 
 			//非余额付款下,检查对应的在线支付是否开启
-			if(self::$method != 'balance'){
+			if(self::$method != 'credit'){
 				// 判断是否开启在线支付
 				if(!Helpers::systemConfig()['is_onlinePay']){
-					return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:系统并未开启在线支付功能']);
+					return Response::json(['status' => 'fail', 'message' => '订单创建失败:系统并未开启在线支付功能']);
 				}
 
 				// 判断是否存在同个商品的未支付订单
 				$existsOrder = Order::uid()->whereStatus(0)->whereGoodsId($goods_id)->exists();
 				if($existsOrder){
-					return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:尚有未支付的订单,请先去支付']);
+					return Response::json(['status' => 'fail', 'message' => '订单创建失败:尚有未支付的订单,请先去支付']);
 				}
 			}
 
@@ -131,10 +132,9 @@ class PaymentController extends Controller {
 				$count = Order::uid()->where('status', '>=', 0)->whereGoodsId($goods_id)->count();
 				if($count >= $goods->limit_num){
 					return Response::json([
-						                      'status'  => 'fail',
-						                      'data'    => '',
-						                      'message' => '此商品/服务限购'.$goods->limit_num.'次,您已购买'.$count.'次'
-					                      ]);
+						'status'  => 'fail',
+						'message' => '此商品/服务限购'.$goods->limit_num.'次,您已购买'.$count.'次'
+					]);
 				}
 			}
 
@@ -142,7 +142,7 @@ class PaymentController extends Controller {
 			if($coupon_sn){
 				$coupon = Coupon::query()->whereStatus(0)->whereIn('type', [1, 2])->whereSn($coupon_sn)->first();
 				if(!$coupon){
-					return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:优惠券不存在']);
+					return Response::json(['status' => 'fail', 'message' => '订单创建失败:优惠券不存在']);
 				}
 
 				// 计算实际应支付总价
@@ -154,14 +154,14 @@ class PaymentController extends Controller {
 
 			// 价格异常判断
 			if($amount < 0){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:订单总价异常']);
-			}elseif($amount == 0 && self::$method != 'balance'){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '订单创建失败:订单总价为0,无需使用在线支付']);
+				return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价异常']);
+			}elseif($amount == 0 && self::$method != 'credit'){
+				return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价为0,无需使用在线支付']);
 			}
 
 			// 验证账号余额是否充足
-			if(self::$method == 'balance' && Auth::user()->balance < $amount){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '您的余额不足,请先充值']);
+			if(self::$method == 'credit' && Auth::getUser()->credit < $amount){
+				return Response::json(['status' => 'fail', 'message' => '您的余额不足,请先充值']);
 			}
 		}
 
@@ -170,22 +170,21 @@ class PaymentController extends Controller {
 		// 生成订单
 		$order = new Order();
 		$order->order_sn = $orderSn;
-		$order->user_id = Auth::user()->id;
-		$order->goods_id = $balance? -1 : $goods_id;
+		$order->user_id = Auth::id();
+		$order->goods_id = $credit? -1 : $goods_id;
 		$order->coupon_id = !empty($coupon)? $coupon->id : 0;
-		$order->origin_amount = $balance?: $goods->price;
+		$order->origin_amount = $credit?: $goods->price;
 		$order->amount = $amount;
-		$order->expire_at = $balance? null : date("Y-m-d H:i:s", strtotime("+".$goods->days." days"));
+		$order->expire_at = $credit? null : date("Y-m-d H:i:s", strtotime("+".$goods->days." days"));
 		$order->is_expire = 0;
 		$order->pay_way = self::$method;
 		$order->status = 0;
 		$order->save();
 
-		// 优惠券置为已使用
+		// 使用优惠券,减少可使用次数
 		if(!empty($coupon)){
-			if($coupon->usage == 1){
-				$coupon->status = 1;
-				$coupon->save();
+			if($coupon->usage_count > 0){
+				Coupon::whereId($coupon->id)->decrement('usage_count', 1);
 			}
 
 			Helpers::addCouponLog($coupon->id, $goods_id, $order->oid, '订单支付使用');
@@ -198,8 +197,8 @@ class PaymentController extends Controller {
 	}
 
 	// 支付单详情
-	public function detail($sn) {
-		$payment = Payment::uid()->with(['order', 'order.goods'])->whereSn($sn)->first();
+	public function detail($trade_no) {
+		$payment = Payment::uid()->with(['order', 'order.goods'])->whereTradeNo($trade_no)->first();
 		$view['payment'] = $payment;
 		$view['name'] = $payment->order->goods? $payment->order->goods->name : '余额充值';
 		$view['days'] = $payment->order->goods? $payment->order->goods->days : 0;
@@ -217,7 +216,7 @@ class PaymentController extends Controller {
 			$query->whereStatus($status);
 		}
 
-		$view['list'] = $query->orderBy('id', 'desc')->paginate(10)->appends($request->except('page'));
+		$view['list'] = $query->orderByDesc('id')->paginate(10)->appends($request->except('page'));
 
 		return Response::view('admin.logs.callbackList', $view);
 	}

+ 17 - 31
app/Http/Controllers/ServiceController.php

@@ -4,29 +4,27 @@
 namespace App\Http\Controllers;
 
 use App\Components\Helpers;
-use App\Http\Models\Goods;
-use App\Http\Models\GoodsLabel;
-use App\Http\Models\Order;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
+use App\Models\Goods;
+use App\Models\Order;
+use App\Models\User;
 
 class ServiceController extends Controller {
 	public function activePrepaidOrder($oid) {
 		// 取出预支付订单
 		$prepaidOrder = Order::find($oid);
 		//去除使用中的套餐和 流量包
-		Order::query()->whereUserId($prepaidOrder->user_id)->whereStatus(2)->whereIsExpire(0)->update([
-			                                                                                              'expire_at' => date('Y-m-d H:i:s'),
-			                                                                                              'is_expire' => 1
-		                                                                                              ]);
+		Order::query()
+		     ->whereUserId($prepaidOrder->user_id)
+		     ->whereStatus(2)
+		     ->whereIsExpire(0)
+		     ->update(['expire_at' => date('Y-m-d H:i:s'), 'is_expire' => 1]);
 		//取出对应套餐信息
 		$prepaidGood = Goods::query()->whereId($prepaidOrder->goods_id)->first();
 		//激活预支付套餐
 		Order::query()->whereOid($prepaidOrder->oid)->update([
-			                                                     'expire_at' => date("Y-m-d H:i:s",
-			                                                                         strtotime("+".$prepaidGood->days." days")),
-			                                                     'status'    => 2
-		                                                     ]);
+			'expire_at' => date("Y-m-d H:i:s", strtotime("+".$prepaidGood->days." days")),
+			'status'    => 2
+		]);
 		//取出用户信息
 		$user = User::query()->whereId($prepaidOrder->user_id)->first();
 
@@ -45,30 +43,18 @@ class ServiceController extends Controller {
 			$nextResetTime = null;
 		}
 
-		// 用户默认标签
-		$defaultLabels = Helpers::systemConfig()['initial_labels_for_user']? explode(',',
-		                                                                             Helpers::systemConfig()['initial_labels_for_user']) : [];
-		//取出 商品默认标签  & 系统默认标签 去重
-		$newUserLabels = array_values(array_unique(array_merge(GoodsLabel::query()
-		                                                                 ->whereGoodsId($prepaidOrder->goods_id)
-		                                                                 ->pluck('label_id')
-		                                                                 ->toArray(), $defaultLabels)));
+		//赋予等级
+		$level = $prepaidOrder->goods->level;
 
-		// 生成标签
-		foreach($newUserLabels as $vo){
-			$obj = new UserLabel();
-			$obj->user_id = $prepaidOrder->user_id;
-			$obj->label_id = $vo;
-			$obj->save();
-		}
 		Helpers::addUserTrafficModifyLog($prepaidOrder->user_id, $prepaidOrder->oid, $user->transfer_enable,
-		                                 $userTraffic, '[预支付订单激活]加上用户购买的套餐流量');
-		User::query()->whereId($prepaidOrder->user_id)->increment('invite_num', $prepaidOrder->invite_num?: 0, [
+			$userTraffic, '[预支付订单激活]加上用户购买的套餐流量');
+		User::query()->whereId($prepaidOrder->user_id)->increment('invite_num', $prepaidOrder->goods->invite_num?: 0, [
 			'u'               => 0,
 			'd'               => 0,
 			'transfer_enable' => $userTraffic,
 			'expire_time'     => $expire_time,
-			'reset_time'      => $nextResetTime
+			'reset_time'      => $nextResetTime,
+			'level'           => $level
 		]);
 	}
 

+ 15 - 18
app/Http/Controllers/User/AffiliateController.php

@@ -4,10 +4,10 @@ namespace App\Http\Controllers\User;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\Order;
-use App\Http\Models\ReferralApply;
-use App\Http\Models\ReferralLog;
-use App\Http\Models\User;
+use App\Models\Order;
+use App\Models\ReferralApply;
+use App\Models\ReferralLog;
+use App\Models\User;
 use Auth;
 use Response;
 
@@ -22,26 +22,23 @@ class AffiliateController extends Controller {
 	public function referral() {
 		if(Order::uid()->whereStatus(2)->doesntExist() && ReferralLog::uid()->doesntExist()){
 			return Response::view('auth.error',
-			                      ['message' => '本功能对非付费用户禁用!请 <a class="btn btn-sm btn-danger" href="/">返 回</a>']);
+				['message' => '本功能对非付费用户禁用!请 <a class="btn btn-sm btn-danger" href="/">返 回</a>']);
 		}
 		$view['referral_traffic'] = flowAutoShow(self::$systemConfig['referral_traffic'] * 1048576);
 		$view['referral_percent'] = self::$systemConfig['referral_percent'];
 		$view['referral_money'] = self::$systemConfig['referral_money'];
 		$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::user()->id;
-		$view['referralLogList'] = ReferralLog::uid()
-		                                      ->with('user')
-		                                      ->orderBy('id', 'desc')
-		                                      ->paginate(10, ['*'], 'log_page');
+		$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')
-		                                          ->orderBy('id', 'desc')
+		                                          ->orderByDesc('id')
 		                                          ->paginate(10, ['*'], 'apply_page');
 		$view['referralUserList'] = User::query()
 		                                ->select(['email', 'created_at'])
-		                                ->whereReferralUid(Auth::user()->id)
-		                                ->orderBy('id', 'desc')
+		                                ->whereReferralUid(Auth::id())
+		                                ->orderByDesc('id')
 		                                ->paginate(10, ['*'], 'user_page');
 
 		return Response::view('user.referral', $view);
@@ -50,7 +47,7 @@ class AffiliateController extends Controller {
 	// 申请提现
 	public function extractMoney() {
 		// 判断账户是否过期
-		if(Auth::user()->expire_time < date('Y-m-d')){
+		if(Auth::getUser()->expire_time < date('Y-m-d')){
 			return Response::json(['status' => 'fail', 'message' => '申请失败:账号已过期,请先购买服务吧']);
 		}
 
@@ -65,9 +62,9 @@ class AffiliateController extends Controller {
 		$ref_amount /= 100;
 		if($ref_amount < self::$systemConfig['referral_money']){
 			return Response::json([
-				                      'status'  => 'fail',
-				                      'message' => '申请失败:满'.self::$systemConfig['referral_money'].'元才可以提现,继续努力吧'
-			                      ]);
+				'status'  => 'fail',
+				'message' => '申请失败:满'.self::$systemConfig['referral_money'].'元才可以提现,继续努力吧'
+			]);
 		}
 
 		// 取出本次申请关联返利日志ID
@@ -79,7 +76,7 @@ class AffiliateController extends Controller {
 		$link_logs = rtrim($link_logs, ',');
 
 		$obj = new ReferralApply();
-		$obj->user_id = Auth::user()->id;
+		$obj->user_id = Auth::id();
 		$obj->before = $ref_amount;
 		$obj->after = 0;
 		$obj->amount = $ref_amount;

+ 7 - 22
app/Http/Controllers/User/SubscribeController.php

@@ -4,10 +4,9 @@ namespace App\Http\Controllers\User;
 
 use App\Components\Helpers;
 use App\Http\Controllers\Controller;
-use App\Http\Models\SsNode;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
-use App\Http\Models\UserSubscribe;
+use App\Models\SsNode;
+use App\Models\User;
+use App\Models\UserSubscribe;
 use Illuminate\Http\Request;
 use Redirect;
 use Response;
@@ -26,7 +25,7 @@ class SubscribeController extends Controller {
 		}
 
 		// 校验合法性
-		$subscribe = UserSubscribe::query()->with('user')->whereStatus(1)->whereCode($code)->first();
+		$subscribe = UserSubscribe::query()->with('user')->whereCode($code)->whereStatus(1)->first();
 		if(!$subscribe){
 			exit($this->noneNode());
 		}
@@ -43,28 +42,14 @@ class SubscribeController extends Controller {
 		$this->log($subscribe->id, getClientIp(), $request->headers);
 
 		// 获取这个账号可用节点
-		$userLabelIds = UserLabel::query()->whereUserId($user->id)->pluck('label_id');
-		if(empty($userLabelIds)){
-			exit($this->noneNode());
-		}
-
-		$query = SsNode::query()
-		               ->selectRaw('ss_node.*')
-		               ->leftjoin("ss_node_label", "ss_node.id", "=", "ss_node_label.node_id");
+		$query = SsNode::query()->whereStatus(1)->whereIsSubscribe(1)->where('level', '<=', $user->level);
 
 		// 启用混合订阅时,加入V2Ray节点,未启用时仅下发SSR节点信息
 		if(!self::$systemConfig['mix_subscribe']){
-			$query->where('ss_node.type', 1);
+			$query->whereType(1);
 		}
 
-		$nodeList = $query->where('ss_node.status', 1)
-		                  ->where('ss_node.is_subscribe', 1)
-		                  ->whereIn('ss_node_label.label_id', $userLabelIds)
-		                  ->groupBy('ss_node.id')
-		                  ->orderBy('ss_node.sort', 'desc')
-		                  ->orderBy('ss_node.id', 'asc')
-		                  ->get()
-		                  ->toArray();
+		$nodeList = $query->orderByDesc('sort')->orderBy('id')->get()->toArray();
 		if(empty($nodeList)){
 			exit($this->noneNode());
 		}

+ 86 - 100
app/Http/Controllers/UserController.php

@@ -4,25 +4,24 @@ namespace App\Http\Controllers;
 
 use App\Components\Helpers;
 use App\Components\PushNotification;
-use App\Http\Models\Article;
-use App\Http\Models\Coupon;
-use App\Http\Models\Goods;
-use App\Http\Models\Invite;
-use App\Http\Models\Order;
-use App\Http\Models\SsNode;
-use App\Http\Models\SsNodeInfo;
-use App\Http\Models\SsNodeLabel;
-use App\Http\Models\SsNodePing;
-use App\Http\Models\Ticket;
-use App\Http\Models\TicketReply;
-use App\Http\Models\User;
-use App\Http\Models\UserLabel;
-use App\Http\Models\UserLoginLog;
-use App\Http\Models\UserSubscribe;
-use App\Http\Models\UserTrafficDaily;
-use App\Http\Models\UserTrafficHourly;
 use App\Mail\newTicket;
 use App\Mail\replyTicket;
+use App\Models\Article;
+use App\Models\Coupon;
+use App\Models\Goods;
+use App\Models\Invite;
+use App\Models\Order;
+use App\Models\SsNode;
+use App\Models\SsNodeInfo;
+use App\Models\SsNodeLabel;
+use App\Models\SsNodePing;
+use App\Models\Ticket;
+use App\Models\TicketReply;
+use App\Models\User;
+use App\Models\UserLoginLog;
+use App\Models\UserSubscribe;
+use App\Models\UserTrafficDaily;
+use App\Models\UserTrafficHourly;
 use Auth;
 use Cache;
 use DB;
@@ -52,20 +51,21 @@ class UserController extends Controller {
 	}
 
 	public function index() {
-		$totalTransfer = Auth::user()->transfer_enable;
-		$usedTransfer = Auth::user()->u + Auth::user()->d;
+		$user = Auth::getUser();
+		$totalTransfer = $user->transfer_enable;
+		$usedTransfer = $user->u + $user->d;
 		$unusedTransfer = $totalTransfer - $usedTransfer > 0? $totalTransfer - $usedTransfer : 0;
-		$expireTime = Auth::user()->expire_time;
+		$expireTime = $user->expire_time;
 		$view['remainDays'] = $expireTime < date('Y-m-d')? -1 : (strtotime($expireTime) - strtotime(date('Y-m-d'))) / 86400;
-		$view['resetDays'] = Auth::user()->reset_time? round((strtotime(Auth::user()->reset_time) - strtotime(date('Y-m-d'))) / 86400) : 0;
+		$view['resetDays'] = $user->reset_time? round((strtotime($user->reset_time) - strtotime(date('Y-m-d'))) / 86400) : 0;
 		$view['unusedTransfer'] = $unusedTransfer;
 		$view['expireTime'] = $expireTime;
-		$view['banedTime'] = Auth::user()->ban_time? date('Y-m-d H:i:s', Auth::user()->ban_time) : 0;
+		$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)->orderBy('id', 'desc')->Paginate(1); // 公告
+		$view['noticeList'] = Article::type(2)->orderByDesc('id')->Paginate(1); // 公告
 		//流量异常判断
 		$hourlyTraffic = UserTrafficHourly::query()
-		                                  ->whereUserId(Auth::user()->id)
+		                                  ->whereUserId($user->id)
 		                                  ->whereNodeId(0)
 		                                  ->where('created_at', '>=', date('Y-m-d H:i:s', time() - 3900))
 		                                  ->sum('total');
@@ -76,10 +76,7 @@ class UserController extends Controller {
 		                                ->whereIsExpire(0)
 		                                ->where('origin_amount', '>', 0)
 		                                ->doesntExist();
-		$view['userLoginLog'] = UserLoginLog::query()
-		                                    ->whereUserId(Auth::user()->id)
-		                                    ->orderBy('id', 'desc')
-		                                    ->first(); // 近期登录日志
+		$view['userLoginLog'] = UserLoginLog::query()->whereUserId($user->id)->orderByDesc('id')->first(); // 近期登录日志
 
 		$dailyData = [];
 		$hourlyData = [];
@@ -87,10 +84,10 @@ class UserController extends Controller {
 		// 节点一个月内的流量
 		// TODO:有bug
 		$userTrafficDaily = UserTrafficDaily::query()
-		                                    ->whereUserId(Auth::user()->id)
+		                                    ->whereUserId($user->id)
 		                                    ->whereNodeId(0)
 		                                    ->where('created_at', '<=', date('Y-m-d', time()))
-		                                    ->orderBy('created_at', 'asc')
+		                                    ->orderBy('created_at')
 		                                    ->pluck('total')
 		                                    ->toArray();
 
@@ -105,10 +102,10 @@ class UserController extends Controller {
 
 		// 节点一天内的流量
 		$userTrafficHourly = UserTrafficHourly::query()
-		                                      ->whereUserId(Auth::user()->id)
+		                                      ->whereUserId($user->id)
 		                                      ->whereNodeId(0)
 		                                      ->where('created_at', '>=', date('Y-m-d', time()))
-		                                      ->orderBy('created_at', 'asc')
+		                                      ->orderBy('created_at')
 		                                      ->pluck('total')
 		                                      ->toArray();
 		$hourlyTotal = date('H');
@@ -141,30 +138,31 @@ class UserController extends Controller {
 
 	// 签到
 	public function checkIn() {
+		$user = Auth::getUser();
 		// 系统开启登录加积分功能才可以签到
 		if(!self::$systemConfig['is_checkin']){
 			return Response::json(['status' => 'fail', 'message' => '系统未开启签到功能']);
 		}
 
 		// 已签到过,验证是否有效
-		if(Cache::has('userCheckIn_'.Auth::user()->id)){
+		if(Cache::has('userCheckIn_'.$user->id)){
 			return Response::json(['status' => 'fail', 'message' => '已经签到过了,明天再来吧']);
 		}
 
 		$traffic = mt_rand((int) self::$systemConfig['min_rand_traffic'],
-		                   (int) self::$systemConfig['max_rand_traffic']) * 1048576;
+				(int) self::$systemConfig['max_rand_traffic']) * 1048576;
 		$ret = User::uid()->increment('transfer_enable', $traffic);
 		if(!$ret){
 			return Response::json(['status' => 'fail', 'message' => '签到失败,系统异常']);
 		}
 
 		// 写入用户流量变动记录
-		Helpers::addUserTrafficModifyLog(Auth::user()->id, 0, Auth::user()->transfer_enable,
-		                                 Auth::user()->transfer_enable + $traffic, '[签到]');
+		Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, $user->transfer_enable + $traffic,
+			'[签到]');
 
 		// 多久后可以再签到
 		$ttl = self::$systemConfig['traffic_limit_time']? self::$systemConfig['traffic_limit_time'] * 60 : 86400;
-		Cache::put('userCheckIn_'.Auth::user()->id, '1', $ttl);
+		Cache::put('userCheckIn_'.$user->id, '1', $ttl);
 
 		return Response::json(['status' => 'success', 'message' => '签到成功,系统送您 '.flowAutoShow($traffic).'流量']);
 	}
@@ -178,41 +176,36 @@ class UserController extends Controller {
 			$node = SsNode::query()->whereId($node_id)->first();
 			// 生成节点信息
 			$proxyType = $node->type == 1? ($node->compatible? 'SS' : 'SSR') : 'V2Ray';
-			$data = $this->getNodeInfo(Auth::user()->id, $node->id, $infoType != 'text'? 0 : 1);
+			$data = $this->getNodeInfo(Auth::id(), $node->id, $infoType != 'text'? 0 : 1);
 
 			return Response::json(['status' => 'success', 'data' => $data, 'title' => $proxyType]);
 		}else{
-			// 获取当前用户标签
-			$userLabelIds = UserLabel::uid()->pluck('label_id');
 			// 获取当前用户可用节点
 			$nodeList = SsNode::query()
-			                  ->selectRaw('ss_node.*')
-			                  ->leftJoin('ss_node_label', 'ss_node.id', '=', 'ss_node_label.node_id')
-			                  ->whereIn('ss_node_label.label_id', $userLabelIds)
-			                  ->where('ss_node.status', 1)
-			                  ->groupBy('ss_node.id')
-			                  ->orderBy('ss_node.sort', 'desc')
-			                  ->orderBy('ss_node.id', 'asc')
+			                  ->whereStatus(1)
+			                  ->where('level', '<=', Auth::getUser()->level)
+			                  ->orderByDesc('sort')
+			                  ->orderBy('id')
 			                  ->get();
 
 			foreach($nodeList as $node){
 				$node->ct = number_format(SsNodePing::query()->whereNodeId($node->id)->where('ct', '>', '0')->avg('ct'),
-				                          1, '.', '');
+					1, '.', '');
 				$node->cu = number_format(SsNodePing::query()->whereNodeId($node->id)->where('cu', '>', '0')->avg('cu'),
-				                          1, '.', '');
+					1, '.', '');
 				$node->cm = number_format(SsNodePing::query()->whereNodeId($node->id)->where('cm', '>', '0')->avg('cm'),
-				                          1, '.', '');
+					1, '.', '');
 				$node->hk = number_format(SsNodePing::query()->whereNodeId($node->id)->where('hk', '>', '0')->avg('hk'),
-				                          1, '.', '');
+					1, '.', '');
 
 				// 节点在线状态
 				$node->offline = SsNodeInfo::query()
 				                           ->whereNodeId($node->id)
 				                           ->where('log_time', '>=', strtotime("-10 minutes"))
-				                           ->orderBy('id', 'desc')
+				                           ->orderByDesc('id')
 				                           ->doesntExist();
 				// 节点标签
-				$node->labels = SsNodeLabel::query()->whereNodeId($node->id)->first();
+				$node->labels = SsNodeLabel::query()->whereNodeId($node->id)->get();
 			}
 			$view['nodeList'] = $nodeList?: [];
 		}
@@ -230,24 +223,25 @@ class UserController extends Controller {
 
 	// 修改个人资料
 	public function profile(Request $request) {
+		$user = Auth::getUser();
 		if($request->isMethod('POST')){
-			$old_password = trim($request->input('old_password'));
-			$new_password = trim($request->input('new_password'));
-			$username = trim($request->input('username'));
-			$wechat = trim($request->input('wechat'));
-			$qq = trim($request->input('qq'));
-			$passwd = trim($request->input('passwd'));
+			$old_password = $request->input('old_password');
+			$new_password = $request->input('new_password');
+			$username = $request->input('username');
+			$wechat = $request->input('wechat');
+			$qq = $request->input('qq');
+			$passwd = $request->input('passwd');
 
 			// 修改密码
 			if($old_password && $new_password){
-				if(!Hash::check($old_password, Auth::user()->password)){
+				if(!Hash::check($old_password, $user->password)){
 					return Redirect::to('profile#tab_1')->withErrors('旧密码错误,请重新输入');
-				}elseif(Hash::check($new_password, Auth::user()->password)){
+				}elseif(Hash::check($new_password, $user->password)){
 					return Redirect::to('profile#tab_1')->withErrors('新密码不可与旧密码一样,请重新输入');
 				}
 
 				// 演示环境禁止改管理员密码
-				if(env('APP_DEMO') && Auth::user()->id == 1){
+				if(env('APP_DEMO') && $user->id == 1){
 					return Redirect::to('profile#tab_1')->withErrors('演示环境禁止修改管理员密码');
 				}
 
@@ -285,23 +279,19 @@ class UserController extends Controller {
 
 	// 商品列表
 	public function services(Request $request) {
+		$user = Auth::getUser();
 		// 余额充值商品,只取10个
-		$view['chargeGoodsList'] = Goods::type(3)
-		                                ->whereStatus(1)
-		                                ->orderBy('price', 'asc')
-		                                ->orderBy('price', 'asc')
-		                                ->limit(10)
-		                                ->get();
+		$view['chargeGoodsList'] = Goods::type(3)->whereStatus(1)->orderBy('price')->limit(10)->get();
 		$view['goodsList'] = Goods::query()
 		                          ->whereStatus(1)
 		                          ->where('type', '<=', '2')
-		                          ->orderBy('type', 'desc')
-		                          ->orderBy('sort', 'desc')
+		                          ->orderByDesc('type')
+		                          ->orderByDesc('sort')
 		                          ->paginate(10)
 		                          ->appends($request->except('page'));
 		$renewOrder = Order::query()
 		                   ->with(['goods'])
-		                   ->whereUserId(Auth::user()->id)
+		                   ->whereUserId($user->id)
 		                   ->whereStatus(2)
 		                   ->whereIsExpire(0)
 		                   ->whereHas('goods', function($q) {
@@ -311,7 +301,7 @@ class UserController extends Controller {
 		$renewPrice = $renewOrder? Goods::query()->whereId($renewOrder->goods_id)->first() : 0;
 		$view['renewTraffic'] = $renewPrice? $renewPrice->renew : 0;
 		// 有重置日时按照重置日为标准,否者就以过期日为标准
-		$dataPlusDays = Auth::user()->reset_time? Auth::user()->reset_time : Auth::user()->expire_time;
+		$dataPlusDays = $user->reset_time? $user->reset_time : $user->expire_time;
 		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? round((strtotime($dataPlusDays) - strtotime(date('Y-m-d'))) / 86400) : 0;
 		$view['purchaseHTML'] = PaymentController::purchaseHTML();
 
@@ -320,21 +310,22 @@ class UserController extends Controller {
 
 	//重置流量
 	public function resetUserTraffic() {
+		$user = Auth::getUser();
 		$temp = Order::uid()->whereStatus(2)->whereIsExpire(0)->with(['goods'])->whereHas('goods', function($q) {
 			$q->whereType(2);
 		})->first();
 		$renewCost = Goods::query()->whereId($temp->goods_id)->first()->renew;
-		if(Auth::user()->balance < $renewCost){
+		if($user->credit < $renewCost){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '余额不足,请充值余额']);
 		}else{
 			User::uid()->update(['u' => 0, 'd' => 0]);
 
 			// 扣余额
-			User::query()->whereId(Auth::user()->id)->decrement('balance', $renewCost * 100);
+			User::query()->whereId($user->id)->decrement('credit', $renewCost * 100);
 
 			// 记录余额操作日志
-			Helpers::addUserBalanceLog(Auth::user()->id, '', Auth::user()->balance, Auth::user()->balance - $renewCost,
-			                           -1 * $renewCost, '用户自行重置流量');
+			Helpers::addUserCreditLog($user->id, '', $user->credit, $user->credit - $renewCost, -1 * $renewCost,
+				'用户自行重置流量');
 
 			return Response::json(['status' => 'success', 'data' => '', 'message' => '重置成功']);
 		}
@@ -342,7 +333,7 @@ class UserController extends Controller {
 
 	// 工单
 	public function ticketList(Request $request) {
-		$view['ticketList'] = Ticket::uid()->orderBy('id', 'desc')->paginate(10)->appends($request->except('page'));
+		$view['ticketList'] = Ticket::uid()->orderByDesc('id')->paginate(10)->appends($request->except('page'));
 
 		return Response::view('user.ticketList', $view);
 	}
@@ -351,7 +342,7 @@ class UserController extends Controller {
 	public function invoices(Request $request) {
 		$view['orderList'] = Order::uid()
 		                          ->with(['user', 'goods', 'coupon', 'payment'])
-		                          ->orderBy('oid', 'desc')
+		                          ->orderByDesc('oid')
 		                          ->paginate(10)
 		                          ->appends($request->except('page'));
 
@@ -390,7 +381,7 @@ class UserController extends Controller {
 		}
 
 		$obj = new Ticket();
-		$obj->user_id = Auth::user()->id;
+		$obj->user_id = Auth::id();
 		$obj->title = $title;
 		$obj->content = $content;
 		$obj->status = 0;
@@ -398,7 +389,7 @@ class UserController extends Controller {
 
 		if($obj->id){
 			$emailTitle = "新工单提醒";
-			$content = "标题:【".$title."】<br>用户:".Auth::user()->email."<br>内容:".$content;
+			$content = "标题:【".$title."】<br>用户:".Auth::getUser()->email."<br>内容:".$content;
 
 			// 发邮件通知管理员
 			if(self::$systemConfig['webmaster_email']){
@@ -435,7 +426,7 @@ class UserController extends Controller {
 
 			$obj = new TicketReply();
 			$obj->ticket_id = $id;
-			$obj->user_id = Auth::user()->id;
+			$obj->user_id = Auth::id();
 			$obj->content = $content;
 			$obj->save();
 
@@ -461,7 +452,7 @@ class UserController extends Controller {
 			}
 		}else{
 			$view['ticket'] = $ticket;
-			$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->orderBy('id', 'asc')->get();
+			$view['replyList'] = TicketReply::query()->whereTicketId($id)->with('user')->orderBy('id')->get();
 
 			return Response::view('user.replyTicket', $view);
 		}
@@ -485,10 +476,10 @@ class UserController extends Controller {
 	public function invite() {
 		if(Order::uid()->whereStatus(2)->whereIsExpire(0)->where('origin_amount', '>', 0)->doesntExist()){
 			return Response::view('auth.error',
-			                      ['message' => '本功能对非付费用户禁用!请 <a class="btn btn-sm btn-danger" href="/">返 回</a>']);
+				['message' => '本功能对非付费用户禁用!请 <a class="btn btn-sm btn-danger" href="/">返 回</a>']);
 		}
 
-		$view['num'] = Auth::user()->invite_num; // 还可以生成的邀请码数量
+		$view['num'] = Auth::getUser()->invite_num; // 还可以生成的邀请码数量
 		$view['inviteList'] = Invite::uid()->with(['generator', 'user'])->paginate(10); // 邀请码列表
 		$view['referral_traffic'] = flowAutoShow(self::$systemConfig['referral_traffic'] * 1048576);
 		$view['referral_percent'] = self::$systemConfig['referral_percent'];
@@ -498,12 +489,12 @@ class UserController extends Controller {
 
 	// 生成邀请码
 	public function makeInvite() {
-		if(Auth::user()->invite_num <= 0){
+		if(Auth::getUser()->invite_num <= 0){
 			return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:已无邀请码生成名额']);
 		}
 
 		$obj = new Invite();
-		$obj->uid = Auth::user()->id;
+		$obj->uid = Auth::id();
 		$obj->fuid = 0;
 		$obj->code = strtoupper(mb_substr(md5(microtime().makeRandStr()), 8, 12));
 		$obj->status = 0;
@@ -559,7 +550,7 @@ class UserController extends Controller {
 			return Redirect::to('services');
 		}
 		// 有重置日时按照重置日为标准,否者就以过期日为标准
-		$dataPlusDays = Auth::user()->reset_time? Auth::user()->reset_time : Auth::user()->expire_time;
+		$dataPlusDays = Auth::getUser()->reset_time?: Auth::getUser()->expire_time;
 		$view['dataPlusDays'] = $dataPlusDays > date('Y-m-d')? round((strtotime($dataPlusDays) - strtotime(date('Y-m-d'))) / 86400) : 0;
 		$view['activePlan'] = Order::uid()
 		                           ->with(['goods'])
@@ -577,7 +568,7 @@ class UserController extends Controller {
 
 	// 帮助中心
 	public function help() {
-		$view['articleList'] = Article::type(1)->orderBy('sort', 'desc')->orderBy('id', 'desc')->limit(10)->paginate(5);
+		$view['articleList'] = Article::type(1)->orderByDesc('sort')->orderByDesc('id')->limit(10)->paginate(5);
 
 		//付费用户判断
 		$view['not_paying_user'] = Order::uid()
@@ -589,7 +580,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::user()->id)->first();
+		$subscribe = UserSubscribe::query()->whereUserId(Auth::id())->first();
 		$view['subscribe_status'] = $subscribe->status;
 		$subscribe_link = (self::$systemConfig['subscribe_domain']? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url']).'/s/'.$subscribe->code;
 		$view['link'] = $subscribe_link;
@@ -649,11 +640,7 @@ class UserController extends Controller {
 		], ['coupon_sn.required' => '券码不能为空', 'coupon_sn.exists' => '该券不可用']);
 
 		if($validator->fails()){
-			return Response::json([
-				                      'status'  => 'fail',
-				                      'data'    => '',
-				                      'message' => $validator->getMessageBag()->first()
-			                      ]);
+			return Response::json(['status' => 'fail', 'message' => $validator->getMessageBag()->first()]);
 		}
 
 		$coupon = Coupon::query()->whereSn($request->input('coupon_sn'))->first();
@@ -661,16 +648,15 @@ class UserController extends Controller {
 		try{
 			DB::beginTransaction();
 			// 写入日志
-			Helpers::addUserBalanceLog(Auth::user()->id, 0, Auth::user()->balance,
-			                           Auth::user()->balance + $coupon->amount, $coupon->amount,
-			                           '用户手动充值 - [充值券:'.$request->input('coupon_sn').']');
+			$user = Auth::getUser();
+			Helpers::addUserCreditLog($user->id, 0, $user->credit, $user->credit + $coupon->amount, $coupon->amount,
+				'用户手动充值 - [充值券:'.$request->input('coupon_sn').']');
 
 			// 余额充值
-			User::uid()->increment('balance', $coupon->amount * 100);
+			User::uid()->increment('credit', $coupon->amount * 100);
 
 			// 更改卡券状态
-			$coupon->status = 1;
-			$coupon->save();
+			Coupon::query()->whereId($coupon->id)->update(['status' => 1]);
 
 			// 写入卡券日志
 			Helpers::addCouponLog($coupon->id, 0, 0, '账户余额充值使用');

+ 1 - 1
app/Http/Middleware/Affiliate.php

@@ -16,7 +16,7 @@ class Affiliate {
 	 * @return mixed
 	 */
 	public function handle($request, Closure $next) {
-		$aff = trim($request->input('aff', 0));
+		$aff = $request->input('aff', 0);
 		if($aff){
 			Cookie::queue('register_aff', $aff, 129600);
 		}

+ 1 - 4
app/Http/Middleware/TrimStrings.php

@@ -10,8 +10,5 @@ class TrimStrings extends Middleware {
 	 *
 	 * @var array
 	 */
-	protected $except = [
-		'password',
-		'password_confirmation',
-	];
+	protected $except = [];
 }

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

@@ -21,25 +21,25 @@ class WebApi extends Middleware {
 		// 未提供 key
 		if($key === null){
 			return Response::json([
-				                      'ret'  => 0,
-				                      'data' => 'Your key is null'
-			                      ]);
+				'ret'  => 0,
+				'data' => 'Your key is null'
+			]);
 		}
 
 		if(!in_array($key, env('WEB_API_KEY'))){
 			// key 不存在
 			return Response::json([
-				                      'ret'  => 0,
-				                      'data' => 'Token is invalid'
-			                      ]);
+				'ret'  => 0,
+				'data' => 'Token is invalid'
+			]);
 		}
 
 		if(env('WEB_API') == false){
 			// 主站不提供 Webapi
 			return Response::json([
-				                      'ret'  => 0,
-				                      'data' => 'We regret this service is temporarily unavailable'
-			                      ]);
+				'ret'  => 0,
+				'data' => 'We regret this service is temporarily unavailable'
+			]);
 		}
 
 		return $next($request);

+ 1 - 1
app/Http/Middleware/isAdmin.php

@@ -17,7 +17,7 @@ class isAdmin {
 	 * @return mixed
 	 */
 	public function handle($request, Closure $next) {
-		if(!Auth::user()->is_admin){
+		if(!Auth::getUser()->is_admin){
 			return Redirect::to('/');
 		}
 

+ 0 - 63
app/Http/Models/Device.php

@@ -1,63 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 订阅设备列表
- *
- * @property-read mixed $platform_label
- * @property-read mixed $type_label
- * @method static Builder|Device newModelQuery()
- * @method static Builder|Device newQuery()
- * @method static Builder|Device query()
- * @mixin Eloquent
- */
-class Device extends Model {
-	public $timestamps = false;
-	protected $table = 'device';
-	protected $primaryKey = 'id';
-
-	function getTypeLabelAttribute() {
-		switch($this->attributes['type']){
-			case 1:
-				$type_label = '<span class="label label-danger"> Shadowsocks(R) </span>';
-				break;
-			case 2:
-				$type_label = '<span class="label label-danger"> V2Ray </span>';
-				break;
-			default:
-				$type_label = '<span class="label label-default"> 其他 </span>';
-		}
-
-		return $type_label;
-	}
-
-	function getPlatformLabelAttribute() {
-		switch($this->attributes['platform']){
-			case 1:
-				$platform_label = '<i class="fa fa-apple"></i> iOS';
-				break;
-			case 2:
-				$platform_label = '<i class="fa fa-android"></i> Android';
-				break;
-			case 3:
-				$platform_label = '<i class="fa fa-apple"></i> Mac';
-				break;
-			case 4:
-				$platform_label = '<i class="fa fa-windows"></i> Windows';
-				break;
-			case 5:
-				$platform_label = '<i class="fa fa-linux"></i> Linux';
-				break;
-			case 0:
-			default:
-				$platform_label = '其他';
-		}
-
-		return $platform_label;
-	}
-}

+ 0 - 26
app/Http/Models/GoodsLabel.php

@@ -1,26 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 商品标签
- *
- * @property-read Goods|null $goods
- * @method static Builder|GoodsLabel newModelQuery()
- * @method static Builder|GoodsLabel newQuery()
- * @method static Builder|GoodsLabel query()
- * @mixin Eloquent
- */
-class GoodsLabel extends Model {
-	public $timestamps = false;
-	protected $table = 'goods_label';
-	protected $primaryKey = 'id';
-
-	function goods() {
-		return $this->hasOne(Goods::class, 'id', 'goods_id');
-	}
-}

+ 0 - 30
app/Http/Models/SsGroup.php

@@ -1,30 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
-
-/**
- * SS节点分组
- *
- * @property int         $id
- * @property string      $name 分组名称
- * @property Carbon|null $created_at
- * @property Carbon|null $updated_at
- * @method static Builder|SsGroup newModelQuery()
- * @method static Builder|SsGroup newQuery()
- * @method static Builder|SsGroup query()
- * @method static Builder|SsGroup whereCreatedAt($value)
- * @method static Builder|SsGroup whereId($value)
- * @method static Builder|SsGroup whereName($value)
- * @method static Builder|SsGroup whereUpdatedAt($value)
- * @mixin Eloquent
- */
-class SsGroup extends Model {
-	protected $table = 'ss_group';
-	protected $primaryKey = 'id';
-
-}

+ 0 - 28
app/Http/Models/SsGroupNode.php

@@ -1,28 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * SS分组和节点关联表
- *
- * @property int $id
- * @property int $group_id 分组ID
- * @property int $node_id  节点ID
- * @method static Builder|SsGroupNode newModelQuery()
- * @method static Builder|SsGroupNode newQuery()
- * @method static Builder|SsGroupNode query()
- * @method static Builder|SsGroupNode whereGroupId($value)
- * @method static Builder|SsGroupNode whereId($value)
- * @method static Builder|SsGroupNode whereNodeId($value)
- * @mixin Eloquent
- */
-class SsGroupNode extends Model {
-	public $timestamps = false;
-	protected $table = 'ss_group_node';
-	protected $primaryKey = 'id';
-
-}

+ 0 - 120
app/Http/Models/SsNode.php

@@ -1,120 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Collection;
-use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
-
-/**
- * SS节点信息
- *
- * @property int                           $id
- * @property int                           $type            服务类型:1-ShadowsocksR、2-V2ray
- * @property string                        $name            名称
- * @property int                           $group_id        所属分组
- * @property string|null                   $country_code    国家代码
- * @property string|null                   $server          服务器域名地址
- * @property string|null                   $ip              服务器IPV4地址
- * @property string|null                   $ipv6            服务器IPV6地址
- * @property string|null                   $relay_server    中转地址
- * @property int|null                      $relay_port      中转端口
- * @property int                           $level           等级:0-无等级,全部可见
- * @property int                           $speed_limit     节点限速,为0表示不限速,单位Byte
- * @property int                           $client_limit    设备数限制
- * @property string|null                   $description     节点简单描述
- * @property string                        $method          加密方式
- * @property string                        $protocol        协议
- * @property string|null                   $protocol_param  协议参数
- * @property string                        $obfs            混淆
- * @property string|null                   $obfs_param      混淆参数
- * @property float                         $traffic_rate    流量比率
- * @property int                           $is_subscribe    是否允许用户订阅该节点:0-否、1-是
- * @property int                           $is_ddns         是否使用DDNS:0-否、1-是
- * @property int                           $is_relay        是否中转节点:0-否、1-是
- * @property int                           $is_udp          是否启用UDP:0-不启用、1-启用
- * @property int                           $ssh_port        SSH端口
- * @property int                           $detectiontype   节点检测: 0-关闭、1-只检测TCP、2-只检测ICMP、3-检测全部
- * @property int                           $compatible      兼容SS
- * @property int                           $single          启用单端口功能:0-否、1-是
- * @property int|null                      $port            单端口的端口号
- * @property string|null                   $passwd          单端口的连接密码
- * @property int                           $sort            排序值,值越大越靠前显示
- * @property int                           $status          状态:0-维护、1-正常
- * @property int                           $v2_alter_id     V2Ray额外ID
- * @property int                           $v2_connect_port V2Ray连接端口
- * @property int                           $v2_port         V2Ray服务端口
- * @property string                        $v2_method       V2Ray加密方式
- * @property string                        $v2_net          V2Ray传输协议
- * @property string                        $v2_type         V2Ray伪装类型
- * @property string                        $v2_host         V2Ray伪装的域名
- * @property string                        $v2_path         V2Ray的WS/H2路径
- * @property int                           $v2_connect_tls  V2Ray连接TLS:0-未开启、1-开启
- * @property int                           $v2_tls          V2Ray后端TLS:0-未开启、1-开启
- * @property string|null                   $tls_provider    V2Ray节点的TLS提供商授权信息
- * @property int                           $trojan_port     Trojan连接端口
- * @property Carbon                        $created_at
- * @property Carbon                        $updated_at
- * @property-read Collection|SsNodeLabel[] $label
- * @property-read int|null                 $label_count
- * @method static Builder|SsNode newModelQuery()
- * @method static Builder|SsNode newQuery()
- * @method static Builder|SsNode query()
- * @method static Builder|SsNode whereClientLimit($value)
- * @method static Builder|SsNode whereCompatible($value)
- * @method static Builder|SsNode whereCountryCode($value)
- * @method static Builder|SsNode whereCreatedAt($value)
- * @method static Builder|SsNode whereDescription($value)
- * @method static Builder|SsNode whereDetectiontype($value)
- * @method static Builder|SsNode whereGroupId($value)
- * @method static Builder|SsNode whereId($value)
- * @method static Builder|SsNode whereIp($value)
- * @method static Builder|SsNode whereIpv6($value)
- * @method static Builder|SsNode whereIsDdns($value)
- * @method static Builder|SsNode whereIsRelay($value)
- * @method static Builder|SsNode whereIsSubscribe($value)
- * @method static Builder|SsNode whereIsUdp($value)
- * @method static Builder|SsNode whereLevel($value)
- * @method static Builder|SsNode whereMethod($value)
- * @method static Builder|SsNode whereName($value)
- * @method static Builder|SsNode whereObfs($value)
- * @method static Builder|SsNode whereObfsParam($value)
- * @method static Builder|SsNode wherePasswd($value)
- * @method static Builder|SsNode wherePort($value)
- * @method static Builder|SsNode whereProtocol($value)
- * @method static Builder|SsNode whereProtocolParam($value)
- * @method static Builder|SsNode whereRelayPort($value)
- * @method static Builder|SsNode whereRelayServer($value)
- * @method static Builder|SsNode whereServer($value)
- * @method static Builder|SsNode whereSingle($value)
- * @method static Builder|SsNode whereSort($value)
- * @method static Builder|SsNode whereSpeedLimit($value)
- * @method static Builder|SsNode whereSshPort($value)
- * @method static Builder|SsNode whereStatus($value)
- * @method static Builder|SsNode whereTlsProvider($value)
- * @method static Builder|SsNode whereTrafficRate($value)
- * @method static Builder|SsNode whereTrojanPort($value)
- * @method static Builder|SsNode whereType($value)
- * @method static Builder|SsNode whereUpdatedAt($value)
- * @method static Builder|SsNode whereV2AlterId($value)
- * @method static Builder|SsNode whereV2ConnectPort($value)
- * @method static Builder|SsNode whereV2ConnectTls($value)
- * @method static Builder|SsNode whereV2Host($value)
- * @method static Builder|SsNode whereV2Method($value)
- * @method static Builder|SsNode whereV2Net($value)
- * @method static Builder|SsNode whereV2Path($value)
- * @method static Builder|SsNode whereV2Port($value)
- * @method static Builder|SsNode whereV2Tls($value)
- * @method static Builder|SsNode whereV2Type($value)
- * @mixin Eloquent
- */
-class SsNode extends Model {
-	protected $table = 'ss_node';
-	protected $primaryKey = 'id';
-
-	function label() {
-		return $this->hasMany(SsNodeLabel::class, 'node_id', 'id');
-	}
-}

+ 0 - 68
app/Http/Models/UserBalanceLog.php

@@ -1,68 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 账号余额操作日志
- * Class UserBalanceLog
- *
- * @package App\Http\Models
- * @mixin Eloquent
- * @property int         $id
- * @property int         $user_id    账号ID
- * @property int         $order_id   订单ID
- * @property int         $before     发生前余额,单位分
- * @property int         $after      发生后金额,单位分
- * @property int         $amount     发生金额,单位分
- * @property string|null $desc       操作描述
- * @property string|null $created_at 创建时间
- * @property-read User   $user
- * @method static Builder|UserBalanceLog newModelQuery()
- * @method static Builder|UserBalanceLog newQuery()
- * @method static Builder|UserBalanceLog query()
- * @method static Builder|UserBalanceLog whereAfter($value)
- * @method static Builder|UserBalanceLog whereAmount($value)
- * @method static Builder|UserBalanceLog whereBefore($value)
- * @method static Builder|UserBalanceLog whereCreatedAt($value)
- * @method static Builder|UserBalanceLog whereDesc($value)
- * @method static Builder|UserBalanceLog whereId($value)
- * @method static Builder|UserBalanceLog whereOrderId($value)
- * @method static Builder|UserBalanceLog whereUserId($value)
- */
-class UserBalanceLog extends Model {
-	public $timestamps = false;
-	protected $table = 'user_balance_log';
-	protected $primaryKey = 'id';
-
-	function user() {
-		return $this->hasOne(User::class, 'id', 'user_id');
-	}
-
-	function getBeforeAttribute($value) {
-		return $value / 100;
-	}
-
-	function setBeforeAttribute($value) {
-		return $this->attributes['before'] = $value * 100;
-	}
-
-	function getAfterAttribute($value) {
-		return $value / 100;
-	}
-
-	function setAfterAttribute($value) {
-		return $this->attributes['after'] = $value * 100;
-	}
-
-	function getAmountAttribute($value) {
-		return $value / 100;
-	}
-
-	function setAmountAttribute($value) {
-		return $this->attributes['amount'] = $value * 100;
-	}
-}

+ 0 - 32
app/Http/Models/UserLabel.php

@@ -1,32 +0,0 @@
-<?php
-
-namespace App\Http\Models;
-
-use Auth;
-use Eloquent;
-use Illuminate\Database\Eloquent\Builder;
-use Illuminate\Database\Eloquent\Model;
-
-/**
- * 用户标签
- *
- * @property-read User|null $user
- * @method static Builder|UserLabel newModelQuery()
- * @method static Builder|UserLabel newQuery()
- * @method static Builder|UserLabel query()
- * @method static Builder|UserLabel uid()
- * @mixin Eloquent
- */
-class UserLabel extends Model {
-	public $timestamps = false;
-	protected $table = 'user_label';
-	protected $primaryKey = 'id';
-
-	function scopeUid($query) {
-		return $query->whereUserId(Auth::user()->id);
-	}
-
-	function user() {
-		return $this->hasOne(User::class, 'id', 'user_id');
-	}
-}

+ 3 - 3
app/Mail/activeUser.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class activeUser extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.activeUser')->subject('激活账号')->with([
-			                                                               'activeUserUrl' => $this->activeUserUrl
-		                                                               ]);
+			'activeUserUrl' => $this->activeUserUrl
+		]);
 	}
 
 	// 发件失败处理

+ 4 - 4
app/Mail/closeTicket.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -24,9 +24,9 @@ class closeTicket extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.closeTicket')->subject('工单关闭提醒')->with([
-			                                                                  'title'   => $this->title,
-			                                                                  'content' => $this->content
-		                                                                  ]);
+			'title'   => $this->title,
+			'content' => $this->content
+		]);
 	}
 
 	// 发件失败处理

+ 4 - 4
app/Mail/newTicket.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -24,9 +24,9 @@ class newTicket extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.newTicket')->subject('新工单提醒')->with([
-			                                                               'title'   => $this->title,
-			                                                               'content' => $this->content
-		                                                               ]);
+			'title'   => $this->title,
+			'content' => $this->content
+		]);
 	}
 
 	// 发件失败处理

+ 3 - 5
app/Mail/nodeCrashWarning.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -21,10 +21,8 @@ class nodeCrashWarning extends Mailable implements ShouldQueue {
 	public function build() {
 
 		return $this->view('emails.nodeCrashWarning')->subject('节点阻断警告')->with([
-			                                                                       'content' => NotificationLog::query()
-			                                                                                                   ->whereId($this->id)
-			                                                                                                   ->first()->content
-		                                                                       ]);
+			'content' => NotificationLog::query()->whereId($this->id)->first()->content
+		]);
 	}
 
 	// 发件失败处理

+ 4 - 4
app/Mail/replyTicket.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -24,9 +24,9 @@ class replyTicket extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.replyTicket')->subject('工单回复提醒')->with([
-			                                                                  'title'   => $this->title,
-			                                                                  'content' => $this->content
-		                                                                  ]);
+			'title'   => $this->title,
+			'content' => $this->content
+		]);
 	}
 
 	// 发件失败处理

+ 3 - 3
app/Mail/resetPassword.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class resetPassword extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.resetPassword')->subject('重置密码')->with([
-			                                                                  'resetPasswordUrl' => $this->resetPasswordUrl
-		                                                                  ]);
+			'resetPasswordUrl' => $this->resetPasswordUrl
+		]);
 	}
 
 	// 发件失败处理

+ 3 - 3
app/Mail/sendUserInfo.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class sendUserInfo extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.sendUserInfo')->subject('发送账号信息')->with([
-			                                                                   'content' => $this->content
-		                                                                   ]);
+			'content' => $this->content
+		]);
 	}
 
 	// 发件失败处理

+ 3 - 3
app/Mail/sendVerifyCode.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class sendVerifyCode extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.sendVerifyCode')->subject('发送注册验证码')->with([
-			                                                                      'code' => $this->code
-		                                                                      ]);
+			'code' => $this->code
+		]);
 	}
 
 	// 发件失败处理

+ 3 - 3
app/Mail/userExpireWarning.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class userExpireWarning extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.userExpireWarning')->subject('账号过期提醒')->with([
-			                                                                        'lastCanUseDays' => $this->lastCanUseDays
-		                                                                        ]);
+			'lastCanUseDays' => $this->lastCanUseDays
+		]);
 	}
 
 	// 发件失败处理

+ 1 - 1
app/Mail/userExpireWarningToday.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;

+ 3 - 3
app/Mail/userTrafficWarning.php

@@ -2,7 +2,7 @@
 
 namespace App\Mail;
 
-use App\Http\Models\NotificationLog;
+use App\Models\NotificationLog;
 use Exception;
 use Illuminate\Bus\Queueable;
 use Illuminate\Contracts\Queue\ShouldQueue;
@@ -22,8 +22,8 @@ class userTrafficWarning extends Mailable implements ShouldQueue {
 
 	public function build() {
 		return $this->view('emails.userTrafficWarning')->subject('流量警告')->with([
-			                                                                       'usedPercent' => $this->usedPercent
-		                                                                       ]);
+			'usedPercent' => $this->usedPercent
+		]);
 	}
 
 	// 发件失败处理

+ 13 - 15
app/Http/Models/Article.php → app/Models/Article.php

@@ -1,27 +1,25 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Database\Query\Builder;
-use Illuminate\Support\Carbon;
 
 /**
  * 文章
  *
- * @property int         $id
- * @property string      $title      标题
- * @property string|null $author     作者
- * @property string|null $summary    简介
- * @property string|null $logo       LOGO
- * @property string|null $content    内容
- * @property int|null    $type       类型:1-文章、2-站内公告、3-站外公告
- * @property int         $sort       排序
- * @property Carbon|null $created_at 创建时间
- * @property Carbon|null $updated_at 最后更新时间
- * @property Carbon|null $deleted_at 删除时间
+ * @property int                             $id
+ * @property int|null                        $type       类型:1-文章、2-站内公告、3-站外公告
+ * @property string                          $title      标题
+ * @property string|null                     $author     作者
+ * @property string|null                     $summary    简介
+ * @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|null $deleted_at 删除时间
  * @method static \Illuminate\Database\Eloquent\Builder|Article newModelQuery()
  * @method static \Illuminate\Database\Eloquent\Builder|Article newQuery()
  * @method static Builder|Article onlyTrashed()
@@ -40,7 +38,7 @@ use Illuminate\Support\Carbon;
  * @method static \Illuminate\Database\Eloquent\Builder|Article whereUpdatedAt($value)
  * @method static Builder|Article withTrashed()
  * @method static Builder|Article withoutTrashed()
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Article extends Model {
 	use SoftDeletes;

+ 2 - 3
app/Http/Models/Config.php → app/Models/Config.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -18,7 +17,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|Config whereId($value)
  * @method static Builder|Config whereName($value)
  * @method static Builder|Config whereValue($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Config extends Model {
 	public $timestamps = false;

+ 2 - 3
app/Http/Models/Country.php → app/Models/Country.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -18,7 +17,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|Country whereCode($value)
  * @method static Builder|Country whereId($value)
  * @method static Builder|Country whereName($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Country extends Model {
 	public $timestamps = false;

+ 18 - 20
app/Http/Models/Coupon.php → app/Models/Coupon.php

@@ -1,31 +1,29 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Database\Query\Builder;
-use Illuminate\Support\Carbon;
 
 /**
  * 优惠券
  *
- * @property int         $id
- * @property string      $name            优惠券名称
- * @property string      $logo            优惠券LOGO
- * @property string      $sn              优惠券码
- * @property int         $type            类型:1-抵用券、2-折扣券、3-充值券
- * @property int         $usage           用途:0-可重复使用、1-仅限一次性使用
- * @property int         $amount          金额,单位分
- * @property float       $discount        折扣
- * @property int         $rule            使用限制,单位分
- * @property int         $available_start 有效期开始
- * @property int         $available_end   有效期结束
- * @property int         $status          状态:0-未使用、1-已使用、2-已失效
- * @property Carbon|null $created_at      创建时间
- * @property Carbon|null $updated_at      最后更新时间
- * @property Carbon|null $deleted_at      删除时间
+ * @property int                             $id
+ * @property string                          $name            优惠券名称
+ * @property string                          $logo            优惠券LOGO
+ * @property string                          $sn              优惠券码
+ * @property int                             $type            类型:1-抵用券、2-折扣券、3-充值券
+ * @property int                             $usage_count     可使用次数
+ * @property int                             $amount          金额,单位分
+ * @property float                           $discount        折扣
+ * @property int                             $rule            使用限制,单位分
+ * @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|null $deleted_at      删除时间
  * @method static \Illuminate\Database\Eloquent\Builder|Coupon newModelQuery()
  * @method static \Illuminate\Database\Eloquent\Builder|Coupon newQuery()
  * @method static Builder|Coupon onlyTrashed()
@@ -45,10 +43,10 @@ use Illuminate\Support\Carbon;
  * @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 whereUsage($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|Coupon whereUsageCount($value)
  * @method static Builder|Coupon withTrashed()
  * @method static Builder|Coupon withoutTrashed()
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Coupon extends Model {
 	use SoftDeletes;

+ 9 - 11
app/Http/Models/CouponLog.php → app/Models/CouponLog.php

@@ -1,22 +1,20 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 优惠券使用日志
  *
- * @property int         $id
- * @property int         $coupon_id   优惠券ID
- * @property int         $goods_id    商品ID
- * @property int         $order_id    订单ID
- * @property string      $description 备注
- * @property Carbon|null $created_at  创建时间
- * @property 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|null $created_at  创建时间
+ * @property \Illuminate\Support\Carbon|null $updated_at  最后更新时间
  * @method static Builder|CouponLog newModelQuery()
  * @method static Builder|CouponLog newQuery()
  * @method static Builder|CouponLog query()
@@ -27,7 +25,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|CouponLog whereId($value)
  * @method static Builder|CouponLog whereOrderId($value)
  * @method static Builder|CouponLog whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class CouponLog extends Model {
 	protected $table = 'coupon_log';

+ 27 - 36
app/Http/Models/Goods.php → app/Models/Goods.php

@@ -1,41 +1,36 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
-use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Database\Query\Builder;
-use Illuminate\Support\Carbon;
 
 /**
  * 商品
  *
- * @property int                          $id
- * @property string                       $sku        商品服务SKU
- * @property string                       $name       商品名称
- * @property string                       $logo       商品图片地址
- * @property int                          $traffic    商品内含多少流量,单位MiB
- * @property int                          $type       商品类型:1-流量包、2-套餐
- * @property int                          $price      售价,单位分
- * @property int                          $renew      流量重置价格,单位分
- * @property int                          $period     流量自动重置周期
- * @property string|null                  $info       商品信息
- * @property string|null                  $desc       商品描述
- * @property int                          $days       有效期
- * @property int                          $invite_num 赠送邀请码数
- * @property int                          $limit_num  限购数量,默认为0不限购
- * @property string                       $color      商品颜色
- * @property int                          $sort       排序
- * @property int                          $is_hot     是否热销:0-否、1-是
- * @property int                          $status     状态:0-下架、1-上架
- * @property Carbon|null                  $created_at 创建时间
- * @property Carbon|null                  $updated_at 最后更新时间
- * @property Carbon|null                  $deleted_at 删除时间
- * @property-read mixed                   $traffic_label
- * @property-read Collection|GoodsLabel[] $label
- * @property-read int|null                $label_count
+ * @property int                             $id
+ * @property string                          $name        商品名称
+ * @property string|null                     $logo        商品图片地址
+ * @property int                             $traffic     商品内含多少流量,单位MiB
+ * @property int                             $type        商品类型:1-流量包、2-套餐
+ * @property int                             $price       售价,单位分
+ * @property int                             $level       购买后给用户授权的等级
+ * @property int                             $renew       流量重置价格,单位分
+ * @property int|null                        $period      流量自动重置周期
+ * @property string|null                     $info        商品信息
+ * @property string|null                     $description 商品描述
+ * @property int                             $days        有效期
+ * @property int                             $invite_num  赠送邀请码数
+ * @property int                             $limit_num   限购数量,默认为0不限购
+ * @property string                          $color       商品颜色
+ * @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|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 onlyTrashed()
@@ -45,18 +40,18 @@ use Illuminate\Support\Carbon;
  * @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 whereDesc($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 whereSku($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)
@@ -64,7 +59,7 @@ use Illuminate\Support\Carbon;
  * @method static \Illuminate\Database\Eloquent\Builder|Goods whereUpdatedAt($value)
  * @method static Builder|Goods withTrashed()
  * @method static Builder|Goods withoutTrashed()
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Goods extends Model {
 	use SoftDeletes;
@@ -74,11 +69,7 @@ class Goods extends Model {
 	protected $dates = ['deleted_at'];
 
 	function scopeType($query, $type) {
-		return $query->whereType($type)->whereStatus(1)->orderBy('sort', 'desc');
-	}
-
-	function label() {
-		return $this->hasMany(GoodsLabel::class, 'goods_id', 'id');
+		return $query->whereType($type)->whereStatus(1)->orderByDesc('sort');
 	}
 
 	function getPriceAttribute($value) {

+ 2 - 2
app/Http/Models/Invite.php → app/Models/Invite.php

@@ -1,6 +1,6 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
 use Auth;
 use Eloquent;
@@ -50,7 +50,7 @@ class Invite extends Model {
 	protected $dates = ['deleted_at'];
 
 	function scopeUid($query) {
-		return $query->whereUid(Auth::user()->id);
+		return $query->whereUid(Auth::id());
 	}
 
 	function generator() {

+ 2 - 3
app/Http/Models/Label.php → app/Models/Label.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -18,7 +17,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|Label whereId($value)
  * @method static Builder|Label whereName($value)
  * @method static Builder|Label whereSort($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Label extends Model {
 	public $timestamps = false;

+ 9 - 4
app/Http/Models/Level.php → app/Models/Level.php

@@ -1,21 +1,26 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
 /**
  * 等级
  *
+ * @property int    $id
+ * @property int    $level 等级
+ * @property string $name  等级名称
  * @method static Builder|Level newModelQuery()
  * @method static Builder|Level newQuery()
  * @method static Builder|Level query()
- * @mixin Eloquent
+ * @method static Builder|Level whereId($value)
+ * @method static Builder|Level whereLevel($value)
+ * @method static Builder|Level whereName($value)
+ * @mixin \Eloquent
  */
 class Level extends Model {
 	public $timestamps = false;
 	protected $table = 'level';
 	protected $primaryKey = 'id';
-}
+}

+ 12 - 14
app/Http/Models/Marketing.php → app/Models/Marketing.php

@@ -1,25 +1,23 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 营销
  *
- * @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 Carbon      $created_at
- * @property Carbon      $updated_at
- * @property-read mixed  $status_label
+ * @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-read mixed                 $status_label
  * @method static Builder|Marketing newModelQuery()
  * @method static Builder|Marketing newQuery()
  * @method static Builder|Marketing query()
@@ -32,7 +30,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|Marketing whereTitle($value)
  * @method static Builder|Marketing whereType($value)
  * @method static Builder|Marketing whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Marketing extends Model {
 	protected $table = 'marketing';

+ 31 - 0
app/Models/NodeRule.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+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
+ * @method static Builder|NodeRule newModelQuery()
+ * @method static Builder|NodeRule newQuery()
+ * @method static Builder|NodeRule query()
+ * @method static Builder|NodeRule whereCreatedAt($value)
+ * @method static Builder|NodeRule whereId($value)
+ * @method static Builder|NodeRule whereIsBlack($value)
+ * @method static Builder|NodeRule whereNodeId($value)
+ * @method static Builder|NodeRule whereRuleId($value)
+ * @method static Builder|NodeRule whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class NodeRule extends Model {
+	protected $table = 'node_rule';
+	protected $primaryKey = 'id';
+}

+ 11 - 14
app/Http/Models/NotificationLog.php → app/Models/NotificationLog.php

@@ -1,24 +1,22 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 推送通知日志
  *
- * @property int         $id
- * @property int         $type       类型:1-邮件、2-ServerChan、3-Bark、4-Telegram
- * @property string      $address    收信地址
- * @property string|null $title      邮件标题
- * @property string|null $content    邮件内容
- * @property int         $status     状态:-1发送失败、0-等待发送、1-发送成功
- * @property string|null $error      发送失败抛出的异常信息
- * @property Carbon|null $created_at 创建时间
- * @property 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|null $created_at 创建时间
+ * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
  * @method static Builder|NotificationLog newModelQuery()
  * @method static Builder|NotificationLog newQuery()
  * @method static Builder|NotificationLog query()
@@ -31,10 +29,9 @@ use Illuminate\Support\Carbon;
  * @method static Builder|NotificationLog whereTitle($value)
  * @method static Builder|NotificationLog whereType($value)
  * @method static Builder|NotificationLog whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class NotificationLog extends Model {
 	protected $table = 'notification_log';
 	protected $primaryKey = 'id';
-
 }

+ 26 - 25
app/Http/Models/Order.php → app/Models/Order.php

@@ -1,35 +1,33 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
 use Auth;
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 订单
  *
- * @property int               $oid
- * @property string            $order_sn      订单编号
- * @property int               $user_id       操作人
- * @property int               $goods_id      商品ID
- * @property int               $coupon_id     优惠券ID
- * @property int               $origin_amount 订单原始总价,单位分
- * @property int               $amount        订单总价,单位分
- * @property string|null       $expire_at     过期时间
- * @property int               $is_expire     是否已过期:0-未过期、1-已过期
- * @property string            $pay_way       支付方式:balance、f2fpay、codepay、payjs、bitpayx等
- * @property int               $status        订单状态:-1-已关闭、0-待支付、1-已支付待确认、2-已完成
- * @property Carbon|null       $created_at    创建时间
- * @property Carbon|null       $updated_at    最后一次更新时间
- * @property-read Coupon|null  $coupon
- * @property-read mixed        $pay_way_label
- * @property-read mixed        $status_label
- * @property-read Goods|null   $goods
- * @property-read Payment|null $payment
- * @property-read User|null    $user
+ * @property int                             $oid
+ * @property string                          $order_sn      订单编号
+ * @property int                             $user_id       操作人
+ * @property int                             $goods_id      商品ID
+ * @property int                             $coupon_id     优惠券ID
+ * @property int                             $origin_amount 订单原始总价,单位分
+ * @property int                             $amount        订单总价,单位分
+ * @property string|null                     $expire_at     过期时间
+ * @property int                             $is_expire     是否已过期:0-未过期、1-已过期
+ * @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-read \App\Models\Coupon|null    $coupon
+ * @property-read mixed                      $pay_way_label
+ * @property-read mixed                      $status_label
+ * @property-read \App\Models\Goods|null     $goods
+ * @property-read \App\Models\Payment|null   $payment
+ * @property-read \App\Models\User|null      $user
  * @method static Builder|Order newModelQuery()
  * @method static Builder|Order newQuery()
  * @method static Builder|Order query()
@@ -47,7 +45,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|Order whereStatus($value)
  * @method static Builder|Order whereUpdatedAt($value)
  * @method static Builder|Order whereUserId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Order extends Model {
 	protected $table = 'order';
@@ -55,7 +53,7 @@ class Order extends Model {
 	protected $appends = ['status_label'];
 
 	function scopeUid($query) {
-		return $query->whereUserId(Auth::user()->id);
+		return $query->whereUserId(Auth::id());
 	}
 
 	function user() {
@@ -116,7 +114,7 @@ class Order extends Model {
 	// 支付方式
 	function getPayWayLabelAttribute() {
 		switch($this->attributes['pay_way']){
-			case 'balance':
+			case 'credit':
 				$pay_way_label = '余额';
 				break;
 			case 'youzan':
@@ -134,6 +132,9 @@ class Order extends Model {
 			case 'bitpayx':
 				$pay_way_label = '麻瓜宝';
 				break;
+			case 'paypal':
+				$pay_way_label = 'PayPal';
+				break;
 			default:
 				$pay_way_label = '未知';
 		}

+ 16 - 18
app/Http/Models/Payment.php → app/Models/Payment.php

@@ -1,29 +1,27 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
 use Auth;
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 支付单
  *
- * @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 Carbon          $created_at
- * @property Carbon          $updated_at
- * @property-read mixed      $status_label
- * @property-read Order|null $order
- * @property-read User       $user
+ * @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 mixed                  $status_label
+ * @property-read \App\Models\Order|null $order
+ * @property-read \App\Models\User       $user
  * @method static Builder|Payment newModelQuery()
  * @method static Builder|Payment newQuery()
  * @method static Builder|Payment query()
@@ -38,7 +36,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|Payment whereUpdatedAt($value)
  * @method static Builder|Payment whereUrl($value)
  * @method static Builder|Payment whereUserId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class Payment extends Model {
 	protected $table = 'payment';
@@ -46,7 +44,7 @@ class Payment extends Model {
 	protected $appends = ['status_label'];
 
 	function scopeUid($query) {
-		return $query->whereUserId(Auth::user()->id);
+		return $query->whereUserId(Auth::id());
 	}
 
 	function user() {

+ 10 - 12
app/Http/Models/PaymentCallback.php → app/Models/PaymentCallback.php

@@ -1,23 +1,21 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 支付回调日志
  *
- * @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 Carbon|null $created_at
- * @property Carbon|null $updated_at
- * @property-read mixed  $status_label
+ * @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 mixed                      $status_label
  * @method static Builder|PaymentCallback newModelQuery()
  * @method static Builder|PaymentCallback newQuery()
  * @method static Builder|PaymentCallback query()
@@ -28,7 +26,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|PaymentCallback whereStatus($value)
  * @method static Builder|PaymentCallback whereTradeNo($value)
  * @method static Builder|PaymentCallback whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class PaymentCallback extends Model {
 	protected $table = 'payment_callback';

+ 33 - 0
app/Models/ProductsPool.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+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 最后更新时间
+ * @method static Builder|ProductsPool newModelQuery()
+ * @method static Builder|ProductsPool newQuery()
+ * @method static Builder|ProductsPool query()
+ * @method static Builder|ProductsPool whereCreatedAt($value)
+ * @method static Builder|ProductsPool whereId($value)
+ * @method static Builder|ProductsPool whereMaxAmount($value)
+ * @method static Builder|ProductsPool whereMinAmount($value)
+ * @method static Builder|ProductsPool whereName($value)
+ * @method static Builder|ProductsPool whereStatus($value)
+ * @method static Builder|ProductsPool whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class ProductsPool extends Model {
+	protected $table = 'products_pool';
+	protected $primaryKey = 'id';
+}

+ 13 - 15
app/Http/Models/ReferralApply.php → app/Models/ReferralApply.php

@@ -1,26 +1,24 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
 use Auth;
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 返利申请
  *
- * @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 Carbon|null    $created_at 创建时间
- * @property Carbon|null    $updated_at 最后更新时间
- * @property-read 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|null $created_at 创建时间
+ * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property-read \App\Models\User|null      $User
  * @method static Builder|ReferralApply newModelQuery()
  * @method static Builder|ReferralApply newQuery()
  * @method static Builder|ReferralApply query()
@@ -34,14 +32,14 @@ use Illuminate\Support\Carbon;
  * @method static Builder|ReferralApply whereStatus($value)
  * @method static Builder|ReferralApply whereUpdatedAt($value)
  * @method static Builder|ReferralApply whereUserId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class ReferralApply extends Model {
 	protected $table = 'referral_apply';
 	protected $primaryKey = 'id';
 
 	function scopeUid($query) {
-		return $query->whereUserId(Auth::user()->id);
+		return $query->whereUserId(Auth::id());
 	}
 
 	function User() {

+ 15 - 17
app/Http/Models/ReferralLog.php → app/Models/ReferralLog.php

@@ -1,28 +1,26 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
 use Auth;
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 返利日志
  *
- * @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 Carbon|null     $created_at  创建时间
- * @property Carbon|null     $updated_at  最后更新时间
- * @property-read Order|null $order
- * @property-read User|null  $ref_user
- * @property-read 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|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
  * @method static Builder|ReferralLog newModelQuery()
  * @method static Builder|ReferralLog newQuery()
  * @method static Builder|ReferralLog query()
@@ -36,14 +34,14 @@ use Illuminate\Support\Carbon;
  * @method static Builder|ReferralLog whereStatus($value)
  * @method static Builder|ReferralLog whereUpdatedAt($value)
  * @method static Builder|ReferralLog whereUserId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class ReferralLog extends Model {
 	protected $table = 'referral_log';
 	protected $primaryKey = 'id';
 
 	function scopeUid($query) {
-		return $query->whereRefUserId(Auth::user()->id);
+		return $query->whereRefUserId(Auth::id());
 	}
 
 	function user() {

+ 53 - 0
app/Models/Rule.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 审计规则
+ *
+ * @property int                        $id
+ * @property int                        $type    类型:1-正则表达式、2-域名、3-IP、4-协议
+ * @property string                     $name    规则描述
+ * @property string                     $pattern 规则值
+ * @property \Illuminate\Support\Carbon $created_at
+ * @property \Illuminate\Support\Carbon $updated_at
+ * @property-read mixed                 $type_label
+ * @method static Builder|Rule newModelQuery()
+ * @method static Builder|Rule newQuery()
+ * @method static Builder|Rule query()
+ * @method static Builder|Rule whereCreatedAt($value)
+ * @method static Builder|Rule whereId($value)
+ * @method static Builder|Rule whereName($value)
+ * @method static Builder|Rule wherePattern($value)
+ * @method static Builder|Rule whereType($value)
+ * @method static Builder|Rule whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class Rule extends Model {
+	protected $table = 'rule';
+	protected $primaryKey = 'id';
+
+	function getTypeLabelAttribute() {
+		switch($this->attributes['type']){
+			case 1:
+				$type_label = '正则表达式';
+				break;
+			case 2:
+				$type_label = '域 名';
+				break;
+			case 3:
+				$type_label = 'I P';
+				break;
+			case 4:
+				$type_label = '协 议';
+				break;
+			default:
+				$type_label = '未 知';
+
+		}
+		return $type_label;
+	}
+}

+ 43 - 0
app/Models/RuleGroup.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 审计规则分组
+ *
+ * @property int                             $id
+ * @property int|null                        $type  模式:1-阻断、2-仅放行
+ * @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 mixed                      $type_label
+ * @method static Builder|RuleGroup newModelQuery()
+ * @method static Builder|RuleGroup newQuery()
+ * @method static Builder|RuleGroup query()
+ * @method static Builder|RuleGroup whereCreatedAt($value)
+ * @method static Builder|RuleGroup whereId($value)
+ * @method static Builder|RuleGroup whereName($value)
+ * @method static Builder|RuleGroup whereNodes($value)
+ * @method static Builder|RuleGroup whereRules($value)
+ * @method static Builder|RuleGroup whereType($value)
+ * @method static Builder|RuleGroup whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class RuleGroup extends Model {
+	protected $table = 'rule_group';
+	protected $primaryKey = 'id';
+
+	function getTypeLabelAttribute() {
+		if($this->attributes['type']){
+			$type_label = '<span class="badge badge-danger">阻 断</span>';
+		}else{
+			$type_label = '<span class="badge badge-primary">放 行</span>';
+		}
+		return $type_label;
+	}
+}

+ 29 - 0
app/Models/RuleGroupNode.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+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
+ * @method static Builder|RuleGroupNode newModelQuery()
+ * @method static Builder|RuleGroupNode newQuery()
+ * @method static Builder|RuleGroupNode query()
+ * @method static Builder|RuleGroupNode whereCreatedAt($value)
+ * @method static Builder|RuleGroupNode whereId($value)
+ * @method static Builder|RuleGroupNode whereNodeId($value)
+ * @method static Builder|RuleGroupNode whereRuleGroupId($value)
+ * @method static Builder|RuleGroupNode whereUpdatedAt($value)
+ * @mixin \Eloquent
+ */
+class RuleGroupNode extends Model {
+	protected $table = 'rule_group_node';
+	protected $primaryKey = 'id';
+}

+ 48 - 0
app/Models/RuleLog.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 触发审计规则日志
+ *
+ * @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-read \App\Models\SsNode|null $node
+ * @property-read \App\Models\Rule|null   $rule
+ * @property-read \App\Models\User|null   $user
+ * @method static Builder|RuleLog newModelQuery()
+ * @method static Builder|RuleLog newQuery()
+ * @method static Builder|RuleLog query()
+ * @method static Builder|RuleLog whereCreatedAt($value)
+ * @method static Builder|RuleLog whereId($value)
+ * @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 {
+	protected $table = 'rule_log';
+	protected $primaryKey = 'id';
+
+	function user() {
+		return $this->hasOne(User::class, 'id', 'user_id');
+	}
+
+	function node() {
+		return $this->hasOne(SsNode::class, 'id', 'node_id');
+	}
+
+	function rule() {
+		return $this->hasOne(Rule::class, 'id', 'rule_id');
+	}
+}

+ 2 - 3
app/Http/Models/SensitiveWords.php → app/Models/SensitiveWords.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -18,7 +17,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|SensitiveWords whereId($value)
  * @method static Builder|SensitiveWords whereType($value)
  * @method static Builder|SensitiveWords whereWords($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SensitiveWords extends Model {
 	public $timestamps = false;

+ 2 - 3
app/Http/Models/SsConfig.php → app/Models/SsConfig.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -24,7 +23,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|SsConfig whereName($value)
  * @method static Builder|SsConfig whereSort($value)
  * @method static Builder|SsConfig whereType($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsConfig extends Model {
 	public $timestamps = false;

+ 115 - 0
app/Models/SsNode.php

@@ -0,0 +1,115 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * SS节点信息
+ *
+ * @property int                                                                     $id
+ * @property int                                                                     $type                    服务类型:1-ShadowsocksR、2-V2ray
+ * @property string                                                                  $name                    名称
+ * @property string                                                                  $country_code            国家代码
+ * @property string|null                                                             $server                  服务器域名地址
+ * @property string|null                                                             $ip                      服务器IPV4地址
+ * @property string|null                                                             $ipv6                    服务器IPV6地址
+ * @property string|null                                                             $relay_server            中转地址
+ * @property int|null                                                                $relay_port              中转端口
+ * @property \App\Models\Level|null                                                  $level                   等级:0-无等级,全部可见
+ * @property int                                                                     $speed_limit             节点限速,为0表示不限速,单位Byte
+ * @property int                                                                     $client_limit            设备数限制
+ * @property string|null                                                             $description             节点简单描述
+ * @property string                                                                  $method                  加密方式
+ * @property string                                                                  $protocol                协议
+ * @property string|null                                                             $protocol_param          协议参数
+ * @property string                                                                  $obfs                    混淆
+ * @property string|null                                                             $obfs_param              混淆参数
+ * @property float                                                                   $traffic_rate            流量比率
+ * @property int                                                                     $is_subscribe            是否允许用户订阅该节点:0-否、1-是
+ * @property int                                                                     $is_ddns                 是否使用DDNS:0-否、1-是
+ * @property int                                                                     $is_relay                是否中转节点:0-否、1-是
+ * @property int                                                                     $is_udp                  是否启用UDP:0-不启用、1-启用
+ * @property int                                                                     $ssh_port                SSH端口
+ * @property int                                                                     $detection_type          节点检测: 0-关闭、1-只检测TCP、2-只检测ICMP、3-检测全部
+ * @property int                                                                     $compatible              兼容SS
+ * @property int                                                                     $single                  启用单端口功能:0-否、1-是
+ * @property int|null                                                                $port                    单端口的端口号或连接端口号
+ * @property string|null                                                             $passwd                  单端口的连接密码
+ * @property int                                                                     $sort                    排序值,值越大越靠前显示
+ * @property int                                                                     $status                  状态:0-维护、1-正常
+ * @property int                                                                     $v2_alter_id             V2Ray额外ID
+ * @property int                                                                     $v2_port                 V2Ray服务端口
+ * @property string                                                                  $v2_method               V2Ray加密方式
+ * @property string                                                                  $v2_net                  V2Ray传输协议
+ * @property string                                                                  $v2_type                 V2Ray伪装类型
+ * @property string                                                                  $v2_host                 V2Ray伪装的域名
+ * @property string                                                                  $v2_path                 V2Ray的WS/H2路径
+ * @property int                                                                     $v2_tls                  V2Ray后端TLS:0-未开启、1-开启
+ * @property int                                                                     $v2_tls_insecure         是否允许不安全连接
+ * @property int                                                                     $v2_tls_insecure_ciphers 是否允许不安全的加密方式
+ * @property \Illuminate\Support\Carbon                                              $created_at
+ * @property \Illuminate\Support\Carbon                                              $updated_at
+ * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\SsNodeLabel[] $label
+ * @property-read int|null                                                           $label_count
+ * @method static Builder|SsNode newModelQuery()
+ * @method static Builder|SsNode newQuery()
+ * @method static Builder|SsNode query()
+ * @method static Builder|SsNode whereClientLimit($value)
+ * @method static Builder|SsNode whereCompatible($value)
+ * @method static Builder|SsNode whereCountryCode($value)
+ * @method static Builder|SsNode whereCreatedAt($value)
+ * @method static Builder|SsNode whereDescription($value)
+ * @method static Builder|SsNode whereDetectionType($value)
+ * @method static Builder|SsNode whereId($value)
+ * @method static Builder|SsNode whereIp($value)
+ * @method static Builder|SsNode whereIpv6($value)
+ * @method static Builder|SsNode whereIsDdns($value)
+ * @method static Builder|SsNode whereIsRelay($value)
+ * @method static Builder|SsNode whereIsSubscribe($value)
+ * @method static Builder|SsNode whereIsUdp($value)
+ * @method static Builder|SsNode whereLevel($value)
+ * @method static Builder|SsNode whereMethod($value)
+ * @method static Builder|SsNode whereName($value)
+ * @method static Builder|SsNode whereObfs($value)
+ * @method static Builder|SsNode whereObfsParam($value)
+ * @method static Builder|SsNode wherePasswd($value)
+ * @method static Builder|SsNode wherePort($value)
+ * @method static Builder|SsNode whereProtocol($value)
+ * @method static Builder|SsNode whereProtocolParam($value)
+ * @method static Builder|SsNode whereRelayPort($value)
+ * @method static Builder|SsNode whereRelayServer($value)
+ * @method static Builder|SsNode whereServer($value)
+ * @method static Builder|SsNode whereSingle($value)
+ * @method static Builder|SsNode whereSort($value)
+ * @method static Builder|SsNode whereSpeedLimit($value)
+ * @method static Builder|SsNode whereSshPort($value)
+ * @method static Builder|SsNode whereStatus($value)
+ * @method static Builder|SsNode whereTrafficRate($value)
+ * @method static Builder|SsNode whereType($value)
+ * @method static Builder|SsNode whereUpdatedAt($value)
+ * @method static Builder|SsNode whereV2AlterId($value)
+ * @method static Builder|SsNode whereV2Host($value)
+ * @method static Builder|SsNode whereV2Method($value)
+ * @method static Builder|SsNode whereV2Net($value)
+ * @method static Builder|SsNode whereV2Path($value)
+ * @method static Builder|SsNode whereV2Port($value)
+ * @method static Builder|SsNode whereV2Tls($value)
+ * @method static Builder|SsNode whereV2TlsInsecure($value)
+ * @method static Builder|SsNode whereV2TlsInsecureCiphers($value)
+ * @method static Builder|SsNode whereV2Type($value)
+ * @mixin \Eloquent
+ */
+class SsNode extends Model {
+	protected $table = 'ss_node';
+	protected $primaryKey = 'id';
+
+	function label() {
+		return $this->hasMany(SsNodeLabel::class, 'node_id', 'id');
+	}
+
+	function getLevel() {
+		return $this->hasOne(Level::class, 'level', 'level');
+	}
+}

+ 2 - 3
app/Http/Models/SsNodeInfo.php → app/Models/SsNodeInfo.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -22,7 +21,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|SsNodeInfo whereLogTime($value)
  * @method static Builder|SsNodeInfo whereNodeId($value)
  * @method static Builder|SsNodeInfo whereUptime($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeInfo extends Model {
 	public $timestamps = false;

+ 11 - 13
app/Http/Models/SsNodeIp.php → app/Models/SsNodeIp.php

@@ -1,24 +1,22 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * SS节点在线IP信息
  *
- * @property int         $id
- * @property int         $node_id    节点ID
- * @property int         $user_id    用户ID
- * @property int         $port       端口
- * @property string      $type       类型:all、tcp、udp
- * @property string|null $ip         连接IP:每个IP用,号隔开
- * @property Carbon      $created_at 上报时间
- * @property-read SsNode $node
- * @property-read User   $user
+ * @property int                        $id
+ * @property int                        $node_id    节点ID
+ * @property int                        $user_id    用户ID
+ * @property int                        $port       端口
+ * @property string                     $type       类型:all、tcp、udp
+ * @property string|null                $ip         连接IP:每个IP用,号隔开
+ * @property \Illuminate\Support\Carbon $created_at 上报时间
+ * @property-read \App\Models\SsNode    $node
+ * @property-read \App\Models\User      $user
  * @method static Builder|SsNodeIp newModelQuery()
  * @method static Builder|SsNodeIp newQuery()
  * @method static Builder|SsNodeIp query()
@@ -29,7 +27,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|SsNodeIp wherePort($value)
  * @method static Builder|SsNodeIp whereType($value)
  * @method static Builder|SsNodeIp whereUserId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeIp extends Model {
 	protected $table = 'ss_node_ip';

+ 6 - 7
app/Http/Models/SsNodeLabel.php → app/Models/SsNodeLabel.php

@@ -1,25 +1,24 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
 /**
  * 节点标签
  *
- * @property int             $id
- * @property int             $node_id  用户ID
- * @property int             $label_id 标签ID
- * @property-read Label|null $labelInfo
+ * @property int                         $id
+ * @property int                         $node_id  节点ID
+ * @property int                         $label_id 标签ID
+ * @property-read \App\Models\Label|null $labelInfo
  * @method static Builder|SsNodeLabel newModelQuery()
  * @method static Builder|SsNodeLabel newQuery()
  * @method static Builder|SsNodeLabel query()
  * @method static Builder|SsNodeLabel whereId($value)
  * @method static Builder|SsNodeLabel whereLabelId($value)
  * @method static Builder|SsNodeLabel whereNodeId($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeLabel extends Model {
 	public $timestamps = false;

+ 2 - 3
app/Http/Models/SsNodeOnlineLog.php → app/Models/SsNodeOnlineLog.php

@@ -1,8 +1,7 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 
@@ -20,7 +19,7 @@ use Illuminate\Database\Eloquent\Model;
  * @method static Builder|SsNodeOnlineLog whereLogTime($value)
  * @method static Builder|SsNodeOnlineLog whereNodeId($value)
  * @method static Builder|SsNodeOnlineLog whereOnlineUser($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeOnlineLog extends Model {
 	public $timestamps = false;

+ 11 - 13
app/Http/Models/SsNodePing.php → app/Models/SsNodePing.php

@@ -1,24 +1,22 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 节点定时Ping测速
  *
- * @property int              $id
- * @property int              $node_id 对应节点id
- * @property int              $ct      电信
- * @property int              $cu      联通
- * @property int              $cm      移动
- * @property int              $hk      香港
- * @property Carbon           $created_at
- * @property Carbon           $updated_at
- * @property-read SsNode|null $node
+ * @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-read \App\Models\SsNode|null $node
  * @method static Builder|SsNodePing newModelQuery()
  * @method static Builder|SsNodePing newQuery()
  * @method static Builder|SsNodePing query()
@@ -30,7 +28,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|SsNodePing whereId($value)
  * @method static Builder|SsNodePing whereNodeId($value)
  * @method static Builder|SsNodePing whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodePing extends Model {
 	protected $table = 'ss_node_ping';

+ 11 - 13
app/Http/Models/SsNodeTrafficDaily.php → app/Models/SsNodeTrafficDaily.php

@@ -1,24 +1,22 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 节点每日流量统计
  *
- * @property int              $id
- * @property int              $node_id    节点ID
- * @property int              $u          上传流量
- * @property int              $d          下载流量
- * @property int              $total      总流量
- * @property string|null      $traffic    总流量(带单位)
- * @property Carbon|null      $created_at 创建时间
- * @property Carbon|null      $updated_at 最后更新时间
- * @property-read 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|null $created_at 创建时间
+ * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property-read \App\Models\SsNode|null    $info
  * @method static Builder|SsNodeTrafficDaily newModelQuery()
  * @method static Builder|SsNodeTrafficDaily newQuery()
  * @method static Builder|SsNodeTrafficDaily query()
@@ -30,7 +28,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|SsNodeTrafficDaily whereTraffic($value)
  * @method static Builder|SsNodeTrafficDaily whereU($value)
  * @method static Builder|SsNodeTrafficDaily whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeTrafficDaily extends Model {
 	protected $table = 'ss_node_traffic_daily';

+ 11 - 13
app/Http/Models/SsNodeTrafficHourly.php → app/Models/SsNodeTrafficHourly.php

@@ -1,24 +1,22 @@
 <?php
 
-namespace App\Http\Models;
+namespace App\Models;
 
-use Eloquent;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
-use Illuminate\Support\Carbon;
 
 /**
  * 节点每日流量统计
  *
- * @property int              $id
- * @property int              $node_id    节点ID
- * @property int              $u          上传流量
- * @property int              $d          下载流量
- * @property int              $total      总流量
- * @property string|null      $traffic    总流量(带单位)
- * @property Carbon|null      $created_at 创建时间
- * @property Carbon|null      $updated_at 最后更新时间
- * @property-read 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|null $created_at 创建时间
+ * @property \Illuminate\Support\Carbon|null $updated_at 最后更新时间
+ * @property-read \App\Models\SsNode|null    $info
  * @method static Builder|SsNodeTrafficHourly newModelQuery()
  * @method static Builder|SsNodeTrafficHourly newQuery()
  * @method static Builder|SsNodeTrafficHourly query()
@@ -30,7 +28,7 @@ use Illuminate\Support\Carbon;
  * @method static Builder|SsNodeTrafficHourly whereTraffic($value)
  * @method static Builder|SsNodeTrafficHourly whereU($value)
  * @method static Builder|SsNodeTrafficHourly whereUpdatedAt($value)
- * @mixin Eloquent
+ * @mixin \Eloquent
  */
 class SsNodeTrafficHourly extends Model {
 	protected $table = 'ss_node_traffic_hourly';

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.