فهرست منبع

1.商品标签化(购买商品自动打标签、商品过期自动清除标签)
2.同一个IP24小时内注册次数限制

bingo 7 سال پیش
والد
کامیت
8b0ed71a2d

+ 15 - 0
app/Console/Commands/AutoDecGoodsTrafficJob.php

@@ -2,6 +2,8 @@
 
 namespace App\Console\Commands;
 
+use App\Http\Models\GoodsLabel;
+use App\Http\Models\UserLabel;
 use Illuminate\Console\Command;
 use App\Http\Models\Order;
 use App\Http\Models\User;
@@ -34,6 +36,19 @@ class AutoDecGoodsTrafficJob extends Command
                         User::query()->where('id', $order->user_id)->decrement('transfer_enable', $order->goods->traffic * 1048576);
                     }
 
+                    // 删除该商品对应用户的所有标签
+                    UserLabel::query()->where('user_id', $order->user->id)->delete();
+
+                    // 取出用户的全部其他商品
+                    $goodsIds = Order::query()->where('user_id', $order->user->id)->where('oid', '<>', $order->oid)->groupBy('goods_id')->pluck('goods_id')->toArray();
+                    $goodsLabels = GoodsLabel::query()->whereIn('goods_id', $goodsIds)->groupBy('label_id')->pluck('label_id')->toArray();
+                    foreach ($goodsLabels as $label) {
+                        $userLabel = new UserLabel();
+                        $userLabel->user_id = $order->user->id;
+                        $userLabel->label_id = $label;
+                        $userLabel->save();
+                    }
+
                     Order::query()->where('oid', $order->oid)->update(['is_expire' => 1]);
                 }
             }

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

@@ -323,7 +323,7 @@ class AdminController extends Controller
 
                 User::query()->where('id', $id)->update($data);
 
-                // 先删除所有该用户的标签
+                // 先删除该用户所有的标签
                 UserLabel::query()->where('user_id', $id)->delete();
 
                 // 生成用户标签

+ 25 - 1
app/Http/Controllers/RegisterController.php

@@ -12,6 +12,7 @@ use App\Mail\activeUser;
 use Captcha;
 use Response;
 use Redirect;
+use Cache;
 use Mail;
 
 /**
@@ -32,6 +33,8 @@ class RegisterController extends Controller
     // 注册页
     public function index(Request $request)
     {
+        $cacheKey = 'register_times_' . md5($request->getClientIp()); // 注册限制缓存key
+
         if ($request->method() == 'POST') {
             $username = trim($request->get('username'));
             $password = trim($request->get('password'));
@@ -106,6 +109,18 @@ class RegisterController extends Controller
                 }
             }
 
+            // 24小时内同IP注册限制
+            if (self::$config['register_ip_limit']) {
+                if (Cache::has($cacheKey)) {
+                    $registerTimes = Cache::get($cacheKey);
+                    if ($registerTimes >= self::$config['register_ip_limit']) {
+                        $request->session()->flash('errorMsg', '系统已开启防刷机制,请勿频繁注册');
+
+                        return Redirect::back()->withInput($request->except(['code']));
+                    }
+                }
+            }
+
             // 校验用户名是否已存在
             $exists = User::query()->where('username', $username)->first();
             if ($exists) {
@@ -148,8 +163,17 @@ class RegisterController extends Controller
             $user->referral_uid = $referral_uid;
             $user->save();
 
+            // 注册次数+1
+            if ($user->id) {
+                if (Cache::has($cacheKey)) {
+                    Cache::increment($cacheKey);
+                } else {
+                    Cache::put($cacheKey, 1, 1440); // 24小时
+                }
+            }
+
             // 初始化默认标签
-            if (count(self::$config['initial_labels_for_user']) > 0) {
+            if (count(self::$config['initial_labels_for_user']) > 0 && $user->id) {
                 $labels = explode(',', self::$config['initial_labels_for_user']);
                 foreach ($labels as $label) {
                     $userLabel = new UserLabel();

+ 80 - 29
app/Http/Controllers/ShopController.php

@@ -3,9 +3,12 @@
 namespace App\Http\Controllers;
 
 use App\Http\Models\Goods;
+use App\Http\Models\GoodsLabel;
+use App\Http\Models\Label;
 use Illuminate\Http\Request;
 use Response;
 use Redirect;
+use DB;
 
 /**
  * 商店控制器
@@ -39,6 +42,7 @@ class ShopController extends Controller
             $score = $request->get('score', 0);
             $type = $request->get('type', 1);
             $days = $request->get('days', 90);
+            $labels = $request->get('labels');
             $status = $request->get('status');
 
             if (empty($name) || empty($traffic)) {
@@ -78,32 +82,49 @@ class ShopController extends Controller
                 $logo = $move ? '/upload/image/goods/' . $logoName : '';
             }
 
-            $obj = new Goods();
-            $obj->name = $name;
-            $obj->desc = $desc;
-            $obj->logo = $logo;
-            $obj->traffic = $traffic;
-            $obj->price = $price;
-            $obj->score = $score;
-            $obj->type = $type;
-            $obj->days = $days;
-            $obj->is_del = 0;
-            $obj->status = $status;
-            $obj->save();
-
-            if ($obj->id) {
+            DB::beginTransaction();
+            try {
+                $goods = new Goods();
+                $goods->name = $name;
+                $goods->desc = $desc;
+                $goods->logo = $logo;
+                $goods->traffic = $traffic;
+                $goods->price = $price;
+                $goods->score = $score;
+                $goods->type = $type;
+                $goods->days = $days;
+                $goods->is_del = 0;
+                $goods->status = $status;
+                $goods->save();
+
                 // 生成SKU
-                $obj->sku = 'S0000' . $obj->id;
-                $obj->save();
+                $goods->sku = 'S0000' . $goods->id;
+                $goods->save();
+
+                // 生成商品标签
+                if (!empty($labels)) {
+                    foreach ($labels as $label) {
+                        $goodsLabel = new GoodsLabel();
+                        $goodsLabel->goods_id = $goods->id;
+                        $goodsLabel->label_id = $label;
+                        $goodsLabel->save();
+                    }
+                }
 
                 $request->session()->flash('successMsg', '添加成功');
-            } else {
+
+                DB::commit();
+            } catch (\Exception $e) {
                 $request->session()->flash('errorMsg', '添加失败');
+
+                DB::rollBack();
             }
 
             return Redirect::to('shop/addGoods');
         } else {
-            return Response::view('shop/addGoods');
+            $view['label_list'] = Label::query()->orderBy('sort', 'desc')->orderBy('id', 'asc')->get();
+
+            return Response::view('shop/addGoods', $view);
         }
     }
 
@@ -116,6 +137,7 @@ class ShopController extends Controller
             $name = $request->get('name');
             $desc = $request->get('desc');
             $price = $request->get('price', 0);
+            $labels = $request->get('labels');
             $status = $request->get('status');
 
             $goods = Goods::query()->where('id', $id)->first();
@@ -148,24 +170,53 @@ class ShopController extends Controller
                 $logo = $move ? '/upload/image/goods/' . $logoName : '';
             }
 
-            $data = [
-                'name'   => $name,
-                'desc'   => $desc,
-                'logo'   => $logo,
-                'price'  => $price * 100, // 更新时修改器不生效,需要手动*100,原因未知
-                'status' => $status
-            ];
+            DB::beginTransaction();
+            try {
+                $data = [
+                    'name'   => $name,
+                    'desc'   => $desc,
+                    'logo'   => $logo,
+                    'price'  => $price * 100,
+                    'status' => $status
+                ];
+
+                Goods::query()->where('id', $id)->update($data);
+
+                // 先删除该商品所有的标签
+                GoodsLabel::query()->where('goods_id', $id)->delete();
+
+                // 生成商品标签
+                if (!empty($labels)) {
+                    foreach ($labels as $label) {
+                        $goodsLabel = new GoodsLabel();
+                        $goodsLabel->goods_id = $id;
+                        $goodsLabel->label_id = $label;
+                        $goodsLabel->save();
+                    }
+                }
 
-            $ret = Goods::query()->where('id', $id)->update($data);
-            if ($ret) {
                 $request->session()->flash('successMsg', '编辑成功');
-            } else {
+
+                DB::commit();
+            } catch (\Exception $e) {
                 $request->session()->flash('errorMsg', '编辑失败');
+
+                DB::rollBack();
             }
 
             return Redirect::to('shop/editGoods?id=' . $id);
         } else {
-            $view['goods'] = Goods::query()->where('id', $id)->first();
+            $goods = Goods::query()->with(['label'])->where('id', $id)->first();
+            if ($goods) {
+                $label = [];
+                foreach ($goods->label as $vo) {
+                    $label[] = $vo->label_id;
+                }
+                $goods->labels = $label;
+            }
+
+            $view['goods'] = $goods;
+            $view['label_list'] = Label::query()->orderBy('sort', 'desc')->orderBy('id', 'asc')->get();
 
             return Response::view('shop/editGoods', $view);
         }

+ 21 - 1
app/Http/Controllers/UserController.php

@@ -7,6 +7,7 @@ use App\Http\Models\Article;
 use App\Http\Models\Coupon;
 use App\Http\Models\CouponLog;
 use App\Http\Models\Goods;
+use App\Http\Models\GoodsLabel;
 use App\Http\Models\Invite;
 use App\Http\Models\Level;
 use App\Http\Models\Order;
@@ -829,7 +830,7 @@ class UserController extends Controller
         $user = $request->session()->get('user');
 
         if ($request->method() == 'POST') {
-            $goods = Goods::query()->where('id', $goods_id)->where('status', 1)->first();
+            $goods = Goods::query()->with(['label'])->where('id', $goods_id)->where('status', 1)->first();
             if (empty($goods)) {
                 return Response::json(['status' => 'fail', 'data' => '', 'message' => '支付失败:商品或服务已下架']);
             }
@@ -927,6 +928,25 @@ class UserController extends Controller
                     }
                 }
 
+                // 写入用户标签
+                if ($goods->label) {
+                    // 取出现有的标签
+                    $userLabels = UserLabel::query()->where('user_id', $user->id)->pluck('label_id')->toArray();
+                    $goodsLabels = GoodsLabel::query()->where('goods_id', $goods_id)->pluck('label_id')->toArray();
+                    $newUserLabels = array_merge($userLabels, $goodsLabels);
+
+                    // 删除用户所有标签
+                    UserLabel::query()->where('user_id', $user->id)->delete();
+
+                    // 生成标签
+                    foreach ($newUserLabels as $vo) {
+                        $obj = new UserLabel();
+                        $obj->user_id = $user->id;
+                        $obj->label_id = $vo;
+                        $obj->save();
+                    }
+                }
+
                 // 写入返利日志
                 if ($user->referral_uid) {
                     $referralLog = new ReferralLog();

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

@@ -15,6 +15,11 @@ class Goods extends Model
     protected $table = 'goods';
     protected $primaryKey = 'id';
 
+    function label()
+    {
+        return $this->hasMany(GoodsLabel::class, 'goods_id', 'id');
+    }
+
     function getPriceAttribute($value)
     {
         return $value / 100;

+ 23 - 0
app/Http/Models/GoodsLabel.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 商品标签
+ * Class GoodsLabel
+ *
+ * @package App\Http\Models
+ */
+class GoodsLabel extends Model
+{
+    protected $table = 'goods_label';
+    protected $primaryKey = 'id';
+    public $timestamps = false;
+
+    function goods()
+    {
+        return $this->hasOne(Goods::class, 'id', 'goods_id');
+    }
+}

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

@@ -15,4 +15,9 @@ class UserLabel extends Model
     protected $table = 'user_label';
     protected $primaryKey = 'id';
     public $timestamps = false;
+
+    function user()
+    {
+        return $this->hasOne(User::class, 'id', 'user_id');
+    }
 }

+ 4 - 4
resources/views/admin/addGroup.blade.php

@@ -29,23 +29,23 @@
                         <form action="#" method="post" enctype="multipart/form-data" class="form-horizontal form-bordered" onsubmit="return do_submit();">
                             <div class="form-body">
                                 <div class="form-group">
-                                    <label class="control-label col-md-3">分组名称</label>
+                                    <label class="control-label col-md-3">名称</label>
                                     <div class="col-md-6">
                                         <input type="text" class="form-control" name="name" value="" id="name" placeholder="" autofocus required>
                                         <input type="hidden" name="_token" value="{{csrf_token()}}">
                                     </div>
                                 </div>
                                 <div class="form-group">
-                                    <label class="control-label col-md-3">可见级别</label>
+                                    <label class="control-label col-md-3">级别</label>
                                     <div class="col-md-6">
                                         <select class="form-control" name="level" id="level" required>
                                             @if(!$level_list->isEmpty())
                                                 @foreach($level_list as $level)
-                                                    <option value="{{$level['level']}}">{{$level['level_name']}}</option>
+                                                    <option value="{{$level->level}}">{{$level->level_name}}</option>
                                                 @endforeach
                                             @endif
                                         </select>
-                                        <span class="help-block">对应账号级别可见该分组下的节点(向下兼容)</span>
+                                        <span class="help-block">暂无用</span>
                                     </div>
                                 </div>
                             </div>

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

@@ -91,7 +91,7 @@
                                                     <select class="form-control" name="level" id="level">
                                                         @if(!$level_list->isEmpty())
                                                             @foreach($level_list as $ele)
-                                                                <option value="{{$ele['level']}}">{{$ele['level_name']}}</option>
+                                                                <option value="{{$ele->level}}">{{$ele->level_name}}</option>
                                                             @endforeach
                                                         @endif
                                                     </select>
@@ -110,7 +110,7 @@
                                             </div>
                                             <hr>
                                             <div class="form-group">
-                                                <label for="status" class="col-md-3 control-label">标签</label>
+                                                <label for="labels" class="col-md-3 control-label">标签</label>
                                                 <div class="col-md-8">
                                                     <select id="labels" class="form-control select2-multiple" name="labels[]" multiple>
                                                         @foreach($label_list as $label)

+ 4 - 4
resources/views/admin/editGroup.blade.php

@@ -29,23 +29,23 @@
                         <form action="#" method="post" enctype="multipart/form-data" class="form-horizontal form-bordered" onsubmit="return do_submit();">
                             <div class="form-body">
                                 <div class="form-group">
-                                    <label class="control-label col-md-3">分组名称</label>
+                                    <label class="control-label col-md-3">名称</label>
                                     <div class="col-md-6">
                                         <input type="text" class="form-control" name="name" value="{{$group->name}}" id="name" placeholder="" autofocus required>
                                         <input type="hidden" name="_token" value="{{csrf_token()}}">
                                     </div>
                                 </div>
                                 <div class="form-group">
-                                    <label class="control-label col-md-3">可见级别</label>
+                                    <label class="control-label col-md-3">级别</label>
                                     <div class="col-md-6">
                                         <select class="form-control" name="level" id="level" required>
                                             @if(!$level_list->isEmpty())
                                                 @foreach($level_list as $level)
-                                                    <option value="{{$level['level']}}" {{$group->level == $level['level'] ? 'selected' : ''}}>{{$level['level_name']}}</option>
+                                                    <option value="{{$level->level}}" {{$group->level == $level->level ? 'selected' : ''}}>{{$level->level_name}}</option>
                                                 @endforeach
                                             @endif
                                         </select>
-                                        <span class="help-block">对应账号级别可见该分组下的节点(向下兼容)</span>
+                                        <span class="help-block">暂无用</span>
                                     </div>
                                 </div>
                             </div>

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

@@ -92,12 +92,12 @@
                                                 </div>
                                             </div>
                                             <div class="form-group">
-                                                <label for="balance" class="col-md-3 control-label">级别</label>
+                                                <label for="level" class="col-md-3 control-label">级别</label>
                                                 <div class="col-md-8">
                                                     <select class="form-control" name="level" id="level">
                                                         @if(!$level_list->isEmpty())
                                                             @foreach($level_list as $level)
-                                                                <option value="{{$level['level']}}" {{$user->level == $level['level'] ? 'selected' : ''}}>{{$level['level_name']}}</option>
+                                                                <option value="{{$level->level}}" {{$user->level == $level->level ? 'selected' : ''}}>{{$level->level_name}}</option>
                                                             @endforeach
                                                         @endif
                                                     </select>
@@ -150,7 +150,7 @@
                                             </div>
                                             <hr>
                                             <div class="form-group">
-                                                <label for="status" class="col-md-3 control-label">标签</label>
+                                                <label for="labels" class="col-md-3 control-label">标签</label>
                                                 <div class="col-md-8">
                                                     <select id="labels" class="form-control select2-multiple" name="labels[]" multiple>
                                                         @foreach($label_list as $label)

+ 5 - 3
resources/views/admin/export.blade.php

@@ -19,9 +19,10 @@
                                 <thead>
                                     <tr class="uppercase">
                                         <th style="width: 10%;">#</th>
-                                        <th style="width: 20%;">节点</th>
-                                        <th style="width: 20%;">识别域名</th>
-                                        <th style="width: 50%;">配置信息</th>
+                                        <th style="width: 15%;">节点</th>
+                                        <th style="width: 15%;">域名</th>
+                                        <th style="width: 15%;">IPv4</th>
+                                        <th style="width: 45%;">配置信息</th>
                                     </tr>
                                 </thead>
                                 <tbody>
@@ -35,6 +36,7 @@
                                                 @if($node->ipv6) <span class="label label-danger">IPv6</span> @endif
                                             </td>
                                             <td>{{$node->server}}</td>
+                                            <td>{{$node->ip}}</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>

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

@@ -85,7 +85,7 @@
                                                 <td> {{$order->user->username}} </td>
                                                 <td> {{$order->goods->name}} </td>
                                                 <td> {{$order->is_expire ? '已过期' : $order->expire_at}} </td>
-                                                <td> {{$order->coupon ? $order->coupon->name : ''}} </td>
+                                                <td> {{$order->coupon ? $order->coupon->name . ' - ' . $order->coupon->sn : ''}} </td>
                                                 <td> ¥{{$order->origin_amount}} </td>
                                                 <td> ¥{{$order->amount}} </td>
                                                 <td> {{$order->pay_way == '1' ? '余额支付' : '有赞云支付'}} </td>

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

@@ -263,7 +263,6 @@
                                                             </div>
                                                         </div>
                                                     </div>
-
                                                     <div class="form-group">
                                                         <div class="col-md-6">
                                                             <label for="initial_labels_for_user" class="col-md-3 control-label">用户初始标签</label>
@@ -280,7 +279,18 @@
                                                                 <span class="help-block"> 注册用户时的初始标签 </span>
                                                             </div>
                                                         </div>
-                                                        <div class="col-md-6"></div>
+                                                        <div class="col-md-6">
+                                                            <label for="register_ip_limit" class="col-md-3 control-label">同IP注册限制</label>
+                                                            <div class="col-md-9">
+                                                                <div class="input-group">
+                                                                    <input class="form-control" type="text" name="register_ip_limit" value="{{$register_ip_limit}}" id="register_ip_limit" />
+                                                                    <span class="input-group-btn">
+                                                                        <button class="btn btn-success" type="button" onclick="setRegisterIpLimit()">修改</button>
+                                                                    </span>
+                                                                </div>
+                                                                <span class="help-block"> 同IP在24小时内允许注册数量,为0时不限制 </span>
+                                                            </div>
+                                                        </div>
                                                     </div>
                                                 </div>
                                             </form>
@@ -1325,6 +1335,24 @@
             });
         }
 
+        // 设置节点订阅随机展示节点数
+        function setRegisterIpLimit() {
+            var register_ip_limit = parseInt($("#register_ip_limit").val());
+
+            if (register_ip_limit < 0) {
+                layer.msg('不能小于0', {time:1000});
+                return ;
+            }
+
+            $.post("{{url('admin/setConfig')}}", {_token:'{{csrf_token()}}', name:'register_ip_limit', value:register_ip_limit}, function (ret) {
+                layer.msg(ret.message, {time:1000}, function() {
+                    if (ret.status == 'fail') {
+                        window.location.reload();
+                    }
+                });
+            });
+        }
+
         // 设置节点订阅随机展示节点数
         function setSubscribeMax() {
             var subscribe_max = parseInt($("#subscribe_max").val());

+ 21 - 3
resources/views/shop/addGoods.blade.php

@@ -3,6 +3,8 @@
 @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" />
+    <link href="/assets/global/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css" />
 @endsection
 @section('title', '控制面板')
 @section('content')
@@ -24,7 +26,7 @@
                     </div>
                 @endif
                 <div class="note note-danger">
-                    <p>警告:用户购买新套餐则会覆盖所有已购但未过期的旧套餐并删除这些旧套餐对应的流量,所以设置商品时请务必注意类型和有效期。</p>
+                    <p>警告:用户购买新套餐则会覆盖所有已购但未过期的旧套餐并删除这些旧套餐对应的流量,所以设置商品时请务必注意类型和有效期,流量包则可叠加。</p>
                 </div>
                 <!-- BEGIN PORTLET-->
                 <div class="portlet light bordered">
@@ -105,6 +107,17 @@
                                         </div>
                                     </div>
                                 </div>
+                                <div class="form-group">
+                                    <label for="labels" class="col-md-3 control-label">标签</label>
+                                    <div class="col-md-6">
+                                        <select id="labels" class="form-control select2-multiple" name="labels[]" multiple>
+                                            @foreach($label_list as $label)
+                                                <option value="{{$label->id}}">{{$label->name}}</option>
+                                            @endforeach
+                                        </select>
+                                        <span class="help-block"> 自动给购买此商品的用户打上相应的标签 </span>
+                                    </div>
+                                </div>
                                 <!--
                                 <div class="form-group">
                                     <label class="control-label col-md-3">所需积分</label>
@@ -114,7 +127,6 @@
                                     </div>
                                 </div>
                                 -->
-
                                 <div class="form-group">
                                     <label class="control-label col-md-3">有效期</label>
                                     <div class="col-md-6">
@@ -163,8 +175,14 @@
     <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 src="/assets/global/plugins/select2/js/select2.full.min.js" type="text/javascript"></script>
     <script type="text/javascript">
+        // 用户标签选择器
+        $('#labels').select2({
+            placeholder: '设置后当用户购买此商品则可见相同标签的节点',
+            allowClear: true
+        });
+
         // 有效期
         $('.input-daterange input').each(function() {
             $(this).datepicker({

+ 21 - 3
resources/views/shop/editGoods.blade.php

@@ -2,6 +2,8 @@
 
 @section('css')
     <link href="/assets/global/plugins/bootstrap-fileinput/bootstrap-fileinput.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/select2/css/select2.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/select2/css/select2-bootstrap.min.css" rel="stylesheet" type="text/css" />
 @endsection
 @section('title', '控制面板')
 @section('content')
@@ -23,7 +25,7 @@
                     </div>
                 @endif
                 <div class="note note-danger">
-                    <p>警告:购买新套餐则会覆盖所有已购但未过期的旧套餐并删除这些旧套餐对应的流量,所以设置商品时请务必注意类型和有效期。</p>
+                    <p>警告:购买新套餐则会覆盖所有已购但未过期的旧套餐并删除这些旧套餐对应的流量,所以设置商品时请务必注意类型和有效期,流量包则可叠加。</p>
                 </div>
                 <!-- BEGIN PORTLET-->
                 <div class="portlet light bordered">
@@ -109,6 +111,17 @@
                                         </div>
                                     </div>
                                 </div>
+                                <div class="form-group">
+                                    <label for="labels" class="col-md-3 control-label">标签</label>
+                                    <div class="col-md-6">
+                                        <select id="labels" class="form-control select2-multiple" name="labels[]" multiple>
+                                            @foreach($label_list as $label)
+                                                <option value="{{$label->id}}" @if(in_array($label->id, $goods->labels)) selected @endif>{{$label->name}}</option>
+                                            @endforeach
+                                        </select>
+                                        <span class="help-block"> 自动给购买此商品的用户打上相应的标签 </span>
+                                    </div>
+                                </div>
                                 <!--
                                 <div class="form-group">
                                     <label class="control-label col-md-3">所需积分</label>
@@ -167,9 +180,14 @@
     <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 src="/assets/global/plugins/select2/js/select2.full.min.js" type="text/javascript"></script>
     <script type="text/javascript">
+        // 用户标签选择器
+        $('#labels').select2({
+            placeholder: '设置后当用户购买此商品则可见相同标签的节点',
+            allowClear: true
+        });
+
         // 有效期
         $('.input-daterange input').each(function() {
             $(this).datepicker({

+ 15 - 0
sql/db.sql

@@ -325,6 +325,7 @@ INSERT INTO `config` VALUES ('53', 'kdt_id', '');
 INSERT INTO `config` VALUES ('54', 'initial_labels_for_user', '');
 INSERT INTO `config` VALUES ('55', 'website_analytics', '');
 INSERT INTO `config` VALUES ('56', 'website_customer_service', '');
+INSERT INTO `config` VALUES ('57', 'register_ip_limit', 5);
 
 
 -- ----------------------------
@@ -758,6 +759,20 @@ CREATE TABLE `user_label` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户标签';
 
 
+-- ----------------------------
+-- Table structure for `goods_label`
+-- ----------------------------
+CREATE TABLE `goods_label` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `goods_id` INT(11) NOT NULL DEFAULT '0' COMMENT '商品ID',
+  `label_id` INT(11) NOT NULL DEFAULT '0' COMMENT '标签ID',
+  PRIMARY KEY (`id`),
+  INDEX `idx` (`goods_id`, `label_id`),
+  INDEX `idx_goods_id` (`goods_id`),
+  INDEX `idx_label_id` (`label_id`)
+) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci' COMMENT='商品标签';
+
+
 -- ----------------------------
 -- Table structure for `country`
 -- ----------------------------

+ 2 - 0
sql/update/20180427.sql

@@ -0,0 +1,2 @@
+-- 加入IP注册限制
+INSERT INTO `config` VALUES ('57', 'register_ip_limit', 5);

+ 10 - 0
sql/update/20180428.sql

@@ -0,0 +1,10 @@
+-- 商品标签
+CREATE TABLE `goods_label` (
+	`id` INT(11) NOT NULL AUTO_INCREMENT,
+	`goods_id` INT(11) NOT NULL DEFAULT '0' COMMENT '商品ID',
+	`label_id` INT(11) NOT NULL DEFAULT '0' COMMENT '标签ID',
+	PRIMARY KEY (`id`),
+	INDEX `idx` (`goods_id`, `label_id`),
+	INDEX `idx_goods_id` (`goods_id`),
+	INDEX `idx_label_id` (`label_id`)
+) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci' COMMENT='商品标签';