Sfoglia il codice sorgente

1.移除push_bear
2.登录自动送积分功能改为手动签到送流量
3.将订阅和节点列表独立出来,个人中心首页干净了
4.升级验证码为科学计算

admin 7 anni fa
parent
commit
6f65ba7dce

+ 14 - 1
app/Http/Controllers/AdminController.php

@@ -2185,8 +2185,10 @@ EOF;
         $is_expire = $request->get('is_expire');
         $pay_way = $request->get('pay_way');
         $status = intval($request->get('status'));
+        $range_time = $request->get('range_time');
+        $sort = intval($request->get('sort')); // 0-按创建时间降序、1-按创建时间升序
 
-        $query = Order::query()->with(['user', 'goods', 'coupon'])->orderBy('oid', 'desc');
+        $query = Order::query()->with(['user', 'goods', 'coupon']);
 
         if ($username) {
             $query->whereHas('user', function ($q) use ($username) {
@@ -2214,6 +2216,17 @@ EOF;
             $query->where('status', $status);
         }
 
+        if ($range_time) {
+            $range_time = explode('至', $range_time);
+            $query->where('created_at', '>=', trim($range_time['0']))->where('created_at', '<=', trim($range_time[1]));
+        }
+
+        if ($sort) {
+            $query->orderBy('oid', 'asc');
+        } else {
+            $query->orderBy('oid', 'desc');
+        }
+
         $view['orderList'] = $query->paginate(15)->appends($request->except('page'));
 
         return Response::view('admin.orderList', $view);

+ 0 - 17
app/Http/Controllers/AuthController.php

@@ -92,23 +92,6 @@ class AuthController extends Controller
                 }
             }
 
-            // 登录送积分
-            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', Auth::user()->id)->increment('score', $score);
-                    if ($ret) {
-                        $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 . ' 积分,您可以用它兑换流量');
-                    }
-                }
-            }
-
             // 写入登录日志
             $this->addUserLoginLog(Auth::user()->id, getClientIp());
 

+ 3 - 3
app/Http/Controllers/SubscribeController.php

@@ -241,7 +241,7 @@ class SubscribeController extends Controller
     // 抛出无可用的节点信息,用于兼容防止客户端订阅失败
     private function noneNode()
     {
-        return base64url_encode('ssr://' . base64url_encode('1.1.1.1:8888:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode('无可用节点或账号被封禁或订阅被封禁') . '&group=' . base64url_encode('错误') . '&udpport=0&uot=0') . "\n");
+        return base64url_encode('ssr://' . base64url_encode('0.0.0.0:1:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode('无可用节点或账号被封禁或订阅被封禁') . '&group=' . base64url_encode('错误') . '&udpport=0&uot=0') . "\n");
     }
 
     /**
@@ -255,7 +255,7 @@ class SubscribeController extends Controller
     {
         $text = '到期时间:' . $user->expire_time;
 
-        return 'ssr://' . base64url_encode('8.8.8.8:8888:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode($text) . '&group=' . base64url_encode('默认') . '&udpport=0&uot=0') . "\n";
+        return 'ssr://' . base64url_encode('0.0.0.0:1:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode($text) . '&group=' . base64url_encode(Helpers::systemConfig()['website_name']) . '&udpport=0&uot=0') . "\n";
     }
 
     /**
@@ -269,6 +269,6 @@ class SubscribeController extends Controller
     {
         $text = '剩余流量:' . flowAutoShow($user->transfer_enable - $user->u - $user->d);
 
-        return 'ssr://' . base64url_encode('9.9.9.9:8888:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode($text) . '&group=' . base64url_encode('默认') . '&udpport=0&uot=0') . "\n";
+        return 'ssr://' . base64url_encode('0.0.0.0:1:origin:none:plain:' . base64url_encode('0000') . '/?obfsparam=&protoparam=&remarks=' . base64url_encode($text) . '&group=' . base64url_encode(Helpers::systemConfig()['website_name']) . '&udpport=0&uot=0') . "\n";
     }
 }

+ 98 - 124
app/Http/Controllers/UserController.php

@@ -9,7 +9,6 @@ use App\Http\Models\Coupon;
 use App\Http\Models\Goods;
 use App\Http\Models\GoodsLabel;
 use App\Http\Models\Invite;
-use App\Http\Models\Level;
 use App\Http\Models\Order;
 use App\Http\Models\ReferralApply;
 use App\Http\Models\ReferralLog;
@@ -20,12 +19,12 @@ use App\Http\Models\Ticket;
 use App\Http\Models\TicketReply;
 use App\Http\Models\User;
 use App\Http\Models\UserLabel;
-use App\Http\Models\UserLoginLog;
 use App\Http\Models\UserSubscribe;
 use App\Http\Models\UserTrafficDaily;
 use App\Http\Models\UserTrafficHourly;
 use App\Mail\newTicket;
 use App\Mail\replyTicket;
+use Cache;
 use Illuminate\Http\Request;
 use Redirect;
 use Response;
@@ -54,34 +53,92 @@ class UserController extends Controller
 
     public function index(Request $request)
     {
-        $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;
-        $user->levelName = Level::query()->where('level', $user['level'])->first()['level_name'];
-
-        $view['info'] = $user->toArray();
-        $view['notice'] = Article::query()->where('type', 2)->where('is_del', 0)->orderBy('id', 'desc')->first();
-        $view['ipa_list'] = 'itms-services://?action=download-manifest&url=' . self::$systemConfig['website_url'] . '/clients/ipa.plist';
-        $view['goodsList'] = Goods::query()->where('type', 3)->where('status', 1)->where('is_del', 0)->orderBy('sort', 'desc')->orderBy('price', 'asc')->limit(10)->get(); // 余额充值商品,只取10个
-        $view['userLoginLog'] = UserLoginLog::query()->where('user_id', Auth::user()->id)->orderBy('id', 'desc')->limit(5)->get(); // 近期登录日志
+        $dailyData = [];
+        $hourlyData = [];
+
+        // 节点一个月内的流量
+        $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();
 
-        // 推广返利是否可见
-        if (!Session::has('referral_status')) {
-            Session::put('referral_status', self::$systemConfig['referral_status']);
+        $dailyTotal = date('d', time()) - 1; // 今天不算,减一
+        $dailyCount = count($userTrafficDaily);
+        for ($x = 0; $x < ($dailyTotal - $dailyCount); $x++) {
+            $dailyData[$x] = 0;
+        }
+        for ($x = ($dailyTotal - $dailyCount); $x < $dailyTotal; $x++) {
+            $dailyData[$x] = round($userTrafficDaily[$x - ($dailyTotal - $dailyCount)] / (1024 * 1024 * 1024), 3);
         }
 
+        // 节点一天内的流量
+        $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++) {
+            $hourlyData[$x] = 0;
+        }
+        for ($x = ($hourlyTotal - $hourlyCount); $x < $hourlyTotal; $x++) {
+            $hourlyData[$x] = round($userTrafficHourly[$x - ($hourlyTotal - $hourlyCount)] / (1024 * 1024 * 1024), 3);
+        }
+
+        // 本月天数数据
+        $monthDays = [];
+        $monthHasDays = date("t");
+        for ($i = 1; $i <= $monthHasDays; $i++) {
+            $monthDays[] = $i;
+        }
+
+        $view['trafficDaily'] = "'" . implode("','", $dailyData) . "'";
+        $view['trafficHourly'] = "'" . implode("','", $hourlyData) . "'";
+        $view['monthDays'] = "'" . implode("','", $monthDays) . "'";
+        $view['notice'] = Article::query()->where('type', 2)->where('is_del', 0)->orderBy('id', 'desc')->first(); // 公告
+
+        return Response::view('user.index', $view);
+    }
+
+    // 签到
+    public function checkIn(Request $request)
+    {
+        // 系统开启登录加积分功能才可以签到
+        if (!self::$systemConfig['is_checkin']) {
+            return Response::json(['status' => 'fail', 'message' => '系统未开启签到功能']);
+        }
+
+        // 已签到过,验证是否有效
+        if (Cache::has('userCheckIn_' . Auth::user()->id)) {
+            return Response::json(['status' => 'fail', 'message' => '已经签到过了,明天再来吧']);
+        }
+
+        $score = mt_rand(self::$systemConfig['min_rand_traffic'], self::$systemConfig['max_rand_traffic']);
+        $ret = User::query()->where('id', Auth::user()->id)->increment('transfer_enable', $score * 1048576);
+        if (!$ret) {
+            return Response::json(['status' => 'fail', 'message' => '签到失败,系统异常']);
+        }
+
+        // 写入用户流量变动记录
+        Helpers::addUserTrafficModifyLog(Auth::user()->id, 0, Auth::user()->transfer_enable, Auth::user()->transfer_enable + $score * 1048576, '[签到]');
+
+        // 多久后可以再签到
+        $ttl = self::$systemConfig['traffic_limit_time'] ? self::$systemConfig['traffic_limit_time'] : 1440;
+        Cache::put('userCheckIn_' . Auth::user()->id, '1', $ttl);
+
+        return Response::json(['status' => 'success', 'message' => '签到成功,系统送您 ' . $score . 'M 流量']);
+    }
+
+    // 节点列表
+    public function nodeList(Request $request)
+    {
+        // 在线安装APP
+        $view['ipa_list'] = 'itms-services://?action=download-manifest&url=' . self::$systemConfig['website_url'] . '/clients/ipa.plist';
+
         // 订阅码
-        $subscribe = UserSubscribe::query()->where('user_id', Auth::user()->id)->first();
-        $view['subscribe_status'] = $subscribe->status;
-        $view['link'] = (self::$systemConfig['subscribe_domain'] ? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url']) . '/s/' . $subscribe->code;
+        $view['link'] = (self::$systemConfig['subscribe_domain'] ? self::$systemConfig['subscribe_domain'] : self::$systemConfig['website_url']) . '/s/' . Auth::user()->subscribe->code;
 
         // 节点列表
         $userLabelIds = UserLabel::query()->where('user_id', Auth::user()->id)->pluck('label_id');
         if (empty($userLabelIds)) {
             $view['nodeList'] = [];
+            $view['allNodes'] = '';
 
-            return Response::view('user.index', $view);
+            return Response::view('user.nodeList', $view);
         }
 
         $nodeList = DB::table('ss_node')
@@ -101,14 +158,14 @@ class UserController extends Controller
 
             if ($node->type == 1) {
                 // 生成ssr scheme
-                $obfs_param = $user->obfs_param ? $user->obfs_param : $node->obfs_param;
-                $protocol_param = $node->single ? $user->port . ':' . $user->passwd : $user->protocol_param;
+                $obfs_param = Auth::user()->obfs_param ? Auth::user()->obfs_param : $node->obfs_param;
+                $protocol_param = $node->single ? Auth::user()->port . ':' . Auth::user()->passwd : Auth::user()->protocol_param;
 
-                $ssr_str = ($node->server ? $node->server : $node->ip) . ':' . ($node->single ? $node->single_port : $user->port);
-                $ssr_str .= ':' . ($node->single ? $node->single_protocol : $user->protocol) . ':' . ($node->single ? $node->single_method : $user->method);
-                $ssr_str .= ':' . ($node->single ? $node->single_obfs : $user->obfs) . ':' . ($node->single ? base64url_encode($node->single_passwd) : base64url_encode($user->passwd));
+                $ssr_str = ($node->server ? $node->server : $node->ip) . ':' . ($node->single ? $node->single_port : Auth::user()->port);
+                $ssr_str .= ':' . ($node->single ? $node->single_protocol : Auth::user()->protocol) . ':' . ($node->single ? $node->single_method : Auth::user()->method);
+                $ssr_str .= ':' . ($node->single ? $node->single_obfs : Auth::user()->obfs) . ':' . ($node->single ? base64url_encode($node->single_passwd) : base64url_encode(Auth::user()->passwd));
                 $ssr_str .= '/?obfsparam=' . base64url_encode($obfs_param);
-                $ssr_str .= '&protoparam=' . ($node->single ? base64url_encode($user->port . ':' . $user->passwd) : base64url_encode($protocol_param));
+                $ssr_str .= '&protoparam=' . ($node->single ? base64url_encode(Auth::user()->port . ':' . Auth::user()->passwd) : base64url_encode($protocol_param));
                 $ssr_str .= '&remarks=' . base64url_encode($node->name);
                 $ssr_str .= '&group=' . base64url_encode(empty($group) ? '' : $group->name);
                 $ssr_str .= '&udpport=0';
@@ -117,8 +174,8 @@ class UserController extends Controller
                 $ssr_scheme = 'ssr://' . $ssr_str;
 
                 // 生成ss scheme
-                $ss_str = $user->method . ':' . $user->passwd . '@';
-                $ss_str .= ($node->server ? $node->server : $node->ip) . ':' . $user->port;
+                $ss_str = Auth::user()->method . ':' . Auth::user()->passwd . '@';
+                $ss_str .= ($node->server ? $node->server : $node->ip) . ':' . Auth::user()->port;
                 $ss_str = base64url_encode($ss_str) . '#' . 'VPN';
                 $ss_scheme = 'ss://' . $ss_str;
 
@@ -127,14 +184,14 @@ class UserController extends Controller
                 if ($node->ipv6) {
                     $txt .= "IPv6:" . $node->ipv6 . "\r\n";
                 }
-                $txt .= "远程端口:" . ($node->single ? $node->single_port : $user->port) . "\r\n";
-                $txt .= "密码:" . ($node->single ? $node->single_passwd : $user->passwd) . "\r\n";
-                $txt .= "加密方法:" . ($node->single ? $node->single_method : $user->method) . "\r\n";
+                $txt .= "远程端口:" . ($node->single ? $node->single_port : Auth::user()->port) . "\r\n";
+                $txt .= "密码:" . ($node->single ? $node->single_passwd : Auth::user()->passwd) . "\r\n";
+                $txt .= "加密方法:" . ($node->single ? $node->single_method : Auth::user()->method) . "\r\n";
                 $txt .= "路由:绕过局域网及中国大陆地址" . "\r\n\r\n";
-                $txt .= "协议:" . ($node->single ? $node->single_protocol : $user->protocol) . "\r\n";
-                $txt .= "协议参数:" . ($node->single ? $user->port . ':' . $user->passwd : $user->protocol_param) . "\r\n";
-                $txt .= "混淆方式:" . ($node->single ? $node->single_obfs : $user->obfs) . "\r\n";
-                $txt .= "混淆参数:" . ($user->obfs_param ? $user->obfs_param : $node->obfs_param) . "\r\n";
+                $txt .= "协议:" . ($node->single ? $node->single_protocol : Auth::user()->protocol) . "\r\n";
+                $txt .= "协议参数:" . ($node->single ? Auth::user()->port . ':' . Auth::user()->passwd : Auth::user()->protocol_param) . "\r\n";
+                $txt .= "混淆方式:" . ($node->single ? $node->single_obfs : Auth::user()->obfs) . "\r\n";
+                $txt .= "混淆参数:" . (Auth::user()->obfs_param ? Auth::user()->obfs_param : $node->obfs_param) . "\r\n";
                 $txt .= "本地端口:1080" . "\r\n";
 
                 $node->txt = $txt;
@@ -149,7 +206,7 @@ class UserController extends Controller
                     "ps"   => $node->name,
                     "add"  => $node->server ? $node->server : $node->ip,
                     "port" => $node->v2_port,
-                    "id"   => $user->vmess_id,
+                    "id"   => Auth::user()->vmess_id,
                     "aid"  => $node->v2_alter_id,
                     "net"  => $node->v2_net,
                     "type" => $node->v2_type,
@@ -166,7 +223,7 @@ class UserController extends Controller
                 }
                 $txt .= "端口:" . $node->v2_port . "\r\n";
                 $txt .= "加密方式:" . $node->v2_method . "\r\n";
-                $txt .= "用户ID:" . $user->vmess_id . "\r\n";
+                $txt .= "用户ID:" . Auth::user()->vmess_id . "\r\n";
                 $txt .= "额外ID:" . $node->v2_alter_id . "\r\n";
                 $txt .= "传输协议:" . $node->v2_net . "\r\n";
                 $txt .= "伪装类型:" . $node->v2_type . "\r\n";
@@ -189,7 +246,7 @@ class UserController extends Controller
         $view['allNodes'] = rtrim($allNodes, "|");
         $view['nodeList'] = $nodeList;
 
-        return Response::view('user.index', $view);
+        return Response::view('user.nodeList', $view);
     }
 
     // 公告详情
@@ -290,52 +347,11 @@ class UserController extends Controller
         }
     }
 
-    // 流量日志
-    public function trafficLog(Request $request)
-    {
-        $dailyData = [];
-        $hourlyData = [];
-
-        // 节点一个月内的流量
-        $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);
-        for ($x = 0; $x < ($dailyTotal - $dailyCount); $x++) {
-            $dailyData[$x] = 0;
-        }
-        for ($x = ($dailyTotal - $dailyCount); $x < $dailyTotal; $x++) {
-            $dailyData[$x] = round($userTrafficDaily[$x - ($dailyTotal - $dailyCount)] / (1024 * 1024 * 1024), 3);
-        }
-
-        // 节点一天内的流量
-        $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++) {
-            $hourlyData[$x] = 0;
-        }
-        for ($x = ($hourlyTotal - $hourlyCount); $x < $hourlyTotal; $x++) {
-            $hourlyData[$x] = round($userTrafficHourly[$x - ($hourlyTotal - $hourlyCount)] / (1024 * 1024 * 1024), 3);
-        }
-
-        // 本月天数数据
-        $monthDays = [];
-        $monthHasDays = date("t");
-        for ($i = 1; $i <= $monthHasDays; $i++) {
-            $monthDays[] = $i;
-        }
-
-        $view['trafficDaily'] = "'" . implode("','", $dailyData) . "'";
-        $view['trafficHourly'] = "'" . implode("','", $hourlyData) . "'";
-        $view['monthDays'] = "'" . implode("','", $monthDays) . "'";
-
-        return Response::view('user.trafficLog', $view);
-    }
-
     // 商品列表
     public function services(Request $request)
     {
+        // 余额充值商品,只取10个
+        $view['chargeGoodsList'] = Goods::query()->where('type', 3)->where('status', 1)->where('is_del', 0)->orderBy('sort', 'desc')->orderBy('price', 'asc')->limit(10)->get();
         $view['goodsList'] = Goods::query()->where('status', 1)->where('is_del', 0)->where('type', '<=', '2')->orderBy('type', 'desc')->orderBy('sort', 'desc')->paginate(10)->appends($request->except('page'));
 
         return Response::view('user.services', $view);
@@ -461,7 +477,7 @@ class UserController extends Controller
 
         $ret = Ticket::query()->where('id', $id)->where('user_id', Auth::user()->id)->update(['status' => 2]);
         if ($ret) {
-            ServerChan::send('工单关闭提醒', '工单:ID' . $id . '户已手动关闭');
+            ServerChan::send('工单关闭提醒', '工单:ID' . $id . '户已手动关闭');
 
             return Response::json(['status' => 'success', 'data' => '', 'message' => '关闭成功']);
         } else {
@@ -754,53 +770,11 @@ class UserController extends Controller
             }
 
             $view['goods'] = $goods;
-            $view['is_youzan'] = self::$systemConfig['is_youzan'];
-            $view['is_alipay'] = self::$systemConfig['is_alipay'];
-            $view['is_f2fpay'] = self::$systemConfig['is_f2fpay'];
 
             return Response::view('user.buy', $view);
         }
     }
 
-    // 积分兑换流量
-    public function exchange(Request $request)
-    {
-        // 积分满100才可以兑换
-        if (Auth::user()->score < 100) {
-            return Response::json(['status' => 'fail', 'data' => '', 'message' => '兑换失败:满100才可以兑换,请继续累计吧']);
-        }
-
-        // 账号过期不允许兑换
-        if (Auth::user()->expire_time < date('Y-m-d')) {
-            return Response::json(['status' => 'fail', 'data' => '', 'message' => '兑换失败:账号已过期,请先购买服务吧']);
-        }
-
-        DB::beginTransaction();
-        try {
-            // 写入积分操作日志
-            $ret = $this->addUserScoreLog(Auth::user()->id, Auth::user()->score, 0, -1 * Auth::user()->score, '积分兑换流量');
-
-            // 扣积分加流量
-            if ($ret) {
-                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', Auth::user()->id)->first()->toArray();
-            Session::remove('user');
-            Session::put('user', $user);
-
-            return Response::json(['status' => 'success', 'data' => '', 'message' => '兑换成功']);
-        } catch (\Exception $e) {
-            DB::rollBack();
-
-            return Response::json(['status' => 'fail', 'data' => '', 'message' => '兑换失败:' . $e->getMessage()]);
-        }
-    }
-
     // 推广返利
     public function referral(Request $request)
     {

+ 2 - 1
app/Http/Middleware/VerifyCsrfToken.php

@@ -12,6 +12,7 @@ class VerifyCsrfToken extends Middleware
      * @var array
      */
     protected $except = [
-        "payment/*"
+        "payment/*",
+        "checkIn"
     ];
 }

+ 5 - 0
app/Http/Models/User.php

@@ -23,6 +23,11 @@ class User extends Authenticatable
     protected $table = 'user';
     protected $primaryKey = 'id';
 
+    function levelList()
+    {
+        return $this->hasOne(Level::class, 'level', 'level');
+    }
+
     function payment()
     {
         return $this->hasMany(Payment::class, 'user_id', 'id');

+ 37 - 37
composer.lock

@@ -8,16 +8,16 @@
     "packages": [
         {
             "name": "barryvdh/laravel-ide-helper",
-            "version": "v2.5.3",
+            "version": "v2.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/barryvdh/laravel-ide-helper.git",
-                "reference": "3d7f1240896a075aa23b13f82dfcbe165dadeef2"
+                "reference": "754bb4d075d7fb2b23b1a416802c0e45884df495"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/3d7f1240896a075aa23b13f82dfcbe165dadeef2",
-                "reference": "3d7f1240896a075aa23b13f82dfcbe165dadeef2",
+                "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/754bb4d075d7fb2b23b1a416802c0e45884df495",
+                "reference": "754bb4d075d7fb2b23b1a416802c0e45884df495",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -29,15 +29,15 @@
             "require": {
                 "barryvdh/reflection-docblock": "^2.0.6",
                 "composer/composer": "^1.6",
-                "illuminate/console": "^5.5,<5.8",
-                "illuminate/filesystem": "^5.5,<5.8",
-                "illuminate/support": "^5.5,<5.8",
+                "illuminate/console": "^5.5,<5.9",
+                "illuminate/filesystem": "^5.5,<5.9",
+                "illuminate/support": "^5.5,<5.9",
                 "php": ">=7"
             },
             "require-dev": {
                 "doctrine/dbal": "~2.3",
-                "illuminate/config": "^5.1,<5.8",
-                "illuminate/view": "^5.1,<5.8",
+                "illuminate/config": "^5.1,<5.9",
+                "illuminate/view": "^5.1,<5.9",
                 "phpro/grumphp": "^0.14",
                 "phpunit/phpunit": "4.*",
                 "scrutinizer/ocular": "~1.1",
@@ -49,7 +49,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.5-dev"
+                    "dev-master": "2.6-dev"
                 },
                 "laravel": {
                     "providers": [
@@ -84,7 +84,7 @@
                 "phpstorm",
                 "sublime"
             ],
-            "time": "2018-12-19T12:12:05+00:00"
+            "time": "2019-02-18T19:54:27+00:00"
         },
         {
             "name": "barryvdh/reflection-docblock",
@@ -2505,16 +2505,16 @@
         },
         {
             "name": "nikic/php-parser",
-            "version": "v4.2.0",
+            "version": "v4.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "594bcae1fc0bccd3993d2f0d61a018e26ac2865a"
+                "reference": "5221f49a608808c1e4d436df32884cbc1b821ac0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/594bcae1fc0bccd3993d2f0d61a018e26ac2865a",
-                "reference": "594bcae1fc0bccd3993d2f0d61a018e26ac2865a",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/5221f49a608808c1e4d436df32884cbc1b821ac0",
+                "reference": "5221f49a608808c1e4d436df32884cbc1b821ac0",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -2558,7 +2558,7 @@
                 "parser",
                 "php"
             ],
-            "time": "2019-01-12T16:31:37+00:00"
+            "time": "2019-02-16T20:54:15+00:00"
         },
         {
             "name": "openlss/lib-array2xml",
@@ -3544,16 +3544,16 @@
         },
         {
             "name": "spatie/laravel-permission",
-            "version": "2.32.0",
+            "version": "2.34.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/spatie/laravel-permission.git",
-                "reference": "a6ddad06f2d8899178a909f72cddfea497e1e9cf"
+                "reference": "10f6b2e19cce79936e42b65f08549cbf564c052e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/a6ddad06f2d8899178a909f72cddfea497e1e9cf",
-                "reference": "a6ddad06f2d8899178a909f72cddfea497e1e9cf",
+                "url": "https://api.github.com/repos/spatie/laravel-permission/zipball/10f6b2e19cce79936e42b65f08549cbf564c052e",
+                "reference": "10f6b2e19cce79936e42b65f08549cbf564c052e",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -3563,14 +3563,14 @@
                 ]
             },
             "require": {
-                "illuminate/auth": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0",
-                "illuminate/container": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0",
-                "illuminate/contracts": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0",
-                "illuminate/database": "~5.4.0|~5.5.0|~5.6.0|~5.7.0",
+                "illuminate/auth": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0",
+                "illuminate/container": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0",
+                "illuminate/contracts": "~5.3.0|~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0",
+                "illuminate/database": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0",
                 "php": ">=7.0"
             },
             "require-dev": {
-                "orchestra/testbench": "~3.4.2|~3.5.0|~3.6.0|~3.7.0",
+                "orchestra/testbench": "~3.4.2|~3.5.0|~3.6.0|~3.7.0|~3.8.0",
                 "phpunit/phpunit": "^5.7|6.2|^7.0",
                 "predis/predis": "^1.1"
             },
@@ -3611,7 +3611,7 @@
                 "security",
                 "spatie"
             ],
-            "time": "2019-02-13T16:05:27+00:00"
+            "time": "2019-02-26T21:25:08+00:00"
         },
         {
             "name": "swiftmailer/swiftmailer",
@@ -5896,16 +5896,16 @@
         },
         {
             "name": "phpunit/php-timer",
-            "version": "2.0.0",
+            "version": "2.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-timer.git",
-                "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f"
+                "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f",
-                "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b389aebe1b8b0578430bda0c7c95a829608e059",
+                "reference": "8b389aebe1b8b0578430bda0c7c95a829608e059",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -5923,7 +5923,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0-dev"
+                    "dev-master": "2.1-dev"
                 }
             },
             "autoload": {
@@ -5947,7 +5947,7 @@
             "keywords": [
                 "timer"
             ],
-            "time": "2018-02-01T13:07:23+00:00"
+            "time": "2019-02-20T10:12:59+00:00"
         },
         {
             "name": "phpunit/php-token-stream",
@@ -6006,16 +6006,16 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "7.5.5",
+            "version": "7.5.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "23a200a60552cb9ba483a8d1e106c70fb0be0bb9"
+                "reference": "09c85e14994df92e5ff1f5ec0b481bdb7d3d3df9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/23a200a60552cb9ba483a8d1e106c70fb0be0bb9",
-                "reference": "23a200a60552cb9ba483a8d1e106c70fb0be0bb9",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/09c85e14994df92e5ff1f5ec0b481bdb7d3d3df9",
+                "reference": "09c85e14994df92e5ff1f5ec0b481bdb7d3d3df9",
                 "shasum": "",
                 "mirrors": [
                     {
@@ -6092,7 +6092,7 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2019-02-15T14:00:34+00:00"
+            "time": "2019-02-18T09:24:50+00:00"
         },
         {
             "name": "sebastian/code-unit-reverse-lookup",

BIN
composer.phar


+ 22 - 22
config/captcha.php

@@ -4,33 +4,33 @@ return [
 
     'characters' => '2346789abcdefghjmnpqrtuxyzABCDEFGHJMNPQRTUXYZ',
 
-    'default'   => [
-        'length'    => 4,
-        'width'     => 90,
-        'height'    => 43,
-        'quality'   => 90,
-        'lines'     => 4,
+    'default' => [
+        'length'  => 9,
+        'width'   => 90,
+        'height'  => 43,
+        'quality' => 90,
+        'math'    => true,
     ],
 
-    'flat'   => [
-        'length'    => 6,
-        'width'     => 160,
-        'height'    => 46,
-        'quality'   => 90,
-        'lines'     => 6,
-        'bgImage'   => false,
-        'bgColor'   => '#ecf2f4',
-        'fontColors'=> ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
-        'contrast'  => -5,
+    'flat' => [
+        'length'     => 6,
+        'width'      => 160,
+        'height'     => 46,
+        'quality'    => 90,
+        'lines'      => 6,
+        'bgImage'    => false,
+        'bgColor'    => '#ecf2f4',
+        'fontColors' => ['#2c3e50', '#c0392b', '#16a085', '#c0392b', '#8e44ad', '#303f9f', '#f57c00', '#795548'],
+        'contrast'   => -5,
     ],
 
-    'mini'   => [
-        'length'    => 3,
-        'width'     => 60,
-        'height'    => 32,
+    'mini' => [
+        'length' => 3,
+        'width'  => 60,
+        'height' => 32,
     ],
 
-    'inverse'   => [
+    'inverse' => [
         'length'    => 5,
         'width'     => 120,
         'height'    => 36,
@@ -41,6 +41,6 @@ return [
         'blur'      => 2,
         'invert'    => true,
         'contrast'  => -5,
-    ],
+    ]
 
 ];

+ 27 - 1
resources/views/admin/orderList.blade.php

@@ -55,6 +55,21 @@
                                     <option value="2" @if(Request::get('status') == '2') selected @endif>已完成</option>
                                 </select>
                             </div>
+                            <div class="col-md-3 col-sm-4 col-xs-12">
+                                <input type="text" class="form-control" name="time" id="range_time" placeholder="创建时间" autocomplete="off" />
+                            </div>
+                            <div class="col-md-3 col-sm-4 col-xs-12">
+                                <div class="mt-radio-inline">
+                                    <label class="mt-radio">
+                                        <input type="radio" name="sort" value="1" checked onchange="doSearch()"> 升序
+                                        <span></span>
+                                    </label>
+                                    <label class="mt-radio">
+                                        <input type="radio" name="sort" value="0" @if(Request::get('sort') == '0') checked @endif onchange="doSearch()"> 降序
+                                        <span></span>
+                                    </label>
+                                </div>
+                            </div>
                             <div class="col-md-3 col-sm-4 col-xs-12">
                                 <button type="button" class="btn blue" onclick="doSearch();">查询</button>
                                 <button type="button" class="btn grey" onclick="doReset();">重置</button>
@@ -149,7 +164,16 @@
     <!-- END CONTENT BODY -->
 @endsection
 @section('script')
+    <script src="/assets/global/plugins/laydate/laydate.js" type="text/javascript"></script>
     <script type="text/javascript">
+        // 有效期
+        laydate.render({
+            elem: '#range_time',
+            type: 'datetime',
+            range: '至',
+            value: '{{urldecode(Request::get('range_time'))}}'
+        });
+
         // 搜索
         function doSearch() {
             var username = $("#username").val();
@@ -157,8 +181,10 @@
             var is_coupon = $("#is_coupon").val();
             var pay_way = $("#pay_way").val();
             var status = $("#status").val();
+            var sort = $("input:radio[name='sort']:checked").val();
+            var range_time = $("#range_time").val();
 
-            window.location.href = '{{url('admin/orderList')}}' + '?username=' + username + '&is_expire=' + is_expire + '&is_coupon=' + is_coupon + '&pay_way=' + pay_way + '&status=' + status;
+            window.location.href = '{{url('admin/orderList')}}' + '?username=' + username + '&is_expire=' + is_expire + '&is_coupon=' + is_coupon + '&pay_way=' + pay_way + '&status=' + status + '&sort=' + sort + '&range_time=' + range_time;
         }
 
         // 重置

+ 6 - 5
resources/views/admin/system.blade.php

@@ -26,7 +26,7 @@
                                             <a href="#tab_2" data-toggle="tab"> 拓展设置 </a>
                                         </li>
                                         <li>
-                                            <a href="#tab_3" data-toggle="tab"> 积分设置 </a>
+                                            <a href="#tab_3" data-toggle="tab"> 签到设置 </a>
                                         </li>
                                         <li>
                                             <a href="#tab_4" data-toggle="tab"> 推广返利设置 </a>
@@ -403,10 +403,10 @@
                                                 <div class="portlet-body">
                                                     <div class="form-group">
                                                         <div class="col-md-6 col-sm-6 col-xs-12">
-                                                            <label for="login_add_score" class="col-md-3 control-label">登录加积分</label>
+                                                            <label for="login_add_score" class="col-md-3 control-label">签到加流量</label>
                                                             <div class="col-md-9">
                                                                 <input type="checkbox" class="make-switch" @if($login_add_score) checked @endif id="login_add_score" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
-                                                                <span class="help-block"> 登录时将根据积分范围随机得到积分 </span>
+                                                                <span class="help-block"> 登录时将根据流量范围随机得到流量 </span>
                                                             </div>
                                                         </div>
                                                         <div class="col-md-6 col-sm-6 col-xs-12">
@@ -419,19 +419,20 @@
                                                                         <button class="btn btn-success" type="button" onclick="setLoginAddScoreRange()">修改</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 col-sm-6 col-xs-12">
-                                                            <label class="col-md-3 control-label">积分范围</label>
+                                                            <label class="col-md-3 control-label">流量范围</label>
                                                             <div class="col-md-9">
                                                                 <div class="input-group input-large input-daterange">
                                                                     <input type="text" class="form-control" name="min_rand_score" value="{{$min_rand_score}}" id="min_rand_score">
                                                                     <span class="input-group-addon"> ~ </span>
                                                                     <input type="text" class="form-control" name="max_rand_score" value="{{$max_rand_score}}" id="max_rand_score">
                                                                 </div>
+                                                                <span class="help-block"> 单位:M </span>
                                                             </div>
                                                         </div>
                                                         <div class="col-md-6 col-sm-6 col-xs-12">

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

@@ -324,7 +324,7 @@
         // 复制订阅链接
         var clipboard = new Clipboard('.copySubscribeLink');
         clipboard.on('success', function(e) {
-            layer.alert("成功复制该用户的订阅链接", {icon: 1});
+            layer.alert("成功复制该用户的订阅链接", {icon: 1, title:'提示'});
         });
         clipboard.on('error', function(e) {
             console.log(e);

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

@@ -75,11 +75,11 @@
             @endif
             <div class="row">
                 <div class="col-xs-12" style="text-align: right;">
-                    @if($is_youzan)
+                    @if(\App\Components\Helpers::systemConfig()['is_youzan'])
                         <a class="btn btn-lg red hidden-print" onclick="onlinePay(0)"> {{trans('home.online_pay')}} </a>
-                    @elseif($is_alipay)
+                    @elseif(\App\Components\Helpers::systemConfig()['is_alipay'])
                         <a class="btn btn-lg green hidden-print" onclick="onlinePay(4)"> 支付宝扫码 </a>
-                    @elseif($is_f2fpay)
+                    @elseif(\App\Components\Helpers::systemConfig()['is_f2fpay'])
                         <a class="btn btn-lg green hidden-print" onclick="onlinePay(5)"> 支付宝扫码 </a>
                     @endif
                   	@if($goods->type <= 2)

+ 119 - 609
resources/views/user/index.blade.php

@@ -5,488 +5,51 @@
     <!-- BEGIN CONTENT BODY -->
     <div class="page-content" style="padding-top:0;">
         <!-- BEGIN PAGE BASE CONTENT -->
-        @if (Session::has('successMsg'))
-            <div class="alert alert-success">
-                <button class="close" data-close="alert"></button>
-                {{Session::get('successMsg')}}
-            </div>
-        @endif
-        <div class="row">
-            <div class="col-md-8">
-                @if($notice)
-                    <div class="row">
-                        <div class="col-md-12">
-                            <div class="portlet light bordered">
-                                <div class="portlet-title tabbable-line">
-                                    <div class="caption">
-                                        <i class="icon-directions font-green hide"></i>
-                                        <span class="caption-subject font-blue bold"> {{trans('home.announcement')}} </span>
-                                    </div>
-                                </div>
-                                <div class="portlet-body">
-                                    <div class="tab-content">
-                                        <div>
-                                             {!!$notice->content!!}
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                @endif
-                <div class="row">
-                    <div class="col-md-12">
-                        <div class="portlet light">
-                            <div class="portlet-title">
-                                <div class="caption">
-                                    <span class="caption-subject font-blue bold">{{trans('home.subscribe_address')}}</span>
-                                </div>
-                            </div>
-                            <div class="portlet-body">
-                                <div class="mt-clipboard-container" style="padding-top:0px;">
-                                    @if($subscribe_status)
-                                        <input type="text" id="mt-target-1" class="form-control" value="{{$link}}" />
-                                        <a href="javascript:exchangeSubscribe();" class="btn green">
-                                            {{trans('home.exchange_subscribe')}}
-                                        </a>
-                                        <a href="javascript:;" class="btn blue mt-clipboard" data-clipboard-action="copy" data-clipboard-target="#mt-target-1">
-                                            {{trans('home.copy_subscribe_address')}}
-                                        </a>
-                                        <div class="tabbable-line">
-                                            <ul class="nav nav-tabs ">
-                                                <li class="active">
-                                                    <a href="#tools1" data-toggle="tab"> <i class="fa fa-apple"></i> Mac </a>
-                                                </li>
-                                                <li>
-                                                    <a href="#tools2" data-toggle="tab"> <i class="fa fa-windows"></i> Windows </a>
-                                                </li>
-                                                <li>
-                                                    <a href="#tools3" data-toggle="tab"> <i class="fa fa-linux"></i> Linux </a>
-                                                </li>
-                                                <li>
-                                                    <a href="#tools4" data-toggle="tab"> <i class="fa fa-apple"></i> iOS </a>
-                                                </li>
-                                                <li>
-                                                    <a href="#tools5" data-toggle="tab"> <i class="fa fa-android"></i> Android </a>
-                                                </li>
-                                                <li>
-                                                    <a href="#tools6" data-toggle="tab"> <i class="fa fa-gamepad"></i> Games </a>
-                                                </li>
-                                            </ul>
-                                            <div class="tab-content" style="font-size:16px;">
-                                                <div class="tab-pane active" id="tools1">
-                                                    <ol>
-                                                        <li> <a href="{{asset('clients/ShadowsocksX-NG-R8-1.4.4.dmg')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
-                                                        <li> 点击状态栏纸飞机 -> 服务器 -> 编辑订阅 </li>
-                                                        <li> 点击窗口左下角 “+”号 新增订阅,完整复制本页上方“订阅服务”处地址,将其粘贴至“订阅地址”栏,点击右下角“OK” </li>
-                                                        <li> 点击纸飞机 -> 服务器 -> 手动更新订阅 </li>
-                                                        <li> 点击纸飞机 -> 服务器,选定合适服务器 </li>
-                                                        <li> 点击纸飞机 -> 打开Shadowsocks </li>
-                                                        <li> 点击纸飞机 -> PAC自动模式 </li>
-                                                        <li> 点击纸飞机 -> 代理设置->从 GFW List 更新 PAC </li>
-                                                        <li> 打开系统偏好设置 -> 网络,在窗口左侧选定显示为“已连接”的网络,点击右下角“高级...” </li>
-                                                        <li> 切换至“代理”选项卡,勾选“自动代理配置”和“不包括简单主机名”,点击右下角“好”,再次点击右下角“应用” </li>
-                                                    </ol>
-                                                </div>
-                                                <div class="tab-pane" id="tools2">
-                                                    <ol>
-                                                        <li> <a href="{{asset('clients/ShadowsocksR-win.zip')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
-                                                        <li> 运行 ShadowsocksR 文件夹内的 ShadowsocksR.exe </li>
-                                                        <li> 右击桌面右下角状态栏(或系统托盘)纸飞机 -> 服务器订阅 -> SSR服务器订阅设置 </li>
-                                                        <li> 点击窗口左下角 “Add” 新增订阅,完整复制本页上方 “订阅服务” 处地址,将其粘贴至“网址”栏,点击“确定” </li>
-                                                        <li> 右击纸飞机 -> 服务器订阅 -> 更新SSR服务器订阅(不通过代理) </li>
-                                                        <li> 右击纸飞机 -> 服务器,选定合适服务器 </li>
-                                                        <li> 右击纸飞机 -> 系统代理模式 -> PAC模式 </li>
-                                                        <li> 右击纸飞机 -> PAC -> 更新PAC为GFWList </li>
-                                                        <li> 右击纸飞机 -> 代理规则 -> 绕过局域网和大陆 </li>
-                                                        <li> 右击纸飞机,取消勾选“服务器负载均衡” </li>
-                                                    </ol>
-                                                </div>
-                                                <div class="tab-pane" id="tools3">
-                                                    <ol>
-                                                        <li> <a href="{{asset('clients/Shadowsocks-qt5-3.0.1.zip')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
-                                                        <li> 单击状态栏小飞机,找到服务器 -> 编辑订阅,复制黏贴订阅地址 </li>
-                                                        <li> 更新订阅设置即可 </li>
-                                                    </ol>
-                                                </div>
-                                                <div class="tab-pane" id="tools4">
-                                                    <ol>
-                                                        @if(Agent::is('iPhone') || Agent::is('iPad'))
-                                                            @if(Agent::is('Safari'))
-                                                                <li> <a href="{{$ipa_list}}" target="_blank">点击此处在线安装</a></li>
-                                                            @else
-                                                                <li> <a href="javascript:onlineInstallWarning();">点击此处在线安装</a></li>
-                                                            @endif
-                                                            <li> 请从站长处获取 App Store 账号密码 </li>
-                                                            <li> 打开 Shadowrocket,点击右上角 “+”号 添加节点,类型选择 Subscribe </li>
-                                                            <li> 完整复制本页上方 “订阅服务” 处地址,将其粘贴至 “URL”栏,点击右上角 “完成” </li>
-                                                            <li> 左划新增的服务器订阅,点击 “更新” </li>
-                                                            <li> 选定合适服务器节点,点击右上角连接开关,屏幕上方状态栏出现“VPN”图标 </li>
-                                                            <li> 当进行海外游戏时请将 Shadowrocket “首页” 页面中的 “全局路由” 切换至 “代理”,并确保“设置”页面中的“UDP”已开启转发 </li>
-                                                        @else
-                                                            <li> 请使用 Safari浏览器 访问本页面 </li>
-                                                        @endif
-                                                    </ol>
-                                                </div>
-                                                <div class="tab-pane" id="tools5">
-                                                    <ol>
-                                                        <li> <a href="{{asset('clients/ShadowsocksRR-3.5.1.1.apk')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
-                                                        <li> 单击左上角的shadowsocksR进入配置文件页,点击右下角的“+”号,点击“添加/升级SSR订阅”,完整复制本页上方“订阅服务”处地址,填入订阅信息并保存 </li>
-                                                        <li> 选中任意一个节点,返回软件首页 </li>
-                                                        <li> 在软件首页处找到“路由”选项,并将其改为“绕过局域网及中国大陆地址” </li>
-                                                        <li> 点击右上角的小飞机图标进行连接,提示是否添加(或创建)VPN连接,点同意(或允许) </li>
-                                                    </ol>
-                                                </div>
-                                                <div class="tab-pane" id="tools6">
-                                                    <ol>
-                                                        <li> <a href="{{asset('clients/SSTap-beta-setup-1.0.9.7.zip')}}" target="_blank">点击此处</a>下载客户端并安装 </li>
-                                                        <li> 打开 SSTap,选择 <i class="fa fa-cog"></i> -> SSR订阅 -> SSR订阅管理,添加订阅地址 </li>
-                                                        <li> 添加完成后,再次选择 <i class="fa fa-cog"></i> - SSR订阅 - 手动更新SSR订阅,即可同步节点列表。</li>
-                                                        <li> 在代理模式中选择游戏或「不代理中国IP」,点击「连接」即可加速。</li>
-                                                        <li> 需要注意的是,一旦连接成功,客户端会自动缩小到任务栏,可在设置中关闭。</li>
-                                                    </ol>
-                                                </div>
-                                            </div>
-                                        </div>
-                                    @else
-                                        <h3>{{trans('home.subscribe_baned')}}</h3>
-                                    @endif
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
 
-                @if(!$nodeList->isEmpty())
-                    <div class="row widget-row">
-                        <div class="col-md-12">
-                            <div class="portlet light bordered">
-                                <div class="portlet-title">
-                                    <div class="caption">
-                                        <span class="caption-subject font-blue bold">{{trans('home.my_node_list')}}</span>
-                                    </div>
-                                    <div class="actions">
-                                        <div class="btn-group btn-group-devided" data-toggle="buttons">
-                                            <button class="btn btn-info" id="copy_all_nodes" data-clipboard-text="{{$allNodes}}"> 复制所有节点 </button>
-                                        </div>
-                                    </div>
-                                </div>
-                                <div class="portlet-body">
-                                    <div class="tab-content">
-                                        <div class="tab-pane active">
-                                            <div class="mt-comments">
-                                                @foreach($nodeList as $node)
-                                                    <div class="mt-comment">
-                                                        <div class="mt-comment-img" style="width:auto;">
-                                                            @if($node->country_code)
-                                                                <img src="{{asset('assets/images/country/' . $node->country_code . '.png')}}"/>
-                                                            @else
-                                                                <img src="{{asset('/assets/images/country/un.png')}}"/>
-                                                            @endif
-                                                        </div>
-                                                        <div class="mt-comment-body">
-                                                            <div class="mt-comment-info">
-                                                                <span class="mt-comment-author">{{$node->name}}</span>
-                                                                <span class="mt-comment-date">
-                                                                    @if(!$node->online_status)
-                                                                        <span class="badge badge-danger">维护中</span>
-                                                                    @endif
-                                                                </span>
-                                                            </div>
-                                                            <div class="mt-comment-text"> {{$node->desc}} </div>
-                                                            <div class="mt-comment-details">
-                                                                <span class="mt-comment-status mt-comment-status-pending">
-                                                                    @if($node->labels)
-                                                                        @foreach($node->labels as $vo)
-                                                                            <span class="badge badge-info">{{$vo->labelInfo->name}}</span>
-                                                                        @endforeach
-                                                                    @endif
-                                                                </span>
-                                                                <ul class="mt-comment-actions" style="display: block;">
-                                                                    <li>
-                                                                        <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#txt_{{$node->id}}" > <i class="fa fa-reorder"></i> </a>
-                                                                    </li>
-                                                                    <li>
-                                                                        <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#link_{{$node->id}}"> @if($node->type == 1) <i class="fa fa-paper-plane"></i> @else <i class="fa fa-vimeo"></i> @endif </a>
-                                                                    </li>
-                                                                    <li>
-                                                                        <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#qrcode_{{$node->id}}"> <i class="fa fa-qrcode"></i> </a>
-                                                                    </li>
-                                                                </ul>
-                                                            </div>
-                                                        </div>
-                                                    </div>
-                                                @endforeach
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                @endif
-            </div>
-            <div class="col-md-4" >
-                <div class="portlet light">
-                    <div class="portlet-title">
+        <div class="row">
+            <div class="col-md-12">
+                <div class="portlet light bordered">
+                    <div class="portlet-title tabbable-line">
                         <div class="caption">
-                            <span class="caption-subject font-blue bold">{{trans('home.account_info')}}</span>
+                            <i class="icon-directions font-green hide"></i>
+                            <span class="caption-subject font-blue bold"> {{trans('home.announcement')}} </span>
                         </div>
                         <div class="actions">
-                            <div class="btn-group btn-group-devided" data-toggle="buttons">
-                                <label class="btn red btn-sm">
-                                    <a href="javascript:;" data-toggle="modal" data-target="#charge_modal" style="color: #FFF;">{{trans('home.recharge')}}</a>
-                                </label>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="portlet-body form">
-                        <form role="form">
-                            <div class="form-horizontal" style="margin: 0; padding: 0;">
-                                @if($info['enable'])
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label">{{trans('home.account_status')}}:</label>
-                                        <p class="form-control-static"> <span class="label label-success">{{trans('home.enabled')}}</span> </p>
-                                    </div>
-                                @else
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label">{{trans('home.account_status')}}:</label>
-                                        <p class="form-control-static"> <span class="label label-danger">{{trans('home.disabled')}}</span> </p>
-                                    </div>
-                                @endif
-                                @if(\App\Components\Helpers::systemConfig()['login_add_score'])
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label">{{trans('home.account_score')}}:</label>
-                                        <p class="form-control-static"> <a href="javascript:;" data-toggle="modal" data-target="#exchange_modal" style="color:#000;">{{$info['score']}}</a> </p>
-                                    </div>
-                                @endif
-                                <div class="form-group" style="margin-bottom: 0;">
-                                    <label class="col-md-4 control-label">{{trans('home.account_balance')}}:</label>
-                                    <p class="form-control-static"> {{$info['balance']}} </p>
-                                </div>
-                                @if(date('Y-m-d') > $info['expire_time'])
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label">{{trans('home.account_expire')}}:</label>
-                                        <p class="form-control-static"> {{trans('home.expired')}} </p>
-                                    </div>
-                                @else
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label">{{trans('home.account_expire')}}:</label>
-                                        <p class="form-control-static"> {{$info['expire_time']}} </p>
-                                    </div>
-                                @endif
-                                <div class="form-group" style="margin-bottom: 0;">
-                                    <label class="col-md-4 control-label">{{trans('home.account_last_usage')}}:</label>
-                                    <p class="form-control-static"> {{empty($info['t']) ? trans('home.never_used') : date('Y-m-d H:i:s', $info['t'])}} </p>
-                                </div>
-                                <div class="form-group" style="margin-bottom: 0;">
-                                    <label class="col-md-4 control-label">{{trans('home.account_last_login')}}:</label>
-                                    <p class="form-control-static"> {{empty($info['last_login']) ? trans('home.never_loggedin') : date('Y-m-d H:i:s', $info['last_login'])}} </p>
-                                </div>
-                                <div class="form-group" style="margin-bottom: 0;">
-                                    <label class="col-md-4 control-label">{{trans('home.account_bandwidth_usage')}}:</label>
-                                    <p class="form-control-static"> {{$info['usedTransfer']}}({{$info['totalTransfer']}}) </p>
-                                </div>
-                                @if($info['traffic_reset_day'])
-                                    <div class="form-group" style="margin-bottom: 0;">
-                                        <label class="col-md-4 control-label"></label>
-                                        <p class="form-control-static"> {{trans('home.account_reset_notice', ['reset_day' => $info['traffic_reset_day']])}} </p>
-                                    </div>
-
-                                @endif
-                            </div>
-                        </form>
-                    </div>
-                </div>
-
-                @if(\App\Components\Helpers::systemConfig()['is_push_bear'] && \App\Components\Helpers::systemConfig()['push_bear_qrcode'])
-                    <div class="portlet light">
-                        <div class="portlet-title">
-                            <div class="caption">
-                                <span class="caption-subject font-blue bold">微信扫码订阅,获取最新资讯</span>
-                            </div>
-                        </div>
-                        <div class="portlet-body form">
-                            <div id="subscribe_qrcode" style="text-align: center;"></div>
-                        </div>
-                    </div>
-                @endif
-
-                <div class="portlet light portlet-fit bordered">
-                    <div class="portlet-title">
-                        <div class="caption">
-                            <span class="caption-subject font-blue sbold uppercase">{{trans('home.account_login_log')}}</span>
+                            <span class="caption-subject">
+                                <a class="btn btn-sm blue" href="javascript:checkIn();"> 签到 </a>
+                            </span>
                         </div>
                     </div>
-                    <div class="portlet-body" style="padding: 0 20px;">
-                        <div class="table-scrollable table-scrollable-borderless">
-                            <table class="table table-hover table-light">
-                                <tbody>
-                                    @foreach($userLoginLog as $log)
-                                        <tr>
-                                            <td> {{$log->created_at}} </td>
-                                            <td> {{$log->ip}} </td>
-                                            <td> {{$log->area}} </td>
-                                        </tr>
-                                    @endforeach
-                                </tbody>
-                            </table>
+                    <div class="portlet-body">
+                        <div class="tab-content">
+                            @if($notice)
+                                {!!$notice->content!!}
+                            @else
+                                暂无公告
+                            @endif
                         </div>
                     </div>
                 </div>
-
             </div>
         </div>
 
-        <div id="charge_modal" class="modal fade" tabindex="-1" data-focus-on="input:first" data-keyboard="false">
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
-                        <h4 class="modal-title">{{trans('home.recharge_balance')}}</h4>
-                    </div>
-                    <div class="modal-body">
-                        <div class="alert alert-danger" style="display: none; text-align: center;" id="charge_msg"></div>
-                        <form action="#" method="post" class="form-horizontal">
-                            <div class="form-body">
-                                <div class="form-group">
-                                    <label for="charge_type" class="col-md-4 control-label">{{trans('home.payment_method')}}</label>
-                                    <div class="col-md-6">
-                                        <select class="form-control" name="charge_type" id="charge_type">
-                                            <option value="1" selected>{{trans('home.coupon_code')}}</option>
-                                            @if(!$goodsList->isEmpty())
-                                                <option value="2">{{trans('home.online_pay')}}</option>
-                                            @endif
-                                        </select>
-                                    </div>
-                                </div>
-                                @if(!$goodsList->isEmpty())
-                                    <div class="form-group" id="charge_balance" style="display: none;">
-                                        <label for="online_pay" class="col-md-4 control-label">充值金额</label>
-                                        <div class="col-md-6">
-                                            <select class="form-control" name="online_pay" id="online_pay">
-                                                @foreach($goodsList as $key => $goods)
-                                                    <option value="{{$goods->id}}">充值{{$goods->price}}元</option>
-                                                @endforeach
-                                            </select>
-                                        </div>
-                                    </div>
-                                @endif
-                                <div class="form-group" id="charge_coupon_code">
-                                    <label for="charge_coupon" class="col-md-4 control-label"> {{trans('home.coupon_code')}} </label>
-                                    <div class="col-md-6">
-                                        <input type="text" class="form-control" name="charge_coupon" id="charge_coupon" placeholder="{{trans('home.please_input_coupon')}}">
-                                    </div>
-                                </div>
-                            </div>
-                        </form>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" data-dismiss="modal" class="btn dark btn-outline">{{trans('home.close')}}</button>
-                        <button type="button" class="btn red btn-outline" onclick="return charge();">{{trans('home.recharge')}}</button>
+        <div class="row">
+            <div class="col-md-6">
+                <div class="portlet light bordered">
+                    <div class="portlet-body">
+                        <div id="chart2" style="width: auto;height:450px;"></div>
                     </div>
                 </div>
             </div>
-        </div>
-        <div id="exchange_modal" class="modal fade" tabindex="-1" data-focus-on="input:first" data-keyboard="false">
-            <div class="modal-dialog">
-                <div class="modal-content">
-                    <div class="modal-header">
-                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
-                        <h4 class="modal-title"> {{trans('home.redeem_score')}} </h4>
-                    </div>
-                    <div class="modal-body">
-                        <div class="alert alert-info" id="msg">{{trans('home.redeem_info', ['score' => $info['score']])}}</div>
-                    </div>
-                    <div class="modal-footer">
-                        <button type="button" data-dismiss="modal" class="btn dark btn-outline">{{trans('home.close')}}</button>
-                        <button type="button" class="btn red btn-outline" onclick="return exchange();">{{trans('home.redeem')}}</button>
+            <div class="col-md-6">
+                <div class="portlet light bordered">
+                    <div class="portlet-body">
+                        <div id="chart1" style="width: auto;height:450px;"></div>
                     </div>
                 </div>
             </div>
         </div>
 
-        @foreach($nodeList as $node)
-            <!-- 配置文本 -->
-            <div class="modal fade draggable-modal" id="txt_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
-                <div class="modal-dialog">
-                    <div class="modal-content">
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
-                            <h4 class="modal-title">{{trans('home.setting_info')}}</h4>
-                        </div>
-                        <div class="modal-body">
-                            <textarea class="form-control" rows="10" readonly="readonly">{{$node->txt}}</textarea>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <!-- 配置链接 -->
-            <div class="modal fade draggable-modal" id="link_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
-                <div class="modal-dialog">
-                    <div class="modal-content">
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
-                            <h4 class="modal-title">{{$node->name}}</h4>
-                        </div>
-                        <div class="modal-body">
-                            @if($node->type == 1)
-                                <textarea class="form-control" rows="5" readonly="readonly">{{$node->ssr_scheme}}</textarea>
-                                <a href="{{$node->ssr_scheme}}" class="btn purple uppercase" style="display: block; width: 100%;margin-top: 10px;">打开SSR</a>
-                                @if($node->ss_scheme)
-                                    <p></p>
-                                    <textarea class="form-control" rows="3" readonly="readonly">{{$node->ss_scheme}}</textarea>
-                                    <a href="{{$node->ss_scheme}}" class="btn blue uppercase" style="display: block; width: 100%;margin-top: 10px;">打开SS</a>
-                                @endif
-                            @else
-                                @if($node->v2_scheme)
-                                    <p></p>
-                                    <textarea class="form-control" rows="3" readonly="readonly">{{$node->v2_scheme}}</textarea>
-                                    <a href="{{$node->v2_scheme}}" class="btn blue uppercase" style="display: block; width: 100%;margin-top: 10px;">打开V2ray</a>
-                                @endif
-                            @endif
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <!-- 配置二维码 -->
-            <div class="modal fade" id="qrcode_{{$node->id}}" tabindex="-1" role="dialog" aria-hidden="true">
-                <div class="modal-dialog @if($node->type == 2 || !$node->compatible) modal-sm @endif">
-                    <div class="modal-content">
-                        <div class="modal-header">
-                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
-                            <h4 class="modal-title">{{trans('home.scan_qrcode')}}</h4>
-                        </div>
-                        <div class="modal-body">
-                            <div class="row">
-                                @if($node->type == 1)
-                                    @if($node->compatible)
-                                        <div class="col-md-6">
-                                            <div id="qrcode_ssr_img_{{$node->id}}" style="text-align: center;"></div>
-                                            <div style="text-align: center;"><a id="download_qrcode_ssr_img_{{$node->id}}">{{trans('home.download')}}</a></div>
-                                        </div>
-                                        <div class="col-md-6">
-                                            <div id="qrcode_ss_img_{{$node->id}}" style="text-align: center;"></div>
-                                            <div style="text-align: center;"><a id="download_qrcode_ss_img_{{$node->id}}">{{trans('home.download')}}</a></div>
-                                        </div>
-                                    @else
-                                        <div class="col-md-12">
-                                            <div id="qrcode_ssr_img_{{$node->id}}" style="text-align: center;"></div>
-                                            <div style="text-align: center;"><a id="download_qrcode_ssr_img_{{$node->id}}">{{trans('home.download')}}</a></div>
-                                        </div>
-                                    @endif
-                                @else
-                                    <div class="col-md-12">
-                                        <div id="qrcode_v2_img_{{$node->id}}" style="text-align: center;"></div>
-                                        <div style="text-align: center;"><a id="download_qrcode_v2_img_{{$node->id}}">{{trans('home.download')}}</a></div>
-                                    </div>
-                                @endif
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        @endforeach
         <!-- END PAGE BASE CONTENT -->
     </div>
     <!-- END CONTENT BODY -->
@@ -496,164 +59,111 @@
     <script src="/assets/pages/scripts/components-clipboard.min.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/jquery-qrcode/jquery.qrcode.min.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/jquery-ui/jquery-ui.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/echarts/echarts.min.js" type="text/javascript"></script>
 
     <script type="text/javascript">
-        // 切换充值方式
-        $("#charge_type").change(function(){
-            if ($(this).val() == 2) {
-                $("#charge_balance").show();
-                $("#charge_coupon_code").hide();
-            } else {
-                $("#charge_balance").hide();
-                $("#charge_coupon_code").show();
-            }
-        });
-
-        // 充值
-        function charge() {
-            var charge_type = $("#charge_type").val();
-            var charge_coupon = $("#charge_coupon").val();
-            var online_pay = $("#online_pay").val();
-
-            if (charge_type == '2') {
-                $("#charge_msg").show().html("正在跳转支付界面");
-                window.location.href = '/buy/' + online_pay;
-                return false;
-            }
-
-            if (charge_type == '1' && (charge_coupon == '' || charge_coupon == undefined)) {
-                $("#charge_msg").show().html("{{trans('home.coupon_not_empty')}}");
-                $("#charge_coupon").focus();
-                return false;
-            }
-
-            $.ajax({
-                url:'{{url('charge')}}',
-                type:"POST",
-                data:{_token:'{{csrf_token()}}', coupon_sn:charge_coupon},
-                beforeSend:function(){
-                    $("#charge_msg").show().html("{{trans('home.recharging')}}");
-                },
-                success:function(ret){
-                    if (ret.status == 'fail') {
-                        $("#charge_msg").show().html(ret.message);
-                        return false;
-                    }
-
-                    $("#charge_modal").modal("hide");
-                    window.location.reload();
-                },
-                error:function(){
-                    $("#charge_msg").show().html("{{trans('home.error_response')}}");
-                },
-                complete:function(){}
-            });
-        }
-
-        // 积分兑换流量
-        function exchange() {
-            $.ajax({
-                type: "POST",
-                url: "{{url('exchange')}}",
-                async: false,
-                data: {_token:'{{csrf_token()}}'},
-                dataType: 'json',
-                success: function (ret) {
-                    layer.msg(ret.message, {time:1000}, function() {
-                        if (ret.status == 'success') {
-                            window.location.reload();
-                        }
-                    });
+        // 签到
+        function checkIn() {
+            $.post('{{url('checkIn')}}', function(ret) {
+                if (ret.status == 'success') {
+                    layer.alert(ret.message, {icon:1, title:'提示'});
+                } else {
+                    layer.alert(ret.message, {icon:2, title:'提示'})
                 }
             });
-
-            return false;
-        }
-
-        // 在线安装警告提示
-        function onlineInstallWarning() {
-            layer.msg('仅限在Safari浏览器下有效', {time:1000});
         }
     </script>
 
     <script type="text/javascript">
-        var UIModals = function () {
-            var n = function () {
-                @foreach($nodeList as $node)
-                    $("#txt_{{$node->id}}").draggable({handle: ".modal-header"});
-                    $("#qrcode_{{$node->id}}").draggable({handle: ".modal-header"});
-                @endforeach
-            };
-
-            return {
-                init: function () {
-                    n()
+        var myChart = echarts.init(document.getElementById('chart1'));
+
+        option = {
+            title: {
+                text: '{{trans('home.traffic_log_30days')}}',
+                subtext: '{{trans('home.traffic_log_unit')}}'
+            },
+            tooltip: {
+                trigger: 'axis'
+            },
+            toolbox: {
+                show: true,
+                feature: {
+                    saveAsImage: {}
+                }
+            },
+            xAxis: {
+                type: 'category',
+                boundaryGap: false,
+                data: [{!! $monthDays !!}]
+            },
+            yAxis: {
+                type: 'value',
+                axisLabel: {
+                    formatter: '{value} G'
+                }
+            },
+            series: [
+                @if(!empty($trafficDaily))
+                {
+                    name:'{{trans('home.traffic_log_keywords')}}',
+                    type:'line',
+                    data:[{!! $trafficDaily !!}],
+                    markPoint: {
+                        data: [
+                            {type: 'max', name: '{{trans('home.traffic_log_max')}}'}
+                        ]
+                    }
                 }
-            }
-        }();
-
-        jQuery(document).ready(function () {
-            UIModals.init()
-        });
-
-        // 循环输出节点scheme用于生成二维码
-        @foreach ($nodeList as $node)
-            @if($node->type == 1)
-                $('#qrcode_ssr_img_{{$node->id}}').qrcode("{{$node->ssr_scheme}}");
-                $('#download_qrcode_ssr_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_ssr_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
-                @if($node->ss_scheme)
-                    $('#qrcode_ss_img_{{$node->id}}').qrcode("{{$node->ss_scheme}}");
-                    $('#download_qrcode_ss_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_ss_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
                 @endif
-            @else
-                $('#qrcode_v2_img_{{$node->id}}').qrcode("{{$node->v2_scheme}}");
-                $('#download_qrcode_v2_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_v2_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
-            @endif
-        @endforeach
+            ]
+        };
 
-        // 节点订阅
-        function subscribe() {
-            window.location.href = '{{url('subscribe')}}';
-        }
-
-        // 显示加密、混淆、协议
-        function show(txt) {
-            layer.msg(txt);
-        }
-
-        // 生成消息通道订阅二维码
-        @if(\App\Components\Helpers::systemConfig()['push_bear_qrcode'])
-            $('#subscribe_qrcode').qrcode({render:"canvas", text:"{{\App\Components\Helpers::systemConfig()['push_bear_qrcode']}}", width:170, height:170});
-        @endif
-
-        // 更换订阅地址
-        function exchangeSubscribe() {
-            layer.confirm('更换订阅地址将导致:<br>1.旧地址立即失效;<br>2.连接密码被更改;', {icon: 7, title:'警告'}, function(index) {
-                $.post("{{url('exchangeSubscribe')}}", {_token:'{{csrf_token()}}'}, function (ret) {
-                    layer.msg(ret.message, {time:1000}, function () {
-                        if (ret.status == 'success') {
-                            window.location.reload();
-                        }
-                    });
-                });
-
-                layer.close(index);
-            });
-        }
+        myChart.setOption(option);
     </script>
+    <script type="text/javascript">
+        var myChart = echarts.init(document.getElementById('chart2'));
+
+        option = {
+            title: {
+                text: '{{trans('home.traffic_log_24hours')}}',
+                subtext: '{{trans('home.traffic_log_unit')}}'
+            },
+            tooltip: {
+                trigger: 'axis'
+            },
+            toolbox: {
+                show: true,
+                feature: {
+                    saveAsImage: {}
+                }
+            },
+            xAxis: {
+                type: 'category',
+                boundaryGap: false,
+                data: ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
+            },
+            yAxis: {
+                type: 'value',
+                axisLabel: {
+                    formatter: '{value} G'
+                }
+            },
+            series: [
+                @if(!empty($trafficHourly))
+                {
+                    name:'{{trans('home.traffic_log_keywords')}}',
+                    type:'line',
+                    data:[{!! $trafficHourly !!}],
+                    markPoint: {
+                        data: [
+                            {type: 'max', name: '{{trans('home.traffic_log_max')}}'}
+                        ]
+                    }
+                }
+                @endif
+            ]
+        };
 
-    @if(!$nodeList->isEmpty())
-        <script type="text/javascript">
-            var copy_all_nodes = document.getElementById('copy_all_nodes');
-            var clipboard = new Clipboard(copy_all_nodes);
-
-            clipboard.on('success', function(e) {
-                layer.alert("复制成功,通过右键菜单倒入节点链接即可!");
-            });
-
-            clipboard.on('error', function(e) {
-                console.log(e);
-            });
-        </script>
-    @endif
+        myChart.setOption(option);
+    </script>
 @endsection

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

@@ -113,6 +113,12 @@
                         <span class="selected"></span>
                     </a>
                 </li>
+                <li class="nav-item {{in_array(Request::path(), ['nodeList']) || in_array(Request::segment(1), ['nodeList']) ? 'active open' : ''}}">
+                    <a href="{{url('nodeList')}}" class="nav-link nav-toggle">
+                        <i class="icon-list"></i>
+                        <span class="title">节点列表</span>
+                    </a>
+                </li>
                 <li class="nav-item {{in_array(Request::path(), ['services']) || in_array(Request::segment(1), ['buy', 'payment']) ? 'active open' : ''}}">
                     <a href="{{url('services')}}" class="nav-link nav-toggle">
                         <i class="icon-basket"></i>
@@ -137,13 +143,7 @@
                         <span class="title">{{trans('home.invite_code')}}</span>
                     </a>
                 </li>
-                <li class="nav-item {{in_array(Request::path(), ['trafficLog']) ? 'active open' : ''}}">
-                    <a href="{{url('trafficLog')}}" class="nav-link nav-toggle">
-                        <i class="icon-speedometer"></i>
-                        <span class="title">{{trans('home.traffic_log')}}</span>
-                    </a>
-                </li>
-                @if(Session::get('referral_status'))
+                @if(\App\Components\Helpers::systemConfig()['referral_status'])
                 <li class="nav-item {{in_array(Request::path(), ['referral']) ? 'active open' : ''}}">
                     <a href="{{url('referral')}}" class="nav-link nav-toggle">
                         <i class="icon-diamond"></i>

+ 369 - 0
resources/views/user/nodeList.blade.php

@@ -0,0 +1,369 @@
+@extends('user.layouts')
+@section('css')
+@endsection
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content" style="padding-top:0;">
+        <div class="col-md-12">
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="portlet light">
+                        <div class="portlet-title">
+                            <div class="caption">
+                                <span class="caption-subject font-blue bold">{{trans('home.subscribe_address')}}</span>
+                            </div>
+                            <div class="actions">
+                                <span class="caption-subject">
+                                    {{trans('home.account_expire')}}:@if(date('Y-m-d') > Auth::user()->expire_time) {{trans('home.expired')}} @else {{Auth::user()->expire_time}} @endif
+                                    {{trans('home.account_bandwidth_usage')}}:{{flowAutoShow(flowAutoShow(Auth::user()->u + Auth::user()->d))}}({{flowAutoShow(Auth::user()->transfer_enable)}})
+                                    @if(Auth::user()->traffic_reset_day) {{trans('home.account_reset_notice', ['reset_day' => Auth::user()->traffic_reset_day])}} @endif
+                                </span>
+                            </div>
+                        </div>
+                        <div class="portlet-body">
+                            <div class="mt-clipboard-container" style="padding-top:0px;">
+                                @if(Auth::user()->subscribe->status)
+                                    <input type="text" id="mt-target-1" class="form-control" value="{{$link}}" />
+                                    <a href="javascript:exchangeSubscribe();" class="btn green">
+                                        {{trans('home.exchange_subscribe')}}
+                                    </a>
+                                    <a href="javascript:;" class="btn blue mt-clipboard" data-clipboard-action="copy" data-clipboard-target="#mt-target-1">
+                                        {{trans('home.copy_subscribe_address')}}
+                                    </a>
+                                    <div class="tabbable-line">
+                                        <ul class="nav nav-tabs ">
+                                            <li class="active">
+                                                <a href="#tools1" data-toggle="tab"> <i class="fa fa-apple"></i> Mac </a>
+                                            </li>
+                                            <li>
+                                                <a href="#tools2" data-toggle="tab"> <i class="fa fa-windows"></i> Windows </a>
+                                            </li>
+                                            <li>
+                                                <a href="#tools3" data-toggle="tab"> <i class="fa fa-linux"></i> Linux </a>
+                                            </li>
+                                            <li>
+                                                <a href="#tools4" data-toggle="tab"> <i class="fa fa-apple"></i> iOS </a>
+                                            </li>
+                                            <li>
+                                                <a href="#tools5" data-toggle="tab"> <i class="fa fa-android"></i> Android </a>
+                                            </li>
+                                            <li>
+                                                <a href="#tools6" data-toggle="tab"> <i class="fa fa-gamepad"></i> Games </a>
+                                            </li>
+                                        </ul>
+                                        <div class="tab-content" style="font-size:16px;">
+                                            <div class="tab-pane active" id="tools1">
+                                                <ol>
+                                                    <li> <a href="{{asset('clients/ShadowsocksX-NG-R8-1.4.4.dmg')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
+                                                    <li> 点击状态栏纸飞机 -> 服务器 -> 编辑订阅 </li>
+                                                    <li> 点击窗口左下角 “+”号 新增订阅,完整复制本页上方“订阅服务”处地址,将其粘贴至“订阅地址”栏,点击右下角“OK” </li>
+                                                    <li> 点击纸飞机 -> 服务器 -> 手动更新订阅 </li>
+                                                    <li> 点击纸飞机 -> 服务器,选定合适服务器 </li>
+                                                    <li> 点击纸飞机 -> 打开Shadowsocks </li>
+                                                    <li> 点击纸飞机 -> PAC自动模式 </li>
+                                                    <li> 点击纸飞机 -> 代理设置->从 GFW List 更新 PAC </li>
+                                                    <li> 打开系统偏好设置 -> 网络,在窗口左侧选定显示为“已连接”的网络,点击右下角“高级...” </li>
+                                                    <li> 切换至“代理”选项卡,勾选“自动代理配置”和“不包括简单主机名”,点击右下角“好”,再次点击右下角“应用” </li>
+                                                </ol>
+                                            </div>
+                                            <div class="tab-pane" id="tools2">
+                                                <ol>
+                                                    <li> <a href="{{asset('clients/ShadowsocksR-win.zip')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
+                                                    <li> 运行 ShadowsocksR 文件夹内的 ShadowsocksR.exe </li>
+                                                    <li> 右击桌面右下角状态栏(或系统托盘)纸飞机 -> 服务器订阅 -> SSR服务器订阅设置 </li>
+                                                    <li> 点击窗口左下角 “Add” 新增订阅,完整复制本页上方 “订阅服务” 处地址,将其粘贴至“网址”栏,点击“确定” </li>
+                                                    <li> 右击纸飞机 -> 服务器订阅 -> 更新SSR服务器订阅(不通过代理) </li>
+                                                    <li> 右击纸飞机 -> 服务器,选定合适服务器 </li>
+                                                    <li> 右击纸飞机 -> 系统代理模式 -> PAC模式 </li>
+                                                    <li> 右击纸飞机 -> PAC -> 更新PAC为GFWList </li>
+                                                    <li> 右击纸飞机 -> 代理规则 -> 绕过局域网和大陆 </li>
+                                                    <li> 右击纸飞机,取消勾选“服务器负载均衡” </li>
+                                                </ol>
+                                            </div>
+                                            <div class="tab-pane" id="tools3">
+                                                <ol>
+                                                    <li> <a href="{{asset('clients/Shadowsocks-qt5-3.0.1.zip')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
+                                                    <li> 单击状态栏小飞机,找到服务器 -> 编辑订阅,复制黏贴订阅地址 </li>
+                                                    <li> 更新订阅设置即可 </li>
+                                                </ol>
+                                            </div>
+                                            <div class="tab-pane" id="tools4">
+                                                <ol>
+                                                    @if(Agent::is('iPhone') || Agent::is('iPad'))
+                                                        @if(Agent::is('Safari'))
+                                                            <li> <a href="{{$ipa_list}}" target="_blank">点击此处在线安装</a></li>
+                                                        @else
+                                                            <li> <a href="javascript:onlineInstallWarning();">点击此处在线安装</a></li>
+                                                        @endif
+                                                        <li> 请从站长处获取 App Store 账号密码 </li>
+                                                        <li> 打开 Shadowrocket,点击右上角 “+”号 添加节点,类型选择 Subscribe </li>
+                                                        <li> 完整复制本页上方 “订阅服务” 处地址,将其粘贴至 “URL”栏,点击右上角 “完成” </li>
+                                                        <li> 左划新增的服务器订阅,点击 “更新” </li>
+                                                        <li> 选定合适服务器节点,点击右上角连接开关,屏幕上方状态栏出现“VPN”图标 </li>
+                                                        <li> 当进行海外游戏时请将 Shadowrocket “首页” 页面中的 “全局路由” 切换至 “代理”,并确保“设置”页面中的“UDP”已开启转发 </li>
+                                                    @else
+                                                        <li> 请使用 Safari浏览器 访问本页面 </li>
+                                                    @endif
+                                                </ol>
+                                            </div>
+                                            <div class="tab-pane" id="tools5">
+                                                <ol>
+                                                    <li> <a href="{{asset('clients/ShadowsocksRR-3.5.1.1.apk')}}" target="_blank">点击此处</a>下载客户端并启动 </li>
+                                                    <li> 单击左上角的shadowsocksR进入配置文件页,点击右下角的“+”号,点击“添加/升级SSR订阅”,完整复制本页上方“订阅服务”处地址,填入订阅信息并保存 </li>
+                                                    <li> 选中任意一个节点,返回软件首页 </li>
+                                                    <li> 在软件首页处找到“路由”选项,并将其改为“绕过局域网及中国大陆地址” </li>
+                                                    <li> 点击右上角的小飞机图标进行连接,提示是否添加(或创建)VPN连接,点同意(或允许) </li>
+                                                </ol>
+                                            </div>
+                                            <div class="tab-pane" id="tools6">
+                                                <ol>
+                                                    <li> <a href="{{asset('clients/SSTap-beta-setup-1.0.9.7.zip')}}" target="_blank">点击此处</a>下载客户端并安装 </li>
+                                                    <li> 打开 SSTap,选择 <i class="fa fa-cog"></i> -> SSR订阅 -> SSR订阅管理,添加订阅地址 </li>
+                                                    <li> 添加完成后,再次选择 <i class="fa fa-cog"></i> - SSR订阅 - 手动更新SSR订阅,即可同步节点列表。</li>
+                                                    <li> 在代理模式中选择游戏或「不代理中国IP」,点击「连接」即可加速。</li>
+                                                    <li> 需要注意的是,一旦连接成功,客户端会自动缩小到任务栏,可在设置中关闭。</li>
+                                                </ol>
+                                            </div>
+                                        </div>
+                                    </div>
+                                @else
+                                    <h3>{{trans('home.subscribe_baned')}}</h3>
+                                @endif
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                @if(!$nodeList->isEmpty())
+                    <div class="col-md-6">
+                        <div class="portlet light bordered">
+                            <div class="portlet-title">
+                                <div class="caption">
+                                    <span class="caption-subject font-blue bold">{{trans('home.my_node_list')}}</span>
+                                </div>
+                                <div class="actions">
+                                    <div class="btn-group btn-group-devided" data-toggle="buttons">
+                                        <button class="btn btn-info" id="copy_all_nodes" data-clipboard-text="{{$allNodes}}"> 复制所有节点 </button>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="portlet-body">
+                                <div class="tab-content">
+                                    <div class="tab-pane active">
+                                        <div class="mt-comments">
+                                            @foreach($nodeList as $node)
+                                                <div class="mt-comment">
+                                                    <div class="mt-comment-img" style="width:auto;">
+                                                        @if($node->country_code)
+                                                            <img src="{{asset('assets/images/country/' . $node->country_code . '.png')}}"/>
+                                                        @else
+                                                            <img src="{{asset('/assets/images/country/un.png')}}"/>
+                                                        @endif
+                                                    </div>
+                                                    <div class="mt-comment-body">
+                                                        <div class="mt-comment-info">
+                                                            <span class="mt-comment-author">{{$node->name}}</span>
+                                                            <span class="mt-comment-date">
+                                                                @if(!$node->online_status)
+                                                                    <span class="badge badge-danger">维护中</span>
+                                                                @endif
+                                                            </span>
+                                                        </div>
+                                                        <div class="mt-comment-text"> {{$node->desc}} </div>
+                                                        <div class="mt-comment-details">
+                                                            <span class="mt-comment-status mt-comment-status-pending">
+                                                                @if($node->labels)
+                                                                    @foreach($node->labels as $vo)
+                                                                        <span class="badge badge-info">{{$vo->labelInfo->name}}</span>
+                                                                    @endforeach
+                                                                @endif
+                                                            </span>
+                                                            <ul class="mt-comment-actions" style="display: block;">
+                                                                <li>
+                                                                    <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#txt_{{$node->id}}" > <i class="fa fa-reorder"></i> </a>
+                                                                </li>
+                                                                <li>
+                                                                    <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#link_{{$node->id}}"> @if($node->type == 1) <i class="fa fa-paper-plane"></i> @else <i class="fa fa-vimeo"></i> @endif </a>
+                                                                </li>
+                                                                <li>
+                                                                    <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#qrcode_{{$node->id}}"> <i class="fa fa-qrcode"></i> </a>
+                                                                </li>
+                                                            </ul>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            @endforeach
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                @endif
+            </div>
+        </div>
+
+        @foreach($nodeList as $node)
+        <!-- 配置文本 -->
+            <div class="modal fade draggable-modal" id="txt_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
+                <div class="modal-dialog">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                            <h4 class="modal-title">{{trans('home.setting_info')}}</h4>
+                        </div>
+                        <div class="modal-body">
+                            <textarea class="form-control" rows="10" readonly="readonly">{{$node->txt}}</textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!-- 配置链接 -->
+            <div class="modal fade draggable-modal" id="link_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
+                <div class="modal-dialog">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                            <h4 class="modal-title">{{$node->name}}</h4>
+                        </div>
+                        <div class="modal-body">
+                            @if($node->type == 1)
+                                <textarea class="form-control" rows="5" readonly="readonly">{{$node->ssr_scheme}}</textarea>
+                                <a href="{{$node->ssr_scheme}}" class="btn purple uppercase" style="display: block; width: 100%;margin-top: 10px;">打开SSR</a>
+                                @if($node->ss_scheme)
+                                    <p></p>
+                                    <textarea class="form-control" rows="3" readonly="readonly">{{$node->ss_scheme}}</textarea>
+                                    <a href="{{$node->ss_scheme}}" class="btn blue uppercase" style="display: block; width: 100%;margin-top: 10px;">打开SS</a>
+                                @endif
+                            @else
+                                @if($node->v2_scheme)
+                                    <p></p>
+                                    <textarea class="form-control" rows="3" readonly="readonly">{{$node->v2_scheme}}</textarea>
+                                    <a href="{{$node->v2_scheme}}" class="btn blue uppercase" style="display: block; width: 100%;margin-top: 10px;">打开V2ray</a>
+                                @endif
+                            @endif
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <!-- 配置二维码 -->
+            <div class="modal fade" id="qrcode_{{$node->id}}" tabindex="-1" role="dialog" aria-hidden="true">
+                <div class="modal-dialog @if($node->type == 2 || !$node->compatible) modal-sm @endif">
+                    <div class="modal-content">
+                        <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                            <h4 class="modal-title">{{trans('home.scan_qrcode')}}</h4>
+                        </div>
+                        <div class="modal-body">
+                            <div class="row">
+                                @if($node->type == 1)
+                                    @if($node->compatible)
+                                        <div class="col-md-6">
+                                            <div id="qrcode_ssr_img_{{$node->id}}" style="text-align: center;"></div>
+                                            <div style="text-align: center;"><a id="download_qrcode_ssr_img_{{$node->id}}">{{trans('home.download')}}</a></div>
+                                        </div>
+                                        <div class="col-md-6">
+                                            <div id="qrcode_ss_img_{{$node->id}}" style="text-align: center;"></div>
+                                            <div style="text-align: center;"><a id="download_qrcode_ss_img_{{$node->id}}">{{trans('home.download')}}</a></div>
+                                        </div>
+                                    @else
+                                        <div class="col-md-12">
+                                            <div id="qrcode_ssr_img_{{$node->id}}" style="text-align: center;"></div>
+                                            <div style="text-align: center;"><a id="download_qrcode_ssr_img_{{$node->id}}">{{trans('home.download')}}</a></div>
+                                        </div>
+                                    @endif
+                                @else
+                                    <div class="col-md-12">
+                                        <div id="qrcode_v2_img_{{$node->id}}" style="text-align: center;"></div>
+                                        <div style="text-align: center;"><a id="download_qrcode_v2_img_{{$node->id}}">{{trans('home.download')}}</a></div>
+                                    </div>
+                                @endif
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        @endforeach
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/assets/global/plugins/clipboardjs/clipboard.min.js" type="text/javascript"></script>
+    <script src="/assets/pages/scripts/components-clipboard.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/jquery-qrcode/jquery.qrcode.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/jquery-ui/jquery-ui.min.js" type="text/javascript"></script>
+
+    <script type="text/javascript">
+        // 在线安装警告提示
+        function onlineInstallWarning() {
+            layer.msg('仅限在Safari浏览器下有效', {time:1000});
+        }
+    </script>
+
+    <script type="text/javascript">
+        var UIModals = function () {
+            var n = function () {
+                @foreach($nodeList as $node)
+                $("#txt_{{$node->id}}").draggable({handle: ".modal-header"});
+                $("#qrcode_{{$node->id}}").draggable({handle: ".modal-header"});
+                @endforeach
+            };
+
+            return {
+                init: function () {
+                    n()
+                }
+            }
+        }();
+
+        jQuery(document).ready(function () {
+            UIModals.init()
+        });
+
+        // 循环输出节点scheme用于生成二维码
+        @foreach ($nodeList as $node)
+            @if($node->type == 1)
+                $('#qrcode_ssr_img_{{$node->id}}').qrcode("{{$node->ssr_scheme}}");
+                $('#download_qrcode_ssr_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_ssr_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
+            @if($node->ss_scheme)
+                $('#qrcode_ss_img_{{$node->id}}').qrcode("{{$node->ss_scheme}}");
+                $('#download_qrcode_ss_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_ss_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
+            @endif
+            @else
+                $('#qrcode_v2_img_{{$node->id}}').qrcode("{{$node->v2_scheme}}");
+                $('#download_qrcode_v2_img_{{$node->id}}').attr({'download':'code','href':$('#qrcode_v2_img_{{$node->id}} canvas')[0].toDataURL("image/png")})
+            @endif
+        @endforeach
+
+        // 更换订阅地址
+        function exchangeSubscribe() {
+            layer.confirm('更换订阅地址将导致:<br>1.旧地址立即失效;<br>2.连接密码被更改;', {icon: 7, title:'警告'}, function(index) {
+                $.post("{{url('exchangeSubscribe')}}", {_token:'{{csrf_token()}}'}, function (ret) {
+                    layer.msg(ret.message, {time:1000}, function () {
+                        if (ret.status == 'success') {
+                            window.location.reload();
+                        }
+                    });
+                });
+
+                layer.close(index);
+            });
+        }
+    </script>
+
+    @if(!$nodeList->isEmpty())
+        <script type="text/javascript">
+            var copy_all_nodes = document.getElementById('copy_all_nodes');
+            var clipboard = new Clipboard(copy_all_nodes);
+
+            clipboard.on('success', function(e) {
+                layer.alert("复制成功,通过右键菜单倒入节点链接即可", {icon:1, title:'提示'});
+            });
+
+            clipboard.on('error', function(e) {
+                console.log(e);
+            });
+        </script>
+    @endif
+@endsection

+ 169 - 56
resources/views/user/services.blade.php

@@ -15,60 +15,75 @@
         <!-- BEGIN PAGE BASE CONTENT -->
         <div class="row">
             <div class="col-md-12">
-                <div class="portlet light bordered">
-                    <div class="portlet-body">
-                        <div class="table-scrollable table-scrollable-borderless">
-                            <table class="table table-hover table-light table-checkable order-column">
-                                <thead>
-                                <tr>
-                                    <th style="width:35%;"> {{trans('home.service_name')}} </th>
-                                    <th style="text-align: center;"> {{trans('home.service_desc')}} </th>
-                                    <th style="text-align: center;"> {{trans('home.service_type')}} </th>
-                                    <th style="text-align: center;"> {{trans('home.service_price')}} </th>
-                                    <th> </th>
-                                </tr>
-                                </thead>
-                                <tbody>
-                                @if($goodsList->isEmpty())
+                <div class="portlet light">
+                    <div class="portlet-title">
+                        <div class="caption">
+                            <span class="caption-subject font-blue">账户等级:</span>
+                            <span class="caption-subject font-red">{{Auth::user()->levelList->level_name}}、</span>
+                            <span class="caption-subject font-blue">账户余额:</span>
+                            <span class="caption-subject font-red">{{Auth::user()->balance}}元</span>
+                        </div>
+                        <div class="actions">
+                            <div class="btn-group btn-group-devided" data-toggle="buttons">
+                                <a class="btn btn-sm red" href="#" data-toggle="modal" data-target="#charge_modal" style="color: #FFF;">{{trans('home.recharge')}}</a>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="portlet light">
+                        <div class="portlet-body">
+                            <div class="table-scrollable table-scrollable-borderless">
+                                <table class="table table-hover table-light table-checkable order-column">
+                                    <thead>
                                     <tr>
-                                        <td colspan="5" style="text-align: center;">{{trans('home.services_none')}}</td>
+                                        <th style="width:35%;"> {{trans('home.service_name')}} </th>
+                                        <th style="text-align: center;"> {{trans('home.service_desc')}} </th>
+                                        <th style="text-align: center;"> {{trans('home.service_type')}} </th>
+                                        <th style="text-align: center;"> {{trans('home.service_price')}} </th>
+                                        <th> </th>
                                     </tr>
-                                @else
-                                    @foreach($goodsList as $key => $goods)
-                                        <tr class="odd gradeX">
-                                            <td style="width: 20%;">
-                                                <!--@if($goods->logo) <a href="{{$goods->logo}}" class="fancybox"><img src="{{$goods->logo}}"/></a> @endif -->
-                                                <span style="font-size: 1.15em; color: #000;">{{$goods->name}}</span>
-                                                <br>
-                                                <span style="color: #000;">{{trans('home.service_traffic')}}:{{$goods->traffic_label}}</span>
-                                                <br>
-                                                <span style="color: #000;">{{trans('home.service_days')}}:{{$goods->days}} {{trans('home.day')}}</span>
-                                            </td>
-                                            <td style="width: 20%; text-align: center;"> {{$goods->desc}} </td>
-                                            <td style="width: 20%; text-align: center;">
-                                                @if($goods->type == 1)
-                                                    {{trans('home.service_type_1')}}
-                                                @elseif($goods->type == 2)
-                                                    {{trans('home.service_type_2')}}
-                                                @else
-                                                    {{trans('home.service_type_3')}}
-                                                @endif
-                                            </td>
-                                            <td style="width: 20%; text-align: center;"> ¥{{$goods->price}} </td>
-                                            <td style="width: 20%; text-align: center;">
-                                                <a href="javascript:buy('{{$goods->id}}');" class="btn blue"> {{trans('home.service_buy_button')}} </a>
-                                                <!--<button type="button" class="btn btn-sm blue btn-outline" onclick="exchange('{{$goods->id}}')">兑换</button>-->
-                                            </td>
+                                    </thead>
+                                    <tbody>
+                                    @if($goodsList->isEmpty())
+                                        <tr>
+                                            <td colspan="5" style="text-align: center;">{{trans('home.services_none')}}</td>
                                         </tr>
-                                    @endforeach
-                                @endif
-                                </tbody>
-                            </table>
-                        </div>
-                        <div class="row">
-                            <div class="col-md-12">
-                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
-                                    {{ $goodsList->links() }}
+                                    @else
+                                        @foreach($goodsList as $key => $goods)
+                                            <tr class="odd gradeX">
+                                                <td style="width: 20%;">
+                                                    <!--@if($goods->logo) <a href="{{$goods->logo}}" class="fancybox"><img src="{{$goods->logo}}"/></a> @endif -->
+                                                    <span style="font-size: 1.15em; color: #000;">{{$goods->name}}</span>
+                                                    <br>
+                                                    <span style="color: #000;">{{trans('home.service_traffic')}}:{{$goods->traffic_label}}</span>
+                                                    <br>
+                                                    <span style="color: #000;">{{trans('home.service_days')}}:{{$goods->days}} {{trans('home.day')}}</span>
+                                                </td>
+                                                <td style="width: 20%; text-align: center;"> {{$goods->desc}} </td>
+                                                <td style="width: 20%; text-align: center;">
+                                                    @if($goods->type == 1)
+                                                        {{trans('home.service_type_1')}}
+                                                    @elseif($goods->type == 2)
+                                                        {{trans('home.service_type_2')}}
+                                                    @else
+                                                        {{trans('home.service_type_3')}}
+                                                    @endif
+                                                </td>
+                                                <td style="width: 20%; text-align: center;"> ¥{{$goods->price}} </td>
+                                                <td style="width: 20%; text-align: center;">
+                                                    <a href="javascript:buy('{{$goods->id}}');" class="btn blue"> {{trans('home.service_buy_button')}} </a>
+                                                    <!--<button type="button" class="btn btn-sm blue btn-outline" onclick="exchange('{{$goods->id}}')">兑换</button>-->
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                    @endif
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="row">
+                                <div class="col-md-12">
+                                    <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                        {{ $goodsList->links() }}
+                                    </div>
                                 </div>
                             </div>
                         </div>
@@ -76,6 +91,57 @@
                 </div>
             </div>
         </div>
+
+        <div id="charge_modal" class="modal fade" tabindex="-1" data-focus-on="input:first" data-keyboard="false">
+            <div class="modal-dialog">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                        <h4 class="modal-title">{{trans('home.recharge_balance')}}</h4>
+                    </div>
+                    <div class="modal-body">
+                        <div class="alert alert-danger" style="display: none; text-align: center;" id="charge_msg"></div>
+                        <form action="#" method="post" class="form-horizontal">
+                            <div class="form-body">
+                                <div class="form-group">
+                                    <label for="charge_type" class="col-md-4 control-label">{{trans('home.payment_method')}}</label>
+                                    <div class="col-md-6">
+                                        <select class="form-control" name="charge_type" id="charge_type">
+                                            <option value="1" selected>{{trans('home.coupon_code')}}</option>
+                                            @if(!$chargeGoodsList->isEmpty())
+                                                <option value="2">{{trans('home.online_pay')}}</option>
+                                            @endif
+                                        </select>
+                                    </div>
+                                </div>
+                                @if(!$chargeGoodsList->isEmpty())
+                                    <div class="form-group" id="charge_balance" style="display: none;">
+                                        <label for="online_pay" class="col-md-4 control-label">充值金额</label>
+                                        <div class="col-md-6">
+                                            <select class="form-control" name="online_pay" id="online_pay">
+                                                @foreach($chargeGoodsList as $key => $goods)
+                                                    <option value="{{$goods->id}}">充值{{$goods->price}}元</option>
+                                                @endforeach
+                                            </select>
+                                        </div>
+                                    </div>
+                                @endif
+                                <div class="form-group" id="charge_coupon_code">
+                                    <label for="charge_coupon" class="col-md-4 control-label"> {{trans('home.coupon_code')}} </label>
+                                    <div class="col-md-6">
+                                        <input type="text" class="form-control" name="charge_coupon" id="charge_coupon" placeholder="{{trans('home.please_input_coupon')}}">
+                                    </div>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                    <div class="modal-footer">
+                        <button type="button" data-dismiss="modal" class="btn dark btn-outline">{{trans('home.close')}}</button>
+                        <button type="button" class="btn red btn-outline" onclick="return charge();">{{trans('home.recharge')}}</button>
+                    </div>
+                </div>
+            </div>
+        </div>
         <!-- END PAGE BASE CONTENT -->
     </div>
     <!-- END CONTENT BODY -->
@@ -88,11 +154,6 @@
             window.location.href = '/buy/' + goods_id;
         }
 
-        // 积分兑换商品
-        function exchange(id) {
-            //
-        }
-
         // 查看商品图片
         $(document).ready(function () {
             $('.fancybox').fancybox({
@@ -100,5 +161,57 @@
                 closeEffect: 'elastic'
             })
         })
+
+        // 切换充值方式
+        $("#charge_type").change(function(){
+            if ($(this).val() == 2) {
+                $("#charge_balance").show();
+                $("#charge_coupon_code").hide();
+            } else {
+                $("#charge_balance").hide();
+                $("#charge_coupon_code").show();
+            }
+        });
+
+        // 充值
+        function charge() {
+            var charge_type = $("#charge_type").val();
+            var charge_coupon = $("#charge_coupon").val();
+            var online_pay = $("#online_pay").val();
+
+            if (charge_type == '2') {
+                $("#charge_msg").show().html("正在跳转支付界面");
+                window.location.href = '/buy/' + online_pay;
+                return false;
+            }
+
+            if (charge_type == '1' && (charge_coupon == '' || charge_coupon == undefined)) {
+                $("#charge_msg").show().html("{{trans('home.coupon_not_empty')}}");
+                $("#charge_coupon").focus();
+                return false;
+            }
+
+            $.ajax({
+                url:'{{url('charge')}}',
+                type:"POST",
+                data:{_token:'{{csrf_token()}}', coupon_sn:charge_coupon},
+                beforeSend:function(){
+                    $("#charge_msg").show().html("{{trans('home.recharging')}}");
+                },
+                success:function(ret){
+                    if (ret.status == 'fail') {
+                        $("#charge_msg").show().html(ret.message);
+                        return false;
+                    }
+
+                    $("#charge_modal").modal("hide");
+                    window.location.reload();
+                },
+                error:function(){
+                    $("#charge_msg").show().html("{{trans('home.error_response')}}");
+                },
+                complete:function(){}
+            });
+        }
     </script>
 @endsection

+ 0 - 132
resources/views/user/trafficLog.blade.php

@@ -1,132 +0,0 @@
-@extends('user.layouts')
-@section('css')
-@endsection
-@section('content')
-    <!-- BEGIN CONTENT BODY -->
-    <div class="page-content" style="padding-top:0;">
-        <!-- BEGIN PAGE BASE CONTENT -->
-        <div class="row">
-            <div class="col-md-12">
-                <div class="note note-info">
-                    <p> {{trans('home.traffic_log_tips')}} </p>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-md-12">
-                <div class="portlet light bordered">
-                    <div class="portlet-body">
-                        <div id="chart1" style="width: auto;height:450px;"></div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-md-12">
-                <div class="portlet light bordered">
-                    <div class="portlet-body">
-                        <div id="chart2" style="width: auto;height:450px;"></div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <!-- END PAGE BASE CONTENT -->
-    </div>
-    <!-- END CONTENT BODY -->
-@endsection
-@section('script')
-    <script src="/assets/global/plugins/echarts/echarts.min.js" type="text/javascript"></script>
-
-    <script type="text/javascript">
-        var myChart = echarts.init(document.getElementById('chart1'));
-
-        option = {
-            title: {
-                text: '{{trans('home.traffic_log_30days')}}',
-                subtext: '{{trans('home.traffic_log_unit')}}'
-            },
-            tooltip: {
-                trigger: 'axis'
-            },
-            toolbox: {
-                show: true,
-                feature: {
-                    saveAsImage: {}
-                }
-            },
-            xAxis: {
-                type: 'category',
-                boundaryGap: false,
-                data: [{!! $monthDays !!}]
-            },
-            yAxis: {
-                type: 'value',
-                axisLabel: {
-                    formatter: '{value} G'
-                }
-            },
-            series: [
-                @if(!empty($trafficDaily))
-                {
-                    name:'{{trans('home.traffic_log_keywords')}}',
-                    type:'line',
-                    data:[{!! $trafficDaily !!}],
-                    markPoint: {
-                        data: [
-                            {type: 'max', name: '{{trans('home.traffic_log_max')}}'}
-                        ]
-                    }
-                }
-                @endif
-            ]
-        };
-
-        myChart.setOption(option);
-    </script>
-    <script type="text/javascript">
-        var myChart = echarts.init(document.getElementById('chart2'));
-
-        option = {
-            title: {
-                text: '{{trans('home.traffic_log_24hours')}}',
-                subtext: '{{trans('home.traffic_log_unit')}}'
-            },
-            tooltip: {
-                trigger: 'axis'
-            },
-            toolbox: {
-                show: true,
-                feature: {
-                    saveAsImage: {}
-                }
-            },
-            xAxis: {
-                type: 'category',
-                boundaryGap: false,
-                data: ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']
-            },
-            yAxis: {
-                type: 'value',
-                axisLabel: {
-                    formatter: '{value} G'
-                }
-            },
-            series: [
-                @if(!empty($trafficHourly))
-                {
-                    name:'{{trans('home.traffic_log_keywords')}}',
-                    type:'line',
-                    data:[{!! $trafficHourly !!}],
-                    markPoint: {
-                        data: [
-                            {type: 'max', name: '{{trans('home.traffic_log_max')}}'}
-                        ]
-                    }
-                }
-                @endif
-            ]
-        };
-
-        myChart.setOption(option);
-    </script>
-@endsection

+ 2 - 2
routes/web.php

@@ -112,8 +112,9 @@ Route::group(['middleware' => ['isForbidden', 'isLogin']], function () {
     Route::any('/', 'UserController@index'); // 用户首页
     Route::any('article', 'UserController@article'); // 文章详情
     Route::post('exchangeSubscribe', 'UserController@exchangeSubscribe'); // 更换节点订阅地址
+    Route::get('nodeList', 'UserController@nodeList'); // 节点列表
+    Route::post('checkIn', 'UserController@checkIn'); // 签到
     Route::get('services', 'UserController@services'); // 商品列表
-    Route::get('trafficLog', 'UserController@trafficLog'); // 流量日志
     Route::get('tickets', 'UserController@ticketList'); // 工单
     Route::post('addTicket', 'UserController@addTicket'); // 快速添加工单
     Route::any('replyTicket', 'UserController@replyTicket'); // 回复工单
@@ -125,7 +126,6 @@ Route::group(['middleware' => ['isForbidden', 'isLogin']], function () {
     Route::get('invite', 'UserController@invite'); // 邀请码
     Route::post('makeInvite', 'UserController@makeInvite'); // 生成邀请码
     Route::any('profile', 'UserController@profile'); // 修改个人信息
-    Route::post('exchange', 'UserController@exchange'); // 积分兑换流量
     Route::get('referral', 'UserController@referral'); // 推广返利
     Route::post('extractMoney', 'UserController@extractMoney'); // 申请提现
     Route::post("switchToAdmin", "UserController@switchToAdmin"); // 转换成管理员的身份

+ 1 - 1
scripts/vnstat.sh

@@ -1,5 +1,5 @@
 #!/bin/bash
-yum install -y wget sqlite-devel
+yum install -y wget sqlite-devel gcc
 wget https://github.com/vergoh/vnstat/releases/download/v2.1/vnstat-2.1.tar.gz
 tar zxvf vnstat-2.1.tar.gz
 cd vnstat-2.1

+ 14 - 17
sql/db.sql

@@ -119,14 +119,14 @@ CREATE TABLE `user` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `username` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名',
   `password` varchar(64) NOT NULL DEFAULT '' COMMENT '密码',
-  `port` int(11) NOT NULL DEFAULT '0' COMMENT 'SS端口',
-  `passwd` varchar(16) NOT NULL DEFAULT '' COMMENT 'SS密码',
-  `vmess_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'V2ray用户ID',
-  `transfer_enable` bigint(20) NOT NULL DEFAULT '1073741824000' COMMENT '可用流量,单位字节,默认1TiB',
+  `port` int(11) NOT NULL DEFAULT '0' COMMENT '代理端口',
+  `passwd` varchar(16) NOT NULL DEFAULT '' COMMENT '代理密码',
+  `vmess_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'V2Ray用户ID',
+  `transfer_enable` bigint(20) NOT NULL DEFAULT '1099511627776' COMMENT '可用流量,单位字节,默认1TiB',
   `u` bigint(20) NOT NULL DEFAULT '0' COMMENT '已上传流量,单位字节',
   `d` bigint(20) NOT NULL DEFAULT '0' COMMENT '已下载流量,单位字节',
   `t` int(11) NOT NULL DEFAULT '0' COMMENT '最后使用时间',
-  `enable` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'SS状态',
+  `enable` tinyint(4) NOT NULL DEFAULT '1' COMMENT '代理状态',
   `method` varchar(30) NOT NULL DEFAULT 'aes-256-cfb' COMMENT '加密方式',
   `protocol` varchar(30) NOT NULL DEFAULT 'origin' COMMENT '协议',
   `protocol_param` varchar(255) DEFAULT '' COMMENT '协议参数',
@@ -140,7 +140,7 @@ CREATE TABLE `user` (
   `usage` VARCHAR(10) NOT NULL DEFAULT '4' COMMENT '用途:1-手机、2-电脑、3-路由器、4-其他',
   `pay_way` tinyint(4) NOT NULL DEFAULT '0' COMMENT '付费方式:0-免费、1-季付、2-月付、3-半年付、4-年付',
   `balance` int(11) NOT NULL DEFAULT '0' COMMENT '余额,单位分',
-  `score` int(11) NOT NULL DEFAULT '0' COMMENT '积分',
+  `score` int(11) NOT NULL DEFAULT '0' COMMENT '积分,暂无用',
   `enable_time` date DEFAULT NULL COMMENT '开通日期',
   `expire_time` date NOT NULL DEFAULT '2099-01-01' COMMENT '过期时间',
   `ban_time` int(11) NOT NULL DEFAULT '0' COMMENT '封禁到期时间',
@@ -185,13 +185,10 @@ CREATE TABLE `level` (
 -- ----------------------------
 -- Records of `level`
 -- ----------------------------
-INSERT INTO `level` VALUES (1, '1', '青铜');
-INSERT INTO `level` VALUES (2, '2', '白银');
-INSERT INTO `level` VALUES (3, '3', '黄金');
-INSERT INTO `level` VALUES (4, '4', '铂金');
-INSERT INTO `level` VALUES (5, '5', '钻石');
-INSERT INTO `level` VALUES (6, '6', '星耀');
-INSERT INTO `level` VALUES (7, '7', '王者');
+INSERT INTO `level` VALUES (1, '1', '普通用户');
+INSERT INTO `level` VALUES (2, '2', 'VIP1');
+INSERT INTO `level` VALUES (3, '3', 'VIP2');
+INSERT INTO `level` VALUES (4, '4', 'VIP3');
 
 
 -- ----------------------------
@@ -295,12 +292,12 @@ INSERT INTO `config` VALUES ('8', 'reset_password_times', 3);
 INSERT INTO `config` VALUES ('9', 'website_url', 'https://www.ssrpanel.com');
 INSERT INTO `config` VALUES ('10', 'is_active_register', 1);
 INSERT INTO `config` VALUES ('11', 'active_times', 3);
-INSERT INTO `config` VALUES ('12', 'login_add_score', 1);
-INSERT INTO `config` VALUES ('13', 'min_rand_score', 1);
-INSERT INTO `config` VALUES ('14', 'max_rand_score', 100);
+INSERT INTO `config` VALUES ('12', 'is_checkin', 1);
+INSERT INTO `config` VALUES ('13', 'min_rand_traffic', 10);
+INSERT INTO `config` VALUES ('14', 'max_rand_traffic', 500);
 INSERT INTO `config` VALUES ('15', 'wechat_qrcode', '');
 INSERT INTO `config` VALUES ('16', 'alipay_qrcode', '');
-INSERT INTO `config` VALUES ('17', 'login_add_score_range', 1440);
+INSERT INTO `config` VALUES ('17', 'traffic_limit_time', 1440);
 INSERT INTO `config` VALUES ('18', 'referral_traffic', 1024);
 INSERT INTO `config` VALUES ('19', 'referral_percent', 0.2);
 INSERT INTO `config` VALUES ('20', 'referral_money', 100);

+ 14 - 0
sql/update/20190228.sql

@@ -0,0 +1,14 @@
+-- 登录送积分功能改为手动签到送流量功能
+UPDATE `config` SET `name` = 'is_checkin' WHERE id=12;
+UPDATE `config` SET `name` = 'min_rand_traffic' WHERE id=13;
+UPDATE `config` SET `name` = 'max_rand_traffic' WHERE id=14;
+UPDATE `config` SET `name` = 'traffic_limit_time' WHERE id=17;
+
+-- 重新定义用户等级表
+TRUNCATE TABLE `level`;
+
+INSERT INTO `level` VALUES (1, '1', '普通用户');
+INSERT INTO `level` VALUES (2, '2', 'VIP1');
+INSERT INTO `level` VALUES (3, '3', 'VIP2');
+INSERT INTO `level` VALUES (4, '4', 'VIP3');
+