Pārlūkot izejas kodu

订阅设备限制

admin 7 gadi atpakaļ
vecāks
revīzija
7527bfcb88

+ 17 - 59
app/Http/Controllers/AdminController.php

@@ -110,13 +110,14 @@ class AdminController extends Controller
     // 用户列表
     public function userList(Request $request)
     {
-        $username = $request->get('username');
-        $wechat = $request->get('wechat');
-        $qq = $request->get('qq');
-        $port = $request->get('port');
-        $pay_way = $request->get('pay_way');
-        $status = $request->get('status');
-        $enable = $request->get('enable');
+        $id = intval($request->get('id'));
+        $username = trim($request->get('username'));
+        $wechat = trim($request->get('wechat'));
+        $qq = trim($request->get('qq'));
+        $port = intval($request->get('port'));
+        $pay_way = intval($request->get('pay_way'));
+        $status = intval($request->get('status'));
+        $enable = intval($request->get('enable'));
         $online = $request->get('online');
         $unActive = $request->get('unActive');
         $flowAbnormal = $request->get('flowAbnormal');
@@ -124,6 +125,10 @@ class AdminController extends Controller
         $largeTraffic = $request->get('largeTraffic');
 
         $query = User::query()->with(['subscribe']);
+        if (!empty($id)) {
+            $query->where('id', $id);
+        }
+
         if (!empty($username)) {
             $query->where('username', 'like', '%' . $username . '%');
         }
@@ -136,20 +141,20 @@ class AdminController extends Controller
             $query->where('qq', 'like', '%' . $qq . '%');
         }
 
-        if (!empty($port)) {
-            $query->where('port', intval($port));
+        if ($port != '') {
+            $query->where('port', $port);
         }
 
         if ($pay_way != '') {
-            $query->where('pay_way', intval($pay_way));
+            $query->where('pay_way', $pay_way);
         }
 
         if ($status != '') {
-            $query->where('status', intval($status));
+            $query->where('status', $status);
         }
 
         if ($enable != '') {
-            $query->where('enable', intval($enable));
+            $query->where('enable', $enable);
         }
 
         // 流量超过100G的
@@ -1138,53 +1143,6 @@ class AdminController extends Controller
         return Response::view('admin.trafficLog', $view);
     }
 
-    // 订阅请求日志
-    public function subscribeLog(Request $request)
-    {
-        $user_id = $request->get('user_id');
-        $username = $request->get('username');
-        $status = $request->get('status');
-
-        $query = UserSubscribe::with(['User']);
-
-        if (!empty($user_id)) {
-            $query->where('user_id', $user_id);
-        }
-
-        if (!empty($username)) {
-            $query->whereHas('user', function ($q) use ($username) {
-                $q->where('username', 'like', '%' . $username . '%');
-            });
-        }
-
-        if ($status != '') {
-            $query->where('status', intval($status));
-        }
-
-        $view['subscribeList'] = $query->orderBy('id', 'desc')->paginate(20)->appends($request->except('page'));
-
-        return Response::view('admin.subscribeLog', $view);
-    }
-
-    // 设置用户的订阅的状态
-    public function setSubscribeStatus(Request $request)
-    {
-        $id = $request->get('id');
-        $status = $request->get('status', 0);
-
-        if (empty($id)) {
-            return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作异常']);
-        }
-
-        if ($status) {
-            UserSubscribe::query()->where('id', $id)->update(['status' => 1, 'ban_time' => 0, 'ban_desc' => '']);
-        } else {
-            UserSubscribe::query()->where('id', $id)->update(['status' => 0, 'ban_time' => time(), 'ban_desc' => '后台手动封禁']);
-        }
-
-        return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
-    }
-
     // SS(R)链接反解析
     public function decompile(Request $request)
     {

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

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Components\Helpers;
+use App\Http\Models\Device;
 use App\Http\Models\SsGroup;
 use App\Http\Models\SsNode;
 use App\Http\Models\User;
@@ -11,6 +12,7 @@ use App\Http\Models\UserSubscribe;
 use App\Http\Models\UserSubscribeLog;
 use Illuminate\Http\Request;
 use Redirect;
+use Response;
 
 /**
  * 订阅控制器
@@ -28,6 +30,99 @@ class SubscribeController extends Controller
         self::$systemConfig = Helpers::systemConfig();
     }
 
+    // 订阅码列表
+    public function subscribeList(Request $request)
+    {
+        $user_id = $request->get('user_id');
+        $username = $request->get('username');
+        $status = $request->get('status');
+
+        $query = UserSubscribe::with(['User']);
+
+        if (!empty($user_id)) {
+            $query->where('user_id', $user_id);
+        }
+
+        if (!empty($username)) {
+            $query->whereHas('user', function ($q) use ($username) {
+                $q->where('username', 'like', '%' . $username . '%');
+            });
+        }
+
+        if ($status != '') {
+            $query->where('status', intval($status));
+        }
+
+        $view['subscribeList'] = $query->orderBy('id', 'desc')->paginate(20)->appends($request->except('page'));
+
+        return Response::view('subscribe.subscribeList', $view);
+    }
+
+    // 订阅设备列表
+    public function deviceList(Request $request)
+    {
+        $type = intval($request->get('type'));
+        $platform = intval($request->get('platform'));
+        $name = trim($request->get('name'));
+        $status = intval($request->get('status'));
+
+        $query = Device::query();
+
+        if (!empty($type)) {
+            $query->where('type', $type);
+        }
+
+        if ($platform != '') {
+            $query->where('platform', $platform);
+        }
+
+        if (!empty($name)) {
+            $query->where('name', 'like', '%' . $name . '%');
+        }
+
+        if ($status != '') {
+            $query->where('status', $status);
+        }
+
+        $view['deviceList'] = $query->paginate(20)->appends($request->except('page'));
+
+        return Response::view('subscribe.deviceList', $view);
+    }
+
+    // 设置用户的订阅的状态
+    public function setSubscribeStatus(Request $request)
+    {
+        $id = $request->get('id');
+        $status = $request->get('status', 0);
+
+        if (empty($id)) {
+            return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作异常']);
+        }
+
+        if ($status) {
+            UserSubscribe::query()->where('id', $id)->update(['status' => 1, 'ban_time' => 0, 'ban_desc' => '']);
+        } else {
+            UserSubscribe::query()->where('id', $id)->update(['status' => 0, 'ban_time' => time(), 'ban_desc' => '后台手动封禁']);
+        }
+
+        return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+    }
+
+    // 设置设备是否允许订阅的状态
+    public function setDeviceStatus(Request $request)
+    {
+        $id = intval($request->get('id'));
+        $status = intval($request->get('status', 0));
+
+        if (empty($id)) {
+            return Response::json(['status' => 'fail', 'data' => '', 'message' => '操作异常']);
+        }
+
+        Device::query()->where('id', $id)->update(['status' => $status]);
+
+        return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+    }
+
     // 获取订阅信息
     public function index(Request $request, $code)
     {

+ 61 - 0
app/Http/Models/Device.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Http\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 订阅设备列表
+ * Class Device
+ *
+ * @package App\Http\Models
+ * @mixin \Eloquent
+ */
+class Device extends Model
+{
+    protected $table = 'device';
+    protected $primaryKey = 'id';
+    public $timestamps = false;
+
+    public function getTypeLabelAttribute()
+    {
+        switch ($this->attributes['type']) {
+            case 1:
+                $type_label = '<span class="label label-info"> Shadowsocks(R) </span>';
+                break;
+            case 2:
+                $type_label = '<span class="label label-info"> V2Ray </span>';
+                break;
+            default:
+                $type_label = '<span class="label label-info"> 其他 </span>';
+        }
+
+        return $type_label;
+    }
+
+    public function getPlatformLabelAttribute()
+    {
+        switch ($this->attributes['platform']) {
+            case 1:
+                $platform_label = '<i class="fa fa-apple"></i>';
+                break;
+            case 2:
+                $platform_label = '<i class="fa fa-android"></i>';
+                break;
+            case 3:
+                $platform_label = '<i class="fa fa-apple"></i>';
+                break;
+            case 4:
+                $platform_label = '<i class="fa fa-windows"></i>';
+                break;
+            case 5:
+                $platform_label = '<i class="fa fa-linux"></i>';
+                break;
+            case 0:
+            default:
+                $platform_label = '其他';
+        }
+
+        return $platform_label;
+    }
+}

+ 0 - 1
app/Http/Models/Order.php

@@ -78,7 +78,6 @@ class Order extends Model
             case 0:
             default:
                 $status_label = '待支付';
-                break;
         }
 
         return $status_label;

+ 0 - 2
app/Http/Models/Payment.php

@@ -53,7 +53,6 @@ class Payment extends Model
             case 0:
             default:
                 $status_label = '等待支付';
-                break;
         }
 
         return $status_label;
@@ -69,7 +68,6 @@ class Payment extends Model
             case 2:
             default:
                 $pay_way_label = '支付宝';
-                break;
         }
 
         return $pay_way_label;

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

@@ -242,7 +242,7 @@
                                                     <div class="col-md-8">
                                                         <div class="mt-radio-inline">
                                                             <label class="mt-radio">
-                                                                <input type="radio" name="service" value="1" checked> ShadowsocksR
+                                                                <input type="radio" name="service" value="1" checked> Shadowsocks(R)
                                                                 <span></span>
                                                             </label>
                                                             <label class="mt-radio">

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

@@ -245,7 +245,7 @@
                                                     <div class="col-md-8">
                                                         <div class="mt-radio-inline">
                                                             <label class="mt-radio">
-                                                                <input type="radio" name="service" value="1" @if($node->type == 1) checked @endif> ShadowsocksR
+                                                                <input type="radio" name="service" value="1" @if($node->type == 1) checked @endif> Shadowsocks(R)
                                                                 <span></span>
                                                             </label>
                                                             <label class="mt-radio">

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

@@ -167,12 +167,6 @@
                                 <span class="title">用户列表</span>
                             </a>
                         </li>
-                        <li class="nav-item {{in_array(Request::path(), ['admin/subscribeLog']) ? 'active open' : ''}}">
-                            <a href="{{url('admin/subscribeLog')}}" class="nav-link">
-                                <i class="icon-list"></i>
-                                <span class="title">订阅管理</span>
-                            </a>
-                        </li>
                         <li class="nav-item {{in_array(Request::path(), ['admin/userOnlineIPList']) ? 'active open' : ''}}">
                             <a href="{{url('admin/userOnlineIPList')}}" class="nav-link">
                                 <i class="icon-list"></i>
@@ -205,6 +199,27 @@
                         </li>
                     </ul>
                 </li>
+                <li class="nav-item {{in_array(Request::path(), ['subscribe/subscribeList', 'subscribe/deviceList']) ? 'active open' : ''}}">
+                    <a href="javascript:;" class="nav-link nav-toggle">
+                        <i class="fa fa-list-alt"></i>
+                        <span class="title">订阅管理</span>
+                        <span class="arrow"></span>
+                    </a>
+                    <ul class="sub-menu">
+                        <li class="nav-item {{in_array(Request::path(), ['subscribe/subscribeList']) ? 'active open' : ''}}">
+                            <a href="{{url('subscribe/subscribeList')}}" class="nav-link">
+                                <i class="icon-list"></i>
+                                <span class="title">订阅码列表</span>
+                            </a>
+                        </li>
+                        <li class="nav-item {{in_array(Request::path(), ['subscribe/deviceList']) ? 'active open' : ''}}">
+                            <a href="{{url('subscribe/deviceList')}}" class="nav-link ">
+                                <i class="fa fa-list"></i>
+                                <span class="title">订阅设备列表</span>
+                            </a>
+                        </li>
+                    </ul>
+                </li>
                 <li class="nav-item {{in_array(Request::path(), ['admin/nodeList', 'admin/addNode', 'admin/editNode', 'admin/groupList', 'admin/addGroup', 'admin/editGroup', 'admin/nodeMonitor']) ? 'active open' : ''}}">
                     <a href="javascript:;" class="nav-link nav-toggle">
                         <i class="fa fa-list-alt"></i>

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

@@ -59,7 +59,7 @@
                                             <tr class="odd gradeX">
                                                 <td> {{$node->id}} </td>
                                                 <td>
-                                                    <span class="label {{$node->status ? 'label-info' : 'label-default'}}">{{$node->type == 2 ? 'V2Ray' : 'ShadowsocksR'}}</span>
+                                                    <span class="label {{$node->status ? 'label-info' : 'label-default'}}">{{$node->type == 2 ? 'V2Ray' : 'Shadowsocks(R)'}}</span>
                                                 </td>
                                                 <td> {{$node->name}} </td>
                                                 <td>

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

@@ -88,7 +88,7 @@
                                                     @if(empty($order->user) )
                                                         【账号不存在】
                                                     @else
-                                                        <a href="{{url('admin/userList?username=') . $order->user->username}}" target="_blank"> <span class="label label-info">{{$order->user->username}}</span> </a>
+                                                        <a href="{{url('admin/userList?id=') . $order->user->id}}" target="_blank"> <span class="label label-info">{{$order->user->username}}</span> </a>
                                                     @endif
                                                 </td>
                                                 <td> {{$order->order_sn}} </td>

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

@@ -64,7 +64,7 @@
                                                     @if(empty($vo->user))
                                                         【账号已删除】
                                                     @else
-                                                        <a href="{{url('admin/userList?username=') . $vo->user->username}}" target="_blank"> <span class="label label-info"> {{$vo->user->username}} </span> </a>
+                                                        <a href="{{url('admin/userList?id=') . $vo->user->id}}" target="_blank"> <span class="label label-info"> {{$vo->user->username}} </span> </a>
                                                     @endif
                                                 </td>
                                                 <td> {{$vo->ssnode->name}} </td>

+ 124 - 0
resources/views/subscribe/deviceList.blade.php

@@ -0,0 +1,124 @@
+@extends('admin.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" />
+    <style type="text/css">
+        input,select {
+            margin-bottom: 5px;
+        }
+    </style>
+@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">
+                <!-- BEGIN EXAMPLE TABLE PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <span class="caption-subject bold uppercase">订阅设备列表</span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="row">
+                            <div class="col-md-3 col-sm-4 col-xs-12">
+                                <input type="text" class="col-md-4 form-control" name="user_id" value="{{Request::get('user_id')}}" id="user_id" placeholder="用户ID" onkeydown="if(event.keyCode==13){doSearch();}">
+                            </div>
+                            <div class="col-md-3 col-sm-4 col-xs-12">
+                                <input type="text" class="col-md-4 form-control" name="username" value="{{Request::get('username')}}" id="username" placeholder="用户名" onkeydown="if(event.keyCode==13){doSearch();}">
+                            </div>
+                            <div class="col-md-3 col-sm-4 col-xs-12">
+                                <select class="form-control" name="status" id="status" onChange="doSearch()">
+                                    <option value="" @if(Request::get('status') == '') selected @endif>状态</option>
+                                    <option value="0" @if(Request::get('status') == '0') selected @endif>禁用</option>
+                                    <option value="1" @if(Request::get('status') == '1') selected @endif>正常</option>
+                                </select>
+                            </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>
+                            </div>
+                        </div>
+                        <div class="table-scrollable table-scrollable-borderless">
+                            <table class="table table-hover table-light">
+                                <thead>
+                                <tr>
+                                    <th> # </th>
+                                    <th> 类型 </th>
+                                    <th> 平台 </th>
+                                    <th> 名称 </th>
+                                    <th> 操作 </th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                    @if($deviceList->isEmpty())
+                                        <tr>
+                                            <td colspan="8" style="text-align: center;">暂无数据</td>
+                                        </tr>
+                                    @else
+                                        @foreach($deviceList as $vo)
+                                            <tr class="odd gradeX">
+                                                <td> {{$vo->id}} </td>
+                                                <td> {!! $vo->type_label !!} </td>
+                                                <td> {!! $vo->platform_label !!} </td>
+                                                <td> {{$vo->name}} </td>
+                                                <td>
+                                                    @if($vo->status == 0)
+                                                        <button type="button" class="btn btn-sm green btn-outline" onclick="setDeviceStatus('{{$vo->id}}', 1)">启用</button>
+                                                    @endif
+                                                    @if($vo->status == 1)
+                                                        <button type="button" class="btn btn-sm red btn-outline" onclick="setDeviceStatus('{{$vo->id}}', 0)">禁用</button>
+                                                    @endif
+                                                </td>
+                                            </tr>
+                                        @endforeach
+                                    @endif
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="row">
+                            <div class="col-md-4 col-sm-4">
+                                <div class="dataTables_info" role="status" aria-live="polite">共 {{$deviceList->total()}} 条记录</div>
+                            </div>
+                            <div class="col-md-8 col-sm-8">
+                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                    {{ $deviceList->links() }}
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END EXAMPLE TABLE PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script type="text/javascript">
+        // 搜索
+        function doSearch() {
+            var name = $("#name").val();
+            var status = $("#status option:checked").val();
+
+            window.location.href = '{{url('subscribe/deviceList')}}' + '?name=' + name + '&status=' + status;
+        }
+
+        // 重置
+        function doReset() {
+            window.location.href = '{{url('subscribe/deviceList')}}';
+        }
+
+        // 启用禁用订阅设备
+        function setDeviceStatus(id, status) {
+            $.post("{{url('subscribe/setDeviceStatus')}}", {_token:'{{csrf_token()}}', id:id, status:status}, function(ret) {
+                layer.msg(ret.message, {time:1000}, function() {
+                    window.location.reload();
+                });
+            });
+        }
+    </script>
+@endsection

+ 17 - 11
resources/views/admin/subscribeLog.blade.php → resources/views/subscribe/subscribeList.blade.php

@@ -18,7 +18,7 @@
                 <div class="portlet light bordered">
                     <div class="portlet-title">
                         <div class="caption font-dark">
-                            <span class="caption-subject bold uppercase">订阅管理</span>
+                            <span class="caption-subject bold uppercase">订阅码列表</span>
                         </div>
                     </div>
                     <div class="portlet-body">
@@ -46,8 +46,8 @@
                                 <thead>
                                 <tr>
                                     <th> # </th>
+                                    <th> 订阅码 </th>
                                     <th> 用户 </th>
-                                    <th> 识别码 </th>
                                     <th> 请求次数 </th>
                                     <th> 最后请求时间 </th>
                                     <th> 封禁时间 </th>
@@ -64,18 +64,24 @@
                                         @foreach($subscribeList as $subscribe)
                                             <tr class="odd gradeX">
                                                 <td> {{$subscribe->id}} </td>
-                                                <td> {{empty($subscribe->user) ? '【账号已删除】' : $subscribe->user->username}} </td>
-                                                <td> {{$subscribe->code}} </td>
-                                                <td> {{$subscribe->times}} </td>
+                                                <td> <span class="label label-danger"> {{$subscribe->code}} </span> </td>
+                                                <td>
+                                                    @if(empty($subscribe->user))
+                                                        【账号已删除】
+                                                    @else
+                                                        <a href="{{url('admin/userList?id=' . $subscribe->user->id)}}">{{$subscribe->user->username}}</a>
+                                                    @endif
+                                                </td>
+                                                <td> <span class="label label-danger"> {{$subscribe->times}} </span> </td>
                                                 <td> {{$subscribe->updated_at}} </td>
                                                 <td> {{$subscribe->ban_time > 0 ? date('Y-m-d H:i:s') : ''}} </td>
                                                 <td> {{$subscribe->ban_desc}} </td>
                                                 <td>
                                                     @if($subscribe->status == 0)
-                                                        <button type="button" class="btn btn-sm green btn-outline" onclick="setStatus('{{$subscribe->id}}', 1)">启用</button>
+                                                        <button type="button" class="btn btn-sm green btn-outline" onclick="setSubscribeStatus('{{$subscribe->id}}', 1)">启用</button>
                                                     @endif
                                                     @if($subscribe->status == 1)
-                                                        <button type="button" class="btn btn-sm red btn-outline" onclick="setStatus('{{$subscribe->id}}', 0)">禁用</button>
+                                                        <button type="button" class="btn btn-sm red btn-outline" onclick="setSubscribeStatus('{{$subscribe->id}}', 0)">禁用</button>
                                                     @endif
                                                 </td>
                                             </tr>
@@ -111,17 +117,17 @@
             var username = $("#username").val();
             var status = $("#status option:checked").val();
 
-            window.location.href = '{{url('admin/subscribeLog')}}' + '?user_id=' + user_id + '&username=' + username + '&status=' + status;
+            window.location.href = '{{url('subscribe/subscribeList')}}' + '?user_id=' + user_id + '&username=' + username + '&status=' + status;
         }
 
         // 重置
         function doReset() {
-            window.location.href = '{{url('admin/subscribeLog')}}';
+            window.location.href = '{{url('subscribe/subscribeList')}}';
         }
 
         // 启用禁用用户的订阅
-        function setStatus(id, status) {
-            $.post("{{url('admin/setSubscribeStatus')}}", {_token:'{{csrf_token()}}', id:id, status:status}, function(ret) {
+        function setSubscribeStatus(id, status) {
+            $.post("{{url('subscribe/setSubscribeStatus')}}", {_token:'{{csrf_token()}}', id:id, status:status}, function(ret) {
                 layer.msg(ret.message, {time:1000}, function() {
                     window.location.reload();
                 });

+ 1 - 1
resources/views/ticket/ticketList.blade.php

@@ -40,7 +40,7 @@
                                                 @if(empty($ticket->user))
                                                     【账号已删除】
                                                 @else
-                                                    <a href="{{url('admin/userList?username=' . $ticket->user->username)}}" target="_blank">{{$ticket->user->username}}</a> </td>
+                                                    <a href="{{url('admin/userList?id=' . $ticket->user->id)}}" target="_blank">{{$ticket->user->username}}</a> </td>
                                                 @endif
                                             <td> <a href="{{url('ticket/replyTicket?id=') . $ticket->id}}" target="_blank">{{$ticket->title}}</a> </td>
                                             <td style="text-align: center;">

+ 4 - 2
routes/web.php

@@ -73,8 +73,6 @@ Route::group(['middleware' => ['isForbidden', 'isLogin', 'isAdmin']], function (
     Route::get('admin/system', 'AdminController@system'); // 系统设置
     Route::post('admin/setExtend', 'AdminController@setExtend'); // 设置客服、统计代码
     Route::post('admin/setConfig', 'AdminController@setConfig'); // 设置某个配置项
-    Route::get('admin/subscribeLog', 'AdminController@subscribeLog'); // 订阅管理
-    Route::post('admin/setSubscribeStatus', 'AdminController@setSubscribeStatus'); // 启用禁用用户的订阅
     Route::get('admin/userBalanceLogList', 'AdminController@userBalanceLogList'); // 余额变动记录
     Route::get('admin/userTrafficLogList', 'AdminController@userTrafficLogList'); // 流量变动记录
     Route::get('admin/userRebateList', 'AdminController@userRebateList'); // 返利流水记录
@@ -85,6 +83,10 @@ Route::group(['middleware' => ['isForbidden', 'isLogin', 'isAdmin']], function (
     Route::post('admin/resetUserTraffic', 'AdminController@resetUserTraffic'); // 重置用户流量
     Route::post('admin/handleUserBalance', 'AdminController@handleUserBalance'); // 用户余额充值
     Route::post("admin/switchToUser", "AdminController@switchToUser"); // 转换成某个用户的身份
+    Route::get('subscribe/subscribeList', 'SubscribeController@subscribeList'); // 订阅码列表
+    Route::get('subscribe/deviceList', 'SubscribeController@deviceList'); // 订阅设备列表
+    Route::post('subscribe/setSubscribeStatus', 'SubscribeController@setSubscribeStatus'); // 启用禁用用户的订阅
+    Route::post('subscribe/setDeviceStatus', 'SubscribeController@setDeviceStatus'); // 是否允许设备订阅
     Route::get("marketing/emailList", "MarketingController@emailList"); // 邮件消息列表
     Route::get("marketing/pushList", "MarketingController@pushList"); // 推送消息列表
     Route::post("marketing/addPushMarketing", "MarketingController@addPushMarketing"); // 推送消息

+ 20 - 0
sql/db.sql

@@ -1171,6 +1171,26 @@ CREATE TABLE `ss_node_deny` (
 ) ENGINE=MyISAM COLLATE='utf8_general_ci' COMMENT='节点访问规则关联表';
 
 
+-- ----------------------------
+-- Table structure for `device`
+-- ----------------------------
+CREATE TABLE `device` (
+	`id` INT(11) NOT NULL AUTO_INCREMENT,
+	`type` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '类型:1-Shadowsocks(R)、2-V2Ray',
+	`platform` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '所属平台:0-其他、1-iOS、2-Android、3-Mac、4-Windows、5-Linux',
+	`name` VARCHAR(50) NOT NULL COMMENT '设备名称',
+	`status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '状态:0-禁止订阅、1-允许订阅',
+	PRIMARY KEY (`id`)
+) COMMENT='设备型号表' ENGINE=MyISAM;
+
+
+-- ----------------------------
+-- Records of `device`
+-- ----------------------------
+INSERT INTO `device` VALUES ('1', '1', '1', 'Quantumult', 1);
+INSERT INTO `device` VALUES ('1', '1', '1', 'Shadowrocket', 1);
+INSERT INTO `device` VALUES ('1', '1', '1', 'ShadowsocksX-NG-R', 1);
+
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

+ 13 - 0
sql/update/20190129.sql

@@ -0,0 +1,13 @@
+-- 加入订阅设备表
+CREATE TABLE `device` (
+	`id` INT(11) NOT NULL AUTO_INCREMENT,
+	`type` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '类型:1-Shadowsocks(R)、2-V2Ray',
+	`platform` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '所属平台:0-其他、1-iOS、2-Android、3-Mac、4-Windows、5-Linux',
+	`name` VARCHAR(50) NOT NULL COMMENT '设备名称',
+	`status` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '状态:0-禁止订阅、1-允许订阅',
+	PRIMARY KEY (`id`)
+) COMMENT='设备型号表' ENGINE=MyISAM;
+
+INSERT INTO `device` VALUES ('1', '1', '1', 'Quantumult', 1);
+INSERT INTO `device` VALUES ('1', '1', '1', 'Shadowrocket', 1);
+INSERT INTO `device` VALUES ('1', '1', '1', 'ShadowsocksX-NG-R', 1);