Browse Source

Subscribe function support V2Ray and Trojan

兔姬桑 4 years ago
parent
commit
ce8d33b711

+ 12 - 1
app/Http/Controllers/Api/LoginController.php

@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
 use App\Models\SsNode;
 use App\Models\User;
 use App\Models\UserSubscribe;
+use App\Models\UserSubscribeLog;
 use Cache;
 use DB;
 use Exception;
@@ -67,7 +68,7 @@ class LoginController extends Controller {
 			$subscribe->increment('times', 1);
 
 			// 记录每次请求
-			$this->log($subscribe->id, getClientIp(), 'API访问');
+			$this->subscribeLog($subscribe->id, getClientIp(), 'API访问');
 
 			// 订阅链接
 			$url = self::$systemConfig['subscribe_domain']? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url'];
@@ -121,4 +122,14 @@ class LoginController extends Controller {
 			return Response::json(['status' => 'success', 'data' => [], 'message' => '登录失败']);
 		}
 	}
+
+	// 写入订阅访问日志
+	private function subscribeLog($subscribeId, $ip, $headers) {
+		$log = new UserSubscribeLog();
+		$log->sid = $subscribeId;
+		$log->request_ip = $ip;
+		$log->request_time = date('Y-m-d H:i:s');
+		$log->request_header = $headers;
+		$log->save();
+	}
 }

+ 2 - 13
app/Http/Controllers/Controller.php

@@ -5,7 +5,6 @@ namespace App\Http\Controllers;
 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;
@@ -152,7 +151,7 @@ class Controller extends BaseController {
 					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');
+						$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='.base64url_encode($group).'&udpport=0&uot=0');
 					}
 				}else{
 					// 生成文本配置信息
@@ -163,7 +162,7 @@ class Controller extends BaseController {
 				// 生成v2ray scheme
 				if($infoType != 1){
 					// 生成v2ray scheme
-					$data = 'vmess://'.base64_encode(json_encode([
+					$data = 'vmess://'.base64url_encode(json_encode([
 							"v"    => "2",
 							"ps"   => $node->name,
 							"add"  => $host,
@@ -187,14 +186,4 @@ class Controller extends BaseController {
 
 		return $data;
 	}
-
-	// 写入订阅访问日志
-	public function log($subscribeId, $ip, $headers) {
-		$log = new UserSubscribeLog();
-		$log->sid = $subscribeId;
-		$log->request_ip = $ip;
-		$log->request_time = date('Y-m-d H:i:s');
-		$log->request_header = $headers;
-		$log->save();
-	}
 }

+ 75 - 46
app/Http/Controllers/User/SubscribeController.php

@@ -7,12 +7,14 @@ use App\Http\Controllers\Controller;
 use App\Models\SsNode;
 use App\Models\User;
 use App\Models\UserSubscribe;
+use App\Models\UserSubscribeLog;
 use Illuminate\Http\Request;
 use Redirect;
 use Response;
 
 class SubscribeController extends Controller {
 	protected static $systemConfig;
+	private $subType;
 
 	function __construct() {
 		self::$systemConfig = Helpers::systemConfig();
@@ -23,35 +25,51 @@ class SubscribeController extends Controller {
 		if(empty($code)){
 			return Redirect::to('login');
 		}
+		$this->subType = $request->input('type');
 
-		// 校验合法性
-		$subscribe = UserSubscribe::query()->with('user')->whereCode($code)->whereStatus(1)->first();
+		// 检查订阅码是否有效
+		$subscribe = UserSubscribe::query()->whereCode($code)->first();
 		if(!$subscribe){
-			exit($this->noneNode());
+			exit($this->infoGenerator('使用的订阅链接错误!请重新从官网获取!'));
+		}elseif($subscribe->status != 1){
+			exit($this->infoGenerator('您的订阅链接已被封禁,请前往官网查询原因!'));
 		}
 
-		$user = User::query()->whereIn('status', [0, 1])->whereEnable(1)->whereId($subscribe->user_id)->first();
+		// 检查用户是否有效
+		$user = User::query()->whereId($subscribe->user_id)->first();
 		if(!$user){
-			exit($this->noneNode());
+			exit($this->infoGenerator('错误订阅链接,账号不存在!请前往官网重新获取订阅链接'));
+		}elseif($user->status == -1){
+			exit($this->infoGenerator('您的账号已经被禁止使用,请重新注册'));
+		}elseif($user->enable != 1){
+			$unusedTransfer = $user->transfer_enable - $user->u - $user->d;
+			if($user->ban_time > 0){
+				exit($this->infoGenerator('您的账号处于封禁状态,请在'.date('Y-m-d H:i:s', $user->ban_time).'之后再更新!'));
+			}elseif($unusedTransfer <= 0){
+				exit($this->infoGenerator('账号流量耗尽!请前往官网购买或重置流量!'));
+			}elseif($user->expire_time < date('Y-m-d')){
+				exit($this->infoGenerator('账号过期!请前往官网购买!'));
+			}else{
+				exit($this->infoGenerator('账号存在问题,请前往官网查询!'));
+			}
 		}
 
 		// 更新访问次数
 		$subscribe->increment('times', 1);
 
 		// 记录每次请求
-		$this->log($subscribe->id, getClientIp(), $request->headers);
+		$this->subscribeLog($subscribe->id, getClientIp(), $request->headers);
 
 		// 获取这个账号可用节点
 		$query = SsNode::query()->whereStatus(1)->whereIsSubscribe(1)->where('level', '<=', $user->level);
 
-		// 启用混合订阅时,加入V2Ray节点,未启用时仅下发SSR节点信息
-		if(!self::$systemConfig['mix_subscribe']){
-			$query->whereType(1);
+		if($this->subType){
+			$query = $query->whereType($this->subType);
 		}
 
 		$nodeList = $query->orderByDesc('sort')->orderBy('id')->get()->toArray();
 		if(empty($nodeList)){
-			exit($this->noneNode());
+			exit($this->infoGenerator('无可用节点'));
 		}
 
 		// 打乱数组
@@ -63,7 +81,7 @@ class SubscribeController extends Controller {
 
 		// 展示到期时间和剩余流量
 		if(self::$systemConfig['is_custom_subscribe']){
-			$scheme .= $this->expireDate($user).$this->lastTraffic($user);
+			$scheme .= $this->infoGenerator('到期时间: '.($user->expire_time < date('Y-m-d')? '过期' : $user->expire_time)).$this->infoGenerator('剩余流量: '.flowAutoShow($user->transfer_enable - $user->u - $user->d));
 		}
 
 		// 控制客户端最多获取节点数
@@ -72,51 +90,62 @@ class SubscribeController extends Controller {
 			if(self::$systemConfig['subscribe_max'] && $key >= self::$systemConfig['subscribe_max']){
 				break;
 			}
+
 			$scheme .= $this->getNodeInfo($user->id, $node['id'], 0).PHP_EOL;
 		}
 
+		$headers = [
+			'Content-type'  => 'application/octet-stream; charset=utf-8',
+			'Cache-Control' => 'no-store, no-cache, must-revalidate',
+			//'Content-Disposition' => 'attachment; filename='.$filename
+		];
+
 		// 适配Quantumult的自定义订阅头
 		if(self::$systemConfig['is_custom_subscribe']){
-			$headers = [
-				'Content-type'          => 'application/octet-stream; charset=utf-8',
-				'Cache-Control'         => 'no-store, no-cache, must-revalidate',
-				'Subscription-Userinfo' => 'upload='.$user->u.'; download='.$user->d.'; total='.$user->transfer_enable.'; expire='.strtotime($user->expire_time)
-			];
-
-			return Response::make(base64url_encode($scheme), 200, $headers);
-		}else{
-			return Response::make(base64url_encode($scheme));
+			$headers['Subscription-Userinfo'] = 'upload='.$user->u.'; download='.$user->d.'; total='.$user->transfer_enable.'; expire='.strtotime($user->expire_time);
 		}
-	}
 
-	// 抛出无可用的节点信息,用于兼容防止客户端订阅失败
-	private function noneNode() {
-		return base64url_encode('ssr://'.base64url_encode('0.0.0.0:1:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode('无可用节点或账号被封禁或订阅被封禁').'&group='.base64url_encode('错误').'&udpport=0&uot=0')."\n");
+		return Response::make(base64url_encode($scheme), 200, $headers);
 	}
 
-	/**
-	 * 过期时间
-	 *
-	 * @param  object  $user
-	 *
-	 * @return string
-	 */
-	private function expireDate($user) {
-		$text = '到期时间: '.$user->expire_time;
-
-		return 'ssr://'.base64url_encode('0.0.0.1:1:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(self::$systemConfig['website_name']).'&udpport=0&uot=0')."\n";
+	// 抛出错误的节点信息,用于兼容防止客户端订阅失败
+	private function infoGenerator($text) {
+		$result = null;
+		switch($this->subType){
+			case 2:
+				$result = 'vmess://'.base64url_encode(json_encode([
+						"v"    => "2",
+						"ps"   => $text,
+						"add"  => "0.0.0.0",
+						"port" => 0,
+						"id"   => 0,
+						"aid"  => 0,
+						"net"  => "tcp",
+						"type" => "none",
+						"host" => "",
+						"path" => "/",
+						'tls'  => "tls"
+					], JSON_PRETTY_PRINT));
+				break;
+			case 3:
+				$result = 'trojan://0@0.0.0.0:0?peer=0.0.0.0#'.rawurlencode($text);
+				break;
+			case 1:
+			default:
+				$result = 'ssr://'.base64url_encode('0.0.0.0:0:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(self::$systemConfig['website_name']).'&udpport=0&uot=0');
+				break;
+
+		}
+		return $result.PHP_EOL;
 	}
 
-	/**
-	 * 剩余流量
-	 *
-	 * @param  object  $user
-	 *
-	 * @return string
-	 */
-	private function lastTraffic($user) {
-		$text = '剩余流量: '.flowAutoShow($user->transfer_enable - $user->u - $user->d);
-
-		return 'ssr://'.base64url_encode('0.0.0.2:1:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(self::$systemConfig['website_name']).'&udpport=0&uot=0')."\n";
+	// 写入订阅访问日志
+	private function subscribeLog($subscribeId, $ip, $headers) {
+		$log = new UserSubscribeLog();
+		$log->sid = $subscribeId;
+		$log->request_ip = $ip;
+		$log->request_time = date('Y-m-d H:i:s');
+		$log->request_header = $headers;
+		$log->save();
 	}
 }

+ 36 - 23
app/Http/Controllers/UserController.php

@@ -316,7 +316,7 @@ class UserController extends Controller {
 		})->first();
 		$renewCost = Goods::query()->whereId($temp->goods_id)->first()->renew;
 		if($user->credit < $renewCost){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '余额不足,请充值余额']);
+			return Response::json(['status' => 'fail', 'message' => '余额不足,请充值余额']);
 		}else{
 			User::uid()->update(['u' => 0, 'd' => 0]);
 
@@ -327,7 +327,7 @@ class UserController extends Controller {
 			Helpers::addUserCreditLog($user->id, '', $user->credit, $user->credit - $renewCost, -1 * $renewCost,
 				'用户自行重置流量');
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '重置成功']);
+			return Response::json(['status' => 'success', 'message' => '重置成功']);
 		}
 	}
 
@@ -353,14 +353,14 @@ class UserController extends Controller {
 		$oid = $request->input('oid');
 		$prepaidOrder = Order::query()->whereOid($oid)->first();
 		if(!$prepaidOrder){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '查无此单!']);
+			return Response::json(['status' => 'fail', 'message' => '查无此单!']);
 		}elseif($prepaidOrder->status != 3){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '非预支付订单,无需再次启动!']);
+			return Response::json(['status' => 'fail', 'message' => '非预支付订单,无需再次启动!']);
 		}else{
 			(new ServiceController)->activePrepaidOrder($oid);
 		}
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '激活成功']);
+		return Response::json(['status' => 'success', 'message' => '激活成功']);
 	}
 
 	// 订单明细
@@ -377,7 +377,7 @@ class UserController extends Controller {
 		$content = str_replace("eval", "", str_replace("atob", "", $content));
 
 		if(empty($title) || empty($content)){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '请输入标题和内容']);
+			return Response::json(['status' => 'fail', 'message' => '请输入标题和内容']);
 		}
 
 		$obj = new Ticket();
@@ -399,9 +399,9 @@ class UserController extends Controller {
 
 			PushNotification::send($emailTitle, $content);
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '提交成功']);
+			return Response::json(['status' => 'success', 'message' => '提交成功']);
 		}else{
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '提交失败']);
+			return Response::json(['status' => 'fail', 'message' => '提交失败']);
 		}
 	}
 
@@ -417,11 +417,11 @@ class UserController extends Controller {
 			$content = substr($content, 0, 300);
 
 			if(empty($content)){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '回复内容不能为空']);
+				return Response::json(['status' => 'fail', 'message' => '回复内容不能为空']);
 			}
 
 			if($ticket->status == 2){
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '错误:该工单已关闭']);
+				return Response::json(['status' => 'fail', 'message' => '错误:该工单已关闭']);
 			}
 
 			$obj = new TicketReply();
@@ -446,9 +446,9 @@ class UserController extends Controller {
 
 				PushNotification::send($title, $content);
 
-				return Response::json(['status' => 'success', 'data' => '', 'message' => '回复成功']);
+				return Response::json(['status' => 'success', 'message' => '回复成功']);
 			}else{
-				return Response::json(['status' => 'fail', 'data' => '', 'message' => '回复失败']);
+				return Response::json(['status' => 'fail', 'message' => '回复失败']);
 			}
 		}else{
 			$view['ticket'] = $ticket;
@@ -466,9 +466,9 @@ class UserController extends Controller {
 		if($ret){
 			PushNotification::send('工单关闭提醒', '工单:ID'.$id.'用户已手动关闭');
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '关闭成功']);
+			return Response::json(['status' => 'success', 'message' => '关闭成功']);
 		}else{
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '关闭失败']);
+			return Response::json(['status' => 'fail', 'message' => '关闭失败']);
 		}
 	}
 
@@ -490,7 +490,7 @@ class UserController extends Controller {
 	// 生成邀请码
 	public function makeInvite() {
 		if(Auth::getUser()->invite_num <= 0){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:已无邀请码生成名额']);
+			return Response::json(['status' => 'fail', 'message' => '生成失败:已无邀请码生成名额']);
 		}
 
 		$obj = new Invite();
@@ -503,7 +503,7 @@ class UserController extends Controller {
 
 		User::uid()->decrement('invite_num', 1);
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => '生成成功']);
+		return Response::json(['status' => 'success', 'message' => '生成成功']);
 	}
 
 	// 使用优惠券
@@ -568,7 +568,20 @@ class UserController extends Controller {
 
 	// 帮助中心
 	public function help() {
-		$view['articleList'] = Article::type(1)->orderByDesc('sort')->orderByDesc('id')->limit(10)->paginate(5);
+		//$view['articleList'] = Article::type(1)->orderByDesc('sort')->orderByDesc('id')->limit(10)->paginate(5);
+		$data = [];
+		if(SsNode::query()->whereType(1)->whereStatus(1)->exists()){
+			$data[] = 'ss';
+			//array_push
+		}
+		if(SsNode::query()->whereType(2)->whereStatus(1)->exists()){
+			$data[] = 'v2';
+		}
+		if(SsNode::query()->whereType(3)->whereStatus(1)->exists()){
+			$data[] = 'trojan';
+		}
+
+		$view['sub'] = $data;
 
 		//付费用户判断
 		$view['not_paying_user'] = Order::uid()
@@ -605,27 +618,27 @@ class UserController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '更换成功']);
+			return Response::json(['status' => 'success', 'message' => '更换成功']);
 		}catch(Exception $e){
 			DB::rollBack();
 
 			Log::info("更换订阅地址异常:".$e->getMessage());
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '更换失败'.$e->getMessage()]);
+			return Response::json(['status' => 'fail', 'message' => '更换失败'.$e->getMessage()]);
 		}
 	}
 
 	// 转换成管理员的身份
 	public function switchToAdmin() {
 		if(!Session::has('admin')){
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '非法请求']);
+			return Response::json(['status' => 'fail', 'message' => '非法请求']);
 		}
 
 		// 管理员信息重新写入user
 		Auth::loginUsingId(Session::get('admin'));
 		Session::forget('admin');
 
-		return Response::json(['status' => 'success', 'data' => '', 'message' => "身份切换成功"]);
+		return Response::json(['status' => 'success', 'message' => "身份切换成功"]);
 	}
 
 	// 卡券余额充值
@@ -663,12 +676,12 @@ class UserController extends Controller {
 
 			DB::commit();
 
-			return Response::json(['status' => 'success', 'data' => '', 'message' => '充值成功']);
+			return Response::json(['status' => 'success', 'message' => '充值成功']);
 		}catch(Exception $e){
 			Log::error($e);
 			DB::rollBack();
 
-			return Response::json(['status' => 'fail', 'data' => '', 'message' => '充值失败']);
+			return Response::json(['status' => 'fail', 'message' => '充值失败']);
 		}
 	}
 }

File diff suppressed because it is too large
+ 2 - 2
public/assets/custom/Plugin/clipboardjs/clipboard.min.js


+ 0 - 6
resources/views/admin/node/nodeInfo.blade.php

@@ -160,10 +160,6 @@
 									<hr/>
 									<!-- SS/SSR 设置部分 -->
 									<div class="ssr-setting">
-											<div class="form-group row normal_port">
-												<label for="port" class="col-md-3 col-form-label">端口</label>
-												<input type="number" class="form-control col-md-4" name="port" id="port" value="443" required/>
-											</div>
 										<div class="form-group row">
 											<label for="method" class="col-md-3 col-form-label">加密方式</label>
 											<select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" name="method" id="method">
@@ -548,9 +544,7 @@
 				case 'single':
 					if (check) {
 						$(".single-setting").show();
-						$('.normal_port').hide()
 					} else {
-						$('.normal_port').show()
 						$(".single-setting").hide();
 					}
 					break;

+ 1 - 2
resources/views/admin/user/userList.blade.php

@@ -88,8 +88,7 @@
 								{!!$user->port? : '<span class="badge badge-lg badge-danger"> 未分配 </span>'!!}
 							</td>
 							<td>
-								<a href="javascript:" class="copySubscribeLink" data-clipboard-action="copy"
-										data-clipboard-text="{{$user->link}}">{{$user->subscribe->code}}</a>
+								<a href="javascript:" class="copySubscribeLink" data-clipboard-action="copy" data-clipboard-text="{{$user->link}}">{{$user->subscribe->code}}</a>
 							</td>
 							<td> {{$user->used_flow}} / {{$user->transfer_enable}} </td>
 							<td> {{$user->t? date('Y-m-d H:i', $user->t): '未使用'}} </td>

+ 30 - 12
resources/views/user/help.blade.php

@@ -58,18 +58,33 @@
 														{{trans('home.subscribe_warning')}}
 													</div>
 													<div class="input-group">
-														<input type="text" class="form-control" value="{{$link}}"/>
-														<span class="input-group-btn btn-group" role="group">
-															<button class="btn btn-outline-info"
-																	onclick="exchangeSubscribe();">
+														<input type="text" class="form-control" id="sub_link" value="{{$link}}"/>
+														<div class="input-group-btn btn-group" role="group">
+															@if(count($sub)>1)
+																<div class="btn-group" role="group">
+																	<button type="button" class="btn btn-primary dropdown-toggle" id="sublink" data-toggle="dropdown" aria-expanded="false">
+																		自定义订阅
+																	</button>
+																	<div class="dropdown-menu" aria-labelledby="sublink" role="menu">
+																		@if(in_array('ss',$sub))
+																			<button class="dropdown-item" onclick="linkManager('1')" role="menuitem">只订阅SS/SSR</button>
+																		@endif
+																		@if(in_array('v2',$sub))
+																			<a class="dropdown-item" onclick="linkManager('2')" role="menuitem">只订阅V2Ray</a>
+																		@endif
+																		@if(in_array('trojan',$sub))
+																			<a class="dropdown-item" onclick="linkManager('3')" role="menuitem">只订阅Trojan</a>
+																		@endif
+																	</div>
+																</div>
+															@endif
+															<button class="btn btn-outline-info" onclick="exchangeSubscribe();">
 																<i class="icon wb-refresh" aria-hidden="true"></i>
 																{{trans('home.exchange_subscribe')}}</button>
-															<button class="btn btn-outline-info mt-clipboard"
-																	data-clipboard-action="copy"
-																	data-clipboard-text="{{$link}}">
+															<button class="btn btn-outline-info mt-clipboard" data-clipboard-action="copy" data-clipboard-target="#sub_link">
 																<i class="icon wb-copy" aria-hidden="true"></i>
 																{{trans('home.copy_subscribe_address')}}</button>
-														</span>
+														</div>
 													</div>
 												@else
 													<div class="alert alert-danger alert-dismissible" role="alert">
@@ -135,8 +150,7 @@
 									<!-- Question 2 -->
 									<div class="panel">
 										<div class="panel-heading" id="question-2" role="tab">
-											<a class="panel-title" aria-controls="answer-2" aria-expanded="false"
-													data-toggle="collapse" href="#answer-2" data-parent="#accordion2">
+											<a class="panel-title" aria-controls="answer-2" aria-expanded="false" data-toggle="collapse" href="#answer-2" data-parent="#accordion2">
 												我想续费/购买服务,该怎么操作?
 											</a>
 										</div>
@@ -150,8 +164,7 @@
 													<li>余额支付,本支付方法支持微信,支付宝。支付后需要等待充值到账,再购买服务。
 													    ,充值后等待充值到账,一般会在<code>24小时</code>内到账,到账后可以在<a
 																href="/services">【{{trans('home.services')}}】</a>
-													    页面查看您的账号余额。 在<a href="/services">【{{trans('home.services')}}
-													                                     】</a>选择想要购买的套餐,在订单界面选择<code>余额支付</code>即可。
+													    页面查看您的账号余额。 在<a href="/services">【{{trans('home.services')}}】</a>选择想要购买的套餐,在订单界面选择<code>余额支付</code>即可。
 													</li>
 												</ol>
 											</div>
@@ -301,6 +314,11 @@
 	<script src="/assets/global/js/Plugin/tabs.js" type="text/javascript"></script>
 	<script src="/assets/custom/jump-tab.js" type="text/javascript"></script>
 	<script type="text/javascript">
+		function linkManager($type) {
+			$('#sub_link').val('{{$link}}?type=' + $type);
+			return false;
+		}
+
 		// 更换订阅地址
 		function exchangeSubscribe() {
 			swal.fire({

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

@@ -22,8 +22,7 @@
 						<div class="card-text form">
 							<div class="mt-clipboard-container input-group">
 								<input type="text" id="mt-target-1" class="form-control" value="{{$link}}"/>
-								<button class="btn btn-info mt-clipboard" data-clipboard-action="copy"
-										data-clipboard-text="{{$link}}">
+								<button class="btn btn-info mt-clipboard" data-clipboard-action="copy" data-clipboard-text="{{$link}}">
 									<i class="icon wb-copy"></i> {{trans('home.referral_button')}}
 								</button>
 							</div>

+ 1 - 1
sql/db.sql

@@ -148,7 +148,7 @@ CREATE TABLE `user`
     `d`               BIGINT(20) UNSIGNED  NOT NULL DEFAULT '0' COMMENT '已下载流量,单位字节',
     `t`               INT(10) UNSIGNED     NOT NULL DEFAULT '0' COMMENT '最后使用时间',
     `ip`              CHAR(128)                     DEFAULT NULL COMMENT '最后连接IP',
-    `enable`          TINYINT(4)           NOT NULL DEFAULT '1' COMMENT '代理状态',
+    `enable`          BIT                  NOT NULL DEFAULT 1 COMMENT '代理状态',
     `method`          VARCHAR(30)          NOT NULL DEFAULT 'aes-256-cfb' COMMENT '加密方式',
     `protocol`        VARCHAR(30)          NOT NULL DEFAULT 'origin' COMMENT '协议',
     `obfs`            VARCHAR(30)          NOT NULL DEFAULT 'plain' COMMENT '混淆',

+ 2 - 0
sql/mod/20200605.sql

@@ -0,0 +1,2 @@
+ALTER TABLE `user`
+    CHANGE `enable` `enable` BIT NOT NULL DEFAULT 1 COMMENT '代理状态';

Some files were not shown because too many files changed in this diff