Jelajahi Sumber

Merge pull request #4 from ssrpanel/master

合并代码
garhing 7 tahun lalu
induk
melakukan
02051a4b4d
40 mengubah file dengan 533 tambahan dan 582 penghapusan
  1. 2 1
      .env.example
  2. 33 0
      app/Console/Commands/upgradeUserPassword.php
  3. 32 0
      app/Console/Commands/upgradeUserVmess.php
  4. 3 1
      app/Console/Kernel.php
  5. 18 4
      app/Exceptions/Handler.php
  6. 20 18
      app/Http/Controllers/AdminController.php
  7. 13 3
      app/Http/Controllers/Api/PingController.php
  8. 2 1
      app/Http/Controllers/Api/YzyController.php
  9. 20 34
      app/Http/Controllers/LoginController.php
  10. 9 14
      app/Http/Controllers/PaymentController.php
  11. 6 2
      app/Http/Controllers/RegisterController.php
  12. 1 0
      app/Http/Controllers/SubscribeController.php
  13. 4 5
      app/Http/Controllers/TicketController.php
  14. 65 107
      app/Http/Controllers/UserController.php
  15. 3 2
      app/Http/Middleware/Admin.php
  16. 0 1
      app/Http/Middleware/Affiliate.php
  17. 8 0
      app/Http/Middleware/Muv2.php
  18. 2 11
      app/Http/Middleware/User.php
  19. 4 2
      app/Http/Models/User.php
  20. 169 234
      composer.lock
  21. 35 36
      config/app.php
  22. 6 6
      config/auth.php
  23. 0 9
      config/captcha.php
  24. 1 1
      database/factories/ModelFactory.php
  25. TEMPAT SAMPAH
      public/clients/Shadowrocket-2.1.23.ipa
  26. 1 1
      public/clients/ipa.plist
  27. 15 12
      readme.md
  28. 1 1
      resources/views/admin/addNode.blade.php
  29. 1 1
      resources/views/admin/editNode.blade.php
  30. 1 1
      resources/views/admin/layouts.blade.php
  31. 1 1
      resources/views/admin/profile.blade.php
  32. 26 27
      resources/views/admin/system.blade.php
  33. 0 24
      resources/views/user/index.blade.php
  34. 1 1
      resources/views/user/invite.blade.php
  35. 3 3
      resources/views/user/layouts.blade.php
  36. 2 2
      routes/api.php
  37. 0 15
      routes/web.php
  38. 15 1
      sql/db.sql
  39. 10 0
      sql/update/20181027.sql
  40. TEMPAT SAMPAH
      storage/qqwry.dat

+ 2 - 1
.env.example

@@ -41,4 +41,5 @@ PUSHER_APP_ID=
 PUSHER_APP_KEY=
 PUSHER_APP_SECRET=
 
-MU_KEY=123456
+MU_KEY=123456
+API_TOKEN=123456

+ 33 - 0
app/Console/Commands/upgradeUserPassword.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Http\Models\User;
+use Illuminate\Console\Command;
+use Hash;
+use Log;
+
+class upgradeUserPassword extends Command
+{
+    protected $signature = 'upgradeUserPassword';
+    protected $description = '用户密码升级(MD5->HASH)';
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        Log::info('----------------------------【升级用户登录密码】开始----------------------------');
+        
+        // 将用户的登录密码由原有的md5升级为hash,统一升级为与用户名相同的密码
+        $userList = User::query()->get();
+        foreach ($userList as $user) {
+            User::query()->where('id', $user->id)->update(['password' => Hash::make($user->username)]);
+            Log::info('----------------------------升级用户[' . $user->username . ']的登录密码----------------------------');
+        }
+
+        Log::info('----------------------------【升级用户登录密码】结束----------------------------');
+    }
+}

+ 32 - 0
app/Console/Commands/upgradeUserVmess.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Http\Models\User;
+use Illuminate\Console\Command;
+
+class upgradeUserVmess extends Command
+{
+    protected $signature = 'upgradeUserVmess';
+    protected $description = '更新用户的Vmess';
+
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    public function handle()
+    {
+        $userList = User::query()->get();
+        foreach ($userList as $user) {
+            if (!isset($user->vmess_id)) {
+                \Log::error("USER表缺失vmess_id字段,请先维护数据库字典");
+                break;
+            }
+
+            if (!$user->vmess_id) {
+                User::query()->where('id', $user->id)->update(['vmess_id' => createGuid()]);
+            }
+        }
+    }
+}

+ 3 - 1
app/Console/Kernel.php

@@ -25,6 +25,8 @@ class Kernel extends ConsoleKernel
         \App\Console\Commands\UserTrafficAbnormalAutoWarning::class,
         \App\Console\Commands\UserExpireAutoWarning::class,
         \App\Console\Commands\UserTrafficAutoWarning::class,
+        \App\Console\Commands\upgradeUserPassword::class,
+        \App\Console\Commands\upgradeUserVmess::class,
     ];
 
     /**
@@ -40,7 +42,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('autoClearLog')->everyThirtyMinutes();
         $schedule->command('autoDecGoodsTraffic')->everyTenMinutes();
         $schedule->command('autoResetUserTraffic')->daily();
-        $schedule->command('autoCheckNodeStatus')->hourly();
+        $schedule->command('autoCheckNodeStatus')->everyMinute();
         $schedule->command('autoStatisticsNodeDailyTraffic')->dailyAt('23:55');
         $schedule->command('autoStatisticsNodeHourlyTraffic')->hourly();
         $schedule->command('autoStatisticsUserDailyTraffic')->dailyAt('23:50');

+ 18 - 4
app/Exceptions/Handler.php

@@ -27,9 +27,9 @@ class Handler extends ExceptionHandler
      * Report or log an exception.
      * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
      *
-     * @param  \Exception $exception
+     * @param  Exception $exception
      *
-     * @return void
+     * @throws Exception
      */
     public function report(Exception $exception)
     {
@@ -52,11 +52,25 @@ class Handler extends ExceptionHandler
             return parent::render($request, $exception);
         }
 
+        // 捕获身份校验异常
+        if ($exception instanceof AuthenticationException) {
+            if ($request->ajax()) {
+                return response()->json(['status' => 'fail', 'data' => '', 'message' => '身份校验失败']);
+            } else {
+                return response()->view('404');
+            }
+        }
+
+        // 捕获CSRF异常
         if ($exception instanceof TokenMismatchException) {
-            return \Response::json(['status' => 'fail', 'data' => '', 'message' => trans('404.csrf_title')]);
+            if ($request->ajax()) {
+                return response()->json(['status' => 'fail', 'data' => '', 'message' => trans('404.csrf_title')]);
+            } else {
+                return response()->view('csrf');
+            }
         }
 
-        return \Response::view('404');
+        return response()->view('404');
     }
 
     /**

+ 20 - 18
app/Http/Controllers/AdminController.php

@@ -38,6 +38,8 @@ use Response;
 use Session;
 use Log;
 use DB;
+use Auth;
+use Hash;
 
 class AdminController extends Controller
 {
@@ -209,7 +211,7 @@ class AdminController extends Controller
 
             $user = new User();
             $user->username = trim($request->get('username'));
-            $user->password = trim($request->get('password')) ? md5(trim($request->get('password'))) : md5(makeRandStr());
+            $user->password = trim($request->get('password')) ? Hash::make(trim($request->get('password'))) : Hash::make(makeRandStr());
             $user->port = $request->get('port');
             $user->passwd = empty($request->get('passwd')) ? makeRandStr() : $request->get('passwd');
             $user->vmess_id = trim($request->get('vmess_id', createGuid()));
@@ -280,7 +282,7 @@ class AdminController extends Controller
 
                 $user = new User();
                 $user->username = '批量生成-' . makeRandStr();
-                $user->password = md5(makeRandStr());
+                $user->password = Hash::make(makeRandStr());
                 $user->port = $port;
                 $user->passwd = makeRandStr();
                 $user->vmess_id = createGuid();
@@ -290,7 +292,7 @@ class AdminController extends Controller
                 $user->protocol_param = '';
                 $user->obfs = Helpers::getDefaultObfs();
                 $user->obfs_param = '';
-                $user->usage = 1;
+                $user->usage = 4;
                 $user->transfer_enable = toGB(1000);
                 $user->enable_time = date('Y-m-d');
                 $user->expire_time = date('Y-m-d', strtotime("+365 days"));
@@ -403,7 +405,7 @@ class AdminController extends Controller
 
                 if (!empty($password)) {
                     if (!(env('APP_DEMO') && $id == 1)) { // 演示环境禁止修改管理员密码
-                        $data['password'] = md5($password);
+                        $data['password'] = Hash::make($password);
                     }
                 }
 
@@ -1247,7 +1249,7 @@ class AdminController extends Controller
                 foreach ($data as $user) {
                     $obj = new User();
                     $obj->username = $user->user;
-                    $obj->password = md5('123456');
+                    $obj->password = Hash::make('123456');
                     $obj->port = $user->port;
                     $obj->passwd = $user->passwd;
                     $obj->vmess_id = $user->vmess_id;
@@ -1406,26 +1408,21 @@ EOF;
     // 修改个人资料
     public function profile(Request $request)
     {
-        $user = Session::get('user');
-
         if ($request->method() == 'POST') {
-            $old_password = $request->get('old_password');
-            $new_password = $request->get('new_password');
-            $old_password = md5(trim($old_password));
-            $new_password = md5(trim($new_password));
+            $old_password = trim($request->get('old_password'));
+            $new_password = trim($request->get('new_password'));
 
-            $user = User::query()->where('id', $user['id'])->first();
-            if ($user->password != $old_password) {
+            if (!Hash::check($old_password, Auth::user()->password)) {
                 Session::flash('errorMsg', '旧密码错误,请重新输入');
 
                 return Redirect::back();
-            } elseif ($user->password == $new_password) {
+            } elseif (Hash::check($new_password, Auth::user()->password)) {
                 Session::flash('errorMsg', '新密码不可与旧密码一样,请重新输入');
 
                 return Redirect::back();
             }
 
-            $ret = User::query()->where('id', $user['id'])->update(['password' => $new_password]);
+            $ret = User::query()->where('id', Auth::user()->id)->update(['password' => Hash::make($new_password)]);
             if (!$ret) {
                 Session::flash('errorMsg', '修改失败');
 
@@ -1955,6 +1952,11 @@ EOF;
             }
         }
 
+        // 如果更改了有赞云任何一个配置,则删除有赞云的授权缓存,防止出现client_id错误
+        if (in_array($name, ['youzan_client_id', 'youzan_client_secret', 'kdt_id'])) {
+            \Cache::forget('YZY_TOKEN');
+        }
+
         // 更新配置
         Config::query()->where('name', $name)->update(['value' => $value]);
 
@@ -2268,9 +2270,9 @@ EOF;
             return Response::json(['status' => 'fail', 'data' => '', 'message' => "用户不存在"]);
         }
 
-        // 存储当前管理员身份信息,并将当前登录信息改成要切换的用户的身份信息
-        Session::put('admin', Session::get("user"));
-        Session::put('user', $user->toArray());
+        // 存储当前管理员ID,并将当前登录信息改成要切换的用户的身份信息
+        Session::put('admin', Auth::user()->id);
+        Auth::login($user);
 
         return Response::json(['status' => 'success', 'data' => '', 'message' => "身份切换成功"]);
     }

+ 13 - 3
app/Http/Controllers/Api/PingController.php

@@ -10,6 +10,7 @@ class PingController extends Controller
 {
     public function ping(Request $request)
     {
+        $token = $request->input('token');
         $host = $request->input('host');
         $port = $request->input('port', 22);
         $transport = $request->input('transport', 'tcp');
@@ -19,7 +20,9 @@ class PingController extends Controller
             echo "<pre>";
             echo "使用方法:";
             echo "<br>";
-            echo "GET /api/ping?host=www.baidu.com&port=80&transport=tcp&timeout=0.5";
+            echo "GET /api/ping?token=toke_value&host=www.baidu.com&port=80&transport=tcp&timeout=0.5";
+            echo "<br>";
+            echo "token:.env下加入API_TOKEN,其值就是token的值";
             echo "<br>";
             echo "host:检测地址,必传,可以是域名、IPv4、IPv6";
             echo "<br>";
@@ -34,6 +37,11 @@ class PingController extends Controller
             exit();
         }
 
+        // 验证TOKEN,防止滥用
+        if (env('API_TOKEN') != $token) {
+            return response()->json(['status' => 0, 'message' => 'token invalid']);
+        }
+
         // 如果不是IPv4
         if (false === filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
             // 如果是IPv6
@@ -51,17 +59,19 @@ class PingController extends Controller
             if (!$fp) {
                 Log::info("$errstr ($errno)");
                 $ret = 0;
+                $message = 'port close';
             } else {
                 $ret = 1;
+                $message = 'port open';
             }
 
             fclose($fp);
 
-            return response()->json(['status' => $ret]);
+            return response()->json(['status' => $ret, 'message' => $message]);
         } catch (\Exception $e) {
             Log::info($e);
 
-            return response()->json(['status' => 0]);
+            return response()->json(['status' => 0, 'message' => 'port close']);
         }
     }
 }

+ 2 - 1
app/Http/Controllers/Api/YzyController.php

@@ -18,6 +18,7 @@ use Illuminate\Http\Request;
 use Log;
 use DB;
 use Mail;
+use Hash;
 
 /**
  * 有赞云支付消息推送接收
@@ -136,7 +137,7 @@ class YzyController extends Controller
 
                 $user = new User();
                 $user->username = '自动生成-' . $payment->order->email;
-                $user->password = md5(makeRandStr());
+                $user->password = Hash::make(makeRandStr());
                 $user->port = $port;
                 $user->passwd = makeRandStr();
                 $user->vmess_id = createGuid();

+ 20 - 34
app/Http/Controllers/LoginController.php

@@ -13,6 +13,7 @@ use Captcha;
 use Session;
 use Cache;
 use Log;
+use Auth;
 
 /**
  * 登录控制器
@@ -36,6 +37,7 @@ class LoginController extends Controller
             $username = trim($request->get('username'));
             $password = trim($request->get('password'));
             $captcha = trim($request->get('captcha'));
+            $remember = trim($request->get('remember'));
 
             if (empty($username) || empty($password)) {
                 Session::flash('errorMsg', '请输入用户名和密码');
@@ -52,69 +54,53 @@ class LoginController extends Controller
                 }
             }
 
-            $user = User::query()->where('username', $username)->where('password', md5($password))->first();
-            if (!$user) {
+            if (!Auth::attempt(['username' => $username, 'password' => $password], $remember)) {
                 Session::flash('errorMsg', '用户名或密码错误');
 
                 return Redirect::back()->withInput();
-            } elseif (!$user->is_admin && $user->status < 0) {
+            } elseif (!Auth::user()->is_admin && Auth::user()->status < 0) {
                 Session::flash('errorMsg', '账号已禁用');
 
                 return Redirect::back();
-            } elseif ($user->status == 0 && self::$systemConfig['is_active_register'] && $user->is_admin == 0) {
-                Session::flash('errorMsg', '账号未激活,请点击<a href="/activeUser?username=' . $user->username . '" target="_blank"><span style="color:#000">【激活账号】</span></a>');
+            } elseif (Auth::user()->status == 0 && self::$systemConfig['is_active_register'] && Auth::user()->is_admin == 0) {
+                Session::flash('errorMsg', '账号未激活,请点击<a href="/activeUser?username=' . Auth::user()->username . '" target="_blank"><span style="color:#000">【激活账号】</span></a>');
 
                 return Redirect::back()->withInput();
             }
 
-            // 更新登录信息
-            $remember_token = "";
-            if ($request->get('remember')) {
-                $remember_token = makeRandStr(20);
-
-                User::query()->where('id', $user->id)->update(['last_login' => time(), 'remember_token' => $remember_token]);
-            } else {
-                User::query()->where('id', $user->id)->update(['last_login' => time(), 'remember_token' => '']);
-            }
-
             // 登录送积分
             if (self::$systemConfig['login_add_score']) {
                 if (!Cache::has('loginAddScore_' . md5($username))) {
                     $score = mt_rand(self::$systemConfig['min_rand_score'], self::$systemConfig['max_rand_score']);
-                    $ret = User::query()->where('id', $user->id)->increment('score', $score);
+                    $ret = User::query()->where('id', Auth::user()->id)->increment('score', $score);
                     if ($ret) {
-                        $this->addUserScoreLog($user->id, $user->score, $user->score + $score, $score, '登录送积分');
+                        $this->addUserScoreLog(Auth::user()->id, Auth::user()->score, Auth::user()->score + $score, $score, '登录送积分');
 
                         // 登录多久后再登录可以获取积分
                         $ttl = self::$systemConfig['login_add_score_range'] ? self::$systemConfig['login_add_score_range'] : 1440;
                         Cache::put('loginAddScore_' . md5($username), '1', $ttl);
 
-                        Session::flash('successMsg', '欢迎回来,系统自动赠送您 ' . $score . ' 积分,您可以用它兑换流量');
+                        Session::flash('successMsg', '欢迎回来,系统自动赠送您 ' . $score . ' 积分,您可以用它兑换流量');
                     }
                 }
             }
 
             // 写入登录日志
-            $this->addUserLoginLog($user->id, getClientIp());
+            $this->addUserLoginLog(Auth::user()->id, getClientIp());
 
-            // 重新取出用户信息
-            $userInfo = User::query()->where('id', $user->id)->first();
-
-            Session::put('user', $userInfo->toArray());
+            // 更新登录信息
+            User::query()->where('id', Auth::user()->id)->update(['last_login' => time()]);
 
             // 根据权限跳转
-            if ($user->is_admin) {
-                return Redirect::to('admin')->cookie('remember', $remember_token, 36000);
+            if (Auth::user()->is_admin) {
+                return Redirect::to('admin');
             }
 
-            return Redirect::to('/')->cookie('remember', $remember_token, 36000);
+            return Redirect::to('/');
         } else {
-            if ($request->cookie("remember")) {
-                $u = User::query()->where('status', '>=', 0)->where("remember_token", $request->cookie("remember"))->first();
-                if ($u) {
-                    Session::put('user', $u->toArray());
-
-                    if ($u->is_admin) {
+            if (Auth::viaRemember()) {
+                if (Auth::check()) {
+                    if (Auth::user()->is_admin) {
                         return Redirect::to('admin');
                     }
 
@@ -135,9 +121,9 @@ class LoginController extends Controller
     // 退出
     public function logout(Request $request)
     {
-        Session::flush();
+        Auth::logout();
 
-        return Redirect::to('login')->cookie('remember', "", 36000);
+        return Redirect::to('login');
     }
 
     // 添加用户登录日志

+ 9 - 14
app/Http/Controllers/PaymentController.php

@@ -12,9 +12,9 @@ use App\Http\Models\PaymentCallback;
 use Illuminate\Http\Request;
 use Response;
 use Redirect;
-use Session;
 use Log;
 use DB;
+use Auth;
 
 class PaymentController extends Controller
 {
@@ -31,8 +31,6 @@ class PaymentController extends Controller
         $goods_id = intval($request->get('goods_id'));
         $coupon_sn = $request->get('coupon_sn');
 
-        $user = Session::get('user');
-
         $goods = Goods::query()->where('is_del', 0)->where('status', 1)->where('id', $goods_id)->first();
         if (!$goods) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:商品或服务已下架']);
@@ -44,7 +42,7 @@ class PaymentController extends Controller
         }
 
         // 判断是否存在同个商品的未支付订单
-        $existsOrder = Order::query()->where('status', 0)->where('user_id', $user['id'])->where('goods_id', $goods_id)->exists();
+        $existsOrder = Order::query()->where('status', 0)->where('user_id', Auth::user()->id)->where('goods_id', $goods_id)->exists();
         if ($existsOrder) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:尚有未支付的订单,请先去支付']);
         }
@@ -52,7 +50,7 @@ class PaymentController extends Controller
         // 限购控制
         $strategy = self::$systemConfig['goods_purchase_limit_strategy'];
         if ($strategy == 'all' || ($strategy == 'package' && $goods->type == 2) || ($strategy == 'free' && $goods->price == 0) || ($strategy == 'package&free' && ($goods->type == 2 || $goods->price == 0))) {
-            $noneExpireOrderExist = Order::query()->where('status', '>=', 0)->where('is_expire', 0)->where('user_id', $user['id'])->where('goods_id', $goods_id)->exists();
+            $noneExpireOrderExist = Order::query()->where('status', '>=', 0)->where('is_expire', 0)->where('user_id', Auth::user()->id)->where('goods_id', $goods_id)->exists();
             if ($noneExpireOrderExist) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '创建支付单失败:商品不可重复购买']);
             }
@@ -94,7 +92,7 @@ class PaymentController extends Controller
                 ->whereHas('goods', function ($q) {
                     $q->where('type', 2);
                 })
-                ->where('user_id', $user['id'])
+                ->where('user_id', Auth::user()->id)
                 ->where('is_expire', 0)
                 ->where('status', 2)
                 ->get();
@@ -114,7 +112,7 @@ class PaymentController extends Controller
             // 生成订单
             $order = new Order();
             $order->order_sn = $orderSn;
-            $order->user_id = $user['id'];
+            $order->user_id = Auth::user()->id;
             $order->goods_id = $goods_id;
             $order->coupon_id = !empty($coupon) ? $coupon->id : 0;
             $order->origin_amount = $goods->price;
@@ -136,7 +134,7 @@ class PaymentController extends Controller
 
             $payment = new Payment();
             $payment->sn = $sn;
-            $payment->user_id = $user['id'];
+            $payment->user_id = Auth::user()->id;
             $payment->oid = $order->oid;
             $payment->order_sn = $orderSn;
             $payment->pay_way = 1;
@@ -177,16 +175,14 @@ class PaymentController extends Controller
             return Redirect::to('services');
         }
 
-        $user = Session::get('user');
-
-        $payment = Payment::query()->with(['order', 'order.goods'])->where('sn', $sn)->where('user_id', $user['id'])->first();
+        $payment = Payment::query()->with(['order', 'order.goods'])->where('sn', $sn)->where('user_id', Auth::user()->id)->first();
         if (!$payment) {
             return Redirect::to('services');
         }
 
         $order = Order::query()->where('oid', $payment->oid)->first();
         if (!$order) {
-            Session::flash('errorMsg', '订单不存在');
+            \Session::flash('errorMsg', '订单不存在');
 
             return Response::view('payment/' . $sn);
         }
@@ -208,8 +204,7 @@ class PaymentController extends Controller
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '请求失败']);
         }
 
-        $user = Session::get('user');
-        $payment = Payment::query()->where('sn', $sn)->where('user_id', $user['id'])->first();
+        $payment = Payment::query()->where('sn', $sn)->where('user_id', Auth::user()->id)->first();
         if (!$payment) {
             return Response::json(['status' => 'error', 'data' => '', 'message' => '支付失败']);
         } elseif ($payment->status > 0) {

+ 6 - 2
app/Http/Controllers/RegisterController.php

@@ -15,6 +15,7 @@ use Redirect;
 use Session;
 use Cache;
 use Mail;
+use Hash;
 
 /**
  * 注册控制器
@@ -160,7 +161,7 @@ class RegisterController extends Controller
             // 创建新用户
             $user = new User();
             $user->username = $username;
-            $user->password = md5($password);
+            $user->password = Hash::make($password);
             $user->port = $port;
             $user->passwd = makeRandStr();
             $user->vmess_id = createGuid();
@@ -197,6 +198,9 @@ class RegisterController extends Controller
                 if (self::$systemConfig['is_invite_register'] && $affArr['code_id']) {
                     Invite::query()->where('id', $affArr['code_id'])->update(['fuid' => $user->id, 'status' => 1]);
                 }
+
+                // 清除邀请人Cookie
+                \Cookie::unqueue('register_aff');
             }
 
             // 发送邮件
@@ -270,7 +274,7 @@ class RegisterController extends Controller
         // 没有用邀请码或者邀请码是管理员生成的,则检查cookie或者url链接
         if (!$referral_uid) {
             // 检查一下cookie里有没有aff
-            $cookieAff = \Request::cookie('register_aff') ? \Request::cookie('register_aff') : 0;
+            $cookieAff = \Request::hasCookie('register_aff') ? \Request::cookie('register_aff') : 0;
             if ($cookieAff) {
                 $affUser = User::query()->where('id', $cookieAff)->exists();
                 $referral_uid = $affUser ? $cookieAff : 0;

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

@@ -60,6 +60,7 @@ class SubscribeController extends Controller
 
         $nodeList = SsNode::query()
             ->leftjoin("ss_node_label", "ss_node.id", "=", "ss_node_label.node_id")
+            ->where('ss_node.type', 1)
             ->where('ss_node.status', 1)
             ->where('ss_node.is_subscribe', 1)
             ->whereIn('ss_node_label.label_id', $userLabelIds)

+ 4 - 5
app/Http/Controllers/TicketController.php

@@ -10,8 +10,8 @@ use App\Mail\closeTicket;
 use App\Mail\replyTicket;
 use Illuminate\Http\Request;
 use Response;
-use Session;
 use Mail;
+use Auth;
 
 /**
  * 工单控制器
@@ -40,7 +40,6 @@ class TicketController extends Controller
     public function replyTicket(Request $request)
     {
         $id = $request->get('id');
-        $user = Session::get('user');
 
         if ($request->method() == 'POST') {
             $content = clean($request->get('content'));
@@ -49,7 +48,7 @@ class TicketController extends Controller
 
             $obj = new TicketReply();
             $obj->ticket_id = $id;
-            $obj->user_id = $user['id'];
+            $obj->user_id = Auth::user()->id;
             $obj->content = $content;
             $obj->created_at = date('Y-m-d H:i:s');
             $obj->save();
@@ -65,7 +64,7 @@ class TicketController extends Controller
                 $content = "标题:" . $ticket->title . "<br>管理员回复:" . $content;
 
                 // 发通知邮件
-                if (!$user['is_admin']) {
+                if (!Auth::user()->is_admin) {
                     if (self::$systemConfig['crash_warning_email']) {
                         try {
                             Mail::to(self::$systemConfig['crash_warning_email'])->send(new replyTicket(self::$systemConfig['website_name'], $title, $content));
@@ -84,7 +83,7 @@ class TicketController extends Controller
                 }
 
                 // 通过ServerChan发微信消息提醒管理员
-                if (!$user['is_admin'] && self::$systemConfig['is_server_chan'] && self::$systemConfig['server_chan_key']) {
+                if (!Auth::user()->is_admin && self::$systemConfig['is_server_chan'] && self::$systemConfig['server_chan_key']) {
                     $serverChan = new ServerChan();
                     $serverChan->send($title, $content);
                 }

+ 65 - 107
app/Http/Controllers/UserController.php

@@ -38,6 +38,8 @@ use Cache;
 use Mail;
 use Log;
 use DB;
+use Auth;
+use Hash;
 
 class UserController extends Controller
 {
@@ -50,9 +52,7 @@ class UserController extends Controller
 
     public function index(Request $request)
     {
-        $user = Session::get('user');
-
-        $user = User::query()->where('id', $user['id'])->first();
+        $user = User::query()->where('id', Auth::user()->id)->first();
         $user->totalTransfer = flowAutoShow($user->transfer_enable);
         $user->usedTransfer = flowAutoShow($user->u + $user->d);
         $user->usedPercent = $user->transfer_enable > 0 ? round(($user->u + $user->d) / $user->transfer_enable, 2) : 1;
@@ -77,12 +77,12 @@ class UserController extends Controller
         }
 
         // 如果没有唯一码则生成一个
-        $subscribe = UserSubscribe::query()->where('user_id', $user['id'])->first();
+        $subscribe = UserSubscribe::query()->where('user_id', Auth::user()->id)->first();
         if (!$subscribe) {
             $code = $this->makeSubscribeCode();
 
             $obj = new UserSubscribe();
-            $obj->user_id = $user['id'];
+            $obj->user_id = Auth::user()->id;
             $obj->code = $code;
             $obj->times = 0;
             $obj->save();
@@ -94,10 +94,10 @@ class UserController extends Controller
         $view['link'] = self::$systemConfig['subscribe_domain'] ? self::$systemConfig['subscribe_domain'] . '/s/' . $code : self::$systemConfig['website_url'] . '/s/' . $code;
 
         // 近期登录日志
-        $view['userLoginLog'] = UserLoginLog::query()->where('user_id', $user['id'])->orderBy('id', 'desc')->limit(10)->get();
+        $view['userLoginLog'] = UserLoginLog::query()->where('user_id', Auth::user()->id)->orderBy('id', 'desc')->limit(10)->get();
 
         // 节点列表
-        $userLabelIds = UserLabel::query()->where('user_id', $user['id'])->pluck('label_id');
+        $userLabelIds = UserLabel::query()->where('user_id', Auth::user()->id)->pluck('label_id');
         if (empty($userLabelIds)) {
             $view['nodeList'] = [];
 
@@ -159,19 +159,19 @@ class UserController extends Controller
                 $node->ss_scheme = $node->compatible ? $ss_scheme : ''; // 节点兼容原版才显示
             } else {
                 // 生成v2ray scheme
-                $v2_json = array(
-                    "v" => "2",
-                    "ps" => $node->name,
-                    "add" => $node->server ? $node->server : $node->ip,
+                $v2_json = [
+                    "v"    => "2",
+                    "ps"   => $node->name,
+                    "add"  => $node->server ? $node->server : $node->ip,
                     "port" => $node->v2_port,
-                    "id" => $user->vmess_id,
-                    "aid" => $node->v2_alter_id,
-                    "net" => $node->v2_net,
+                    "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 == 1 ? "tls" : ""
-                );
+                    "tls"  => $node->v2_tls == 1 ? "tls" : ""
+                ];
                 $v2_scheme = 'vmess://' . base64url_encode(json_encode($v2_json));
 
                 // 生成文本配置信息
@@ -225,11 +225,9 @@ class UserController extends Controller
     // 修改个人资料
     public function profile(Request $request)
     {
-        $user = Session::get('user');
-
         if ($request->method() == 'POST') {
-            $old_password = $request->get('old_password');
-            $new_password = $request->get('new_password');
+            $old_password = trim($request->get('old_password'));
+            $new_password = trim($request->get('new_password'));
             $wechat = $request->get('wechat');
             $qq = $request->get('qq');
             $passwd = trim($request->get('passwd'));
@@ -239,28 +237,24 @@ class UserController extends Controller
 
             // 修改密码
             if ($old_password && $new_password) {
-                $old_password = md5(trim($old_password));
-                $new_password = md5(trim($new_password));
-
-                $user = User::query()->where('id', $user['id'])->first();
-                if ($user->password != $old_password) {
+                if (!Hash::check($old_password, Auth::user()->password)) {
                     Session::flash('errorMsg', '旧密码错误,请重新输入');
 
                     return Redirect::to('profile#tab_1');
-                } elseif ($user->password == $new_password) {
+                } elseif (Hash::check($new_password, Auth::user()->password)) {
                     Session::flash('errorMsg', '新密码不可与旧密码一样,请重新输入');
 
                     return Redirect::to('profile#tab_1');
                 }
 
                 // 演示环境禁止改管理员密码
-                if (env('APP_DEMO') && $user['id'] == 1) {
+                if (env('APP_DEMO') && Auth::user()->id == 1) {
                     Session::flash('errorMsg', '演示环境禁止修改管理员密码');
 
                     return Redirect::to('profile#tab_1');
                 }
 
-                $ret = User::query()->where('id', $user['id'])->update(['password' => $new_password]);
+                $ret = User::query()->where('id', Auth::user()->id)->update(['password' => Hash::make($new_password)]);
                 if (!$ret) {
                     Session::flash('errorMsg', '修改失败');
 
@@ -280,7 +274,7 @@ class UserController extends Controller
                     return Redirect::to('profile#tab_2');
                 }
 
-                $ret = User::query()->where('id', $user['id'])->update(['wechat' => $wechat, 'qq' => $qq]);
+                $ret = User::query()->where('id', Auth::user()->id)->update(['wechat' => $wechat, 'qq' => $qq]);
                 if (!$ret) {
                     Session::flash('errorMsg', '修改失败');
 
@@ -317,14 +311,14 @@ class UserController extends Controller
                     'obfs'     => $obfs
                 ];
 
-                $ret = User::query()->where('id', $user['id'])->update($data);
+                $ret = User::query()->where('id', Auth::user()->id)->update($data);
                 if (!$ret) {
                     Session::flash('errorMsg', '修改失败');
 
                     return Redirect::to('profile#tab_3');
                 } else {
                     // 更新session
-                    $user = User::query()->where('id', $user['id'])->first()->toArray();
+                    $user = User::query()->where('id', Auth::user()->id)->first()->toArray();
                     Session::remove('user');
                     Session::put('user', $user);
 
@@ -338,7 +332,7 @@ class UserController extends Controller
             $view['method_list'] = Helpers::methodList();
             $view['protocol_list'] = Helpers::protocolList();
             $view['obfs_list'] = Helpers::obfsList();
-            $view['info'] = User::query()->where('id', $user['id'])->first();
+            $view['info'] = User::query()->where('id', Auth::user()->id)->first();
             $view['website_logo'] = self::$systemConfig['website_logo'];
             $view['website_analytics'] = self::$systemConfig['website_analytics'];
             $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
@@ -350,13 +344,11 @@ class UserController extends Controller
     // 流量日志
     public function trafficLog(Request $request)
     {
-        $user = Session::get('user');
-
         $dailyData = [];
         $hourlyData = [];
 
         // 节点一个月内的流量
-        $userTrafficDaily = UserTrafficDaily::query()->where('user_id', $user['id'])->where('node_id', 0)->where('created_at', '>=', date('Y-m', time()))->orderBy('created_at', 'asc')->pluck('total')->toArray();
+        $userTrafficDaily = UserTrafficDaily::query()->where('user_id', Auth::user()->id)->where('node_id', 0)->where('created_at', '>=', date('Y-m', time()))->orderBy('created_at', 'asc')->pluck('total')->toArray();
 
         $dailyTotal = date('d', time()) - 1; // 今天不算,减一
         $dailyCount = count($userTrafficDaily);
@@ -368,7 +360,7 @@ class UserController extends Controller
         }
 
         // 节点一天内的流量
-        $userTrafficHourly = UserTrafficHourly::query()->where('user_id', $user['id'])->where('node_id', 0)->where('created_at', '>=', date('Y-m-d', time()))->orderBy('created_at', 'asc')->pluck('total')->toArray();
+        $userTrafficHourly = UserTrafficHourly::query()->where('user_id', Auth::user()->id)->where('node_id', 0)->where('created_at', '>=', date('Y-m-d', time()))->orderBy('created_at', 'asc')->pluck('total')->toArray();
         $hourlyTotal = date('H', time());
         $hourlyCount = count($userTrafficHourly);
         for ($x = 0; $x < ($hourlyTotal - $hourlyCount); $x++) {
@@ -410,13 +402,11 @@ class UserController extends Controller
     // 工单
     public function ticketList(Request $request)
     {
-        $user = Session::get('user');
-
         $view['website_logo'] = self::$systemConfig['website_logo'];
         $view['website_analytics'] = self::$systemConfig['website_analytics'];
         $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
 
-        $view['ticketList'] = Ticket::query()->where('user_id', $user['id'])->orderBy('id', 'desc')->paginate(10)->appends($request->except('page'));
+        $view['ticketList'] = Ticket::query()->where('user_id', Auth::user()->id)->orderBy('id', 'desc')->paginate(10)->appends($request->except('page'));
 
         return Response::view('user.ticketList', $view);
     }
@@ -424,10 +414,7 @@ class UserController extends Controller
     // 订单
     public function orderList(Request $request)
     {
-        $user = Session::get('user');
-
-        $view['orderList'] = Order::query()->with(['user', 'goods', 'coupon', 'payment'])->where('user_id', $user['id'])->orderBy('oid', 'desc')->paginate(10)->appends($request->except('page'));
-
+        $view['orderList'] = Order::query()->with(['user', 'goods', 'coupon', 'payment'])->where('user_id', Auth::user()->id)->orderBy('oid', 'desc')->paginate(10)->appends($request->except('page'));
         $view['website_logo'] = self::$systemConfig['website_logo'];
         $view['website_analytics'] = self::$systemConfig['website_analytics'];
         $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
@@ -453,14 +440,12 @@ class UserController extends Controller
         $content = clean($request->get('content'));
         $content = str_replace("eval", "", str_replace("atob", "", $content));
 
-        $user = Session::get('user');
-
         if (empty($title) || empty($content)) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '请输入标题和内容']);
         }
 
         $obj = new Ticket();
-        $obj->user_id = $user['id'];
+        $obj->user_id = Auth::user()->id;
         $obj->title = $title;
         $obj->content = $content;
         $obj->status = 0;
@@ -498,8 +483,6 @@ class UserController extends Controller
     {
         $id = intval($request->get('id'));
 
-        $user = Session::get('user');
-
         if ($request->method() == 'POST') {
             $content = clean($request->get('content'));
             $content = str_replace("eval", "", str_replace("atob", "", $content));
@@ -511,7 +494,7 @@ class UserController extends Controller
 
             $obj = new TicketReply();
             $obj->ticket_id = $id;
-            $obj->user_id = $user['id'];
+            $obj->user_id = Auth::user()->id;
             $obj->content = $content;
             $obj->created_at = date('Y-m-d H:i:s');
             $obj->save();
@@ -544,7 +527,7 @@ class UserController extends Controller
             }
         } else {
             $ticket = Ticket::query()->where('id', $id)->with('user')->first();
-            if (empty($ticket) || $ticket->user_id != $user['id']) {
+            if (empty($ticket) || $ticket->user_id != Auth::user()->id) {
                 return Redirect::to('tickets');
             }
 
@@ -564,9 +547,7 @@ class UserController extends Controller
     {
         $id = $request->get('id');
 
-        $user = Session::get('user');
-
-        $ret = Ticket::query()->where('id', $id)->where('user_id', $user['id'])->update(['status' => 2]);
+        $ret = Ticket::query()->where('id', $id)->where('user_id', Auth::user()->id)->update(['status' => 2]);
         if ($ret) {
             return Response::json(['status' => 'success', 'data' => '', 'message' => '关闭成功']);
         } else {
@@ -577,16 +558,14 @@ class UserController extends Controller
     // 邀请码
     public function invite(Request $request)
     {
-        $user = Session::get('user');
-
         // 已生成的邀请码数量
-        $num = Invite::query()->where('uid', $user['id'])->count();
+        $num = Invite::query()->where('uid', Auth::user()->id)->count();
 
         $view['website_logo'] = self::$systemConfig['website_logo'];
         $view['website_analytics'] = self::$systemConfig['website_analytics'];
         $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
         $view['num'] = self::$systemConfig['invite_num'] - $num <= 0 ? 0 : self::$systemConfig['invite_num'] - $num; // 还可以生成的邀请码数量
-        $view['inviteList'] = Invite::query()->where('uid', $user['id'])->with(['generator', 'user'])->paginate(10); // 邀请码列表
+        $view['inviteList'] = Invite::query()->where('uid', Auth::user()->id)->with(['generator', 'user'])->paginate(10); // 邀请码列表
         $view['referral_traffic'] = flowAutoShow(self::$systemConfig['referral_traffic'] * 1048576);
         $view['referral_percent'] = self::$systemConfig['referral_percent'];
 
@@ -609,16 +588,14 @@ class UserController extends Controller
     // 生成邀请码
     public function makeInvite(Request $request)
     {
-        $user = Session::get('user');
-
         // 已生成的邀请码数量
-        $num = Invite::query()->where('uid', $user['id'])->count();
+        $num = Invite::query()->where('uid', Auth::user()->id)->count();
         if ($num >= self::$systemConfig['invite_num']) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:最多只能生成' . self::$systemConfig['invite_num'] . '个邀请码']);
         }
 
         $obj = new Invite();
-        $obj->uid = $user['id'];
+        $obj->uid = Auth::user()->id;
         $obj->fuid = 0;
         $obj->code = strtoupper(mb_substr(md5(microtime() . makeRandStr()), 8, 12));
         $obj->status = 0;
@@ -855,14 +832,14 @@ class UserController extends Controller
                 Session::flash('errorMsg', '账号已被禁用');
 
                 return Redirect::back();
-            } elseif (md5($password) == $verify->user->password) {
+            } elseif (Hash::check($password, $verify->user->password)) {
                 Session::flash('errorMsg', '新旧密码一样,请重新输入');
 
                 return Redirect::back();
             }
 
             // 更新密码
-            $ret = User::query()->where('id', $verify->user_id)->update(['password' => md5($password)]);
+            $ret = User::query()->where('id', $verify->user_id)->update(['password' => Hash::make($password)]);
             if (!$ret) {
                 Session::flash('errorMsg', '重设密码失败');
 
@@ -942,8 +919,6 @@ class UserController extends Controller
         $goods_id = intval($id);
         $coupon_sn = $request->get('coupon_sn');
 
-        $user = Session::get('user');
-
         if ($request->method() == 'POST') {
             $goods = Goods::query()->with(['label'])->where('is_del', 0)->where('status', 1)->where('id', $goods_id)->first();
             if (!$goods) {
@@ -953,7 +928,7 @@ class UserController extends Controller
             // 限购控制:all-所有商品限购, free-价格为0的商品限购, none-不限购(默认)
             $strategy = self::$systemConfig['goods_purchase_limit_strategy'];
             if ($strategy == 'all' || ($strategy == 'package' && $goods->type == 2) || ($strategy == 'free' && $goods->price == 0) || ($strategy == 'package&free' && ($goods->type == 2 || $goods->price == 0))) {
-                $noneExpireGoodExist = Order::query()->where('status', '>=', 0)->where('is_expire', 0)->where('user_id', $user['id'])->where('goods_id', $goods_id)->exists();
+                $noneExpireGoodExist = Order::query()->where('status', '>=', 0)->where('is_expire', 0)->where('user_id', Auth::user()->id)->where('goods_id', $goods_id)->exists();
                 if ($noneExpireGoodExist) {
                     return Response::json(['status' => 'fail', 'data' => '', 'message' => '支付失败:商品不可重复购买']);
                 }
@@ -987,7 +962,7 @@ class UserController extends Controller
             }
 
             // 验证账号余额是否充足
-            $user = User::query()->where('id', $user['id'])->first();
+            $user = User::query()->where('id', Auth::user()->id)->first();
             if ($user->balance < $amount) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '支付失败:您的余额不足,请先充值']);
             }
@@ -999,7 +974,7 @@ class UserController extends Controller
                     ->whereHas('goods', function ($q) {
                         $q->where('type', 2);
                     })
-                    ->where('user_id', $user['id'])
+                    ->where('user_id', Auth::user()->id)
                     ->where('is_expire', 0)
                     ->where('status', 2)
                     ->get();
@@ -1156,33 +1131,31 @@ class UserController extends Controller
     // 积分兑换流量
     public function exchange(Request $request)
     {
-        $user = Session::get('user');
-
         // 积分满100才可以兑换
-        if ($user['score'] < 100) {
+        if (Auth::user()->score < 100) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '兑换失败:满100才可以兑换,请继续累计吧']);
         }
 
         // 账号过期不允许兑换
-        if ($user['expire_time'] < date('Y-m-d')) {
+        if (Auth::user()->expire_time < date('Y-m-d')) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '兑换失败:账号已过期,请先购买服务吧']);
         }
 
         DB::beginTransaction();
         try {
             // 写入积分操作日志
-            $ret = $this->addUserScoreLog($user['id'], $user['score'], 0, -1 * $user['score'], '积分兑换流量');
+            $ret = $this->addUserScoreLog(Auth::user()->id, Auth::user()->score, 0, -1 * Auth::user()->score, '积分兑换流量');
 
             // 扣积分加流量
             if ($ret) {
-                User::query()->where('id', $user['id'])->update(['score' => 0]);
-                User::query()->where('id', $user['id'])->increment('transfer_enable', $user['score'] * 1048576);
+                User::query()->where('id', Auth::user()->id)->update(['score' => 0]);
+                User::query()->where('id', Auth::user()->id)->increment('transfer_enable', Auth::user()->score * 1048576);
             }
 
             DB::commit();
 
             // 更新session
-            $user = User::query()->where('id', $user['id'])->first()->toArray();
+            $user = User::query()->where('id', Auth::user()->id)->first()->toArray();
             Session::remove('user');
             Session::put('user', $user);
 
@@ -1197,21 +1170,18 @@ class UserController extends Controller
     // 推广返利
     public function referral(Request $request)
     {
-        // 生成个人推广链接
-        $user = Session::get('user');
-
         $view['website_logo'] = self::$systemConfig['website_logo'];
         $view['website_analytics'] = self::$systemConfig['website_analytics'];
         $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
         $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::query()->where('ref_user_id', $user['id'])->sum('ref_amount') / 100;
-        $view['canAmount'] = ReferralLog::query()->where('ref_user_id', $user['id'])->where('status', 0)->sum('ref_amount') / 100;
-        $view['link'] = self::$systemConfig['website_url'] . '/register?aff=' . $user['id'];
-        $view['referralLogList'] = ReferralLog::query()->where('ref_user_id', $user['id'])->with('user')->orderBy('id', 'desc')->paginate(10);
-        $view['referralApplyList'] = ReferralApply::query()->where('user_id', $user['id'])->with('user')->orderBy('id', 'desc')->paginate(10);
-        $view['referralUserList'] = User::query()->select(['username', 'created_at'])->where('referral_uid', $user['id'])->orderBy('id', 'desc')->paginate(10);
+        $view['totalAmount'] = ReferralLog::query()->where('ref_user_id', Auth::user()->id)->sum('ref_amount') / 100;
+        $view['canAmount'] = ReferralLog::query()->where('ref_user_id', Auth::user()->id)->where('status', 0)->sum('ref_amount') / 100;
+        $view['link'] = self::$systemConfig['website_url'] . '/register?aff=' . Auth::user()->id;
+        $view['referralLogList'] = ReferralLog::query()->where('ref_user_id', Auth::user()->id)->with('user')->orderBy('id', 'desc')->paginate(10);
+        $view['referralApplyList'] = ReferralApply::query()->where('user_id', Auth::user()->id)->with('user')->orderBy('id', 'desc')->paginate(10);
+        $view['referralUserList'] = User::query()->select(['username', 'created_at'])->where('referral_uid', Auth::user()->id)->orderBy('id', 'desc')->paginate(10);
 
         return Response::view('user.referral', $view);
     }
@@ -1219,21 +1189,19 @@ class UserController extends Controller
     // 申请提现
     public function extractMoney(Request $request)
     {
-        $user = Session::get('user');
-
         // 判断账户是否过期
-        if ($user['expire_time'] < date('Y-m-d')) {
+        if (Auth::user()->expire_time < date('Y-m-d')) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '申请失败:账号已过期,请先购买服务吧']);
         }
 
         // 判断是否已存在申请
-        $referralApply = ReferralApply::query()->where('user_id', $user['id'])->whereIn('status', [0, 1])->first();
+        $referralApply = ReferralApply::query()->where('user_id', Auth::user()->id)->whereIn('status', [0, 1])->first();
         if ($referralApply) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '申请失败:已存在申请,请等待之前的申请处理完']);
         }
 
         // 校验可以提现金额是否超过系统设置的阀值
-        $ref_amount = ReferralLog::query()->where('ref_user_id', $user['id'])->where('status', 0)->sum('ref_amount');
+        $ref_amount = ReferralLog::query()->where('ref_user_id', Auth::user()->id)->where('status', 0)->sum('ref_amount');
         $ref_amount = $ref_amount / 100;
         if ($ref_amount < self::$systemConfig['referral_money']) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '申请失败:满' . self::$systemConfig['referral_money'] . '元才可以提现,继续努力吧']);
@@ -1241,14 +1209,14 @@ class UserController extends Controller
 
         // 取出本次申请关联返利日志ID
         $link_logs = '';
-        $referralLog = ReferralLog::query()->where('ref_user_id', $user['id'])->where('status', 0)->get();
+        $referralLog = ReferralLog::query()->where('ref_user_id', Auth::user()->id)->where('status', 0)->get();
         foreach ($referralLog as $log) {
             $link_logs .= $log->id . ',';
         }
         $link_logs = rtrim($link_logs, ',');
 
         $obj = new ReferralApply();
-        $obj->user_id = $user['id'];
+        $obj->user_id = Auth::user()->id;
         $obj->before = $ref_amount;
         $obj->after = 0;
         $obj->amount = $ref_amount;
@@ -1273,16 +1241,14 @@ class UserController extends Controller
     // 更换订阅地址
     public function exchangeSubscribe(Request $request)
     {
-        $user = Session::get('user');
-
         DB::beginTransaction();
         try {
             // 更换订阅地址
             $code = $this->makeSubscribeCode();
-            UserSubscribe::query()->where('user_id', $user['id'])->update(['code' => $code]);
+            UserSubscribe::query()->where('user_id', Auth::user()->id)->update(['code' => $code]);
 
             // 更换连接密码
-            User::query()->where('id', $user['id'])->update(['passwd' => makeRandStr()]);
+            User::query()->where('id', Auth::user()->id)->update(['passwd' => makeRandStr()]);
 
             DB::commit();
 
@@ -1299,18 +1265,12 @@ class UserController extends Controller
     // 转换成管理员的身份
     public function switchToAdmin(Request $request)
     {
-        if (!Session::has('admin') || !Session::has('user')) {
+        if (!Session::has('admin')) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '非法请求']);
         }
 
-        $admin = Session::get('admin');
-        $user = User::query()->where('id', $admin['id'])->first();
-        if (!$user) {
-            return Response::json(['status' => 'fail', 'data' => '', 'message' => "非法请求"]);
-        }
-
         // 管理员信息重新写入user
-        Session::put('user', Session::get('admin'));
+        Auth::loginUsingId(Session::get('admin'));
         Session::forget('admin');
 
         return Response::json(['status' => 'success', 'data' => '', 'message' => "身份切换成功"]);
@@ -1319,8 +1279,6 @@ class UserController extends Controller
     // 卡券余额充值
     public function charge(Request $request)
     {
-        $user = Session::get('user');
-
         $coupon_sn = trim($request->get('coupon_sn'));
         if (empty($coupon_sn)) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '券码不能为空']);
@@ -1333,7 +1291,7 @@ class UserController extends Controller
 
         DB::beginTransaction();
         try {
-            $user = User::query()->where('id', $user['id'])->first();
+            $user = User::query()->where('id', Auth::user()->id)->first();
 
             // 写入日志
             $this->addUserBalanceLog($user->id, 0, $user->balance, $user->balance + $coupon->amount, $coupon->amount, '用户手动充值 - [充值券:' . $coupon_sn . ']');

+ 3 - 2
app/Http/Middleware/Admin.php

@@ -4,6 +4,7 @@ namespace App\Http\Middleware;
 
 use Closure;
 use Redirect;
+use Auth;
 
 class Admin
 {
@@ -17,8 +18,8 @@ class Admin
      */
     public function handle($request, Closure $next)
     {
-        if (!$request->session()->get('user')['is_admin']) {
-            return Redirect::to('login');
+        if (!Auth::user()->is_admin) {
+            return Redirect::to('/');
         }
 
         return $next($request);

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

@@ -4,7 +4,6 @@ namespace App\Http\Middleware;
 
 use Cookie;
 use Closure;
-use Redirect;
 
 class Affiliate
 {

+ 8 - 0
app/Http/Middleware/Muv2.php

@@ -9,6 +9,14 @@ use Redirect;
 
 class Muv2
 {
+    /**
+     * 用于支持GO版本V2ray
+     *
+     * @param         $request
+     * @param Closure $next
+     *
+     * @return \Illuminate\Http\JsonResponse|mixed
+     */
     public function handle($request, Closure $next)
     {
         \Log::info(json_encode($request->header()));

+ 2 - 11
app/Http/Middleware/User.php

@@ -4,7 +4,7 @@ namespace App\Http\Middleware;
 
 use Closure;
 use Redirect;
-use App\Http\Models\User as U;
+use Auth;
 
 class User
 {
@@ -18,16 +18,7 @@ class User
      */
     public function handle($request, Closure $next)
     {
-        if (!$request->session()->has('user')) {
-            if ($request->cookie("remember")) {
-                $u = U::query()->where("remember_token", $request->cookie("remember"))->first();
-                if ($u) {
-                    $request->session()->put('user', $u->toArray());
-
-                    return $next($request);
-                }
-            }
-
+        if (!Auth::check()) {
             return Redirect::to('login');
         }
 

+ 4 - 2
app/Http/Models/User.php

@@ -2,7 +2,8 @@
 
 namespace App\Http\Models;
 
-use Illuminate\Database\Eloquent\Model;
+use Illuminate\Notifications\Notifiable;
+use Illuminate\Foundation\Auth\User as Authenticatable;
 
 /**
  * 用户信息
@@ -10,8 +11,9 @@ use Illuminate\Database\Eloquent\Model;
  *
  * @package App\Http\Models
  */
-class User extends Model
+class User extends Authenticatable
 {
+    use Notifiable;
     protected $table = 'user';
     protected $primaryKey = 'id';
 

File diff ditekan karena terlalu besar
+ 169 - 234
composer.lock


+ 35 - 36
config/app.php

@@ -200,43 +200,42 @@ return [
     */
 
     'aliases' => [
-
-        'App' => Illuminate\Support\Facades\App::class,
-        'Artisan' => Illuminate\Support\Facades\Artisan::class,
-        'Auth' => Illuminate\Support\Facades\Auth::class,
-        'Blade' => Illuminate\Support\Facades\Blade::class,
-        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
-        'Bus' => Illuminate\Support\Facades\Bus::class,
-        'Cache' => Illuminate\Support\Facades\Cache::class,
-        'Config' => Illuminate\Support\Facades\Config::class,
-        'Cookie' => Illuminate\Support\Facades\Cookie::class,
-        'Crypt' => Illuminate\Support\Facades\Crypt::class,
-        'DB' => Illuminate\Support\Facades\DB::class,
-        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
-        'Event' => Illuminate\Support\Facades\Event::class,
-        'File' => Illuminate\Support\Facades\File::class,
-        'Gate' => Illuminate\Support\Facades\Gate::class,
-        'Hash' => Illuminate\Support\Facades\Hash::class,
-        'Lang' => Illuminate\Support\Facades\Lang::class,
-        'Log' => Illuminate\Support\Facades\Log::class,
-        'Mail' => Illuminate\Support\Facades\Mail::class,
+        'App'          => Illuminate\Support\Facades\App::class,
+        'Artisan'      => Illuminate\Support\Facades\Artisan::class,
+        'Auth'         => Illuminate\Support\Facades\Auth::class,
+        'Blade'        => Illuminate\Support\Facades\Blade::class,
+        'Broadcast'    => Illuminate\Support\Facades\Broadcast::class,
+        'Bus'          => Illuminate\Support\Facades\Bus::class,
+        'Cache'        => Illuminate\Support\Facades\Cache::class,
+        'Config'       => Illuminate\Support\Facades\Config::class,
+        'Cookie'       => Illuminate\Support\Facades\Cookie::class,
+        'Crypt'        => Illuminate\Support\Facades\Crypt::class,
+        'DB'           => Illuminate\Support\Facades\DB::class,
+        'Eloquent'     => Illuminate\Database\Eloquent\Model::class,
+        'Event'        => Illuminate\Support\Facades\Event::class,
+        'File'         => Illuminate\Support\Facades\File::class,
+        'Gate'         => Illuminate\Support\Facades\Gate::class,
+        'Hash'         => Illuminate\Support\Facades\Hash::class,
+        'Lang'         => Illuminate\Support\Facades\Lang::class,
+        'Log'          => Illuminate\Support\Facades\Log::class,
+        'Mail'         => Illuminate\Support\Facades\Mail::class,
         'Notification' => Illuminate\Support\Facades\Notification::class,
-        'Password' => Illuminate\Support\Facades\Password::class,
-        'Queue' => Illuminate\Support\Facades\Queue::class,
-        'Redirect' => Illuminate\Support\Facades\Redirect::class,
-        'Redis' => Illuminate\Support\Facades\Redis::class,
-        'Request' => Illuminate\Support\Facades\Request::class,
-        'Response' => Illuminate\Support\Facades\Response::class,
-        'Route' => Illuminate\Support\Facades\Route::class,
-        'Schema' => Illuminate\Support\Facades\Schema::class,
-        'Session' => Illuminate\Support\Facades\Session::class,
-        'Storage' => Illuminate\Support\Facades\Storage::class,
-        'URL' => Illuminate\Support\Facades\URL::class,
-        'Validator' => Illuminate\Support\Facades\Validator::class,
-        'View' => Illuminate\Support\Facades\View::class,
-        'Captcha' => Mews\Captcha\Facades\Captcha::class,
-        'Agent' => Jenssegers\Agent\Facades\Agent::class,
-        'Purifier' => Mews\Purifier\Facades\Purifier::class,
+        'Password'     => Illuminate\Support\Facades\Password::class,
+        'Queue'        => Illuminate\Support\Facades\Queue::class,
+        'Redirect'     => Illuminate\Support\Facades\Redirect::class,
+        'Redis'        => Illuminate\Support\Facades\Redis::class,
+        'Request'      => Illuminate\Support\Facades\Request::class,
+        'Response'     => Illuminate\Support\Facades\Response::class,
+        'Route'        => Illuminate\Support\Facades\Route::class,
+        'Schema'       => Illuminate\Support\Facades\Schema::class,
+        'Session'      => Illuminate\Support\Facades\Session::class,
+        'Storage'      => Illuminate\Support\Facades\Storage::class,
+        'URL'          => Illuminate\Support\Facades\URL::class,
+        'Validator'    => Illuminate\Support\Facades\Validator::class,
+        'View'         => Illuminate\Support\Facades\View::class,
+        'Captcha'      => Mews\Captcha\Facades\Captcha::class,
+        'Agent'        => Jenssegers\Agent\Facades\Agent::class,
+        'Purifier'     => Mews\Purifier\Facades\Purifier::class,
 
     ],
 

+ 6 - 6
config/auth.php

@@ -14,7 +14,7 @@ return [
     */
 
     'defaults' => [
-        'guard' => 'web',
+        'guard'     => 'web',
         'passwords' => 'users',
     ],
 
@@ -37,12 +37,12 @@ return [
 
     'guards' => [
         'web' => [
-            'driver' => 'session',
+            'driver'   => 'session',
             'provider' => 'users',
         ],
 
         'api' => [
-            'driver' => 'token',
+            'driver'   => 'token',
             'provider' => 'users',
         ],
     ],
@@ -67,7 +67,7 @@ return [
     'providers' => [
         'users' => [
             'driver' => 'eloquent',
-            'model' => App\User::class,
+            'model'  => App\Http\Models\User::class,
         ],
 
         // 'users' => [
@@ -94,8 +94,8 @@ return [
     'passwords' => [
         'users' => [
             'provider' => 'users',
-            'table' => 'password_resets',
-            'expire' => 60,
+            'table'    => 'password_resets',
+            'expire'   => 60,
         ],
     ],
 

+ 0 - 9
config/captcha.php

@@ -43,13 +43,4 @@ return [
         'contrast'  => -5,
     ],
 
-    // 自动售号机
-    'seller' => [
-        'length'    => 4,
-        'width'     => 90,
-        'height'    => 34,
-        'quality'   => 90,
-        'lines'     => 4,
-    ]
-
 ];

+ 1 - 1
database/factories/ModelFactory.php

@@ -12,7 +12,7 @@
 */
 
 /** @var \Illuminate\Database\Eloquent\Factory $factory */
-$factory->define(App\User::class, function (Faker\Generator $faker) {
+$factory->define(App\Http\Models\User::class, function (Faker\Generator $faker) {
     static $password;
 
     return [

TEMPAT SAMPAH
public/clients/Shadowrocket_2.1.23.ipa → public/clients/Shadowrocket-2.1.23.ipa


+ 1 - 1
public/clients/ipa.plist

@@ -10,7 +10,7 @@
                         <key>kind</key>
                         <string>software-package</string>
                         <key>url</key>
-                        <string>http://demo.ssrpanel.com/clients/Shadowrocket_2.1.23.ipa</string>
+                        <string>https://demo.ssrpanel.com/clients/Shadowrocket_2.1.23.ipa</string>
                     </dict>
                 </array>
                 <key>metadata</key>

+ 15 - 12
readme.md

@@ -1,7 +1,7 @@
 ## 项目描述
 ````
 1.SSR多节点账号管理面板,兼容SS、SSRR,需配合SSR或SSRR版后端使用
-2.支持v2ray(开发中)
+2.支持v2ray
 3.开放API,方便自行定制改造客户端
 4.内含简单的购物、卡券、邀请码、推广返利&提现、文章管理、工单(回复带邮件提醒)等模块
 5.用户、节点标签化,不同用户可见不同节点
@@ -31,7 +31,7 @@
 演示站:http://demo.ssrpanel.com
 telegram订阅频道:https://t.me/ssrpanel
 ````
-官网搭建于Azure,由代理商 [@LesHutt](https://t.me/LesHutt) 提供
+官网搭建于Azure,由代理商 [@LesHutt](https://t.me/LesHutt) 提供,需要流量机器,价格优惠需要的联系他。
 
 ## 捐赠
 **以太坊钱包** : 0x968f797f194fcec05ea571723199748b58de38ba
@@ -98,6 +98,14 @@ vim /usr/local/php/etc/php.ini
 修改完记得重启NGINX和PHP-FPM
 ````
 
+#### 密码错误
+````
+如果正确安装完成后发现admin无法登陆,请到SSRPanel目录下执行如下命令:
+php artisan upgradeUserPassword
+
+admin的密码将被改为admin
+````
+
 #### 重启NGINX和PHP-FPM
 ````
 service nginx restart
@@ -136,11 +144,8 @@ crontab -e -u www
 
 ###### 发邮件失败处理
 ````
-如果使用了逗比的ban_iptables.sh来防止用户发垃圾邮件
-可能会导致出现 Connection could not be established with host smtp.exmail.qq.com [Connection timed out #110] 这样的错误
-因为smtp发邮件必须用到25,26,465,587这四个端口,逗比的一键脚本会将这些端口一并封禁
-可以编辑iptables,注释掉以下这段(前面加个#号就可以),然后保存并重启iptables
-#-A OUTPUT -p tcp -m multiport --dports 25,26,465,587 -m state --state NEW,ESTABLISHED -j REJECT --reject-with icmp-port-unreachable
+出现 Connection could not be established with host smtp.exmail.qq.com [Connection timed out #110] 这样的错误
+因为smtp发邮件必须用到25,26,465,587这四个端口,故需要允许这四个端口通信
 ````
 
 ## 英文版
@@ -161,6 +166,7 @@ chown www:www ssserver.log
 ## IP库
 ```
 本项目使用的是纯真IP库,如果需要更新IP库文件,请上纯真官网把qqwry.dat下载并覆盖至 storage/qqwrt.dat 文件
+项目里还自带了IPIP的IP库,但是未使用,有开发能力的请自行测试。
 ```
 
 ## SSR(R)部署
@@ -266,12 +272,8 @@ ntpdate cn.pool.ntp.org
 3.本项目中ajax返回格式都是 {"status":"fail 或者 success", "data":[数据], "message":"文本消息提示语"}
 ````
 
-## 收费版
-````
-收费版代码混淆,不开源,具体请知识星球上私信我
-````
 
-## 致敬
+## 鸣谢
 - [@shadowsocks](https://github.com/shadowsocks)
 - [@breakwa11](https://github.com/breakwa11)
 - [@glzjin](https://github.com/esdeathlove)
@@ -280,6 +282,7 @@ ntpdate cn.pool.ntp.org
 - [@91yun](https://github.com/91yun)
 - [@Akkariiin](https://github.com/shadowsocksrr)
 - [@tonychanczm](https://github.com/tonychanczm)
+- [@aiyahacke](https://github.com/aiyahacke)
 - [@ipcheck](https://ipcheck.need.sh)
 - [@cz88](http://www.cz88.net/index.shtml)
 - [@ip.sb](https://www.ip.sb)

+ 1 - 1
resources/views/admin/addNode.blade.php

@@ -352,7 +352,7 @@
                                                         <div class="form-group">
                                                             <label for="v2_port" class="col-md-3 control-label">端口</label>
                                                             <div class="col-md-8">
-                                                                <input type="text" class="form-control" name="v2_port" value="23000" id="v2_port" placeholder="23000">
+                                                                <input type="text" class="form-control" name="v2_port" value="10087" id="v2_port" placeholder="10087">
                                                             </div>
                                                         </div>
                                                         <div class="form-group">

+ 1 - 1
resources/views/admin/editNode.blade.php

@@ -351,7 +351,7 @@
                                                         <div class="form-group">
                                                             <label for="v2_port" class="col-md-3 control-label">端口号</label>
                                                             <div class="col-md-8">
-                                                                <input type="text" class="form-control" name="v2_port" value="{{$node->v2_port}}" id="v2_port" placeholder="23000">
+                                                                <input type="text" class="form-control" name="v2_port" value="{{$node->v2_port}}" id="v2_port" placeholder="10087">
                                                             </div>
                                                         </div>
                                                         <div class="form-group">

+ 1 - 1
resources/views/admin/layouts.blade.php

@@ -59,7 +59,7 @@
                     <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->
                     <li class="dropdown dropdown-user dropdown-dark">
                         <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">
-                            <span class="username username-hide-on-mobile"> {{Session::get('user')['username']}} </span>
+                            <span class="username username-hide-on-mobile"> {{Auth::user()->username}} </span>
                             <!-- DOC: Do not remove below empty space(&nbsp;) as its purposely used -->
                             <img alt="" class="img-circle" src="/assets/images/avatar.png" /> </a>
                         <ul class="dropdown-menu dropdown-menu-default">

+ 1 - 1
resources/views/admin/profile.blade.php

@@ -32,7 +32,7 @@
                         <!-- END SIDEBAR USERPIC -->
                         <!-- SIDEBAR USER TITLE -->
                         <div class="profile-usertitle">
-                            <div class="profile-usertitle-name"> {{Session::get('user')['username']}} </div>
+                            <div class="profile-usertitle-name"> {{Auth::user()->username}} </div>
                             <div class="profile-usertitle-job"> 管理员 </div>
                         </div>
                         <!-- END SIDEBAR USER TITLE -->

+ 26 - 27
resources/views/admin/system.blade.php

@@ -95,7 +95,6 @@
                                                                     <option value="1" @if($is_invite_register == '1') selected @endif>可选</option>
                                                                     <option value="2" @if($is_invite_register == '2') selected @endif>必须</option>
                                                                 </select>
-                                                                <span class="help-block"> 启用后必须使用邀请码进行注册 </span>
                                                             </div>
                                                         </div>
                                                     </div>
@@ -281,7 +280,7 @@
                                                                         <button class="btn btn-success" type="button" onclick="setSubscribeDomain()">修改</button>
                                                                     </span>
                                                                 </div>
-                                                                <span class="help-block"> (推荐)防止面板域名被投毒后无法正常订阅,需带http://或https:// </span>
+                                                                <span class="help-block"> (推荐)防止面板域名被DNS投毒后无法正常订阅,需带http://或https:// </span>
                                                             </div>
                                                         </div>
                                                         <div class="col-md-6">
@@ -512,7 +511,29 @@
                                                                         <button class="btn btn-success" type="button" onclick="setCrashWarningEmail()">修改</button>
                                                                     </span>
                                                                 </div>
-                                                                <span class="help-block"> 填写此值则节点宕机、工单回复会自动提醒 </span>
+                                                                <span class="help-block"> 填写此值则节点宕机、用户回复工单都会自动提醒 </span>
+                                                            </div>
+                                                        </div>
+                                                    </div>
+                                                    <div class="form-group">
+                                                        <div class="col-md-6">
+                                                            <label for="is_tcp_check" class="col-md-3 control-label">TCP阻断检测</label>
+                                                            <div class="col-md-9">
+                                                                <input type="checkbox" class="make-switch" @if($is_tcp_check) checked @endif id="is_tcp_check" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
+                                                                <span class="help-block"> 每30~60分钟内随机检测节点是否被TCP阻断并提醒 </span>
+                                                            </div>
+                                                        </div>
+                                                        <div class="col-md-6">
+                                                            <label for="tcp_check_warning_times" class="col-md-3 control-label">阻断检测提醒</label>
+                                                            <div class="col-md-9">
+                                                                <div class="input-group">
+                                                                    <input class="form-control" type="text" name="tcp_check_warning_times" value="{{$tcp_check_warning_times}}" id="tcp_check_warning_times" placeholder="" />
+                                                                    <span class="input-group-addon">次</span>
+                                                                    <span class="input-group-btn">
+                                                                        <button class="btn btn-success" type="button" onclick="setTcpCheckWarningTimes()">修改</button>
+                                                                    </span>
+                                                                </div>
+                                                                <span class="help-block"> 提醒几次后自动下线节点,为0时不限制,不超过12 </span>
                                                             </div>
                                                         </div>
                                                     </div>
@@ -594,28 +615,6 @@
                                                         </div>
                                                         <div class="col-md-6"></div>
                                                     </div>
-                                                    <div class="form-group">
-                                                        <div class="col-md-6">
-                                                            <label for="is_tcp_check" class="col-md-3 control-label">TCP阻断检测</label>
-                                                            <div class="col-md-9">
-                                                                <input type="checkbox" class="make-switch" @if($is_tcp_check) checked @endif id="is_tcp_check" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
-                                                                <span class="help-block"> 每小时自动检测节点是否被TCP阻断并提醒 </span>
-                                                            </div>
-                                                        </div>
-                                                        <div class="col-md-6">
-                                                            <label for="tcp_check_warning_times" class="col-md-3 control-label">阻断检测提醒</label>
-                                                            <div class="col-md-9">
-                                                                <div class="input-group">
-                                                                    <input class="form-control" type="text" name="tcp_check_warning_times" value="{{$tcp_check_warning_times}}" id="tcp_check_warning_times" placeholder="" />
-                                                                    <span class="input-group-addon">次</span>
-                                                                    <span class="input-group-btn">
-                                                                        <button class="btn btn-success" type="button" onclick="setTcpCheckWarningTimes()">修改</button>
-                                                                    </span>
-                                                                </div>
-                                                                <span class="help-block"> 提醒几次后自动下线节点,为0时不限制,不超过12 </span>
-                                                            </div>
-                                                        </div>
-                                                    </div>
                                                 </div>
                                             </form>
                                         </div>
@@ -720,7 +719,7 @@
                                                     <div class="form-group">
                                                         <div class="col-md-12">
                                                             <div class="alert alert-info" style="text-align: center;">
-                                                                请在<a href="https://console.youzanyun.com/login" target="_blank">有赞云</a>后台设置应用的推送网址为:{{$website_url . '/api/yzy'}}
+                                                                请在<a href="https://console.youzanyun.com/login" target="_blank" style="color: red;">有赞云</a>设置应用的推送网址为:{{$website_url . '/api/yzy'}}
                                                             </div>
                                                         </div>
                                                     </div>
@@ -729,7 +728,7 @@
                                                             <label for="is_youzan" class="col-md-3 control-label">本功能</label>
                                                             <div class="col-md-9">
                                                                 <input type="checkbox" class="make-switch" @if($is_youzan) checked @endif id="is_youzan" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
-                                                                <span class="help-block"> 请先到<a href="https://console.youzanyun.com/dashboard">有赞云</a>申请client_id和client_secret并绑定店铺 </span>
+                                                                <span class="help-block"> 请先到<a href="https://console.youzanyun.com/dashboard">有赞云</a>申请client_id和client_secret并绑定店铺(<a href="https://github.com/ssrpanel/SSRPanel/wiki/%E6%9C%89%E8%B5%9E%E4%BA%91%E6%94%AF%E4%BB%98" target="_blank">申请教程</a>) </span>
                                                             </div>
                                                         </div>
                                                         <div class="col-md-6">

+ 0 - 24
resources/views/user/index.blade.php

@@ -1,28 +1,4 @@
 @extends('user.layouts')
-
-@section('css')
-    <link href="/assets/global/plugins/fancybox/source/jquery.fancybox.css" rel="stylesheet" type="text/css" />
-    <style type="text/css">
-        .fancybox > img {
-            width: 75px;
-            height: 75px;
-        }
-        .ticker {
-            background-color: #fff;
-            margin-bottom: 20px;
-            border: 1px solid #e7ecf1!important;
-            border-radius: 4px;
-            -webkit-border-radius: 4px;
-        }
-        .ticker ul {
-            padding: 0;
-        }
-        .ticker li {
-            list-style: none;
-            padding: 15px;
-        }
-    </style>
-@endsection
 @section('title', trans('home.panel'))
 @section('content')
     <!-- BEGIN CONTENT BODY -->

+ 1 - 1
resources/views/user/invite.blade.php

@@ -62,7 +62,7 @@
                                             @foreach($inviteList as $key => $invite)
                                                 <tr>
                                                     <td> {{$key + 1}} </td>
-                                                    <td> <a href="{{url('register?aff='.Session::get('user')['id'].'&code='.$invite->code)}}" target="_blank">{{$invite->code}}</a> </td>
+                                                    <td> <a href="{{url('register?aff='.Auth::user()->id.'&code='.$invite->code)}}" target="_blank">{{$invite->code}}</a> </td>
                                                     <td> {{$invite->dateline}} </td>
                                                     <td>
                                                         @if($invite->status == '0')

+ 3 - 3
resources/views/user/layouts.blade.php

@@ -63,11 +63,11 @@
                     <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->
                     <li class="dropdown dropdown-user dropdown-dark">
                         <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">
-                            <span class="username username-hide-on-mobile"> {{Session::get('user')['username']}} </span>
+                            <span class="username username-hide-on-mobile"> {{Auth::user()->username}} </span>
                             <!-- DOC: Do not remove below empty space(&nbsp;) as its purposely used -->
                             <img alt="" class="img-circle" src="/assets/images/avatar.png" /> </a>
                         <ul class="dropdown-menu dropdown-menu-default">
-                            @if(Session::get('user')['is_admin'])
+                            @if(Auth::user()->is_admin)
                                 <li>
                                     <a href="{{url('admin')}}"> <i class="icon-settings"></i>{{trans('home.console')}}</a>
                                 </li>
@@ -174,7 +174,7 @@
     @if(Session::get("admin"))
         <div class="portlet light bordered" style="position:fixed;right:20px;bottom:0px;width:270px;">
             <div class="portlet-body text-right">
-                <h5>当前身份:{{Session::get("user")['username']}}</h5>
+                <h5>当前身份:{{Auth::user()->username}}</h5>
                 <button class="btn btn-sm btn-danger" id="return_to_admin"> 返回管理页面 </button>
             </div>
         </div>

+ 2 - 2
routes/api.php

@@ -5,8 +5,8 @@ Route::group(['namespace' => 'Api'], function () {
     Route::resource('yzy', 'YzyController');
 
     // 定制客户端
-    Route::get('login', 'LoginController@login');
+    Route::any('login', 'LoginController@login');
 
     // PING检测
-    Route::get('ping', 'PingController@ping')->middleware('admin');
+    Route::get('ping', 'PingController@ping');
 });

+ 0 - 15
routes/web.php

@@ -143,18 +143,3 @@ Route::group(['namespace' => 'Muv2', 'prefix' => 'mu/v2', 'middleware' => ['Muv2
     Route::get('nodes/{id}/v2rayUsers', 'NodeController@v2rayUsers');
     Route::post('nodes/{id}/traffic', 'NodeController@postTraffic');
 });
-
-// 自动提号机
-Route::group(['prefix' => 'seller', 'middleware' => ['forbidden']], function () {
-    Route::get('/', 'SellerController@index');
-    Route::get('buy/{id}', 'SellerController@buy');
-    Route::post('createPayment', 'SellerController@createPayment'); // 创建支付单
-    Route::get('payment/{sn}', 'SellerController@payment'); // 支付单详情
-    Route::post('redeemCoupon', 'SellerController@redeemCoupon'); // 检查优惠券
-    Route::get('order', 'SellerController@order');
-    Route::post('searchOrder', 'SellerController@searchOrder');
-    Route::get('getPaymentStatus', 'SellerController@getPaymentStatus');
-    Route::get('send', 'SellerController@send');
-    Route::post('sendEmail', 'SellerController@sendEmail'); // 邮件重发
-    Route::any('info', 'SellerController@info'); // 余量查询
-});

+ 15 - 1
sql/db.sql

@@ -166,7 +166,7 @@ LOCK TABLES `user` WRITE;
 /*!40000 ALTER TABLE `user` DISABLE KEYS */;
 
 INSERT INTO `user` (`id`, `username`, `password`, `port`, `passwd`, `transfer_enable`, `u`, `d`, `t`, `enable`, `method`, `protocol`, `protocol_param`, `obfs`, `obfs_param`, `speed_limit_per_con`, `speed_limit_per_user`, `wechat`, `qq`, `usage`, `pay_way`, `balance`, `enable_time`, `expire_time`, `remark`, `is_admin`, `reg_ip`, `created_at`, `updated_at`)
-VALUES (1,'admin','e10adc3949ba59abbe56e057f20f883e',10000,'@123',1073741824000,0,0,0,1,'aes-192-ctr','auth_chain_a','','tls1.2_ticket_auth','',204800,204800,'','',1,3,0.00,NULL,'2099-01-01',NULL,1,'127.0.0.1',NULL,NULL);
+VALUES (1,'admin','$2y$10$ryMdx5ejvCSdjvZVZAPpOuxHrsAUY8FEINUATy6RCck6j9EeHhPfq',10000,'@123',1073741824000,0,0,0,1,'aes-192-ctr','auth_chain_a','','tls1.2_ticket_auth','',204800,204800,'','',1,3,0.00,NULL,'2099-01-01',NULL,1,'127.0.0.1',NULL,NULL);
 
 /*!40000 ALTER TABLE `user` ENABLE KEYS */;
 UNLOCK TABLES;
@@ -1108,6 +1108,20 @@ CREATE TABLE `user_login_log` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户登录日志';
 
 
+-- ----------------------------
+-- Table structure for `ss_node_ip`
+-- ----------------------------
+CREATE TABLE `ss_node_ip` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `node_id` int(11) NOT NULL DEFAULT '0' COMMENT '节点ID',
+  `port` int(11) NOT NULL DEFAULT '0' COMMENT '端口',
+  `type` char(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'tcp' COMMENT '类型:tcp、udp',
+  `ip` text COLLATE utf8mb4_unicode_ci COMMENT '连接IP:每个IP用,号隔开',
+  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '上报时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

+ 10 - 0
sql/update/20181027.sql

@@ -0,0 +1,10 @@
+-- 节点各个端口的连接IP记录表(由节点每60秒上报一次)
+CREATE TABLE `ss_node_ip` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `node_id` int(11) NOT NULL DEFAULT '0' COMMENT '节点ID',
+  `port` int(11) NOT NULL DEFAULT '0' COMMENT '端口',
+  `type` char(10) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'tcp' COMMENT '类型:tcp、udp',
+  `ip` text COLLATE utf8mb4_unicode_ci COMMENT '连接IP:每个IP用,号隔开',
+  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '上报时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

TEMPAT SAMPAH
storage/qqwry.dat


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini