Просмотр исходного кода

1.管理员/用户权限分离
2.防爬虫
3.修正管理后台一些BUG、优化细节、删除无用代码
4.加入用户端(开发中)

zhangjiangbin 8 лет назад
Родитель
Сommit
397cebc05a

+ 94 - 4
app/Http/Controllers/AdminController.php

@@ -21,6 +21,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $past = strtotime(date('Y-m-d', strtotime("-7 days")));
         $online = time() - 3600;
 
@@ -47,6 +51,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $username = $request->get('username');
         $wechat = $request->get('wechat');
         $qq = $request->get('qq');
@@ -104,6 +112,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if ($request->method() == 'POST') {
             $username = $request->get('username');
             $password = $request->get('password');
@@ -140,7 +152,7 @@ class AdminController extends BaseController
                 'password' => $password,
                 'port' => $port,
                 'passwd' => empty($passwd) ? $this->makeRandStr() : $passwd, // SS密码为空时生成默认密码
-                'transfer_enable' => $transfer_enable,
+                'transfer_enable' => $this->toGB($transfer_enable),
                 'enable' => $enable,
                 'method' => $method,
                 'custom_method' => $custom_method,
@@ -154,7 +166,7 @@ class AdminController extends BaseController
                 'pay_way' => $pay_way,
                 'balance' => $balance,
                 'enable_time' => empty($enable_time) ? date('Y-m-d') : $enable_time,
-                'expire_time' => empty($expire_time) ? '2099-1-1' : $expire_time,
+                'expire_time' => empty($expire_time) ? date('Y-m-d', strtotime("+365 days")) : $expire_time,
                 'remark' => $remark,
                 'is_admin' => $is_admin,
                 'reg_ip' => $request->getClientIp()
@@ -188,6 +200,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if ($request->method() == 'POST') {
             $username = $request->get('username');
@@ -234,7 +250,7 @@ class AdminController extends BaseController
                 'pay_way' => $pay_way,
                 'balance' => $balance,
                 'enable_time' => empty($enable_time) ? date('Y-m-d') : $enable_time,
-                'expire_time' => empty($expire_time) ? '2099-1-1' : $expire_time,
+                'expire_time' => empty($expire_time) ? date('Y-m-d', strtotime("+365 days")) : $expire_time,
                 'remark' => $remark,
                 'is_admin' => $is_admin
             ];
@@ -273,6 +289,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if ($id == 1) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '系统管理员不可删除']);
@@ -293,6 +313,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $nodeList = SsNode::paginate(10);
         foreach ($nodeList as &$node) {
             // 在线人数
@@ -321,6 +345,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if ($request->method() == 'POST') {
             $name = $request->get('name');
             $server = $request->get('server');
@@ -374,6 +402,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if ($request->method() == 'POST') {
             $name = $request->get('name');
@@ -435,6 +467,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         $user = SsNode::where('id', $id)->delete();
         if ($user) {
@@ -451,6 +487,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $trafficLogList = UserTrafficLog::with(['User', 'SsNode'])->orderBy('id', 'desc')->paginate(20);
         foreach ($trafficLogList as &$trafficLog) {
             $trafficLog->u = $this->flowAutoShow($trafficLog->u);
@@ -470,6 +510,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if ($request->method() == 'POST') {
             $method = $request->get('method');
             $transfer_enable = $request->get('transfer_enable');
@@ -531,6 +575,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if (!file_exists(public_path('downloads/convert.json'))) {
             exit('文件不存在');
         }
@@ -545,6 +593,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if ($request->method() == 'POST') {
 
             if (!$request->hasFile('uploadFile')) {
@@ -636,6 +688,10 @@ class AdminController extends BaseController
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if (empty($id)) {
             return Redirect::to('admin/userList');
@@ -663,7 +719,7 @@ class AdminController extends BaseController
             $ss_str = '';
             $ss_str .= $user->method . ':' . $user->passwd . '@';
             $ss_str .= $node->server . ':' . $user->port;
-            $ss_str .= $this->base64url_encode($ss_str);
+            $ss_str = $this->base64url_encode($ss_str) . '#' . 'VPN';
             $ss_scheme = 'ss://' . $ss_str;
 
             // 生成json配置信息
@@ -716,6 +772,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $user = $request->session()->get('user');
 
         if ($request->method() == 'POST') {
@@ -754,6 +814,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if (empty($id)) {
             return Redirect::to('admin/userList');
@@ -794,6 +858,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         if ($request->method() == 'POST') {
             $name = $request->get('name');
             $type = $request->get('type', 1); // 类型:1-加密方式(method)、2-协议(protocol)、3-混淆(obfs)
@@ -834,6 +902,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         $config = SsConfig::where('id', $id)->delete();
         if ($config) {
@@ -850,6 +922,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $id = $request->get('id');
         if (empty($id)) {
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '非法请求']);
@@ -876,7 +952,17 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $file = storage_path('app/public/ssserver.log');
+        if (!file_exists($file)) {
+            $request->session()->flash('analysisErrorMsg', $file . ' 不存在,请先创建文件');
+
+            return Response::view('admin/analysis');
+        }
+
         $logs = $this->tail($file, 10000);
         $url = [];
         foreach ($logs as $log) {
@@ -907,6 +993,10 @@ TXT;
             return Redirect::to('login');
         }
 
+        if (!$request->session()->get('user')['is_admin']) {
+            return Redirect::to('login');
+        }
+
         $view = $this->systemConfig();
 
         return Response::view('admin/system', $view);

+ 0 - 20
app/Http/Controllers/HomeController.php

@@ -1,20 +0,0 @@
-<?php
-
-namespace App\Http\Controllers;
-
-use Request;
-use Response;
-
-/**
- * 前端控制器
- * Class Home
- * @package App\Http\Controllers
- */
-class HomeController extends Controller
-{
-    public function index(Request $request)
-    {
-        return Response::view('index');
-    }
-
-}

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

@@ -0,0 +1,124 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Models\SsNode;
+use App\Http\Models\SsNodeInfo;
+use App\Http\Models\SsNodeOnlineLog;
+use App\Http\Models\User;
+use App\Http\Models\UserTrafficLog;
+use Illuminate\Http\Request;
+use Redirect;
+use Response;
+
+class UserController extends BaseController
+{
+    public function index(Request $request)
+    {
+        return Response::view('user/index');
+    }
+
+    // 修改个人资料
+    public function profile(Request $request)
+    {
+        if (!$request->session()->has('user')) {
+            return Redirect::to('login');
+        }
+
+        $user = $request->session()->get('user');
+
+        if ($request->method() == 'POST') {
+            $old_password = $request->get('old_password');
+            $new_password = $request->get('new_password');
+
+            $old_password = md5(trim($old_password));
+            $new_password = md5(trim($new_password));
+
+            $user = User::where('id', $user['id'])->first();
+            if ($user->password != $old_password) {
+                $request->session()->flash('errorMsg', '旧密码错误,请重新输入');
+                return Redirect::back();
+            } else if ($user->password == $new_password) {
+                $request->session()->flash('errorMsg', '新密码不可与旧密码一样,请重新输入');
+                return Redirect::back();
+            }
+
+            $ret = User::where('id', $user['id'])->update(['password' => $new_password]);
+            if (!$ret) {
+                $request->session()->flash('errorMsg', '修改失败');
+                return Redirect::back();
+            } else {
+                $request->session()->flash('successMsg', '修改成功');
+                return Redirect::back();
+            }
+        } else {
+            return Response::view('user/profile');
+        }
+    }
+
+    // 节点列表
+    public function nodeList(Request $request)
+    {
+        if (!$request->session()->has('user')) {
+            return Redirect::to('login');
+        }
+
+        $nodeList = SsNode::paginate(10);
+        foreach ($nodeList as &$node) {
+            // 在线人数
+            $online_log = SsNodeOnlineLog::where('node_id', $node->id)->orderBy('id', 'desc')->first();
+            $node->online_users = empty($online_log) ? 0 : $online_log->online_user;
+
+            // 已产生流量
+            $u = UserTrafficLog::where('node_id', $node->id)->sum('u');
+            $d = UserTrafficLog::where('node_id', $node->id)->sum('d');
+            $node->transfer = $this->flowAutoShow($u + $d);
+
+            // 负载
+            $node_info = SsNodeInfo::where('node_id', $node->id)->orderBy('id', 'desc')->first();
+            $node->load = empty($node_info->load) ? 0 : $node_info->load;
+        }
+
+        $view['nodeList'] = $nodeList;
+
+        return Response::view('user/nodeList', $view);
+    }
+
+    // 流量日志
+    public function trafficLog(Request $request)
+    {
+        if (!$request->session()->has('user')) {
+            return Redirect::to('login');
+        }
+
+        $user = $request->session()->get('user');
+
+        $trafficLogList = UserTrafficLog::with(['User', 'SsNode'])->where('user_id', $user['id'])->orderBy('id', 'desc')->paginate(20);
+        foreach ($trafficLogList as &$trafficLog) {
+            $trafficLog->u = $this->flowAutoShow($trafficLog->u);
+            $trafficLog->d = $this->flowAutoShow($trafficLog->d);
+            $trafficLog->log_time = date('Y-m-d H:i:s', $trafficLog->log_time);
+        }
+
+        $view['trafficLogList'] = $trafficLogList;
+
+        return Response::view('user/trafficLog', $view);
+    }
+
+    // 邀请码
+    public function invite(Request $request)
+    {
+        if (!$request->session()->has('user')) {
+            return Redirect::to('login');
+        }
+
+        $user = $request->session()->get('user');
+
+
+
+        $view = [];
+
+        return Response::view('user/invite', $view);
+    }
+
+}

+ 46 - 2
public/robots.txt

@@ -1,2 +1,46 @@
-User-agent: *
-Disallow:
+User-agent: Baiduspider
+Disallow: /
+User-agent: Sosospider
+Disallow: /
+User-agent: sogou spider
+Disallow: /
+User-agent: YodaoBot
+Disallow: /
+User-agent: Googlebot
+Disallow: /
+User-agent: Bingbot
+Disallow: /
+User-agent: Slurp
+Disallow: /
+User-agent: Teoma
+Disallow: /
+User-agent: ia_archiver
+Disallow: /
+User-agent: twiceler
+Disallow: /
+User-agent: MSNBot
+Disallow: /
+User-agent: Scrubby
+Disallow: /
+User-agent: Robozilla
+Disallow: /
+User-agent: Gigabot
+Disallow: /
+User-agent: googlebot-image
+Disallow: /
+User-agent: googlebot-mobile
+Disallow: /
+User-agent: yahoo-mmcrawler
+Disallow: /
+User-agent: yahoo-blogs/v3.9
+Disallow: /
+User-agent: psbot
+Disallow: /
+Disallow: /public/
+Disallow: /sql/
+Disallow: /config/
+Disallow: /app/
+Disallow: /database/
+Disallow: /resources/
+Disallow: /routes/
+Disallow: /vendor

+ 6 - 21
resources/views/admin/addUser.blade.php

@@ -97,29 +97,14 @@
                                                 </div>
                                             </div>
                                             <div class="form-group">
-                                                <label for="enable_time" class="col-md-3 control-label">开通时间</label>
+                                                <label class="col-md-3 control-label">有效期</label>
                                                 <div class="col-md-8">
-                                                    <div class="input-group input-medium date date-picker" data-date-format="yyyy-mm-dd">
-                                                        <input type="text" class="form-control" name="enable_time" value="" id="enable_time" readonly>
-                                                        <span class="input-group-btn">
-                                                            <button class="btn default" type="button">
-                                                                <i class="fa fa-calendar"></i>
-                                                            </button>
-                                                        </span>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="form-group">
-                                                <label for="expire_time" class="col-md-3 control-label">过期时间</label>
-                                                <div class="col-md-8">
-                                                    <div class="input-group input-medium date date-picker" data-date-format="yyyy-mm-dd" data-date-start-date="+0d">
-                                                        <input type="text" class="form-control" name="expire_time" value="" id="expire_time" readonly>
-                                                        <span class="input-group-btn">
-                                                            <button class="btn default" type="button">
-                                                                <i class="fa fa-calendar"></i>
-                                                            </button>
-                                                        </span>
+                                                    <div class="input-group input-large date-picker input-daterange" data-date="2017-10-10" data-date-format="yyyy-mm-dd">
+                                                        <input type="text" class="form-control" name="enable_time" id="enable_time">
+                                                        <span class="input-group-addon"> 至 </span>
+                                                        <input type="text" class="form-control" name="expire_time" id="expire_time">
                                                     </div>
+                                                    <span class="help-block"> 留空默认为一年 </span>
                                                 </div>
                                             </div>
                                             <hr>

+ 10 - 5
resources/views/admin/analysis.blade.php

@@ -31,7 +31,12 @@
                         </div>
                     </div>
                     <div class="portlet-body">
-                        <table class="table table-striped table-bordered table-hover order-column" id="sample_1">
+                        @if (Session::has('analysisErrorMsg'))
+                            <div class="alert alert-danger">
+                                {{Session::get('analysisErrorMsg')}}
+                            </div>
+                        @else
+                            <table class="table table-striped table-bordered table-hover order-column" id="analysis">
                                 <thead>
                                     <tr>
                                         <th> 近期请求地址 </th>
@@ -51,6 +56,7 @@
                                     @endif
                                 </tbody>
                             </table>
+                        @endif
                     </div>
                 </div>
                 <!-- END EXAMPLE TABLE PORTLET-->
@@ -62,14 +68,13 @@
 @endsection
 @section('script')
     <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
-    <script src="/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js" type="text/javascript"></script>
     <script src="/assets/global/scripts/datatable.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/datatables/datatables.min.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.js" type="text/javascript"></script>
 
     <script type="text/javascript">
-        var TableDatatablesScroller=function(){var e=function(){
-            var e=$("#sample_1");
+        var TableDatatablesScroller = function(){var e=function(){
+            var e = $("#analysis");
             e.dataTable({
                 language:{aria:{
                     sortAscending:": activate to sort column ascending",
@@ -95,7 +100,7 @@
                 pageLength:20,
                 dom:"<'row' <'col-md-12'B>><'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r><'table-scrollable't><'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>"
         })};
-        return{init:function(){jQuery().dataTable&&(e(),t(),n(),o())}}}();
+        return{init:function(){jQuery().dataTable&&(e())}}}();
             jQuery(document).ready(function(){TableDatatablesScroller.init()});
 
         $('#is_rand_port').on({

+ 6 - 21
resources/views/admin/editUser.blade.php

@@ -98,29 +98,14 @@
                                                 </div>
                                             </div>
                                             <div class="form-group">
-                                                <label for="enable_time" class="col-md-3 control-label">开通时间</label>
+                                                <label class="col-md-3 control-label">有效期</label>
                                                 <div class="col-md-8">
-                                                    <div class="input-group input-medium date date-picker" data-date-format="yyyy-mm-dd">
-                                                        <input type="text" class="form-control" name="enable_time" value="{{$user->enable_time}}" id="enable_time" readonly>
-                                                        <span class="input-group-btn">
-                                                            <button class="btn default" type="button">
-                                                                <i class="fa fa-calendar"></i>
-                                                            </button>
-                                                        </span>
-                                                    </div>
-                                                </div>
-                                            </div>
-                                            <div class="form-group">
-                                                <label for="expire_time" class="col-md-3 control-label">过期时间</label>
-                                                <div class="col-md-8">
-                                                    <div class="input-group input-medium date date-picker" data-date-format="yyyy-mm-dd" data-date-start-date="+0d">
-                                                        <input type="text" class="form-control" name="expire_time" value="{{$user->expire_time}}" id="expire_time" readonly>
-                                                        <span class="input-group-btn">
-                                                            <button class="btn default" type="button">
-                                                                <i class="fa fa-calendar"></i>
-                                                            </button>
-                                                        </span>
+                                                    <div class="input-group input-large date-picker input-daterange" data-date="2017-10-10" data-date-format="yyyy-mm-dd">
+                                                        <input type="text" class="form-control" name="enable_time" value="{{$user->enable_time}}" id="enable_time">
+                                                        <span class="input-group-addon"> 至 </span>
+                                                        <input type="text" class="form-control" name="expire_time" value="{{$user->expire_time}}" id="expire_time">
                                                     </div>
+                                                    <span class="help-block"> 留空默认为一年 </span>
                                                 </div>
                                             </div>
                                             <hr>

+ 0 - 44
resources/views/admin/trafficLog.blade.php

@@ -84,49 +84,5 @@
     <!-- END CONTENT BODY -->
 @endsection
 @section('script')
-    <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
 
-    <script type="text/javascript">
-        // 添加节点
-        function addNode() {
-            window.location.href = '{{url('admin/addNode')}}';
-        }
-
-        // 编辑节点
-        function editNode(id) {
-            window.location.href = '{{url('admin/editNode?id=')}}' + id;
-        }
-
-        // 删除节点
-        function delNode(id) {
-            var _token = '{{csrf_token()}}';
-
-            bootbox.confirm({
-                message: "确定删除节点?",
-                buttons: {
-                    confirm: {
-                        label: '确定',
-                        className: 'btn-success'
-                    },
-                    cancel: {
-                        label: '取消',
-                        className: 'btn-danger'
-                    }
-                },
-                callback: function (result) {
-                    if (result) {
-                        $.post("{{url('admin/delNode')}}", {id:id, _token:_token}, function(ret){
-                            if (ret.status == 'success') {
-                                bootbox.alert(ret.message, function(){
-                                    window.location.reload();
-                                });
-                            } else {
-                                bootbox.alert(ret.message);
-                            }
-                        });
-                    }
-                }
-            });
-        }
-    </script>
 @endsection

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

@@ -0,0 +1,176 @@
+@extends('user.layouts')
+
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('user')}}">用户中心</a>
+                <i class="fa fa-circle"></i>
+            </li>
+        </ul>
+        <!-- END PAGE BREADCRUMB -->
+        <div class="row">
+            <div class="col-md-6">
+                <!-- BEGIN PORTLET -->
+                <div class="portlet light bordered">
+                    <div class="portlet-title tabbable-line">
+                        <div class="caption caption-md">
+                            <i class="icon-globe theme-font hide"></i>
+                            <span class="caption-subject font-blue-madison bold uppercase">系统公告</span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <!--BEGIN TABS-->
+                        <div class="tab-content">
+                            <div class="tab-pane active">
+                                <div class="scroller" style="height: 170px;" data-always-visible="1" data-rail-visible1="0" data-handle-color="#D7DCE2">
+                                    <ul class="feeds">
+                                        <li>
+                                            <div class="col1">
+                                                <div class="cont">
+                                                    <div class="cont-col1">
+                                                        <div class="label label-sm label-success">
+                                                            <i class="fa fa-bell-o"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="cont-col2">
+                                                        <div class="desc"> 节点全部切换为SSR,请注意更改客户端配置信息 </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <li>
+                                            <div class="col1">
+                                                <div class="cont">
+                                                    <div class="cont-col1">
+                                                        <div class="label label-sm label-default">
+                                                            <i class="fa fa-bullhorn"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="cont-col2">
+                                                        <div class="desc"> 促销:200G流量包,原价50元现在只要35元,有效期180天 </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <li>
+                                            <div class="col1">
+                                                <div class="cont">
+                                                    <div class="cont-col1">
+                                                        <div class="label label-sm label-info">
+                                                            <i class="fa fa-bullhorn"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="cont-col2">
+                                                        <div class="desc"> 新节点:新上架新加坡节点,白银以上会员可见  </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <li>
+                                            <div class="col1">
+                                                <div class="cont">
+                                                    <div class="cont-col1">
+                                                        <div class="label label-sm label-default">
+                                                            <i class="fa fa-bullhorn"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="cont-col2">
+                                                        <div class="desc"> 新节点:新上架白俄罗斯节点,白银以上会员可见 </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                        <li>
+                                            <div class="col1">
+                                                <div class="cont">
+                                                    <div class="cont-col1">
+                                                        <div class="label label-sm label-info">
+                                                            <i class="fa fa-bullhorn"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="cont-col2">
+                                                        <div class="desc"> 新节点:新上架新西兰节点,白银以上会员可见  </div>
+                                                    </div>
+                                                </div>
+                                            </div>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                        <!--END TABS-->
+                    </div>
+                </div>
+            </div>
+            <div class="col-md-6">
+                <!-- BEGIN PORTLET -->
+                <div class="portlet light bordered">
+                    <div class="portlet-title tabbable-line">
+                        <div class="caption caption-md">
+                            <i class="icon-globe theme-font hide"></i>
+                            <span class="caption-subject font-blue-madison bold uppercase"> 当前状态 </span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="row">
+                            <div class="col-md-7">
+                                <ul class="list-group">
+                                    <li class="list-group-item">
+                                        等级:普通会员
+                                    </li>
+                                    <li class="list-group-item">
+                                        端口:10222
+                                        <span class="badge badge-warning"><a href="#">修改</a></span>
+                                    </li>
+                                    <li class="list-group-item">
+                                        加密方式:aes-192-ctr
+                                        <span class="badge badge-warning"><a href="#">修改</a></span>
+                                    </li>
+                                    <li class="list-group-item">
+                                        连接密码:@123
+                                        <span class="badge badge-warning"><a href="#">修改</a></span>
+                                    </li>
+                                    <li class="list-group-item">
+                                        协议:orgin
+                                        <span class="badge badge-warning"><a href="#">修改</a></span>
+                                    </li>
+                                    <li class="list-group-item">
+                                        混淆:plain
+                                        <span class="badge badge-warning"><a href="#">修改</a></span>
+                                    </li>
+                                    <li class="list-group-item"> 最后使用:2017-2-2 12:12:12
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="col-md-5" style="text-align: center;">
+                                <h3> 流量 </h3>
+                                <input class="knob" value="35" title="可用流量:1000G">
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/assets/global/plugins/counterup/jquery.waypoints.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/counterup/jquery.counterup.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/jquery-knob/js/jquery.knob.js" type="text/javascript"></script>
+
+    <script>
+        $(function() {
+            $(".knob").knob({
+                'readOnly':true,
+                'angleoffset':0,
+                'width':150,
+                'height':150,
+            });
+        });
+    </script>
+@endsection

+ 44 - 0
resources/views/user/invite.blade.php

@@ -0,0 +1,44 @@
+@extends('user.layouts')
+
+@section('css')
+    <link href="/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css" />
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('user/invite')}}">邀请码</a>
+                <i class="fa fa-circle"></i>
+            </li>
+        </ul>
+        <!-- END PAGE BREADCRUMB -->
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                <!-- BEGIN EXAMPLE TABLE PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <i class="icon-user-follow font-dark"></i>
+                            <span class="caption-subject bold uppercase"> 邀请码</span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        、、
+                    </div>
+                </div>
+                <!-- END EXAMPLE TABLE PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
+
+@endsection

+ 174 - 0
resources/views/user/layouts.blade.php

@@ -0,0 +1,174 @@
+<!DOCTYPE html>
+<!--[if IE 8]> <html lang="en" class="ie8 no-js"> <![endif]-->
+<!--[if IE 9]> <html lang="en" class="ie9 no-js"> <![endif]-->
+<!--[if !IE]><!-->
+<html lang="{{app()->getLocale()}}">
+<!--<![endif]-->
+
+<head>
+    <meta charset="utf-8" />
+    <title>@yield('title')</title>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta content="width=device-width, initial-scale=1" name="viewport" />
+    <meta content="" name="description" />
+    <meta content="" name="author" />
+    <!-- BEGIN GLOBAL MANDATORY STYLES -->
+    <link href="/assets/global/plugins/font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/simple-line-icons/simple-line-icons.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/bootstrap-switch/css/bootstrap-switch.min.css" rel="stylesheet" type="text/css" />
+    <!-- END GLOBAL MANDATORY STYLES -->
+    <!-- BEGIN PAGE LEVEL PLUGINS -->
+    @yield('css')
+    <!-- END PAGE LEVEL PLUGINS -->
+    <!-- BEGIN THEME GLOBAL STYLES -->
+    <link href="/assets/global/css/components-rounded.min.css" rel="stylesheet" id="style_components" type="text/css" />
+    <link href="/assets/global/css/plugins.min.css" rel="stylesheet" type="text/css" />
+    <!-- END THEME GLOBAL STYLES -->
+    <!-- BEGIN THEME LAYOUT STYLES -->
+    <link href="/assets/layouts/layout4/css/layout.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/layouts/layout4/css/themes/default.min.css" rel="stylesheet" type="text/css" id="style_color" />
+    <link href="/assets/layouts/layout4/css/custom.min.css" rel="stylesheet" type="text/css" />
+    <!-- END THEME LAYOUT STYLES -->
+    <link rel="shortcut icon" href="favicon.ico" />
+</head>
+
+<body class="page-container-bg-solid page-header-fixed page-sidebar-closed-hide-logo">
+<!-- BEGIN HEADER -->
+<div class="page-header navbar navbar-fixed-top">
+    <!-- BEGIN HEADER INNER -->
+    <div class="page-header-inner ">
+        <!-- BEGIN LOGO -->
+        <div class="page-logo">
+            <a href="{{url('/')}}">
+                <img src="/assets/images/logo.png" alt="logo" class="logo-default" /> </a>
+            <div class="menu-toggler sidebar-toggler">
+                <!-- DOC: Remove the above "hide" to enable the sidebar toggler button on header -->
+            </div>
+        </div>
+        <!-- END LOGO -->
+        <!-- BEGIN RESPONSIVE MENU TOGGLER -->
+        <a href="javascript:;" class="menu-toggler responsive-toggler" data-toggle="collapse" data-target=".navbar-collapse"> </a>
+        <!-- END RESPONSIVE MENU TOGGLER -->
+        <!-- BEGIN PAGE TOP -->
+        <div class="page-top">
+            <!-- BEGIN TOP NAVIGATION MENU -->
+            <div class="top-menu">
+                <ul class="nav navbar-nav pull-right">
+                    <li class="separator hide"> </li>
+                    <!-- BEGIN USER LOGIN DROPDOWN -->
+                    <!-- DOC: Apply "dropdown-dark" class after below "dropdown-extended" to change the dropdown styte -->
+                    <li class="dropdown dropdown-user dropdown-dark">
+                        <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown" data-close-others="true">
+                            <span class="username username-hide-on-mobile"> {{Session::get('user')['username']}} </span>
+                            <!-- DOC: Do not remove below empty space(&nbsp;) as its purposely used -->
+                            <img alt="" class="img-circle" src="/assets/images/avatar.jpg" /> </a>
+                        <ul class="dropdown-menu dropdown-menu-default">
+                            <li>
+                                <a href="{{url('user/profile')}}"> <i class="icon-user"></i> 个人资料 </a>
+                            </li>
+                            <li>
+                                <a href="{{url('logout')}}"> <i class="icon-key"></i> 退出 </a>
+                            </li>
+                        </ul>
+                    </li>
+                    <!-- END USER LOGIN DROPDOWN -->
+                </ul>
+            </div>
+            <!-- END TOP NAVIGATION MENU -->
+        </div>
+        <!-- END PAGE TOP -->
+    </div>
+    <!-- END HEADER INNER -->
+</div>
+<!-- END HEADER -->
+<!-- BEGIN HEADER & CONTENT DIVIDER -->
+<div class="clearfix"> </div>
+<!-- END HEADER & CONTENT DIVIDER -->
+<!-- BEGIN CONTAINER -->
+<div class="page-container">
+    <!-- BEGIN SIDEBAR -->
+    <div class="page-sidebar-wrapper">
+        <!-- BEGIN SIDEBAR -->
+        <!-- DOC: Set data-auto-scroll="false" to disable the sidebar from auto scrolling/focusing -->
+        <!-- DOC: Change data-auto-speed="200" to adjust the sub menu slide up/down speed -->
+        <div class="page-sidebar navbar-collapse collapse">
+            <!-- BEGIN SIDEBAR MENU -->
+            <!-- DOC: Apply "page-sidebar-menu-light" class right after "page-sidebar-menu" to enable light sidebar menu style(without borders) -->
+            <!-- DOC: Apply "page-sidebar-menu-hover-submenu" class right after "page-sidebar-menu" to enable hoverable(hover vs accordion) sub menu mode -->
+            <!-- DOC: Apply "page-sidebar-menu-closed" class right after "page-sidebar-menu" to collapse("page-sidebar-closed" class must be applied to the body element) the sidebar sub menu mode -->
+            <!-- DOC: Set data-auto-scroll="false" to disable the sidebar from auto scrolling/focusing -->
+            <!-- DOC: Set data-keep-expand="true" to keep the submenues expanded -->
+            <!-- DOC: Set data-auto-speed="200" to adjust the sub menu slide up/down speed -->
+            <ul class="page-sidebar-menu   " data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">
+                <li class="nav-item start {{Request::getRequestUri() == '/user' ? 'active open' : ''}}">
+                    <a href="{{url('user')}}" class="nav-link nav-toggle">
+                        <i class="icon-home"></i>
+                        <span class="title">用户中心</span>
+                        <span class="selected"></span>
+                    </a>
+                </li>
+                <li class="nav-item {{Request::getRequestUri() == '/user/nodeList' ? 'active open' : ''}}">
+                    <a href="{{url('user/nodeList')}}" class="nav-link nav-toggle">
+                        <i class="icon-list"></i>
+                        <span class="title">节点列表</span>
+                    </a>
+                </li>
+                <li class="nav-item {{Request::getRequestUri() == '/user/trafficLog' ? 'active open' : ''}}">
+                    <a href="{{url('user/trafficLog')}}" class="nav-link nav-toggle">
+                        <i class="icon-speedometer"></i>
+                        <span class="title">流量日志</span>
+                    </a>
+                </li>
+                <li class="nav-item {{Request::getRequestUri() == '/user/invite' ? 'active open' : ''}}">
+                    <a href="{{url('user/invite')}}" class="nav-link nav-toggle">
+                        <i class="icon-user-follow"></i>
+                        <span class="title">邀请码</span>
+                    </a>
+                </li>
+            </ul>
+            <!-- END SIDEBAR MENU -->
+        </div>
+        <!-- END SIDEBAR -->
+    </div>
+    <!-- END SIDEBAR -->
+    <!-- BEGIN CONTENT -->
+    <div class="page-content-wrapper">
+        @yield('content')
+    </div>
+    <!-- END CONTENT -->
+</div>
+<!-- END CONTAINER -->
+<!-- BEGIN FOOTER -->
+<div class="page-footer">
+    <div class="page-footer-inner"> 2017 &copy; 胖虎 </div>
+    <div class="scroll-to-top">
+        <i class="icon-arrow-up"></i>
+    </div>
+</div>
+<!-- END FOOTER -->
+<!--[if lt IE 9]>
+<script src="/assets/global/plugins/respond.min.js"></script>
+<script src="/assets/global/plugins/excanvas.min.js"></script>
+<script src="/assets/global/plugins/ie8.fix.min.js"></script>
+<![endif]-->
+<!-- BEGIN CORE PLUGINS -->
+<script src="/assets/global/plugins/jquery.min.js" type="text/javascript"></script>
+<script src="/assets/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+<script src="/assets/global/plugins/js.cookie.min.js" type="text/javascript"></script>
+<script src="/assets/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js" type="text/javascript"></script>
+<script src="/assets/global/plugins/jquery.blockui.min.js" type="text/javascript"></script>
+<script src="/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js" type="text/javascript"></script>
+<!-- END CORE PLUGINS -->
+<!-- BEGIN PAGE LEVEL PLUGINS -->
+@yield('script')
+<!-- END PAGE LEVEL PLUGINS -->
+<!-- BEGIN THEME GLOBAL SCRIPTS -->
+<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
+<!-- END THEME GLOBAL SCRIPTS -->
+<!-- BEGIN THEME LAYOUT SCRIPTS -->
+<script src="/assets/layouts/layout4/scripts/layout.min.js" type="text/javascript"></script>
+<!-- END THEME LAYOUT SCRIPTS -->
+</body>
+
+</html>

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

@@ -0,0 +1,98 @@
+@extends('user.layouts')
+
+@section('css')
+    <link href="/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css" />
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('user/nodeList')}}">节点列表</a>
+                <i class="fa fa-circle"></i>
+            </li>
+        </ul>
+        <!-- END PAGE BREADCRUMB -->
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                <!-- BEGIN EXAMPLE TABLE PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <i class="icon-list font-dark"></i>
+                            <span class="caption-subject bold uppercase"> 节点列表 </span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="table-scrollable">
+                            <table class="table table-striped table-bordered table-hover table-checkable order-column" id="sample_1">
+                                <thead>
+                                <tr>
+                                    <th> ID </th>
+                                    <th> 节点名称 </th>
+                                    <th> 出口带宽 </th>
+                                    <th> 负载 </th>
+                                    <th> 在线人数 </th>
+                                    <th> 产生流量 </th>
+                                    <th> 流量比例 </th>
+                                    <th> 协议 </th>
+                                    <th> 混淆 </th>
+                                    <th> 操作 </th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                <div class="alert alert-danger">
+                                    <strong>流量比例:</strong> 1表示用100M就结算100M,0.1表示用100M结算10M,5表示用100M结算500M,以此类推。目的是在于限制优质节点频繁使用,请大家珍惜自己的流量,选择适合自己的节点。
+                                </div>
+                                @if($nodeList->isEmpty())
+                                    <tr>
+                                        <td colspan="10">暂无数据</td>
+                                    </tr>
+                                @else
+                                    @foreach($nodeList as $node)
+                                        <tr class="odd gradeX">
+                                            <td> {{$node->id}} </td>
+                                            <td> {{$node->name}} @if ($node->compatible) <span class="label label-warning"> 兼容SS </span> @endif </td>
+                                            <td> {{$node->bandwidth}}M </td>
+                                            <td> <span class="label label-danger"> {{$node->load}} </span> </td>
+                                            <td> <span class="label label-danger"> {{$node->online_users}} </span> </td>
+                                            <td> {{$node->transfer}} </td>
+                                            <td> {{$node->traffic_rate}} </td>
+                                            <td> <span class="label label-info"> {{$node->protocol}} </span> </td>
+                                            <td> <span class="label label-info"> {{$node->obfs}} </span> </td>
+                                            <td>
+                                                <button type="button" class="btn btn-sm blue btn-outline" onclick="">查看配置</button>
+                                            </td>
+                                        </tr>
+                                    @endforeach
+                                @endif
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="row">
+                            <div class="col-md-5 col-sm-5">
+                                <div class="dataTables_info" role="status" aria-live="polite">共 {{$nodeList->total()}} 个节点</div>
+                            </div>
+                            <div class="col-md-7 col-sm-7">
+                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                    {{ $nodeList->links() }}
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END EXAMPLE TABLE PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
+
+@endsection

+ 114 - 0
resources/views/user/profile.blade.php

@@ -0,0 +1,114 @@
+@extends('user.layouts')
+
+@section('css')
+    <link href="/assets/pages/css/profile.min.css" rel="stylesheet" type="text/css" />
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('admin/profile')}}">个人资料</a>
+                <i class="fa fa-circle"></i>
+            </li>
+        </ul>
+        <!-- END PAGE BREADCRUMB -->
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                @if (Session::has('successMsg'))
+                    <div class="alert alert-success alert-dismissable">
+                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>
+                        {{Session::get('successMsg')}}
+                    </div>
+                @endif
+                @if (Session::has('errorMsg'))
+                    <div class="alert alert-danger alert-dismissable">
+                        <button type="button" class="close" data-dismiss="alert" aria-hidden="true"></button>
+                        <strong>错误:</strong> {{Session::get('errorMsg')}}
+                    </div>
+                @endif
+                <!-- BEGIN PROFILE SIDEBAR -->
+                <div class="profile-sidebar">
+                    <!-- PORTLET MAIN -->
+                    <div class="portlet light profile-sidebar-portlet bordered">
+                        <!-- SIDEBAR USERPIC -->
+                        <div class="profile-userpic">
+                            <img src="/assets/images/avatar.jpg" class="img-responsive" alt=""> </div>
+                        <!-- END SIDEBAR USERPIC -->
+                        <!-- SIDEBAR USER TITLE -->
+                        <div class="profile-usertitle">
+                            <div class="profile-usertitle-name"> {{Session::get('user')['username']}} </div>
+                            <div class="profile-usertitle-job"> 普通会员 </div>
+                        </div>
+                        <!-- END SIDEBAR USER TITLE -->
+                        <!-- SIDEBAR MENU -->
+                        <div class="profile-usermenu">
+                            <!--
+                            <ul class="nav">
+                                <li class="active">
+                                    <a href="javascript:;">
+                                        <i class="icon-user"></i> 个人资料 </a>
+                                </li>
+                            </ul>
+                            -->
+                        </div>
+                        <!-- END MENU -->
+                    </div>
+                    <!-- END PORTLET MAIN -->
+                </div>
+                <!-- END BEGIN PROFILE SIDEBAR -->
+                <!-- BEGIN PROFILE CONTENT -->
+                <div class="profile-content">
+                    <div class="row">
+                        <div class="col-md-12">
+                            <div class="portlet light bordered">
+                                <div class="portlet-title tabbable-line">
+                                    <ul class="nav nav-tabs">
+                                        <li class="active">
+                                            <a href="#tab_1" data-toggle="tab">修改密码</a>
+                                        </li>
+                                    </ul>
+                                </div>
+                                <div class="portlet-body">
+                                    <div class="tab-content">
+                                        <!-- CHANGE PASSWORD TAB -->
+                                        <div class="tab-pane active" id="tab_1">
+                                            <form action="{{url('user/profile')}}" method="post" enctype="multipart/form-data" class="form-bordered">
+                                                <div class="form-group">
+                                                    <label class="control-label"> 旧密码 </label>
+                                                    <input type="password" class="form-control" name="old_password" id="old_password" autofocus required />
+                                                    <input type="hidden" name="_token" value="{{csrf_token()}}" />
+                                                </div>
+                                                <div class="form-group">
+                                                    <label class="control-label"> 新密码 </label>
+                                                    <input type="password" class="form-control" name="new_password" id="new_password" required />
+                                                </div>
+                                                <div class="form-actions">
+                                                    <div class="row">
+                                                        <div class=" col-md-4">
+                                                            <button type="submit" class="btn green"> 提 交 </button>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </form>
+                                        </div>
+                                        <!-- END CHANGE PASSWORD TAB -->
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END PROFILE CONTENT -->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+
+@endsection

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

@@ -0,0 +1,87 @@
+@extends('user.layouts')
+
+@section('css')
+    <link href="/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css" />
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('user/trafficLog')}}">流量日志</a>
+                <i class="fa fa-circle"></i>
+            </li>
+        </ul>
+        <!-- END PAGE BREADCRUMB -->
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                <!-- BEGIN EXAMPLE TABLE PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <i class="icon-speedometer font-dark"></i>
+                            <span class="caption-subject bold uppercase"> 流量日志</span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="table-scrollable">
+                            <table class="table table-striped table-bordered table-hover table-checkable order-column" id="sample_1">
+                                <thead>
+                                <tr>
+                                    <th> ID </th>
+                                    <th> 节点 </th>
+                                    <th> 流量比例 </th>
+                                    <th> 上传流量 </th>
+                                    <th> 下载流量 </th>
+                                    <th> 总流量 </th>
+                                    <th> 记录时间 </th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                    @if($trafficLogList->isEmpty())
+                                        <tr>
+                                            <td colspan="9">暂无数据</td>
+                                        </tr>
+                                    @else
+                                        @foreach($trafficLogList as $trafficLog)
+                                            <tr class="odd gradeX">
+                                                <td> {{$trafficLog->id}} </td>
+                                                <td> {{$trafficLog->ssnode->name}} </td>
+                                                <td> {{$trafficLog->rate}} </td>
+                                                <td> {{$trafficLog->u}} </td>
+                                                <td> {{$trafficLog->d}} </td>
+                                                <td> <span class="label label-danger"> {{$trafficLog->traffic}} </span> </td>
+                                                <td> {{$trafficLog->log_time}} </td>
+                                            </tr>
+                                        @endforeach
+                                    @endif
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="row">
+                            <div class="col-md-5 col-sm-5">
+                                <div class="dataTables_info" role="status" aria-live="polite">共 {{$trafficLogList->total()}} 条记录</div>
+                            </div>
+                            <div class="col-md-7 col-sm-7">
+                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                    {{ $trafficLogList->links() }}
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END EXAMPLE TABLE PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
+
+@endsection

+ 10 - 4
routes/web.php

@@ -5,12 +5,12 @@ Route::any('login', 'LoginController@index'); // 登录
 Route::any('logout', 'LoginController@logout'); // 退出
 Route::any('register', 'RegisterController@index'); // 注册
 
-Route::any('admin', 'AdminController@index'); // 后台首页
+Route::get('admin', 'AdminController@index'); // 后台首页
 Route::any('admin/userList', 'AdminController@userList'); // 账号列表
 Route::any('admin/addUser', 'AdminController@addUser'); // 添加账号
 Route::any('admin/editUser', 'AdminController@editUser'); // 编辑账号
 Route::post('admin/delUser', 'AdminController@delUser'); // 删除账号
-Route::any('admin/nodeList', 'AdminController@nodeList'); // 节点列表
+Route::get('admin/nodeList', 'AdminController@nodeList'); // 节点列表
 Route::any('admin/addNode', 'AdminController@addNode'); // 添加节点
 Route::any('admin/editNode', 'AdminController@editNode'); // 编辑节点
 Route::post('admin/delNode', 'AdminController@delNode'); // 删除节点
@@ -18,14 +18,20 @@ Route::any('admin/config', 'AdminController@config'); // 配置列表
 Route::any('admin/addConfig', 'AdminController@addConfig'); // 添加配置
 Route::post('admin/delConfig', 'AdminController@delConfig'); // 删除配置
 Route::post('admin/setDefaultConfig', 'AdminController@setDefaultConfig'); // 设置默认配置
-Route::any('admin/trafficLog', 'AdminController@trafficLog'); // 流量日志
+Route::get('admin/trafficLog', 'AdminController@trafficLog'); // 流量日志
 Route::any('admin/export', 'AdminController@export'); // 导出配置信息
 Route::any('admin/convert', 'AdminController@convert'); // 格式转换
 Route::any('admin/import', 'AdminController@import'); // 数据导入
-Route::any('admin/monitor', 'AdminController@monitor'); // 流量监控
+Route::get('admin/monitor', 'AdminController@monitor'); // 流量监控
 Route::any('admin/profile', 'AdminController@profile'); // 修改个人信息
 Route::any('admin/analysis', 'AdminController@analysis'); // 日志分析
 Route::any('admin/system', 'AdminController@system'); // 系统设置
 Route::post('admin/enableRandPort', 'AdminController@enableRandPort'); // 启用、禁用随机端口
 Route::get('makePasswd', 'AdminController@makePasswd'); // 获取随机密码
 Route::get('download', 'AdminController@download'); // 下载转换过的JSON配置
+
+Route::any('user', 'UserController@index'); // 用户首页
+Route::any('user/nodeList', 'UserController@nodeList'); // 节点列表
+Route::any('user/profile', 'UserController@profile'); // 修改个人信息
+Route::any('user/trafficLog', 'UserController@trafficLog'); // 流量日志
+Route::any('user/invite', 'UserController@invite'); // 邀请码