Bladeren bron

1.用户流量警告
2.修正一些BUG
3.邮件发送记录

zhangjiangbin 8 jaren geleden
bovenliggende
commit
e2de05bc16

+ 60 - 2
app/Http/Controllers/AdminController.php

@@ -4,7 +4,10 @@ namespace App\Http\Controllers;
 
 use App\Http\Models\Article;
 use App\Http\Models\Config;
+use App\Http\Models\EmailLog;
+use App\Http\Models\Goods;
 use App\Http\Models\Invite;
+use App\Http\Models\OrderGoods;
 use App\Http\Models\ReferralApply;
 use App\Http\Models\ReferralLog;
 use App\Http\Models\SsConfig;
@@ -15,9 +18,11 @@ use App\Http\Models\SsNodeInfo;
 use App\Http\Models\SsNodeOnlineLog;
 use App\Http\Models\User;
 use App\Http\Models\UserTrafficLog;
+use App\Mail\userTrafficWarning;
 use Illuminate\Http\Request;
 use Redirect;
 use Response;
+use Mail;
 
 class AdminController extends BaseController
 {
@@ -43,9 +48,52 @@ class AdminController extends BaseController
         $view['totalBalance'] = User::sum('balance');
         $view['expireWarningUserCount'] = User::where('expire_time', '<=', date('Y-m-d', strtotime("+15 days")))->where('enable', 1)->count();
 
-        // 到期账号禁用
+        // 到期账号禁用 TODO:加入定时任务
         User::where('enable', 1)->where('expire_time', '<=', date('Y-m-d'))->update(['enable' => 0]);
 
+        // 商品到期自动扣购买该商品的流量 TODO:加入定时任务
+        $goodsList = Goods::where('end_time', '<', date('Y-m-d H:i:s'))->get();
+        foreach ($goodsList as $goods) {
+            // 所有购买过该商品的用户
+            $orderGoods = OrderGoods::where('goods_id', $goods->id)->get();
+            foreach ($orderGoods as $og) {
+                $u = User::where('id', $og->user_id)->first();
+                if (empty($u)) {
+                    continue;
+                }
+
+                if ($u->transfer_enable - $goods->traffic * 1024 * 1024 < 0) {
+                    User::where('id', $og->user_id)->update(['transfer_enable' => 0]);
+                } else {
+                    User::where('id', $og->user_id)->decrement('transfer_enable', $goods->traffic * 1024 * 1024);
+                }
+            }
+        }
+
+        // 用户流量警告提醒发邮件 TODO:加入定时任务
+        if (self::$config['traffic_warning']) {
+            $userList = User::get();
+            foreach ($userList as $user) {
+                if (empty($user->transfer_enable)) {
+                    continue;
+                }
+
+                $usedPercent = round(($user->d + $user->u) / $user->transfer_enable, 2) * 100; // 已使用流量百分比
+                if ($usedPercent >= self::$config['traffic_warning_percent']) {
+                    $ret = Mail::to($user->username)->send(new userTrafficWarning(self::$config['website_name'], $usedPercent));
+
+                    // 写入邮件发送日志
+                    $emailLogObj = new EmailLog();
+                    $emailLogObj->user_id = $user->id;
+                    $emailLogObj->title = '用户流量警告';
+                    $emailLogObj->content = '流量已使用:' . $usedPercent . '%,超过流量阈值' . self::$config['traffic_warning_percent'];
+                    $emailLogObj->status = $ret ? 1 : 0;
+                    $emailLogObj->created_at = date('Y-m-d H:i:s');
+                    $emailLogObj->save();
+                }
+            }
+        }
+
         return Response::view('admin/index', $view);
     }
 
@@ -149,7 +197,7 @@ class AdminController extends BaseController
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '用户名已存在,请重新输入']);
             }
 
-            // 密码为空时生成默认密码
+            // 密码为空时则生成随机密码
             if (empty($password)) {
                 $str = $this->makeRandStr();
                 $password = md5($str);
@@ -1163,6 +1211,16 @@ TXT;
         return Response::json(['status' => 'success', 'data' => '', 'message' => '设置成功']);
     }
 
+    // 设置激活账号次数
+    public function setTrafficWarningPercent(Request $request)
+    {
+        $value = intval($request->get('value'));
+
+        Config::where('name', 'traffic_warning_percent')->update(['value' => $value]);
+
+        return Response::json(['status' => 'success', 'data' => '', 'message' => '设置成功']);
+    }
+
     // 设置激活账号次数
     public function setAddScoreRange(Request $request)
     {

+ 31 - 0
app/Http/Controllers/EmailLogController.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Models\EmailLog;
+use Illuminate\Http\Request;
+use Response;
+
+/**
+ * 邮件发送日志控制器
+ * Class LoginController
+ * @package App\Http\Controllers
+ */
+class EmailLogController extends BaseController
+{
+    protected static $config;
+
+    function __construct()
+    {
+        self::$config = $this->systemConfig();
+    }
+
+    // 邮件发送日志列表
+    public function list(Request $request)
+    {
+        $view['list'] = EmailLog::paginate(10);
+
+        return Response::view('emailLog/list', $view);
+    }
+
+}

+ 26 - 16
app/Http/Controllers/RegisterController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers;
 
+use App\Http\Models\EmailLog;
 use App\Http\Models\Invite;
 use App\Http\Models\User;
 use App\Http\Models\Verify;
@@ -102,7 +103,7 @@ class RegisterController extends BaseController
             $port = self::$config['is_rand_port'] ? $this->getRandPort() : $last_user->port + 1;
 
             // 创建新用户
-            $transfer_enable = $referral_uid ? (self::$config['default_traffic'] + self::$config['referral_traffic']) : self::$config['default_traffic'];
+            $transfer_enable = $referral_uid ? (self::$config['default_traffic'] + self::$config['referral_traffic']) * 1048576 : self::$config['default_traffic'] * 1048576;
             $user = new User();
             $user->username = $username;
             $user->password = md5($password);
@@ -118,23 +119,32 @@ class RegisterController extends BaseController
             // 更新邀请码
             if (self::$config['is_invite_register'] && $user->id) {
                 Invite::where('id', $code->id)->update(['fuid' => $user->id, 'status' => 1]);
-
-                // 生成激活账号的地址
-                $token = md5(self::$config['website_name'] . $username . microtime());
-                $verify = new Verify();
-                $verify->user_id = $user->id;
-                $verify->username = $username;
-                $verify->token = $token;
-                $verify->status = 0;
-                $verify->save();
-
-                // 发送邮件
-                $activeUserUrl = self::$config['website_url'] . '/active/' . $token;
-                Mail::to($username)->send(new activeUser(self::$config['website_name'], $activeUserUrl));
-
-                $request->session()->flash('regSuccessMsg', '注册成功:激活邮件已发送,请查看邮箱');
             }
 
+            // 生成激活账号的地址
+            $token = md5(self::$config['website_name'] . $username . microtime());
+            $verify = new Verify();
+            $verify->user_id = $user->id;
+            $verify->username = $username;
+            $verify->token = $token;
+            $verify->status = 0;
+            $verify->save();
+
+            // 发送邮件
+            $activeUserUrl = self::$config['website_url'] . '/active/' . $token;
+            $ret = Mail::to($username)->send(new activeUser(self::$config['website_name'], $activeUserUrl));
+
+            // 写入邮件发送日志
+            $emailLogObj = new EmailLog();
+            $emailLogObj->user_id = $user->id;
+            $emailLogObj->title = '注册激活账号';
+            $emailLogObj->content = '请求地址:' . $activeUserUrl;
+            $emailLogObj->status = $ret ? 1 : 0;
+            $emailLogObj->created_at = date('Y-m-d H:i:s');
+            $emailLogObj->save();
+
+            $request->session()->flash('regSuccessMsg', '注册成功:激活邮件已发送,请查看邮箱');
+
             return Redirect::to('login');
         } else {
             $view['is_register'] = self::$config['is_register'];

+ 8 - 0
app/Http/Controllers/ShopController.php

@@ -38,6 +38,8 @@ class ShopController extends BaseController
             $traffic = $request->get('traffic');
             $price = $request->get('price');
             $score = $request->get('score');
+            $start_time = $request->get('start_time');
+            $end_time = $request->get('end_time');
             $status = $request->get('status');
 
             if (empty($name) || empty($traffic) || $price == '') {
@@ -63,6 +65,8 @@ class ShopController extends BaseController
             $obj->traffic = $traffic;
             $obj->price = $price;
             $obj->score = $score;
+            $obj->start_time = date('Y-m-d 00:00:00', strtotime($start_time));
+            $obj->end_time = date('Y-m-d 23:59:59', strtotime($end_time));
             $obj->status = $status;
             $obj->save();
 
@@ -89,6 +93,8 @@ class ShopController extends BaseController
             $traffic = $request->get('traffic');
             $price = $request->get('price');
             $score = $request->get('score');
+            $start_time = $request->get('start_time');
+            $end_time = $request->get('end_time');
             $status = $request->get('status');
 
             if (empty($name) || empty($traffic) || $price == '') {
@@ -114,6 +120,8 @@ class ShopController extends BaseController
                 'traffic' => $traffic,
                 'price'   => $price,
                 'score'   => $score,
+                'start_time' => date('Y-m-d 00:00:00', strtotime($start_time)),
+                'end_time' => date('Y-m-d 23:59:59', strtotime($end_time)),
                 'status'  => $status
             ];
             $ret = Goods::where('id', $id)->update($data);

+ 42 - 13
app/Http/Controllers/UserController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Http\Models\Article;
 use App\Http\Models\Coupon;
 use App\Http\Models\CouponLog;
+use App\Http\Models\EmailLog;
 use App\Http\Models\Goods;
 use App\Http\Models\Invite;
 use App\Http\Models\Order;
@@ -47,13 +48,17 @@ class UserController extends BaseController
         $view['articleList'] = Article::where('is_del', 0)->orderBy('sort', 'desc')->orderBy('id', 'desc')->paginate(5);
         $view['wechat_qrcode'] = self::$config['wechat_qrcode'];
         $view['alipay_qrcode'] = self::$config['alipay_qrcode'];
-        $view['referral_status'] = self::$config['referral_status'];
 
         $user['totalTransfer'] = $this->flowAutoShow($user['transfer_enable'] - $user['u'] - $user['d']);
         $user['usedTransfer'] = $this->flowAutoShow($user['u'] + $user['d']);
         $user['usedPercent'] = $user['transfer_enable'] > 0 ? round(($user['u'] + $user['d']) / $user['transfer_enable'], 2) : 1;
         $view['info'] = $user;
 
+        // 推广返利是否可见
+        if (!$request->session()->has('referral_status')) {
+            $request->session()->put('referral_status', self::$config['referral_status']);
+        }
+
         return Response::view('user/index', $view);
     }
 
@@ -437,7 +442,16 @@ TXT;
 
             // 发送邮件
             $activeUserUrl = self::$config['website_url'] . '/active/' . $token;
-            Mail::to($user->username)->send(new activeUser(self::$config['website_name'], $activeUserUrl));
+            $ret = Mail::to($user->username)->send(new activeUser(self::$config['website_name'], $activeUserUrl));
+
+            // 写入邮件发送日志
+            $emailLogObj = new EmailLog();
+            $emailLogObj->user_id = $user->id;
+            $emailLogObj->title = '重新激活账号';
+            $emailLogObj->content = '请求地址:' . $activeUserUrl;
+            $emailLogObj->status = $ret ? 1 : 0;
+            $emailLogObj->created_at = date('Y-m-d H:i:s');
+            $emailLogObj->save();
 
             Cache::put('activeUser_' . md5($username), $activeTimes + 1, 1440);
             $request->session()->flash('successMsg', '邮件已发送,请查看邮箱');
@@ -460,6 +474,10 @@ TXT;
         $verify = Verify::where('token', $token)->with('user')->first();
         if (empty($verify)) {
             return Redirect::to('login');
+        } else if (empty($verify->user)) {
+            $request->session()->flash('errorMsg', '该链接已失效');
+
+            return Response::view('user/active');
         } else if ($verify->status == 1) {
             $request->session()->flash('errorMsg', '该链接已失效');
 
@@ -538,7 +556,16 @@ TXT;
 
             // 发送邮件
             $resetPasswordUrl = self::$config['website_url'] . '/reset/' . $token;
-            Mail::to($user->username)->send(new resetPassword(self::$config['website_name'], $resetPasswordUrl));
+            $ret = Mail::to($user->username)->send(new resetPassword(self::$config['website_name'], $resetPasswordUrl));
+
+            // 写入邮件发送日志
+            $emailLogObj = new EmailLog();
+            $emailLogObj->user_id = $user->id;
+            $emailLogObj->title = '重置账号密码';
+            $emailLogObj->content = '请求地址:' . $resetPasswordUrl;
+            $emailLogObj->status = $ret ? 1 : 0;
+            $emailLogObj->created_at = date('Y-m-d H:i:s');
+            $emailLogObj->save();
 
             Cache::put('resetPassword_' . md5($username), $resetTimes + 1, 1440);
             $request->session()->flash('successMsg', '重置成功,请查看邮箱');
@@ -752,17 +779,19 @@ TXT;
                 }
 
                 // 把流量包内的流量加到账号上
-                User::where('id', $user['id'])->increment('transfer_enable', $goods->traffic);
+                User::where('id', $user['id'])->increment('transfer_enable', $goods->traffic * 1048576);
 
                 // 写入返利日志
-                $referralLog = new ReferralLog();
-                $referralLog->user_id = $user->id;
-                $referralLog->ref_user_id = $user->referral_uid;
-                $referralLog->order_id = $order->oid;
-                $referralLog->amount = $totalPrice;
-                $referralLog->ref_amount = $totalPrice * self::$config['referral_percent'];
-                $referralLog->status = 0;
-                $referralLog->save();
+                if ($user->referral_uid) {
+                    $referralLog = new ReferralLog();
+                    $referralLog->user_id = $user->id;
+                    $referralLog->ref_user_id = $user->referral_uid;
+                    $referralLog->order_id = $order->oid;
+                    $referralLog->amount = $totalPrice;
+                    $referralLog->ref_amount = $totalPrice * self::$config['referral_percent'];
+                    $referralLog->status = 0;
+                    $referralLog->save();
+                }
 
                 DB::commit();
 
@@ -830,7 +859,7 @@ TXT;
         // 生成个人推广链接
         $user = $request->session()->get('user');
 
-        $view['referral_traffic'] = $this->flowAutoShow(self::$config['referral_traffic']);
+        $view['referral_traffic'] = $this->flowAutoShow(self::$config['referral_traffic'] * 1048576);
         $view['referral_percent'] = self::$config['referral_percent'];
         $view['referral_money'] = self::$config['referral_money'];
         $view['referralLogList'] = ReferralLog::where('ref_user_id', $user['id'])->with('user')->paginate();

+ 24 - 0
app/Http/Models/EmailLog.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 邮件发送日志
+ * Class EmailLog
+ * @package App\Http\Models
+ */
+class EmailLog extends Model
+{
+    protected $table = 'email_log';
+    protected $primaryKey = 'id';
+    public $timestamps = false;
+    protected $fillable = [
+        'user_id',
+        'title',
+        'content',
+        'created_at'
+    ];
+
+}

+ 30 - 0
app/Mail/userTrafficWarning.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Mail;
+
+use Illuminate\Bus\Queueable;
+use Illuminate\Mail\Mailable;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Contracts\Queue\ShouldQueue;
+
+class userTrafficWarning extends Mailable
+{
+    use Queueable, SerializesModels;
+
+    protected $websiteName;
+    protected $usedPercent;
+
+    public function __construct($websiteName, $usedPercent)
+    {
+        $this->websiteName = $websiteName;
+        $this->usedPercent = $usedPercent;
+    }
+
+    public function build()
+    {
+        return $this->view('emails.activeUser')->subject('流量警告')->with([
+            'websiteName' => $this->websiteName,
+            'usedPercent' => $this->usedPercent
+        ]);
+    }
+}

BIN
composer.phar


+ 12 - 12
resources/views/admin/addUser.blade.php

@@ -35,7 +35,7 @@
                                             </div>
                                         </div>
                                         <div class="portlet-body">
-                                            <div class="form-group">
+                                            <div class="form-group has-error">
                                                 <label for="username" class="col-md-3 control-label">用户名</label>
                                                 <div class="col-md-8">
                                                     <input type="text" class="form-control" name="username" id="username" placeholder="" autofocus required>
@@ -45,7 +45,7 @@
                                             <div class="form-group">
                                                 <label for="password" class="col-md-3 control-label">密码</label>
                                                 <div class="col-md-8">
-                                                    <input type="text" class="form-control" name="password" value="123456" id="password" placeholder="">
+                                                    <input type="text" class="form-control" name="password" value="" id="password" placeholder="留空则自动生成随机密码">
                                                 </div>
                                             </div>
                                             <div class="form-group">
@@ -182,7 +182,7 @@
                                                 <label for="passwd" class="col-md-3 control-label">密码</label>
                                                 <div class="col-md-8">
                                                     <div class="input-group">
-                                                        <input class="form-control" type="text" name="passwd" id="passwd" placeholder="不填则自动生成" />
+                                                        <input class="form-control" type="text" name="passwd" id="passwd" placeholder="留空则自动生成随机密码" />
                                                         <span class="input-group-btn">
                                                             <button class="btn btn-success" type="button" onclick="makePasswd()">
                                                                 <i class="fa fa-arrow-left fa-fw" /></i> 生成 </button>
@@ -190,7 +190,7 @@
                                                     </div>
                                                 </div>
                                             </div>
-                                            <div class="form-group">
+                                            <div class="form-group has-error">
                                                 <label for="method" class="col-md-3 control-label">加密方式</label>
                                                 <div class="col-md-8">
                                                     <select class="form-control" name="method" id="method">
@@ -219,7 +219,7 @@
                                                 </div>
                                             </div>
                                             <hr>
-                                            <div class="form-group">
+                                            <div class="form-group has-error">
                                                 <label for="protocol" class="col-md-3 control-label">协议</label>
                                                 <div class="col-md-8">
                                                     <select class="form-control" name="protocol" id="protocol">
@@ -229,13 +229,7 @@
                                                     </select>
                                                 </div>
                                             </div>
-                                            <div class="form-group">
-                                                <label for="protocol_param" class="col-md-3 control-label">协议参数</label>
-                                                <div class="col-md-8">
-                                                    <input type="text" class="form-control" name="protocol_param" id="protocol_param" placeholder="">
-                                                </div>
-                                            </div>
-                                            <div class="form-group">
+                                            <div class="form-group has-error">
                                                 <label for="obfs" class="col-md-3 control-label">混淆</label>
                                                 <div class="col-md-8">
                                                     <select class="form-control" name="obfs" id="obfs">
@@ -245,6 +239,12 @@
                                                     </select>
                                                 </div>
                                             </div>
+                                            <div class="form-group">
+                                                <label for="protocol_param" class="col-md-3 control-label">协议参数</label>
+                                                <div class="col-md-8">
+                                                    <input type="text" class="form-control" name="protocol_param" id="protocol_param" placeholder="">
+                                                </div>
+                                            </div>
                                             <div class="form-group">
                                                 <label for="obfs_param" class="col-md-3 control-label">混淆参数</label>
                                                 <div class="col-md-8">

+ 3 - 1
resources/views/admin/applyList.blade.php

@@ -32,7 +32,7 @@
                                         <th> 申请账号 </th>
                                         <th> 提现金额 </th>
                                         <th> 申请时间 </th>
-                                        <th> 审核时间 </th>
+                                        <th> 处理时间 </th>
                                         <th> 状态 </th>
                                         <th> 操作 </th>
                                     </tr>
@@ -62,7 +62,9 @@
                                                     @endif
                                                 </td>
                                                 <td>
+                                                    @if($apply->status < 2)
                                                     <button type="button" class="btn btn-sm blue btn-outline" onclick="doAudit('{{$apply->id}}')">审核</button>
+                                                    @endif
                                                 </td>
                                             </tr>
                                         @endforeach

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

@@ -240,12 +240,6 @@
                                                     </select>
                                                 </div>
                                             </div>
-                                            <div class="form-group">
-                                                <label for="protocol_param" class="col-md-3 control-label">协议参数</label>
-                                                <div class="col-md-8">
-                                                    <input type="text" class="form-control" name="protocol_param" value="{{$user->protocol_param}}" id="protocol_param" placeholder="">
-                                                </div>
-                                            </div>
                                             <div class="form-group">
                                                 <label for="obfs" class="col-md-3 control-label">混淆</label>
                                                 <div class="col-md-8">
@@ -256,6 +250,12 @@
                                                     </select>
                                                 </div>
                                             </div>
+                                            <div class="form-group">
+                                                <label for="protocol_param" class="col-md-3 control-label">协议参数</label>
+                                                <div class="col-md-8">
+                                                    <input type="text" class="form-control" name="protocol_param" value="{{$user->protocol_param}}" id="protocol_param" placeholder="">
+                                                </div>
+                                            </div>
                                             <div class="form-group">
                                                 <label for="obfs_param" class="col-md-3 control-label">混淆参数</label>
                                                 <div class="col-md-8">

+ 20 - 0
resources/views/admin/export.blade.php

@@ -39,6 +39,7 @@
                                             <td> {{$node->name}} @if ($node->compatible) <span class="label label-warning"> 兼容SS </span> @endif </td>
                                             <td>
                                                 <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#txt_{{$node->id}}"> 文本 </a>
+                                                <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#scheme_{{$node->id}}"> SCHEME </a>
                                                 <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#json_{{$node->id}}"> JSON </a>
                                                 <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#qrcode_{{$node->id}}"> 二维码 </a>
                                             </td>
@@ -72,6 +73,24 @@
                                     </div>
                                 </div>
                             </div>
+                            <div class="modal fade draggable-modal" id="scheme_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
+                                <div class="modal-dialog">
+                                    <div class="modal-content">
+                                        <div class="modal-header">
+                                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                                            <h4 class="modal-title">Url Scheme</h4>
+                                        </div>
+                                        <div class="modal-body">
+                                            <textarea class="form-control" rows="7" onclick="this.focus();this.select()" readonly="readonly">
+                                                {{$node->ssr_scheme}}
+                                                @if ($node->compatible)
+                                                    {{$node->ss_scheme}}
+                                                @endif
+                                            </textarea>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
                             <div class="modal fade draggable-modal" id="json_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
                                 <div class="modal-dialog">
                                     <div class="modal-content">
@@ -134,6 +153,7 @@
             var n = function () {
                 @foreach($nodeList as $node)
                     $("#txt_{{$node->id}}").draggable({handle: ".modal-header"});
+                    $("#scheme_{{$node->id}}").draggable({handle: ".modal-header"});
                     $("#json_{{$node->id}}").draggable({handle: ".modal-header"});
                     $("#qrcode_{{$node->id}}").draggable({handle: ".modal-header"});
                 @endforeach

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

@@ -180,7 +180,7 @@
                         </li>
                     </ul>
                 </li>
-                <li class="nav-item {{Request::getRequestUri() == '/admin/convert' || Request::getRequestUri() == '/admin/import' || Request::getRequestUri() == '/admin/analysis' ? 'active open' : ''}}">
+                <li class="nav-item {{Request::getRequestUri() == '/admin/convert' || Request::getRequestUri() == '/admin/import' || Request::getRequestUri() == '/admin/analysis' || Request::getRequestUri() == '/emailLog/list' ? 'active open' : ''}}">
                     <a href="javascript:;" class="nav-link nav-toggle">
                         <i class="icon-wrench"></i>
                         <span class="title">工具箱</span>
@@ -205,6 +205,12 @@
                                 <span class="title">日志分析</span>
                             </a>
                         </li>
+                        <li class="nav-item {{Request::getRequestUri() == '/emailLog/list' ? 'active open' : ''}}">
+                            <a href="{{url('emailLog/list')}}" class="nav-link ">
+                                <i class="icon-list"></i>
+                                <span class="title">邮件发送记录</span>
+                            </a>
+                        </li>
                     </ul>
                 </li>
                 <li class="nav-item {{Request::getRequestUri() == '/admin/config' || Request::getRequestUri() == '/admin/addConfig' || Request::getRequestUri() == '/admin/system' ? 'active open' : ''}}">

+ 46 - 2
resources/views/admin/system.blade.php

@@ -129,7 +129,7 @@
                                                         <div class="col-md-3">
                                                             <div class="input-group">
                                                                 <input class="form-control" type="text" name="default_traffic" value="{{$default_traffic}}" id="default_traffic" />
-                                                                <span class="input-group-addon">Byte</span>
+                                                                <span class="input-group-addon">MiB</span>
                                                                 <span class="input-group-btn">
                                                                     <button class="btn btn-success" type="button" onclick="setDefaultTraffic()">修改</button>
                                                                 </span>
@@ -173,6 +173,26 @@
                                                             <span class="help-block"> 24小时内可以通过邮件激活账号次数 </span>
                                                         </div>
                                                     </div>
+                                                    <div class="form-group">
+                                                        <label for="traffic_warning" class="col-md-2 control-label">流量警告</label>
+                                                        <div class="col-md-6">
+                                                            <input type="checkbox" class="make-switch" @if($traffic_warning) checked @endif id="traffic_warning" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
+                                                            <span class="help-block"> 启用后用户的已使用流量超过警告阈值则自动发邮件提醒 </span>
+                                                        </div>
+                                                    </div>
+                                                    <div class="form-group">
+                                                        <label for="traffic_warning_percent" class="col-md-2 control-label">流量警告阈值</label>
+                                                        <div class="col-md-3">
+                                                            <div class="input-group">
+                                                                <input class="form-control" type="text" name="traffic_warning_percent" value="{{$traffic_warning_percent}}" id="traffic_warning_percent" />
+                                                                <span class="input-group-addon">%</span>
+                                                                <span class="input-group-btn">
+                                                                    <button class="btn btn-success" type="button" onclick="setTrafficWarningPercent()">修改</button>
+                                                                </span>
+                                                            </div>
+                                                            <span class="help-block"> 建议设置在70%~90%,否则浪费邮件 </span>
+                                                        </div>
+                                                    </div>
                                                 </div>
                                             </form>
                                         </div>
@@ -226,7 +246,7 @@
                                                         <div class="col-md-3">
                                                             <div class="input-group">
                                                                 <input class="form-control" type="text" name="referral_gift_traffic" value="{{$referral_traffic}}" id="referral_traffic" />
-                                                                <span class="input-group-addon">Byte</span>
+                                                                <span class="input-group-addon">MiB</span>
                                                                 <span class="input-group-btn">
                                                                     <button class="btn btn-success" type="button" onclick="setReferralTraffic()">修改</button>
                                                                 </span>
@@ -444,6 +464,17 @@
             }
         });
 
+        // 启用、禁用随机端口
+        $('#traffic_warning').on({
+            'switchChange.bootstrapSwitch': function(event, state) {
+                var traffic_warning = state ? 1 : 0;
+
+                $.post("{{url('admin/setConfig')}}", {_token:'{{csrf_token()}}', name:'traffic_warning', value:traffic_warning}, function (ret) {
+                    console.log(ret);
+                });
+            }
+        });
+
         // 设置最小积分
         $("#min_rand_score").change(function () {
             var min_rand_score = $(this).val();
@@ -522,6 +553,19 @@
             });
         }
 
+        // 设置流量警告阈值
+        function setTrafficWarningPercent() {
+            var traffic_warning_percent = $("#traffic_warning_percent").val();
+
+            $.post("{{url('admin/setTrafficWarningPercent')}}", {_token:'{{csrf_token()}}', value:traffic_warning_percent}, function (ret) {
+                if (ret.status == 'success') {
+                    bootbox.alert(ret.message, function() {
+                        window.location.reload();
+                    });
+                }
+            });
+        }
+
         // 设置网站名称
         function setWebsiteName() {
             var website_name = $("#website_name").val();

+ 93 - 0
resources/views/emailLog/list.blade.php

@@ -0,0 +1,93 @@
+@extends('admin.layouts')
+
+@section('css')
+    <link href="/assets/global/plugins/fancybox/source/jquery.fancybox.css" rel="stylesheet" type="text/css" />
+    <style>
+        .fancybox > img {
+            width: 75px;
+            height: 75px;
+        }
+    </style>
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content">
+        <!-- BEGIN PAGE BREADCRUMB -->
+        <ul class="page-breadcrumb breadcrumb">
+            <li>
+                <a href="{{url('emailLog/list')}}">邮件发送记录</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">
+                                <thead>
+                                <tr>
+                                    <th> ID </th>
+                                    <th> 接收者 </th>
+                                    <th> 邮件标题 </th>
+                                    <th> 邮件内容 </th>
+                                    <th> 发送时间 </th>
+                                    <th> 状态 </th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                @if($list->isEmpty())
+                                    <tr>
+                                        <td colspan="6">暂无数据</td>
+                                    </tr>
+                                @else
+                                    @foreach($list as $vo)
+                                        <tr class="odd gradeX">
+                                            <td> {{$vo->id}} </td>
+                                            <td> {{$vo->user_id}} </td>
+                                            <td> {{$vo->title}} </td>
+                                            <td> {{$vo->content}} </td>
+                                            <td> {{$vo->created_at}} </td>
+                                            <td> {{$vo->status ? '发送成功' : '发送失败'}} </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">共 {{$list->total()}} 条记录</div>
+                            </div>
+                            <div class="col-md-8 col-sm-8">
+                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                    {{ $list->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>
+
+    <script type="text/javascript">
+        //
+    </script>
+@endsection

+ 88 - 0
resources/views/emails/userTrafficWarning.blade.php

@@ -0,0 +1,88 @@
+<table class="body" style="Margin:0;background:#FAFAFA;border-collapse:collapse;border-spacing:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0;text-align:left;vertical-align:top;width:100%">
+    <tbody>
+    <tr style="padding:0;text-align:left;vertical-align:top">
+        <td class="center" align="center" valign="top" style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;hyphens:auto;line-height:19px;margin:0;padding:0;text-align:left;vertical-align:top;word-wrap:break-word">
+            <center data-parsed="" style="min-width:580px;width:100%">
+                <table align="center" class="container no-bg float-center" style="Margin:0 auto;background:0 0;border:0;border-collapse:collapse;border-radius:3px;border-spacing:0;box-shadow:none;float:none;margin:0 auto;margin-top:20px;padding:0;text-align:center;vertical-align:top;width:580px">
+                    <tbody>
+                    <tr style="padding:0;text-align:left;vertical-align:top">
+                        <td style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;hyphens:auto;line-height:19px;margin:0;padding:0;text-align:left;vertical-align:top;word-wrap:break-word">
+                            <table class="row" style="border-collapse:collapse;border-spacing:0;display:table;padding:0;position:relative;text-align:left;vertical-align:top;width:100%">
+                                <tbody>
+                                <tr style="padding:0;text-align:left;vertical-align:top">
+
+                                    <th class="small-11 large-11 columns last" style="Margin:0 auto;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0 auto;padding:0;padding-bottom:0;padding-left:8px;padding-right:16px;text-align:left;width:515.67px">
+                                        <table style="border-collapse:collapse;border-spacing:0;padding:0;text-align:left;vertical-align:top;width:100%">
+                                            <tbody>
+                                            <tr style="padding:0;text-align:left;vertical-align:top">
+                                                <th style="Margin:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0;text-align:left">
+                                                    <h3 style="Margin:0;Margin-bottom:10px;color:inherit;font-family:Helvetica,Arial,sans-serif;font-size:28px;font-weight:400;line-height:1.3;margin:0;margin-bottom:0;padding:0;text-align:left;word-wrap:normal">
+                                                        <a href="#" style="Margin:0;color:#40253b;font-family:Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3;margin:0;padding:0;text-align:left;text-decoration:none" target="_blank">
+                                                            SSRPanel
+                                                        </a>
+                                                    </h3>
+                                                </th>
+                                            </tr>
+                                            </tbody>
+                                        </table>
+                                    </th>
+                                </tr>
+                                </tbody>
+                            </table>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+                <table align="center" class="container float-center" style="Margin:0 auto;background:#fefefe;border:1px solid #cdcdcd;border-collapse:collapse;border-radius:3px;border-spacing:0;float:none;margin:0 auto;margin-top:20px;padding:0;text-align:center;vertical-align:top;width:580px">
+                    <tbody>
+                    <tr style="padding:0;text-align:left;vertical-align:top">
+                        <td style="-moz-hyphens:auto;-webkit-hyphens:auto;Margin:0;border-collapse:collapse!important;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;hyphens:auto;line-height:19px;margin:0;padding:0;text-align:left;vertical-align:top;word-wrap:break-word">
+                            <table class="row container-header-row" style="background-color:#5c97bd;border-collapse:collapse;border-spacing:0;color:#f3f3f3;display:table;padding:0;padding-bottom:8px;padding-top:8px;position:relative;text-align:left;vertical-align:top;width:100%">
+                                <tbody>
+                                <tr style="padding:0;text-align:left;vertical-align:top">
+                                    <th class="small-12 large-12 columns first last" style="Margin:0 auto;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0 auto;padding:0;padding-bottom:0;padding-left:16px;padding-right:16px;text-align:left;width:564px">
+                                        <table style="border-collapse:collapse;border-spacing:0;padding:0;text-align:left;vertical-align:top;width:100%">
+                                            <tbody>
+                                            <tr style="padding:0;text-align:left;vertical-align:top">
+                                                <th style="Margin:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0;text-align:left">
+                                                    <h6 style="Margin:0;Margin-bottom:10px;color:#f3f3f3;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:400;line-height:1.3;margin:0;margin-bottom:8px;margin-top:8px;padding:0;text-align:left;word-wrap:normal">
+                                                        <a href="#" style="Margin:0;color:#f3f3f3;font-family:Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3;margin:0;padding:0;text-align:left;text-decoration:none" target="_blank">
+                                                            流量警告
+                                                        </a>
+                                                    </h6>
+                                                </th>
+                                                <th class="expander" style="Margin:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0!important;text-align:left;visibility:hidden;width:0"></th>
+                                            </tr>
+                                            </tbody>
+                                        </table>
+                                    </th>
+                                </tr>
+                                </tbody>
+                            </table>
+                            <table class="row" style="border-collapse:collapse;border-spacing:0;display:table;padding:0;position:relative;text-align:left;vertical-align:top;width:100%">
+                                <tbody>
+                                <tr style="padding:0;text-align:left;vertical-align:top">
+                                    <th class="small-12 large-12 columns first last" style="Margin:0 auto;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0 auto;padding:0;padding-bottom:0;padding-left:16px;padding-right:16px;text-align:left;width:564px">
+                                        <p style="border-collapse:collapse;border-spacing:0;padding:0;text-align:left;vertical-align:top;width:100%"></p>
+                                <tbody>
+                                <tr style="padding:0;text-align:left;vertical-align:top">
+                                    <th style="Margin:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0;text-align:left">
+                                        <div class="release" style="padding-top:5px;padding-left:20px;padding-bottom:20px;">
+                                            <p>这是一封来自 {{$websiteName}} 的流量警告提醒。</p>
+                                            <p>您的流量已使用【{{$usedPercent}}%】了,为了确保您可要继续正常享受我们的服务,请及时续费或者购买流量包。</p>
+                                        </div>
+                                    </th>
+                                    <th class="expander" style="Margin:0;color:#333;font-family:Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:19px;margin:0;padding:0!important;text-align:left;visibility:hidden;width:0"></th>
+                                </tr>
+                                </tbody>
+                                </th></tr></tbody>
+                            </table>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </center>
+        </td>
+    </tr>
+    </tbody>
+</table>

+ 32 - 5
resources/views/shop/addGoods.blade.php

@@ -2,6 +2,7 @@
 
 @section('css')
     <link href="/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/bootstrap-datepicker/css/bootstrap-datepicker3.min.css" rel="stylesheet" type="text/css" />
 @endsection
 @section('title', '控制面板')
 @section('content')
@@ -80,24 +81,38 @@
                                     <label class="control-label col-md-3">内含流量</label>
                                     <div class="col-md-6">
                                         <div class="input-group">
-                                            <input type="text" class="form-control" name="traffic" value="10" id="traffic" placeholder="" required="">
-                                            <span class="input-group-addon">GiB</span>
+                                            <input type="text" class="form-control" name="traffic" value="1024" id="traffic" placeholder="" required="">
+                                            <span class="input-group-addon">MiB</span>
                                         </div>
                                     </div>
                                 </div>
                                 <div class="form-group">
                                     <label class="control-label col-md-3">售价</label>
                                     <div class="col-md-6">
-                                        <input type="text" class="form-control" name="price" value="" id="price" placeholder="" required>
+                                        <div class="input-group">
+                                            <input type="text" class="form-control" name="price" value="" id="price" placeholder="" required>
+                                            <span class="input-group-addon">元</span>
+                                        </div>
                                     </div>
                                 </div>
                                 <div class="form-group">
                                     <label class="control-label col-md-3">所需积分</label>
                                     <div class="col-md-6">
-                                        <input type="text" class="form-control" name="score" value="" id="score" placeholder="" required>
+                                        <input type="text" class="form-control" name="score" value="0" id="score" placeholder="" required>
                                         <span class="help-block">换购该商品需要的积分值</span>
                                     </div>
                                 </div>
+                                <div class="form-group">
+                                    <label class="col-md-3 control-label">有效期</label>
+                                    <div class="col-md-9">
+                                        <div class="input-group input-large input-daterange">
+                                            <input type="text" class="form-control" name="start_time" value="{{date('Y-m-d')}}" id="start_time">
+                                            <span class="input-group-addon"> 至 </span>
+                                            <input type="text" class="form-control" name="end_time" value="{{date('Y-m-d', strtotime("+1 year"))}}" id="end_time">
+                                        </div>
+                                        <span class="help-block"> 有效期结束后,凡是购买该商品的账号都会被扣除该商品设置的流量值 </span>
+                                    </div>
+                                </div>
                                 <div class="form-group last">
                                     <label class="control-label col-md-3">状态</label>
                                     <div class="col-md-6">
@@ -113,7 +128,6 @@
                                         </div>
                                     </div>
                                 </div>
-
                             </div>
                             <div class="form-actions">
                                 <div class="row">
@@ -135,5 +149,18 @@
 @endsection
 @section('script')
     <script src="/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/bootstrap-datepicker/js/bootstrap-datepicker.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        // 有效期
+        $('.input-daterange input').each(function() {
+            $(this).datepicker({
+                language: 'zh-CN',
+                autoclose: true,
+                todayHighlight: true,
+                format: 'yyyy-mm-dd'
+            });
+        });
+    </script>
 @endsection

+ 22 - 1
resources/views/shop/editGoods.blade.php

@@ -104,6 +104,17 @@
                                         <span class="help-block">换购该商品需要的积分值</span>
                                     </div>
                                 </div>
+                                <div class="form-group">
+                                    <label class="col-md-3 control-label">有效期</label>
+                                    <div class="col-md-8">
+                                        <div class="input-group input-large input-daterange">
+                                            <input type="text" class="form-control" name="start_time" value="{{date('Y-m-d', strtotime($goods->start_time))}}" id="start_time">
+                                            <span class="input-group-addon"> 至 </span>
+                                            <input type="text" class="form-control" name="end_time" value="{{date('Y-m-d', strtotime($goods->end_time))}}" id="end_time">
+                                        </div>
+                                        <span class="help-block"> 有效期结束后,凡是购买该商品的账号都会被扣除该商品设置的流量值 </span>
+                                    </div>
+                                </div>
                                 <div class="form-group last">
                                     <label class="control-label col-md-3">状态</label>
                                     <div class="col-md-6">
@@ -141,9 +152,19 @@
 @endsection
 @section('script')
     <script src="/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/bootstrap-datepicker/js/bootstrap-datepicker.min.js" type="text/javascript"></script>
+    <script src="/assets/global/plugins/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js" type="text/javascript"></script>
     <script src="/assets/global/plugins/bootbox/bootbox.min.js" type="text/javascript"></script>
 
     <script type="text/javascript">
-        //
+        // 有效期
+        $('.input-daterange input').each(function() {
+            $(this).datepicker({
+                language: 'zh-CN',
+                autoclose: true,
+                todayHighlight: true,
+                format: 'yyyy-mm-dd'
+            });
+        });
     </script>
 @endsection

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

@@ -150,7 +150,7 @@
                         <span class="title">我的工单</span>
                     </a>
                 </li>
-                @if($referral_status)
+                @if(Session::get('referral_status'))
                 <li class="nav-item {{Request::getRequestUri() == '/user/referral' ? 'active open' : ''}}">
                     <a href="{{url('user/referral')}}" class="nav-link nav-toggle">
                         <i class="icon-diamond"></i>

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

@@ -64,6 +64,7 @@
                                             <td> <span class="label label-info"> {{$node->obfs}} </span> </td>
                                             <td>
                                                 <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#txt_{{$node->id}}"> 查看配置 </a>
+                                                <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#scheme_{{$node->id}}"> SCHEME </a>
                                                 <a class="btn btn-sm green btn-outline" data-toggle="modal" href="#qrcode_{{$node->id}}"> 二维码 </a>
                                             </td>
                                         </tr>
@@ -97,6 +98,24 @@
                                     </div>
                                 </div>
                             </div>
+                            <div class="modal fade draggable-modal" id="scheme_{{$node->id}}" tabindex="-1" role="basic" aria-hidden="true">
+                                <div class="modal-dialog">
+                                    <div class="modal-content">
+                                        <div class="modal-header">
+                                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+                                            <h4 class="modal-title">Url Scheme</h4>
+                                        </div>
+                                        <div class="modal-body">
+                                            <textarea class="form-control" rows="7" onclick="this.focus();this.select()" readonly="readonly">
+                                                {{$node->ssr_scheme}}
+                                                @if ($node->compatible)
+                                                    {{$node->ss_scheme}}
+                                                @endif
+                                            </textarea>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
                             <div class="modal fade" id="qrcode_{{$node->id}}" tabindex="-1" role="dialog" aria-hidden="true">
                                 <div class="modal-dialog @if(!$node->compatible) modal-sm @endif">
                                     <div class="modal-content">

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

@@ -25,7 +25,7 @@
         <div class="row">
             <div class="col-md-12">
                 <div class="alert alert-danger">
-                    通过您的推广链接注册的账号可以获得 <code>{{$referral_traffic}}流量</code> 奖励。您可以获得他们每笔消费的<code>{{$referral_percent * 100}}%现金返利</code>。累计满 <code>{{$referral_money}}元</code>,就可以申请提现至微信或者支付宝。
+                    通过您的推广链接注册的账号可以获得 <code>{{$referral_traffic}}流量</code> 奖励。您可以获得他们每笔消费的<code>{{$referral_percent * 100}}%现金</code>返利。累计满 <code>{{$referral_money}}元</code>,就可以申请提现至微信或者支付宝。
                 </div>
                 <div class="portlet light form-fit bordered">
                     <div class="portlet-title">

+ 2 - 2
resources/views/user/reset.blade.php

@@ -48,10 +48,10 @@
         @if(Session::get('successMsg'))
             <div class="alert alert-success">
                 <button class="close" data-close="alert"></button>
-                <span> {{Session::get('errorMsg')}} </span>
+                <span> {{Session::get('successMsg')}} </span>
             </div>
         @endif
-        @if ($verify->status)
+        @if ($verify->status && empty(Session::get('errorMsg')) && empty(Session::get('successMsg')))
             <div class="alert alert-danger">
                 <button class="close" data-close="alert"></button>
                 <span> 该链接已失效 </span>

+ 2 - 0
routes/web.php

@@ -53,6 +53,7 @@ Route::group(['middleware' => ['user', 'admin']], function() {
     Route::post('admin/setWebsiteUrl', 'AdminController@setWebsiteUrl'); // 设置网站地址
     Route::post('admin/setResetPasswordTimes', 'AdminController@setResetPasswordTimes'); // 设置重置密码次数
     Route::post('admin/setActiveTimes', 'AdminController@setActiveTimes'); // 设置激活账号次数
+    Route::post('admin/setTrafficWarningPercent', 'AdminController@setTrafficWarningPercent'); // 设置流量警告阈值
     Route::post('admin/setAddScoreRange', 'AdminController@setAddScoreRange'); // 设置登录加积分时间间隔
     Route::post('admin/setReferralTraffic', 'AdminController@setReferralTraffic'); // 设置注册送流量值
     Route::post('admin/setReferralPercent', 'AdminController@setReferralPercent'); // 设置返利比例
@@ -67,6 +68,7 @@ Route::group(['middleware' => ['user', 'admin']], function() {
     Route::any('coupon/couponList', 'CouponController@couponList'); // 优惠券列表
     Route::any('coupon/addCoupon', 'CouponController@addCoupon'); // 添加优惠券
     Route::post('coupon/delCoupon', 'CouponController@delCoupon'); // 删除优惠券
+    Route::get('emailLog/list', 'EmailLogController@list'); // 邮件发送日志
 });
 
 Route::group(['middleware' => ['user']], function(){

+ 21 - 2
sql/db.sql

@@ -235,6 +235,9 @@ INSERT INTO `config` VALUES ('18', 'referral_traffic', 1024);
 INSERT INTO `config` VALUES ('19', 'referral_percent', 0.2);
 INSERT INTO `config` VALUES ('20', 'referral_money', 100);
 INSERT INTO `config` VALUES ('21', 'referral_status', 1);
+INSERT INTO `config` VALUES ('22', 'default_traffic', 1024);
+INSERT INTO `config` VALUES ('23', 'traffic_warning', 0);
+INSERT INTO `config` VALUES ('24', 'traffic_warning_percent', 80);
 
 
 -- ----------------------------
@@ -314,10 +317,12 @@ CREATE TABLE `goods` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品名称',
   `logo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品图片地址',
-  `traffic` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品内含多少流量',
+  `traffic` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品内含多少流量,单位MiB',
   `score` int(11) NOT NULL DEFAULT '0' COMMENT '商品价值多少积分',
   `price` int(11) NOT NULL DEFAULT '0' COMMENT '商品售价,单位分',
-  `desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '商品描述',
+  `desc` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '商品描述',
+  `start_time` datetime DEFAULT NULL COMMENT '有效期开始',
+  `end_time` datetime DEFAULT NULL COMMENT '有效期结束',
   `is_del` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否已删除:0-否、1-是',
   `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0-下架、1-上架',
   `created_at` datetime DEFAULT NULL COMMENT '创建时间',
@@ -489,6 +494,20 @@ CREATE TABLE `referral_log` (
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消费返利日志';
 
 
+-- ----------------------------
+-- Table structure for `email_log`
+-- ----------------------------
+CREATE TABLE `email_log` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '接收者ID',
+  `title` varchar(255) DEFAULT '' COMMENT '邮件标题',
+  `content` text COMMENT '邮件内容',
+  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1-发送成功、2-发送失败',
+  `created_at` datetime DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
 
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;