Explorar el Código

Changed 系统参数将使用redis Cache储存,减少查表

兔姬桑 hace 4 años
padre
commit
a4f1f40ad4

+ 35 - 21
app/Components/Helpers.php

@@ -10,6 +10,7 @@ use App\Models\User;
 use App\Models\UserCreditLog;
 use App\Models\UserDataModifyLog;
 use App\Models\UserSubscribe;
+use Cache;
 use DateTime;
 use Str;
 
@@ -82,7 +83,7 @@ class Helpers {
 		$user->email = $email;
 		$user->password = $password;
 		// 生成一个可用端口
-		$user->port = self::sysConfig()['is_rand_port']? self::getRandPort() : self::getOnlyPort();
+		$user->port = self::getPort();
 		$user->passwd = Str::random();
 		$user->vmess_id = Str::uuid();
 		$user->enable = 1;
@@ -100,33 +101,28 @@ class Helpers {
 		return $user->id;
 	}
 
-	// 获取系统配置
-	public static function sysConfig(): array {
-		$data = Config::all()->pluck('value', 'name')->toArray();
-		$data['is_onlinePay'] = ($data['is_AliPay'] || $data['is_QQPay'] || $data['is_WeChatPay'] || $data['is_otherPay'])?: 0;
-
-		return $data;
-	}
-
-	// 获取一个随机端口
-	public static function getRandPort(): int {
-		$port = random_int(self::sysConfig()['min_port'], self::sysConfig()['max_port']);
-
-		$exists_port = User::pluck('port')->toArray();
-		if(in_array($port, $exists_port, true) || in_array($port, self::$denyPorts, true)){
+	// 获取一个有效端口
+	public static function getPort(): int {
+		if(sysConfig('is_rand_port')){
 			$port = self::getRandPort();
-		}
+		}else{
+			$port = (int) sysConfig('min_port');
+			$exists_port = array_merge(User::where('port', '>=', $port)->pluck('port')->toArray(), self::$denyPorts);
 
+			while(in_array($port, $exists_port, true)){
+				++$port;
+			}
+		}
 		return $port;
 	}
 
 	// 获取一个随机端口
-	public static function getOnlyPort(): int {
-		$port = (int) self::sysConfig()['min_port'];
+	private static function getRandPort(): int {
+		$port = random_int(sysConfig('min_port'), sysConfig('max_port'));
+		$exists_port = array_merge(User::where('port', '<>', 0)->pluck('port')->toArray(), self::$denyPorts);
 
-		$exists_port = User::where('port', '>=', $port)->pluck('port')->toArray();
-		while(in_array($port, $exists_port, true) || in_array($port, self::$denyPorts, true)){
-			++$port;
+		while(in_array($port, $exists_port, true)){
+			$port = random_int(sysConfig('min_port'), sysConfig('max_port'));
 		}
 
 		return $port;
@@ -153,6 +149,24 @@ class Helpers {
 		return $config? $config->name : 'plain';
 	}
 
+	// 获取系统配置
+	public static function cacheSysConfig($name) {
+		if($name === 'is_onlinePay'){
+			$value = !empty(array_filter(Cache::many([
+				'is_AliPay',
+				'is_QQPay',
+				'is_WeChatPay',
+				'is_otherPay'
+			])));
+			Cache::tags('sysConfig')->add('is_onlinePay', $value);
+		}else{
+			$value = Config::find($name)->value;
+			Cache::tags('sysConfig')->add($name, $value?: false);
+		}
+
+		return $value;
+	}
+
 	public static function daysToNow($date): int {
 		return (new DateTime())->diff(new DateTime($date))->days;
 	}

+ 1 - 4
app/Console/Commands/AutoJob.php

@@ -196,11 +196,8 @@ class AutoJob extends Command {
 	// 端口回收与分配
 	private function dispatchPort(): void {
 		## 自动分配端口
-		$isRandPort = sysConfig('is_rand_port');
 		foreach(User::activeUser()->wherePort(0)->get() as $user){
-			$port = $isRandPort? Helpers::getRandPort() : Helpers::getOnlyPort();
-
-			$user->update(['port' => $port]);
+			$user->update(['port' => Helpers::getPort()]);
 		}
 
 		// 被封禁 / 过期一个月 的账号自动释放端口

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

@@ -15,18 +15,18 @@ class updateTextToJson extends Command {
 	public function handle(): void {
 		Log::info('----------------------------【数据转换】开始----------------------------');
 		foreach(ReferralApply::all() as $referralApply){
-			$referralApply->link_logs = $this->convertToJson($referralApply->getRawOriginal ('link_logs'));
+			$referralApply->link_logs = $this->convertToJson($referralApply->getRawOriginal('link_logs'));
 			$referralApply->save();
 		}
 		Log::info('转换返利表完成');
 		foreach(UserGroup::all() as $userGroup){
-			$userGroup->nodes = $this->convertToJson($userGroup->getRawOriginal ('nodes'));
+			$userGroup->nodes = $this->convertToJson($userGroup->getRawOriginal('nodes'));
 			$userGroup->save();
 		}
 		Log::info('转换用户分组表完成');
 		foreach(RuleGroup::all() as $ruleGroup){
-			$ruleGroup->rules = $this->convertToJson($ruleGroup->getRawOriginal ('rules'));
-			$ruleGroup->nodes = $this->convertToJson($ruleGroup->getRawOriginal ('nodes'));
+			$ruleGroup->rules = $this->convertToJson($ruleGroup->getRawOriginal('rules'));
+			$ruleGroup->nodes = $this->convertToJson($ruleGroup->getRawOriginal('nodes'));
 			$ruleGroup->save();
 		}
 		Log::info('转换审核规则表完成');

+ 21 - 30
app/Http/Controllers/AdminController.php

@@ -53,16 +53,10 @@ use Validator;
  * @package App\Http\Controllers
  */
 class AdminController extends Controller {
-	protected static $sysConfig;
-
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	public function index() {
-		$past = strtotime("-".self::$sysConfig['expire_days']." days");
+		$past = strtotime("-".sysConfig('expire_days')." days");
 
-		$view['expireDays'] = self::$sysConfig['expire_days'];
+		$view['expireDays'] = sysConfig('expire_days');
 		$view['totalUserCount'] = User::count(); // 总用户数
 		$view['enableUserCount'] = User::whereEnable(1)->count(); // 有效用户数
 		$view['activeUserCount'] = User::where('t', '>=', $past)->count(); // 活跃用户数
@@ -70,7 +64,7 @@ class AdminController extends Controller {
 		$view['onlineUserCount'] = User::where('t', '>=', strtotime("-10 minutes"))->count(); // 10分钟内在线用户数
 		$view['expireWarningUserCount'] = User::whereBetween('expired_at', [
 			date('Y-m-d'),
-			strtotime("+".self::$sysConfig['expire_days']." days")
+			strtotime("+".sysConfig('expire_days')." days")
 		])->count(); // 临近过期用户数
 		$view['largeTrafficUserCount'] = User::whereRaw('(u + d) >= 107374182400')
 		                                     ->where('status', '<>', -1)
@@ -105,7 +99,7 @@ class AdminController extends Controller {
 		                                          ->selectRaw("user_id, sum(total) as totalTraffic")
 		                                          ->get(); // 只统计50M以上的记录,加快速度
 		foreach($userTotalTrafficList as $user){
-			if($user->totalTraffic > self::$sysConfig['traffic_ban_value'] * GB){
+			if($user->totalTraffic > sysConfig('traffic_ban_value') * GB){
 				$result[] = $user->user_id;
 			}
 		}
@@ -163,7 +157,7 @@ class AdminController extends Controller {
 		// 临近过期提醒
 		if($expireWarning){
 			$query->whereBetween('expired_at',
-				[date('Y-m-d'), date('Y-m-d', strtotime("+".self::$sysConfig['expire_days']." days"))]);
+				[date('Y-m-d'), date('Y-m-d', strtotime("+".sysConfig('expire_days')." days"))]);
 		}
 
 		// 当前在线
@@ -173,7 +167,7 @@ class AdminController extends Controller {
 
 		// 不活跃用户
 		if($request->input('unActive')){
-			$query->whereBetween('t', [1, strtotime("-".self::$sysConfig['expire_days']." days")])->whereEnable(1);
+			$query->whereBetween('t', [1, strtotime("-".sysConfig('expire_days')." days")])->whereEnable(1);
 		}
 
 		// 1小时内流量异常用户
@@ -197,10 +191,10 @@ class AdminController extends Controller {
 
 			// 流量异常警告
 			$totalTraffic = UserHourlyDataFlow::userRecentUsed($user->id)->sum('total');
-			$user->trafficWarning = $totalTraffic > (self::$sysConfig['traffic_ban_value'] * GB)? 1 : 0;
+			$user->trafficWarning = $totalTraffic > (sysConfig('traffic_ban_value') * GB)? 1 : 0;
 
 			// 订阅地址
-			$user->link = (self::$sysConfig['subscribe_domain']?: self::$sysConfig['website_url']).'/s/'.$user->subscribe->code;
+			$user->link = (sysConfig('subscribe_domain')?: sysConfig('website_url')).'/s/'.$user->subscribe->code;
 		}
 
 		$view['userList'] = $userList;
@@ -266,7 +260,7 @@ class AdminController extends Controller {
 
 	// 生成端口
 	public function makePort(): int {
-		return self::$sysConfig['is_rand_port']? Helpers::getRandPort() : Helpers::getOnlyPort();
+		return Helpers::getPort();
 	}
 
 	// 批量生成账号
@@ -986,7 +980,7 @@ class AdminController extends Controller {
 
 	// 系统设置
 	public function system() {
-		$view = self::$sysConfig;
+		$view = Config::pluck('value', 'name')->toArray();
 		$view['labelList'] = Label::orderByDesc('sort')->orderBy('id')->get();
 
 		return view('admin.config.system', $view);
@@ -994,7 +988,7 @@ class AdminController extends Controller {
 
 	// 设置某个配置项
 	public function setConfig(Request $request): JsonResponse {
-		$name = (string) $request->input('name');
+		$name = $request->input('name');
 		$value = $request->input('value');
 
 		if(!$name){
@@ -1002,7 +996,7 @@ class AdminController extends Controller {
 		}
 
 		// 屏蔽异常配置
-		if(!array_key_exists($name, self::$sysConfig)){
+		if(!in_array($name, Config::pluck('name')->toArray())){
 			return Response::json(['status' => 'fail', 'message' => '设置失败:配置不存在']);
 		}
 
@@ -1024,35 +1018,32 @@ class AdminController extends Controller {
 		if($value !== null && in_array($name, ['is_AliPay', 'is_QQPay', 'is_WeChatPay', 'is_otherPay'], true)){
 			switch($value){
 				case 'f2fpay':
-					if(!self::$sysConfig['f2fpay_app_id'] || !self::$sysConfig['f2fpay_private_key']
-					   || !self::$sysConfig['f2fpay_public_key']){
+					if(!sysConfig('f2fpay_app_id') || !sysConfig('f2fpay_private_key') || !sysConfig('f2fpay_public_key')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【支付宝F2F】必要参数']);
 					}
 					break;
 				case 'codepay':
-					if(!self::$sysConfig['codepay_url'] || !self::$sysConfig['codepay_id']
-					   || !self::$sysConfig['codepay_key']){
+					if(!sysConfig('codepay_url') || !sysConfig('codepay_id') || !sysConfig('codepay_key')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【码支付】必要参数']);
 					}
 					break;
 				case 'epay':
-					if(!self::$sysConfig['epay_url'] || !self::$sysConfig['epay_mch_id'] || !self::$sysConfig['epay_key']){
+					if(!sysConfig('epay_url') || !sysConfig('epay_mch_id') || !sysConfig('epay_key')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【易支付】必要参数']);
 					}
 					break;
 				case 'payjs':
-					if(!self::$sysConfig['payjs_mch_id'] || !self::$sysConfig['payjs_key']){
+					if(!sysConfig('payjs_mch_id') || !sysConfig('payjs_key')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【PayJs】必要参数']);
 					}
 					break;
 				case 'bitpayx':
-					if(!self::$sysConfig['bitpay_secret']){
+					if(!sysConfig('bitpay_secret')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【麻瓜宝】必要参数']);
 					}
 					break;
 				case 'paypal':
-					if(!self::$sysConfig['paypal_username'] || !self::$sysConfig['paypal_password']
-					   || !self::$sysConfig['paypal_secret']){
+					if(!sysConfig('paypal_username') || !sysConfig('paypal_password') || !sysConfig('paypal_secret')){
 						return Response::json(['status' => 'fail', 'message' => '请先设置【PayPal】必要参数']);
 					}
 					break;
@@ -1091,12 +1082,12 @@ class AdminController extends Controller {
 
 	// 推送通知测试
 	public function sendTestNotification(): JsonResponse {
-		if(self::$sysConfig['is_notification']){
+		if(sysConfig('is_notification')){
 			$result = PushNotification::send('这是测试的标题', 'ProxyPanel测试内容');
 			if($result === false){
 				return Response::json(['status' => 'fail', 'message' => '发送失败,请重新尝试!']);
 			}
-			switch(self::$sysConfig['is_notification']){
+			switch(sysConfig('is_notification')){
 				case 'serverChan':
 					if(!$result['errno']){
 						return Response::json(['status' => 'success', 'message' => '发送成功,请查看手机是否收到推送消息']);
@@ -1135,7 +1126,7 @@ class AdminController extends Controller {
 			$obj->invitee_id = 0;
 			$obj->code = strtoupper(substr(md5(microtime().Str::random(6)), 8, 12));
 			$obj->status = 0;
-			$obj->dateline = date('Y-m-d H:i:s', strtotime("+".self::$sysConfig['admin_invite_days']." days"));
+			$obj->dateline = date('Y-m-d H:i:s', strtotime("+".sysConfig('admin_invite_days')." days"));
 			$obj->save();
 		}
 

+ 40 - 50
app/Http/Controllers/AuthController.php

@@ -38,12 +38,6 @@ use Validator;
  * @package App\Http\Controllers
  */
 class AuthController extends Controller {
-	protected static $sysConfig;
-
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	// 登录
 	public function login(Request $request) {
 		if($request->isMethod('POST')){
@@ -85,10 +79,10 @@ class AuthController extends Controller {
 					Auth::logout(); // 强制销毁会话,因为Auth::attempt的时候会产生会话
 
 					return Redirect::back()->withInput()->withErrors(trans('auth.login_ban',
-						['email' => self::$sysConfig['webmaster_email']]));
+						['email' => sysConfig('webmaster_email')]));
 				}
 
-				if($user->status == 0 && self::$sysConfig['is_activate_account']){
+				if($user->status == 0 && sysConfig('is_activate_account')){
 					Auth::logout(); // 强制销毁会话,因为Auth::attempt的时候会产生会话
 
 					return Redirect::back()
@@ -124,7 +118,7 @@ class AuthController extends Controller {
 
 	// 校验验证码
 	private function check_captcha($request) {
-		switch(self::$sysConfig['is_captcha']){
+		switch(sysConfig('is_captcha')){
 			case 1: // 默认图形验证码
 				if(!Captcha::check($request->input('captcha'))){
 					return Redirect::back()->withInput()->withErrors(trans('auth.captcha_error'));
@@ -169,8 +163,8 @@ class AuthController extends Controller {
 	/**
 	 * 添加用户登录日志
 	 *
-	 * @param  string  $userId  用户ID
-	 * @param  string  $ip      IP地址
+	 * @param  integer  $userId  用户ID
+	 * @param  string   $ip      IP地址
 	 */
 	private function addUserLoginLog($userId, $ip): void {
 		if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){
@@ -264,12 +258,12 @@ class AuthController extends Controller {
 			Session::forget('register_token');
 
 			// 是否开启注册
-			if(!self::$sysConfig['is_register']){
+			if(!sysConfig('is_register')){
 				return Redirect::back()->withErrors(trans('auth.register_close'));
 			}
 
 			// 校验域名邮箱黑白名单
-			if(self::$sysConfig['is_email_filtering']){
+			if(sysConfig('is_email_filtering')){
 				$result = $this->emailChecker($email, 1);
 				if($result !== false){
 					return $result;
@@ -277,12 +271,7 @@ class AuthController extends Controller {
 			}
 
 			// 如果需要邀请注册
-			if(self::$sysConfig['is_invite_register']){
-				// 必须使用邀请码
-				if(self::$sysConfig['is_invite_register'] == 2 && !$code){
-					return Redirect::back()->withInput()->withErrors(trans('auth.code_null'));
-				}
-
+			if(sysConfig('is_invite_register')){
 				// 校验邀请码合法性
 				if($code){
 					if(Invite::whereCode($code)->whereStatus(0)->doesntExist()){
@@ -290,11 +279,13 @@ class AuthController extends Controller {
 						               ->withInput($request->except(['code']))
 						               ->withErrors(trans('auth.code_error'));
 					}
+				}elseif(sysConfig('is_invite_register') == 2){ // 必须使用邀请码
+					return Redirect::back()->withInput()->withErrors(trans('auth.code_null'));
 				}
 			}
 
 			// 注册前发送激活码
-			if(self::$sysConfig['is_activate_account'] == 1){
+			if(sysConfig('is_activate_account') == 1){
 				if(!$verify_code){
 					return Redirect::back()
 					               ->withInput($request->except(['verify_code']))
@@ -319,9 +310,9 @@ class AuthController extends Controller {
 			}
 
 			// 24小时内同IP注册限制
-			if(self::$sysConfig['register_ip_limit'] && Cache::has($cacheKey)){
+			if(sysConfig('register_ip_limit') && Cache::has($cacheKey)){
 				$registerTimes = Cache::get($cacheKey);
-				if($registerTimes >= self::$sysConfig['register_ip_limit']){
+				if($registerTimes >= sysConfig('register_ip_limit')){
 					return Redirect::back()
 					               ->withInput($request->except(['code']))
 					               ->withErrors(trans('auth.register_anti'));
@@ -329,8 +320,8 @@ class AuthController extends Controller {
 			}
 
 			// 获取可用端口
-			$port = self::$sysConfig['is_rand_port']? Helpers::getRandPort() : Helpers::getOnlyPort();
-			if($port > self::$sysConfig['max_port']){
+			$port = Helpers::getPort();
+			if($port > sysConfig('max_port')){
 				return Redirect::back()->withInput()->withErrors(trans('auth.register_close'));
 			}
 
@@ -338,10 +329,10 @@ class AuthController extends Controller {
 			$affArr = $this->getAff($code, $aff);
 			$inviter_id = $affArr['inviter_id'];
 
-			$transfer_enable = MB * (self::$sysConfig['default_traffic'] + ($inviter_id? self::$sysConfig['referral_traffic'] : 0));
+			$transfer_enable = MB * ((int) sysConfig('default_traffic') + ($inviter_id? (int) sysConfig('referral_traffic') : 0));
 
 			// 创建新用户
-			$uid = Helpers::addUser($email, Hash::make($password), $transfer_enable, self::$sysConfig['default_days'],
+			$uid = Helpers::addUser($email, Hash::make($password), $transfer_enable, sysConfig('default_days'),
 				$inviter_id);
 
 			// 注册失败,抛出异常
@@ -359,7 +350,7 @@ class AuthController extends Controller {
 			}
 
 			// 更新邀请码
-			if(self::$sysConfig['is_invite_register'] && $affArr['code_id']){
+			if($affArr['code_id'] && sysConfig('is_invite_register')){
 				Invite::find($affArr['code_id'])->update(['invitee_id' => $uid, 'status' => 1]);
 			}
 
@@ -367,10 +358,10 @@ class AuthController extends Controller {
 			Cookie::unqueue('register_aff');
 
 			// 注册后发送激活码
-			if(self::$sysConfig['is_activate_account'] == 2){
+			if(sysConfig('is_activate_account') == 2){
 				// 生成激活账号的地址
 				$token = $this->addVerifyUrl($uid, $email);
-				$activeUserUrl = self::$sysConfig['website_url'].'/active/'.$token;
+				$activeUserUrl = sysConfig('website_url').'/active/'.$token;
 
 				$logId = Helpers::addNotificationLog('注册激活', '请求地址:'.$activeUserUrl, 1, $email);
 				Mail::to($email)->send(new activeUser($logId, $activeUserUrl));
@@ -381,11 +372,11 @@ class AuthController extends Controller {
 				if($inviter_id){
 					$referralUser = User::find($inviter_id);
 					if($referralUser && $referralUser->expired_at >= date('Y-m-d')){
-						(new UserService($referralUser))->incrementData(self::$sysConfig['referral_traffic'] * MB);
+						(new UserService($referralUser))->incrementData(sysConfig('referral_traffic') * MB);
 					}
 				}
 
-				if(self::$sysConfig['is_activate_account'] == 1){
+				if(sysConfig('is_activate_account') == 1){
 					User::find($uid)->update(['status' => 1]);
 				}
 
@@ -395,7 +386,7 @@ class AuthController extends Controller {
 			return Redirect::to('login')->withInput();
 		}
 
-		$view['emailList'] = self::$sysConfig['is_email_filtering'] != 2? false : EmailFilter::whereType(2)->get();
+		$view['emailList'] = sysConfig('is_email_filtering') != 2? false : EmailFilter::whereType(2)->get();
 		Session::put('register_token', Str::random());
 
 		return view('auth.register', $view);
@@ -403,9 +394,9 @@ class AuthController extends Controller {
 
 	//邮箱检查
 	private function emailChecker($email, $returnType = 0) {
-		$emailFilterList = $this->emailFilterList(self::$sysConfig['is_email_filtering']);
+		$emailFilterList = $this->emailFilterList(sysConfig('is_email_filtering'));
 		$emailSuffix = explode('@', $email); // 提取邮箱后缀
-		switch(self::$sysConfig['is_email_filtering']){
+		switch(sysConfig('is_email_filtering')){
 			// 黑名单
 			case 1:
 				if(in_array(strtolower($emailSuffix[1]), $emailFilterList, true)){
@@ -470,7 +461,7 @@ class AuthController extends Controller {
 
 	// 生成申请的请求地址
 	private function addVerifyUrl($uid, $email) {
-		$token = md5(self::$sysConfig['website_name'].$email.microtime());
+		$token = md5(sysConfig('website_name').$email.microtime());
 		$verify = new Verify();
 		$verify->type = 1;
 		$verify->user_id = $uid;
@@ -499,9 +490,9 @@ class AuthController extends Controller {
 			$email = $request->input('email');
 
 			// 是否开启重设密码
-			if(!self::$sysConfig['is_reset_password']){
+			if(!sysConfig('is_reset_password')){
 				return Redirect::back()->withErrors(trans('auth.reset_password_close',
-					['email' => self::$sysConfig['webmaster_email']]));
+					['email' => sysConfig('webmaster_email')]));
 			}
 
 			// 查找账号
@@ -514,9 +505,9 @@ class AuthController extends Controller {
 			$resetTimes = 0;
 			if(Cache::has('resetPassword_'.md5($email))){
 				$resetTimes = Cache::get('resetPassword_'.md5($email));
-				if($resetTimes >= self::$sysConfig['reset_password_times']){
+				if($resetTimes >= sysConfig('reset_password_times')){
 					return Redirect::back()->withErrors(trans('auth.reset_password_limit',
-						['time' => self::$sysConfig['reset_password_times']]));
+						['time' => sysConfig('reset_password_times')]));
 				}
 			}
 
@@ -524,7 +515,7 @@ class AuthController extends Controller {
 			$token = $this->addVerifyUrl($user->id, $email);
 
 			// 发送邮件
-			$resetPasswordUrl = self::$sysConfig['website_url'].'/reset/'.$token;
+			$resetPasswordUrl = sysConfig('website_url').'/reset/'.$token;
 
 			$logId = Helpers::addNotificationLog('重置密码', '请求地址:'.$resetPasswordUrl, 1, $email);
 			Mail::to($email)->send(new resetPassword($logId, $resetPasswordUrl));
@@ -626,16 +617,15 @@ class AuthController extends Controller {
 			$email = $request->input('email');
 
 			// 是否开启账号激活
-			if(self::$sysConfig['is_activate_account'] != 2){
+			if(sysConfig('is_activate_account') != 2){
 				return Redirect::back()->withInput()->withErrors(trans('auth.active_close',
-					['email' => self::$sysConfig['webmaster_email']]));
+					['email' => sysConfig('webmaster_email')]));
 			}
 
 			// 查找账号
 			$user = User::whereEmail($email)->firstOrFail();
 			if($user->status < 0){
-				return Redirect::back()->withErrors(trans('auth.login_ban',
-					['email' => self::$sysConfig['webmaster_email']]));
+				return Redirect::back()->withErrors(trans('auth.login_ban', ['email' => sysConfig('webmaster_email')]));
 			}
 
 			if($user->status > 0){
@@ -646,9 +636,9 @@ class AuthController extends Controller {
 			$activeTimes = 0;
 			if(Cache::has('activeUser_'.md5($email))){
 				$activeTimes = Cache::get('activeUser_'.md5($email));
-				if($activeTimes >= self::$sysConfig['active_times']){
+				if($activeTimes >= sysConfig('active_times')){
 					return Redirect::back()->withErrors(trans('auth.active_limit',
-						['time' => self::$sysConfig['webmaster_email']]));
+						['time' => sysConfig('webmaster_email')]));
 				}
 			}
 
@@ -656,7 +646,7 @@ class AuthController extends Controller {
 			$token = $this->addVerifyUrl($user->id, $email);
 
 			// 发送邮件
-			$activeUserUrl = self::$sysConfig['website_url'].'/active/'.$token;
+			$activeUserUrl = sysConfig('website_url').'/active/'.$token;
 
 			$logId = Helpers::addNotificationLog('激活账号', '请求地址:'.$activeUserUrl, 1, $email);
 			Mail::to($email)->send(new activeUser($logId, $activeUserUrl));
@@ -723,7 +713,7 @@ class AuthController extends Controller {
 		// 账号激活后给邀请人送流量
 		$inviter = $user->inviter;
 		if($inviter){
-			(new UserService($inviter))->incrementData(self::$sysConfig['referral_traffic'] * MB);
+			(new UserService($inviter))->incrementData(sysConfig('referral_traffic') * MB);
 		}
 
 		Session::flash('successMsg', trans('auth.active_success'));
@@ -748,7 +738,7 @@ class AuthController extends Controller {
 		}
 
 		// 校验域名邮箱黑白名单
-		if(self::$sysConfig['is_email_filtering']){
+		if(sysConfig('is_email_filtering')){
 			$result = $this->emailChecker($email);
 			if($result !== false){
 				return $result;
@@ -756,7 +746,7 @@ class AuthController extends Controller {
 		}
 
 		// 是否开启注册发送验证码
-		if(self::$sysConfig['is_activate_account'] != 1){
+		if(sysConfig('is_activate_account') != 1){
 			return Response::json(['status' => 'fail', 'message' => trans('auth.captcha_close')]);
 		}
 

+ 0 - 7
app/Http/Controllers/Gateway/AbstractPayment.php

@@ -2,7 +2,6 @@
 
 namespace App\Http\Controllers\Gateway;
 
-use App\Components\Helpers;
 use App\Models\Payment;
 use App\Models\PaymentCallback;
 use Illuminate\Http\JsonResponse;
@@ -10,12 +9,6 @@ use Illuminate\Http\Request;
 use Str;
 
 abstract class AbstractPayment {
-	protected static $sysConfig;
-
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	abstract public function purchase(Request $request): JsonResponse;
 
 	abstract public function notify(Request $request): void;

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

@@ -18,10 +18,10 @@ class BitpayX extends AbstractPayment {
 			'price_amount'      => $payment->amount,
 			'price_currency'    => 'CNY',
 			'title'             => '支付单号:'.$payment->trade_no,
-			'description'       => self::$sysConfig['subject_name']?: self::$sysConfig['website_name'],
-			'callback_url'      => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=bitpayx',
-			'success_url'       => self::$sysConfig['website_url'].'/invoices',
-			'cancel_url'        => self::$sysConfig['website_url'].'/invoices',
+			'description'       => sysConfig('subject_name')?: sysConfig('website_name'),
+			'callback_url'      => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=bitpayx',
+			'success_url'       => sysConfig('website_url').'/invoices',
+			'cancel_url'        => sysConfig('website_url').'/invoices',
 			'token'             => $this->sign($payment->trade_no),
 		];
 		$result = $this->sendRequest($data);
@@ -40,11 +40,11 @@ class BitpayX extends AbstractPayment {
 	private function sign($tradeNo): string {
 		$data = [
 			'merchant_order_id' => $tradeNo,
-			'secret'            => self::$sysConfig['bitpay_secret'],
+			'secret'            => sysConfig('bitpay_secret'),
 			'type'              => 'FIAT'
 		];
 
-		return $this->aliStyleSign($data, self::$sysConfig['bitpay_secret']);
+		return $this->aliStyleSign($data, sysConfig('bitpay_secret'));
 	}
 
 	private function sendRequest($data, $type = 'createOrder') {
@@ -52,7 +52,7 @@ class BitpayX extends AbstractPayment {
 			'base_uri' => 'https://api.mugglepay.com/v1/',
 			'timeout'  => 15,
 			'headers'  => [
-				'token'        => self::$sysConfig['bitpay_secret'],
+				'token'        => sysConfig('bitpay_secret'),
 				'content-type' => 'application/json'
 			]
 		]);

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

@@ -12,18 +12,18 @@ class CodePay extends AbstractPayment {
 		$payment = $this->creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount'));
 
 		$data = [
-			'id'         => self::$sysConfig['codepay_id'],
+			'id'         => sysConfig('codepay_id'),
 			'pay_id'     => $payment->trade_no,
 			'type'       => $request->input('type'),            //1支付宝支付 2QQ钱包 3微信支付
 			'price'      => $payment->amount,
 			'page'       => 1,
 			'outTime'    => 900,
-			'notify_url' => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=codepay',
-			'return_url' => self::$sysConfig['website_url'].'/invoices',
+			'notify_url' => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=codepay',
+			'return_url' => sysConfig('website_url').'/invoices',
 		];
-		$data['sign'] = $this->aliStyleSign($data, self::$sysConfig['codepay_key']);
+		$data['sign'] = $this->aliStyleSign($data, sysConfig('codepay_key'));
 
-		$url = self::$sysConfig['codepay_url'].http_build_query($data);
+		$url = sysConfig('codepay_url').http_build_query($data);
 		$payment->update(['url' => $url]);
 
 		return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']);
@@ -32,8 +32,7 @@ class CodePay extends AbstractPayment {
 	public function notify($request): void {
 		$trade_no = $request->input('pay_id');
 		if($trade_no && $request->input('pay_no')
-		   && $this->verify($request->except('method'), self::$sysConfig['codepay_key'], $request->input('sign'),
-				false)){
+		   && $this->verify($request->except('method'), sysConfig('codepay_key'), $request->input('sign'), false)){
 			$payment = Payment::whereTradeNo($trade_no)->first();
 			if($payment){
 				$ret = $payment->order->update(['status' => 2]);

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

@@ -27,18 +27,18 @@ class EPay extends AbstractPayment {
 		}
 
 		$data = [
-			'pid'          => self::$sysConfig['epay_mch_id'],
+			'pid'          => sysConfig('epay_mch_id'),
 			'type'         => $type,
-			'notify_url'   => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=epay',
-			'return_url'   => self::$sysConfig['website_url'].'/invoices',
+			'notify_url'   => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=epay',
+			'return_url'   => sysConfig('website_url').'/invoices',
 			'out_trade_no' => $payment->trade_no,
-			'name'         => self::$sysConfig['subject_name']?: self::$sysConfig['website_name'],
+			'name'         => sysConfig('subject_name')?: sysConfig('website_name'),
 			'money'        => $payment->amount,
 			'sign_type'    => 'MD5'
 		];
-		$data['sign'] = $this->aliStyleSign($data, self::$sysConfig['epay_key']);
+		$data['sign'] = $this->aliStyleSign($data, sysConfig('epay_key'));
 
-		$url = self::$sysConfig['epay_url'].'submit.php?'.http_build_query($data);
+		$url = sysConfig('epay_url').'submit.php?'.http_build_query($data);
 		$payment->update(['url' => $url]);
 
 		return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']);
@@ -46,7 +46,7 @@ class EPay extends AbstractPayment {
 
 	public function notify(Request $request): void {
 		if($request->input('trade_status') === 'TRADE_SUCCESS'
-		   && $this->verify($request->except('method'), self::$sysConfig['epay_key'], $request->input('sign'))){
+		   && $this->verify($request->except('method'), sysConfig('epay_key'), $request->input('sign'))){
 			$payment = Payment::whereTradeNo($request->input('out_trade_no'))->first();
 			if($payment){
 				$ret = $payment->order->update(['status' => 2]);
@@ -59,11 +59,11 @@ class EPay extends AbstractPayment {
 	}
 
 	public function queryInfo(): JsonResponse {
-		$request = (new Client())->get(self::$sysConfig['epay_url'].'api.php', [
+		$request = (new Client())->get(sysConfig('epay_url').'api.php', [
 			'query' => [
 				'act' => 'query',
-				'pid' => self::$sysConfig['epay_mch_id'],
-				'key' => self::$sysConfig['epay_key']
+				'pid' => sysConfig('epay_mch_id'),
+				'key' => sysConfig('epay_key')
 			]
 		]);
 		if($request->getStatusCode() == 200){

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

@@ -16,16 +16,15 @@ class F2Fpay extends AbstractPayment {
 	private static $aliConfig;
 
 	public function __construct() {
-		parent::__construct();
 		self::$aliConfig = [
 			'use_sandbox'     => false,
-			'app_id'          => self::$sysConfig['f2fpay_app_id'],
+			'app_id'          => sysConfig('f2fpay_app_id'),
 			'sign_type'       => 'RSA2',
-			'ali_public_key'  => self::$sysConfig['f2fpay_public_key'],
-			'rsa_private_key' => self::$sysConfig['f2fpay_private_key'],
+			'ali_public_key'  => sysConfig('f2fpay_public_key'),
+			'rsa_private_key' => sysConfig('f2fpay_private_key'),
 			'limit_pay'       => [],
-			'notify_url'      => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=f2fpay',
-			'return_url'      => self::$sysConfig['website_url'].'/invoices',
+			'notify_url'      => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=f2fpay',
+			'return_url'      => sysConfig('website_url').'/invoices',
 			'fee_type'        => 'CNY',
 		];
 	}
@@ -35,7 +34,7 @@ class F2Fpay extends AbstractPayment {
 
 		$data = [
 			'body'        => '',
-			'subject'     => self::$sysConfig['subject_name']?: self::$sysConfig['website_name'],
+			'subject'     => sysConfig('subject_name')?: sysConfig('website_name'),
 			'trade_no'    => $payment->trade_no,
 			'time_expire' => time() + 900, // 必须 15分钟 内付款
 			'amount'      => $payment->amount,

+ 4 - 5
app/Http/Controllers/Gateway/PayJs.php

@@ -12,10 +12,9 @@ class PayJs extends AbstractPayment {
 	private static $config;
 
 	public function __construct() {
-		parent::__construct();
 		self::$config = [
-			'mchid' => self::$sysConfig['payjs_mch_id'],   // 配置商户号
-			'key'   => self::$sysConfig['payjs_key'],   // 配置通信密钥
+			'mchid' => sysConfig('payjs_mch_id'),   // 配置商户号
+			'key'   => sysConfig('payjs_key'),   // 配置通信密钥
 		];
 	}
 
@@ -23,10 +22,10 @@ class PayJs extends AbstractPayment {
 		$payment = $this->creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount'));
 
 		$result = (new Pay($this::$config))->cashier([
-			'body'         => self::$sysConfig['subject_name']?: self::$sysConfig['website_name'],
+			'body'         => sysConfig('subject_name')?: sysConfig('website_name'),
 			'total_fee'    => $payment->amount * 100,
 			'out_trade_no' => $payment->trade_no,
-			'notify_url'   => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=payjs',
+			'notify_url'   => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=payjs',
 		]);
 
 		// 获取收款二维码内容

+ 10 - 11
app/Http/Controllers/Gateway/PayPal.php

@@ -18,22 +18,21 @@ class PayPal extends AbstractPayment {
 	protected $exChange;
 
 	public function __construct() {
-		parent::__construct();
 		$this->provider = new ExpressCheckout();
 		$config = [
 			'mode' => 'live',
 			'live' => [
-				'username'    => self::$sysConfig['paypal_username'],
-				'password'    => self::$sysConfig['paypal_password'],
-				'secret'      => self::$sysConfig['paypal_secret'],
-				'certificate' => self::$sysConfig['paypal_certificate'],
-				'app_id'      => self::$sysConfig['paypal_app_id'],
+				'username'    => sysConfig('paypal_username'),
+				'password'    => sysConfig('paypal_password'),
+				'secret'      => sysConfig('paypal_secret'),
+				'certificate' => sysConfig('paypal_certificate'),
+				'app_id'      => sysConfig('paypal_app_id'),
 			],
 
 			'payment_action' => 'Sale',
 			'currency'       => 'USD',
 			'billing_type'   => 'MerchantInitiatedBilling',
-			'notify_url'     => (self::$sysConfig['website_callback_url']?: self::$sysConfig['website_url']).'/callback/notify?method=paypal',
+			'notify_url'     => (sysConfig('website_callback_url')?: sysConfig('website_url')).'/callback/notify?method=paypal',
 			'locale'         => 'zh_CN',
 			'validate_ssl'   => true,
 		];
@@ -76,15 +75,15 @@ class PayPal extends AbstractPayment {
 			'invoice_id'          => $trade_no,
 			'items'               => [
 				[
-					'name'  => self::$sysConfig['subject_name']?: self::$sysConfig['website_name'],
+					'name'  => sysConfig('subject_name')?: sysConfig('website_name'),
 					'price' => $amount,
-					'desc'  => 'Description for'.(self::$sysConfig['subject_name']?: self::$sysConfig['website_name']),
+					'desc'  => 'Description for'.(sysConfig('subject_name')?: sysConfig('website_name')),
 					'qty'   => 1
 				]
 			],
 			'invoice_description' => $trade_no,
-			'return_url'          => self::$sysConfig['website_url'].'/callback/checkout',
-			'cancel_url'          => self::$sysConfig['website_url'].'/invoices',
+			'return_url'          => sysConfig('website_url').'/callback/checkout',
+			'cancel_url'          => sysConfig('website_url').'/invoices',
 			'total'               => $amount,
 		];
 	}

+ 6 - 13
app/Http/Controllers/User/AffiliateController.php

@@ -2,7 +2,6 @@
 
 namespace App\Http\Controllers\User;
 
-use App\Components\Helpers;
 use App\Http\Controllers\Controller;
 use App\Models\Order;
 use App\Models\ReferralApply;
@@ -12,24 +11,18 @@ use Illuminate\Http\JsonResponse;
 use Response;
 
 class AffiliateController extends Controller {
-	protected static $sysConfig;
-
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	// 推广返利
 	public function referral() {
 		if(ReferralLog::uid()->doesntExist() && Order::uid()->whereStatus(2)->doesntExist()){
 			return Response::view('auth.error',
 				['message' => '本功能对非付费用户禁用!请 <a class="btn btn-sm btn-danger" href="/">返 回</a>'], 402);
 		}
-		$view['referral_traffic'] = flowAutoShow(self::$sysConfig['referral_traffic'] * MB);
-		$view['referral_percent'] = self::$sysConfig['referral_percent'];
-		$view['referral_money'] = self::$sysConfig['referral_money'];
+		$view['referral_traffic'] = flowAutoShow(sysConfig('referral_traffic') * MB);
+		$view['referral_percent'] = sysConfig('referral_percent');
+		$view['referral_money'] = sysConfig('referral_money');
 		$view['totalAmount'] = ReferralLog::uid()->sum('commission') / 100;
 		$view['canAmount'] = ReferralLog::uid()->whereStatus(0)->sum('commission') / 100;
-		$view['aff_link'] = self::$sysConfig['website_url'].'/register?aff='.Auth::id();
+		$view['aff_link'] = sysConfig('website_url').'/register?aff='.Auth::id();
 		$view['referralLogList'] = ReferralLog::uid()
 		                                      ->with('invitee:id,email')
 		                                      ->latest()
@@ -60,10 +53,10 @@ class AffiliateController extends Controller {
 		// 校验可以提现金额是否超过系统设置的阀值
 		$commission = ReferralLog::uid()->whereStatus(0)->sum('commission');
 		$commission /= 100;
-		if($commission < self::$sysConfig['referral_money']){
+		if($commission < sysConfig('referral_money')){
 			return Response::json([
 				'status'  => 'fail',
-				'message' => '申请失败:满'.self::$sysConfig['referral_money'].'元才可以提现,继续努力吧'
+				'message' => '申请失败:满'.sysConfig('referral_money').'元才可以提现,继续努力吧'
 			]);
 		}
 

+ 5 - 11
app/Http/Controllers/User/SubscribeController.php

@@ -2,7 +2,6 @@
 
 namespace App\Http\Controllers\User;
 
-use App\Components\Helpers;
 use App\Http\Controllers\Controller;
 use App\Models\UserSubscribe;
 use App\Models\UserSubscribeLog;
@@ -12,13 +11,8 @@ use Redirect;
 use Response;
 
 class SubscribeController extends Controller {
-	protected static $sysConfig;
 	private $subType;
 
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	// 通过订阅码获取订阅信息
 	public function getSubscribeByCode(Request $request, $code) {
 		if(empty($code)){
@@ -84,21 +78,21 @@ class SubscribeController extends Controller {
 		}
 
 		// 打乱数组
-		if(self::$sysConfig['rand_subscribe']){
+		if(sysConfig('rand_subscribe')){
 			$nodeList = Arr::shuffle($nodeList);
 		}
 
 		$scheme = null;
 
 		// 展示到期时间和剩余流量
-		if(self::$sysConfig['is_custom_subscribe']){
+		if(sysConfig('is_custom_subscribe')){
 			$scheme .= $this->infoGenerator('到期时间: '.($user->expired_at < date('Y-m-d')? '过期' : $user->expired_at)).$this->infoGenerator('剩余流量: '.flowAutoShow($user->transfer_enable - $user->u - $user->d));
 		}
 
 		// 控制客户端最多获取节点数
 		foreach($nodeList as $key => $node){
 			// 控制显示的节点数
-			if(self::$sysConfig['subscribe_max'] && $key >= self::$sysConfig['subscribe_max']){
+			if(sysConfig('subscribe_max') && $key >= sysConfig('subscribe_max')){
 				break;
 			}
 
@@ -112,7 +106,7 @@ class SubscribeController extends Controller {
 		];
 
 		// 适配Quantumult的自定义订阅头
-		if(self::$sysConfig['is_custom_subscribe']){
+		if(sysConfig('is_custom_subscribe')){
 			$headers['Subscription-Userinfo'] = 'upload='.$user->u.'; download='.$user->d.'; total='.$user->transfer_enable.'; expire='.strtotime($user->expired_at);
 		}
 
@@ -144,7 +138,7 @@ class SubscribeController extends Controller {
 			case 1:
 			case 4:
 			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::$sysConfig['website_name']).'&udpport=0&uot=0');
+				$result = 'ssr://'.base64url_encode('0.0.0.0:0:origin:none:plain:'.base64url_encode('0000').'/?obfsparam=&protoparam=&remarks='.base64url_encode($text).'&group='.base64url_encode(sysConfig('website_name')).'&udpport=0&uot=0');
 				break;
 
 		}

+ 18 - 25
app/Http/Controllers/UserController.php

@@ -45,12 +45,6 @@ use Validator;
  * @package App\Http\Controllers
  */
 class UserController extends Controller {
-	protected static $sysConfig;
-
-	public function __construct() {
-		self::$sysConfig = Helpers::sysConfig();
-	}
-
 	public function index() {
 		$user = Auth::getUser();
 		$totalTransfer = $user->transfer_enable;
@@ -66,7 +60,7 @@ class UserController extends Controller {
 		$view['noticeList'] = Article::type(2)->latest()->Paginate(1); // 公告
 		//流量异常判断
 		$hourlyTraffic = UserHourlyDataFlow::userRecentUsed($user->id)->sum('total');
-		$view['isTrafficWarning'] = $hourlyTraffic >= (self::$sysConfig['traffic_ban_value'] * GB)?: 0;
+		$view['isTrafficWarning'] = $hourlyTraffic >= (sysConfig('traffic_ban_value') * GB)?: 0;
 		//付费用户判断
 		$view['not_paying_user'] = Order::uid()->active()->where('origin_amount', '>', 0)->doesntExist();
 		$view['userLoginLog'] = UserLoginLog::whereUserId($user->id)->latest()->first(); // 近期登录日志
@@ -79,7 +73,7 @@ class UserController extends Controller {
 	public function checkIn(): JsonResponse {
 		$user = Auth::getUser();
 		// 系统开启登录加积分功能才可以签到
-		if(!self::$sysConfig['is_checkin']){
+		if(!sysConfig('is_checkin')){
 			return Response::json(['status' => 'fail', 'message' => '系统未开启签到功能']);
 		}
 
@@ -88,8 +82,7 @@ class UserController extends Controller {
 			return Response::json(['status' => 'fail', 'message' => '已经签到过了,明天再来吧']);
 		}
 
-		$traffic = random_int((int) self::$sysConfig['min_rand_traffic'],
-				(int) self::$sysConfig['max_rand_traffic']) * MB;
+		$traffic = random_int((int) sysConfig('min_rand_traffic'), (int) sysConfig('max_rand_traffic')) * MB;
 
 		if(!(new UserService())->incrementData($traffic)){
 			return Response::json(['status' => 'fail', 'message' => '签到失败,系统异常']);
@@ -100,7 +93,7 @@ class UserController extends Controller {
 			'[签到]');
 
 		// 多久后可以再签到
-		$ttl = self::$sysConfig['traffic_limit_time']? self::$sysConfig['traffic_limit_time'] * Minute : Day;
+		$ttl = sysConfig('traffic_limit_time')? sysConfig('traffic_limit_time') * Minute : Day;
 		Cache::put('userCheckIn_'.$user->id, '1', $ttl);
 
 		return Response::json(['status' => 'success', 'message' => '签到成功,系统送您 '.flowAutoShow($traffic).'流量']);
@@ -315,9 +308,9 @@ class UserController extends Controller {
 			$content = "标题:【".$title."】<br>用户:".$user->email."<br>内容:".$content;
 
 			// 发邮件通知管理员
-			if(self::$sysConfig['webmaster_email']){
-				$logId = Helpers::addNotificationLog($emailTitle, $content, 1, self::$sysConfig['webmaster_email']);
-				Mail::to(self::$sysConfig['webmaster_email'])->send(new newTicket($logId, $emailTitle, $content));
+			if(sysConfig('webmaster_email')){
+				$logId = Helpers::addNotificationLog($emailTitle, $content, 1, sysConfig('webmaster_email'));
+				Mail::to(sysConfig('webmaster_email'))->send(new newTicket($logId, $emailTitle, $content));
 			}
 
 			PushNotification::send($emailTitle, $content);
@@ -362,9 +355,9 @@ class UserController extends Controller {
 				$content = "标题:【".$ticket->title."】<br>用户回复:".$content;
 
 				// 发邮件通知管理员
-				if(self::$sysConfig['webmaster_email']){
-					$logId = Helpers::addNotificationLog($title, $content, 1, self::$sysConfig['webmaster_email']);
-					Mail::to(self::$sysConfig['webmaster_email'])->send(new replyTicket($logId, $title, $content));
+				if(sysConfig('webmaster_email')){
+					$logId = Helpers::addNotificationLog($title, $content, 1, sysConfig('webmaster_email'));
+					Mail::to(sysConfig('webmaster_email'))->send(new replyTicket($logId, $title, $content));
 				}
 
 				PushNotification::send($title, $content);
@@ -404,8 +397,8 @@ class UserController extends Controller {
 
 		$view['num'] = Auth::getUser()->invite_num; // 还可以生成的邀请码数量
 		$view['inviteList'] = Invite::uid()->with(['invitee', 'inviter'])->paginate(10); // 邀请码列表
-		$view['referral_traffic'] = flowAutoShow(self::$sysConfig['referral_traffic'] * MB);
-		$view['referral_percent'] = self::$sysConfig['referral_percent'];
+		$view['referral_traffic'] = flowAutoShow(sysConfig('referral_traffic') * MB);
+		$view['referral_percent'] = sysConfig('referral_percent');
 
 		return view('user.invite', $view);
 	}
@@ -422,7 +415,7 @@ class UserController extends Controller {
 		$obj->invitee_id = 0;
 		$obj->code = strtoupper(mb_substr(md5(microtime().Str::random()), 8, 12));
 		$obj->status = 0;
-		$obj->dateline = date('Y-m-d H:i:s', strtotime("+".self::$sysConfig['user_invite_days']." days"));
+		$obj->dateline = date('Y-m-d H:i:s', strtotime("+".sysConfig('user_invite_days')." days"));
 		$obj->save();
 
 		User::uid()->decrement('invite_num', 1);
@@ -512,16 +505,16 @@ class UserController extends Controller {
 		//付费用户判断
 		$view['not_paying_user'] = Order::uid()->active()->where('origin_amount', '>', 0)->doesntExist();
 		//客户端安装
-		$view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.self::$sysConfig['website_url'].'/clients/Shadowrocket.plist';
-		$view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.self::$sysConfig['website_url'].'/clients/Quantumult.plist';
+		$view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Shadowrocket.plist';
+		$view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Quantumult.plist';
 		// 订阅连接
 		$subscribe = UserSubscribe::whereUserId(Auth::id())->firstOrFail();
 		$view['subscribe_status'] = $subscribe->status;
-		$subscribe_link = (self::$sysConfig['subscribe_domain']?: self::$sysConfig['website_url']).'/s/'.$subscribe->code;
+		$subscribe_link = (sysConfig('subscribe_domain')?: sysConfig('website_url')).'/s/'.$subscribe->code;
 		$view['link'] = $subscribe_link;
 		$view['subscribe_link'] = 'sub://'.base64url_encode($subscribe_link);
-		$view['Shadowrocket_link'] = 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(self::$sysConfig['website_name'].'-'.self::$sysConfig['website_url']);
-		$view['Shadowrocket_linkQrcode'] = 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(self::$sysConfig['website_name']);
+		$view['Shadowrocket_link'] = 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(sysConfig('website_name').'-'.sysConfig('website_url'));
+		$view['Shadowrocket_linkQrcode'] = 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(sysConfig('website_name'));
 		$view['Quantumult_linkOut'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf');
 		$view['Quantumult_linkIn'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/BacktoCN.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf');
 

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

@@ -3,8 +3,8 @@
 namespace App\Http\Middleware;
 
 use App\Providers\RouteServiceProvider;
-use Closure;
 use Auth;
+use Closure;
 
 class RedirectIfAuthenticated {
 	/**

+ 13 - 0
app/Observers/ConfigObserver.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Observers;
+
+use App\Models\Config;
+use Cache;
+
+class ConfigObserver {
+	public function updated(Config $config): void {
+		// 更新系统参数缓存
+		Cache::tags('sysConfig')->put($config->name, $config->value?: 0);
+	}
+}

+ 1 - 2
app/Observers/RuleGroupObserver.php

@@ -17,8 +17,7 @@ class RuleGroupObserver {
 			}
 		}elseif(Arr::exists($changes, 'nodes')){
 			$nodes = Node::whereType(4)
-			             ->whereIn('id',
-				             array_diff($ruleGroup->nodes, $ruleGroup->getOriginal('nodes')?: []))
+			             ->whereIn('id', array_diff($ruleGroup->nodes, $ruleGroup->getOriginal('nodes')?: []))
 			             ->get();
 			if($nodes){
 				reloadNode::dispatchNow($nodes);

+ 1 - 2
app/Observers/UserGroupObserver.php

@@ -19,8 +19,7 @@ class UserGroupObserver {
 		$changes = $userGroup->getChanges();
 		if(Arr::exists($changes, 'nodes')){
 			$nodes = Node::whereType(4)
-			             ->whereIn('id',
-				             array_diff($userGroup->nodes, $userGroup->getOriginal('nodes')?: []))
+			             ->whereIn('id', array_diff($userGroup->nodes, $userGroup->getOriginal('nodes')?: []))
 			             ->get();
 			if($nodes){
 				reloadNode::dispatchNow($nodes);

+ 3 - 0
app/Providers/AppServiceProvider.php

@@ -2,11 +2,13 @@
 
 namespace App\Providers;
 
+use App\Models\Config;
 use App\Models\Node;
 use App\Models\Order;
 use App\Models\RuleGroup;
 use App\Models\User;
 use App\Models\UserGroup;
+use App\Observers\ConfigObserver;
 use App\Observers\NodeObserver;
 use App\Observers\OrderObserver;
 use App\Observers\RuleGroupObserver;
@@ -40,6 +42,7 @@ class AppServiceProvider extends ServiceProvider {
 			URL::forceScheme('https');
 		}
 
+		Config::observe(ConfigObserver::class);
 		Node::observe(NodeObserver::class);
 		Order::observe(OrderObserver::class);
 		RuleGroup::observe(RuleGroupObserver::class);

+ 1 - 1
app/View/Components/ChatUnit.php

@@ -12,7 +12,7 @@ class ChatUnit extends Component {
 		$this->user = $user;
 		$this->ticket = $ticket;
 	}
-	
+
 	public function render() {
 		return view('components.chat-unit');
 	}

+ 5 - 1
app/helpers.php

@@ -172,6 +172,10 @@ if(!function_exists('filterEmoji')){
 // 获取系统设置
 if(!function_exists('sysConfig')){
 	function sysConfig($name) {
-		return Helpers::sysConfig()[$name];
+		$ret = Cache::tags('sysConfig')->get($name);
+		if(is_null($ret)){
+			return Helpers::cacheSysConfig($name);
+		}
+		return $ret;
 	}
 }

+ 25 - 25
composer.json

@@ -8,31 +8,31 @@
   ],
   "license": "MIT",
   "require": {
-	"php": "^7.2.5",
-	"fideloper/proxy": "^4.2",
-	"fruitcake/laravel-cors": "^2.0",
-	"guzzlehttp/guzzle": "^6.3",
-	"ipip/db": "^1.0",
-	"itbdw/ip-database": "^2.0",
-	"jenssegers/agent": "^2.6",
-	"laravel/framework": "^7.24",
-	"laravel/tinker": "^2.0",
-	"mews/captcha": "^3.1",
-	"mews/purifier": "^3.2",
-	"openlss/lib-array2xml": "^1.0",
-	"overtrue/laravel-lang": "^4.0",
-	"phpoffice/phpspreadsheet": "^1.14",
-	"rap2hpoutre/laravel-log-viewer": "^1.6",
-	"riverslei/payment": "^5.1",
-	"simplesoftwareio/simple-qrcode": "^3.0",
-	"spatie/laravel-permission": "^3.16",
-	"srmklive/paypal": "^1.7",
-	"xhat/payjs": "^1.4",
-	"zbrettonye/geetest": "^1.1",
-	"zbrettonye/hcaptcha": "^1.0",
-	"zbrettonye/no-captcha": "^1.0",
-	"ext-json": "*",
-	"ext-openssl": "*"
+    "php": "^7.2.5",
+    "ext-json": "*",
+    "ext-openssl": "*",
+    "fideloper/proxy": "^4.2",
+    "fruitcake/laravel-cors": "^2.0",
+    "guzzlehttp/guzzle": "^6.3",
+    "ipip/db": "^1.0",
+    "itbdw/ip-database": "^2.0",
+    "jenssegers/agent": "^2.6",
+    "laravel/framework": "^7.24",
+    "laravel/tinker": "^2.0",
+    "mews/captcha": "^3.1",
+    "mews/purifier": "^3.2",
+    "openlss/lib-array2xml": "^1.0",
+    "overtrue/laravel-lang": "^4.0",
+    "phpoffice/phpspreadsheet": "^1.14",
+    "rap2hpoutre/laravel-log-viewer": "^1.6",
+    "riverslei/payment": "^5.1",
+    "simplesoftwareio/simple-qrcode": "^3.0",
+    "spatie/laravel-permission": "^3.16",
+    "srmklive/paypal": "^1.7",
+    "xhat/payjs": "^1.4",
+    "zbrettonye/geetest": "^1.1",
+    "zbrettonye/hcaptcha": "^1.0",
+    "zbrettonye/no-captcha": "^1.0"
   },
   "require-dev": {
 	"barryvdh/laravel-debugbar": "^3.4",

+ 9 - 8
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "7763dce1918821fed204495e2f09880e",
+    "content-hash": "9cc259d29a4a2882654c83d01a78b8eb",
     "packages": [
         {
             "name": "asm89/stack-cors",
@@ -2250,16 +2250,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.39.0",
+            "version": "2.39.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "0a41ea7f7fedacf307b7a339800e10356a042918"
+                "reference": "7af467873250583cc967a59ee9df29fabab193c1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0a41ea7f7fedacf307b7a339800e10356a042918",
-                "reference": "0a41ea7f7fedacf307b7a339800e10356a042918",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7af467873250583cc967a59ee9df29fabab193c1",
+                "reference": "7af467873250583cc967a59ee9df29fabab193c1",
                 "shasum": ""
             },
             "require": {
@@ -2272,7 +2272,7 @@
                 "doctrine/orm": "^2.7",
                 "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
                 "kylekatarnls/multi-tester": "^2.0",
-                "phpmd/phpmd": "^2.8",
+                "phpmd/phpmd": "^2.9",
                 "phpstan/extension-installer": "^1.0",
                 "phpstan/phpstan": "^0.12.35",
                 "phpunit/phpunit": "^7.5 || ^8.0",
@@ -2335,7 +2335,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-08-24T12:35:58+00:00"
+            "time": "2020-09-04T13:11:37+00:00"
         },
         {
             "name": "nikic/php-parser",
@@ -9575,7 +9575,8 @@
     "prefer-lowest": false,
     "platform": {
         "php": "^7.2.5",
-        "ext-json": "*"
+        "ext-json": "*",
+        "ext-openssl": "*"
     },
     "platform-dev": [],
     "plugin-api-version": "1.1.0"

+ 1 - 1
database/migrations/2020_08_21_145711_create_config_table.php

@@ -12,7 +12,7 @@ class CreateConfigTable extends Migration {
 	 */
 	public function up() {
 		Schema::create('config', function(Blueprint $table) {
-			$table->string('name')->primary()->comment('配置名');
+			$table->string('name')->primary()->unique()->index()->comment('配置名');
 			$table->text('value')->nullable()->comment('配置值');
 		});
 	}

+ 44 - 37
database/migrations/2020_08_21_150711_preset_data.php

@@ -195,43 +195,50 @@ class PresetData extends Migration {
 			Config::insert(['name' => $config]);
 		}
 
-		Config::whereName('invite_num')->update(['value' => 3]);
-		Config::whereName('is_register')->update(['value' => 1]);
-		Config::whereName('is_invite_register')->update(['value' => 2]);
-		Config::whereName('website_name')->update(['value' => 'ProxyPanel']);
-		Config::whereName('is_reset_password')->update(['value' => 1]);
-		Config::whereName('reset_password_times')->update(['value' => 3]);
-		Config::whereName('website_url')->update(['value' => 'https://demo.proxypanel.ml']);
-		Config::whereName('active_times')->update(['value' => 3]);
-		Config::whereName('is_checkin')->update(['value' => 1]);
-		Config::whereName('min_rand_traffic')->update(['value' => 10]);
-		Config::whereName('max_rand_traffic')->update(['value' => 500]);
-		Config::whereName('traffic_limit_time')->update(['value' => 1440]);
-		Config::whereName('referral_traffic')->update(['value' => 1024]);
-		Config::whereName('referral_percent')->update(['value' => 0.2]);
-		Config::whereName('referral_money')->update(['value' => 100]);
-		Config::whereName('referral_status')->update(['value' => 1]);
-		Config::whereName('default_traffic')->update(['value' => 1024]);
-		Config::whereName('traffic_warning_percent')->update(['value' => 80]);
-		Config::whereName('expire_days')->update(['value' => 15]);
-		Config::whereName('reset_traffic')->update(['value' => 1]);
-		Config::whereName('default_days')->update(['value' => 7]);
-		Config::whereName('subscribe_max')->update(['value' => 3]);
-		Config::whereName('min_port')->update(['value' => 10000]);
-		Config::whereName('max_port')->update(['value' => 65535]);
-		Config::whereName('is_traffic_ban')->update(['value' => 1]);
-		Config::whereName('traffic_ban_value')->update(['value' => 10]);
-		Config::whereName('traffic_ban_time')->update(['value' => 60]);
-		Config::whereName('is_clear_log')->update(['value' => 1]);
-		Config::whereName('is_subscribe_ban')->update(['value' => 1]);
-		Config::whereName('subscribe_ban_times')->update(['value' => 20]);
-		Config::whereName('auto_release_port')->update(['value' => 1]);
-		Config::whereName('register_ip_limit')->update(['value' => 5]);
-		Config::whereName('detection_check_times')->update(['value' => 3]);
-		Config::whereName('alipay_transport')->update(['value' => 'http']);
-		Config::whereName('alipay_currency')->update(['value' => 'USD']);
-		Config::whereName('user_invite_days')->update(['value' => 7]);
-		Config::whereName('admin_invite_days')->update(['value' => 7]);
+		$presetDates = [
+			'invite_num'              => 3,
+			'is_register'             => 1,
+			'is_invite_register'      => 2,
+			'website_name'            => 'ProxyPanel',
+			'is_reset_password'       => 1,
+			'reset_password_times'    => 3,
+			'website_url'             => 'https://demo.proxypanel.ml',
+			'active_times'            => 3,
+			'is_checkin'              => 1,
+			'min_rand_traffic'        => 10,
+			'max_rand_traffic'        => 500,
+			'traffic_limit_time'      => 1440,
+			'referral_traffic'        => 1024,
+			'referral_percent'        => 0.2,
+			'referral_money'          => 100,
+			'referral_status'         => 1,
+			'default_traffic'         => 1024,
+			'traffic_warning_percent' => 80,
+			'expire_days'             => 15,
+			'reset_traffic'           => 1,
+			'default_days'            => 7,
+			'subscribe_max'           => 3,
+			'min_port'                => 10000,
+			'max_port'                => 65535,
+			'is_traffic_ban'          => 1,
+			'traffic_ban_value'       => 10,
+			'traffic_ban_time'        => 60,
+			'is_clear_log'            => 1,
+			'is_subscribe_ban'        => 1,
+			'subscribe_ban_times'     => 20,
+			'auto_release_port'       => 1,
+			'register_ip_limit'       => 5,
+			'detection_check_times'   => 3,
+			'alipay_transport'        => 'http',
+			'alipay_currency'         => 'USD',
+			'user_invite_days'        => 7,
+			'admin_invite_days'       => 7,
+		];
+
+		foreach($presetDates as $key => $value){
+			Config::find($key)->update(['value' => $value]);
+		}
+
 
 		// 节点用标签
 		$labelList = [

+ 24 - 11
tests/Unit/ExampleTest.php

@@ -3,16 +3,29 @@
 namespace Tests\Unit;
 
 use PHPUnit\Framework\TestCase;
+use Redis;
 
-class ExampleTest extends TestCase
-{
-    /**
-     * A basic test example.
-     *
-     * @return void
-     */
-    public function testBasicTest()
-    {
-        $this->assertTrue(true);
-    }
+class ExampleTest extends TestCase {
+	/**
+	 * A basic test example.
+	 *
+	 * @return void
+	 */
+	public function testBasicTest() {
+		try{
+			//create redis instance
+			$redis = new Redis();
+			//connect with server and port
+			$redis->connect('localhost', 6379);
+			//set value
+			$redis->set('website', 'www.phpflow.com');
+			//get value
+			$website = $redis->get('website');
+			//print www.phpflow.com
+			echo $website;
+
+		}catch(Exception $ex){
+			echo $ex->getMessage();
+		}
+	}
 }