Преглед на файлове

1.网站统计、在线客服配置
2.添加、编辑节点时IPv4、IPv6需要合法

bingo преди 7 години
родител
ревизия
7210cc8267

+ 97 - 54
app/Http/Controllers/AdminController.php

@@ -413,56 +413,74 @@ class AdminController extends Controller
     // 添加节点
     public function addNode(Request $request)
     {
-        if ($request->method() == 'POST') {
-            $ssNode = new SsNode();
-            $ssNode->name = $request->get('name');
-            $ssNode->group_id = $request->get('group_id', 0);
-            $ssNode->country_code = $request->get('country_code', 'un');
-            $ssNode->server = $request->get('server', '');
-            $ssNode->ip = $request->get('ip');
-            $ssNode->ipv6 = $request->get('ipv6');
-            $ssNode->desc = $request->get('desc', '');
-            $ssNode->method = $request->get('method');
-            $ssNode->protocol = $request->get('protocol');
-            $ssNode->protocol_param = $request->get('protocol_param');
-            $ssNode->obfs = $request->get('obfs', '');
-            $ssNode->obfs_param = $request->get('obfs_param', '');
-            $ssNode->traffic_rate = $request->get('traffic_rate', 1);
-            $ssNode->bandwidth = $request->get('bandwidth', 100);
-            $ssNode->traffic = $request->get('traffic', 1000);
-            $ssNode->monitor_url = $request->get('monitor_url', '');
-            $ssNode->compatible = $request->get('compatible', 0);
-            $ssNode->single = $request->get('single', 0);
-            $ssNode->single_force = $request->get('single') ? $request->get('single_force') : 0;
-            $ssNode->single_port = $request->get('single') ? $request->get('single_port') : '';
-            $ssNode->single_passwd = $request->get('single') ? $request->get('single_passwd') : '';
-            $ssNode->single_method = $request->get('single') ? $request->get('single_method') : '';
-            $ssNode->single_protocol = $request->get('single') ? $request->get('single_protocol') : '';
-            $ssNode->single_obfs = $request->get('single') ? $request->get('single_obfs') : '';
-            $ssNode->sort = $request->get('sort', 0);
-            $ssNode->status = $request->get('status', 1);
-            $ssNode->save();
-
-            // 建立分组关联
-            if ($ssNode->id && $request->get('group_id', 0)) {
-                $ssGroupNode = new SsGroupNode();
-                $ssGroupNode->group_id = $request->get('group_id', 0);
-                $ssGroupNode->node_id = $ssNode->id;
-                $ssGroupNode->save();
+        if ($request->isMethod('POST')) {
+            if (false === filter_var($request->get('ip'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败:IPv4地址不合法']);
             }
 
-            // 生成节点标签
-            $labels = $request->get('labels');
-            if ($ssNode->id && !empty($labels)) {
-                foreach ($labels as $label) {
-                    $ssNodeLabel = new SsNodeLabel();
-                    $ssNodeLabel->node_id = $ssNode->id;
-                    $ssNodeLabel->label_id = $label;
-                    $ssNodeLabel->save();
-                }
+            if (false === filter_var($request->get('ipv6'), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败:IPv6地址不合法']);
             }
 
-            return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+            DB::beginTransaction();
+            try {
+                $ssNode = new SsNode();
+                $ssNode->name = $request->get('name');
+                $ssNode->group_id = $request->get('group_id', 0);
+                $ssNode->country_code = $request->get('country_code', 'un');
+                $ssNode->server = $request->get('server', '');
+                $ssNode->ip = $request->get('ip');
+                $ssNode->ipv6 = $request->get('ipv6');
+                $ssNode->desc = $request->get('desc', '');
+                $ssNode->method = $request->get('method');
+                $ssNode->protocol = $request->get('protocol');
+                $ssNode->protocol_param = $request->get('protocol_param');
+                $ssNode->obfs = $request->get('obfs', '');
+                $ssNode->obfs_param = $request->get('obfs_param', '');
+                $ssNode->traffic_rate = $request->get('traffic_rate', 1);
+                $ssNode->bandwidth = $request->get('bandwidth', 100);
+                $ssNode->traffic = $request->get('traffic', 1000);
+                $ssNode->monitor_url = $request->get('monitor_url', '');
+                $ssNode->compatible = $request->get('compatible', 0);
+                $ssNode->single = $request->get('single', 0);
+                $ssNode->single_force = $request->get('single') ? $request->get('single_force') : 0;
+                $ssNode->single_port = $request->get('single') ? $request->get('single_port') : '';
+                $ssNode->single_passwd = $request->get('single') ? $request->get('single_passwd') : '';
+                $ssNode->single_method = $request->get('single') ? $request->get('single_method') : '';
+                $ssNode->single_protocol = $request->get('single') ? $request->get('single_protocol') : '';
+                $ssNode->single_obfs = $request->get('single') ? $request->get('single_obfs') : '';
+                $ssNode->sort = $request->get('sort', 0);
+                $ssNode->status = $request->get('status', 1);
+                $ssNode->save();
+
+                // 建立分组关联
+                if ($ssNode->id && $request->get('group_id', 0)) {
+                    $ssGroupNode = new SsGroupNode();
+                    $ssGroupNode->group_id = $request->get('group_id', 0);
+                    $ssGroupNode->node_id = $ssNode->id;
+                    $ssGroupNode->save();
+                }
+
+                // 生成节点标签
+                $labels = $request->get('labels');
+                if ($ssNode->id && !empty($labels)) {
+                    foreach ($labels as $label) {
+                        $ssNodeLabel = new SsNodeLabel();
+                        $ssNodeLabel->node_id = $ssNode->id;
+                        $ssNodeLabel->label_id = $label;
+                        $ssNodeLabel->save();
+                    }
+                }
+
+                DB::commit();
+
+                return Response::json(['status' => 'success', 'data' => '', 'message' => '添加成功']);
+            } catch (\Exception $e) {
+                DB::rollBack();
+                Log::error('添加节点信息异常:' . $e->getMessage());
+
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败:' . $e->getMessage()]);
+            }
         } else {
             $view['method_list'] = $this->methodList();
             $view['protocol_list'] = $this->protocolList();
@@ -510,6 +528,14 @@ class AdminController extends Controller
             $sort = $request->get('sort');
             $status = $request->get('status');
 
+            if (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败:IPv4地址不合法']);
+            }
+
+            if (false === filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '添加失败:IPv6地址不合法']);
+            }
+
             DB::beginTransaction();
             try {
                 $data = [
@@ -573,7 +599,7 @@ class AdminController extends Controller
                 DB::rollBack();
                 Log::error('编辑节点信息异常:' . $e->getMessage());
 
-                return Response::json(['status' => 'fail', 'data' => '', 'message' => '编辑失败']);
+                return Response::json(['status' => 'fail', 'data' => '', 'message' => '编辑失败' . $e->getMessage()]);
             }
         } else {
             $node = SsNode::query()->with(['label'])->where('id', $id)->first();
@@ -620,6 +646,7 @@ class AdminController extends Controller
             return Response::json(['status' => 'success', 'data' => '', 'message' => '删除成功']);
         } catch (\Exception $e) {
             DB::rollBack();
+            Log::error('删除节点信息异常:' . $e->getMessage());
 
             return Response::json(['status' => 'fail', 'data' => '', 'message' => '删除失败:' . $e->getMessage()]);
         }
@@ -748,7 +775,7 @@ class AdminController extends Controller
         $view['groupList'] = SsGroup::query()->paginate(10)->appends($request->except('page'));
 
         $level_list = $this->levelList();
-        $level_dict = array();
+        $level_dict = [];
         foreach ($level_list as $level) {
             $level_dict[$level['level']] = $level['level_name'];
         }
@@ -1041,14 +1068,14 @@ class AdminController extends Controller
             }
 
             $save_path = realpath(storage_path('uploads'));
-            $new_name = md5($file->getClientOriginalExtension()) . 'json';
+            $new_name = md5($file->getClientOriginalExtension()) . '.json';
             $file->move($save_path, $new_name);
 
             // 读取文件内容
             $data = file_get_contents($save_path . '/' . $new_name);
             $data = json_decode($data);
             if (!$data) {
-                $request->session()->flash('errorMsg', '内容格式解析异常,请上传符合SSR配置规范的JSON文件');
+                $request->session()->flash('errorMsg', '内容格式解析异常,请上传符合SSR(R)配置规范的JSON文件');
 
                 return Redirect::back();
             }
@@ -1350,6 +1377,22 @@ class AdminController extends Controller
         return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
     }
 
+    // 设置系统扩展信息,例如客服、统计代码
+    public function setExtend(Request $request)
+    {
+        $websiteAnalytics = $request->get('website_analytics');
+        $websiteCustomerService = $request->get('website_customer_service');
+
+        try {
+            Config::query()->where('name', 'website_analytics')->update(['value' => $websiteAnalytics]);
+            Config::query()->where('name', 'website_customer_service')->update(['value' => $websiteCustomerService]);
+
+            return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+        } catch (\Exception $e) {
+            return Response::json(['status' => 'success', 'data' => '', 'message' => '操作成功']);
+        }
+    }
+
     // 日志分析
     public function analysis(Request $request)
     {
@@ -1709,15 +1752,15 @@ class AdminController extends Controller
         $filename = '邀请码' . date('Ymd');
         Excel::create($filename, function ($excel) use ($inviteList) {
             $excel->sheet('邀请码', function ($sheet) use ($inviteList) {
-                $sheet->row(1, array(
+                $sheet->row(1, [
                     '邀请码', '有效期'
-                ));
+                ]);
 
                 if (!$inviteList->isEmpty()) {
                     foreach ($inviteList as $k => $vo) {
-                        $sheet->row($k + 2, array(
+                        $sheet->row($k + 2, [
                             $vo->code, $vo->dateline
-                        ));
+                        ]);
                     }
                 }
             });

+ 2 - 0
app/Http/Controllers/LoginController.php

@@ -125,6 +125,8 @@ class LoginController extends Controller
 
             $view['is_captcha'] = self::$config['is_captcha'];
             $view['is_register'] = self::$config['is_register'];
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
 
             return Response::view('login', $view);
         }

+ 2 - 0
app/Http/Controllers/PaymentController.php

@@ -140,6 +140,8 @@ class PaymentController extends Controller
         }
 
         $view['payment'] = $payment;
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
 
         return Response::view('payment/detail', $view);
     }

+ 2 - 0
app/Http/Controllers/RegisterController.php

@@ -197,6 +197,8 @@ class RegisterController extends Controller
             $view['is_captcha'] = self::$config['is_captcha'];
             $view['is_register'] = self::$config['is_register'];
             $view['is_invite_register'] = self::$config['is_invite_register'];
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
 
             return Response::view('register', $view);
         }

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

@@ -63,6 +63,8 @@ class UserController extends Controller
         $view['wechat_qrcode'] = self::$config['wechat_qrcode'];
         $view['alipay_qrcode'] = self::$config['alipay_qrcode'];
         $view['login_add_score'] = self::$config['login_add_score'];
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
 
         // 推广返利是否可见
         if (!$request->session()->has('referral_status')) {
@@ -146,6 +148,9 @@ class UserController extends Controller
             return Redirect::to('user');
         }
 
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
+
         return Response::view('user/article', $view);
     }
 
@@ -259,6 +264,8 @@ class UserController extends Controller
             $view['protocol_list'] = $this->protocolList();
             $view['obfs_list'] = $this->obfsList();
             $view['info'] = User::query()->where('id', $user['id'])->first();
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
 
             return Response::view('user/profile', $view);
         }
@@ -287,6 +294,8 @@ class UserController extends Controller
 
         $view['trafficDaily'] = "'" . implode("','", $dailyData) . "'";
         $view['trafficHourly'] = "'" . implode("','", $hourlyData) . "'";
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
 
         return Response::view('user/trafficLog', $view);
     }
@@ -301,6 +310,8 @@ class UserController extends Controller
         }
 
         $view['goodsList'] = $goodsList;
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
 
         return Response::view('user/goodsList', $view);
     }
@@ -310,6 +321,8 @@ class UserController extends Controller
     {
         $user = $request->session()->get('user');
 
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
         $view['ticketList'] = Ticket::query()->where('user_id', $user['id'])->paginate(10)->appends($request->except('page'));
 
         return Response::view('user/ticketList', $view);
@@ -329,6 +342,8 @@ class UserController extends Controller
         }
 
         $view['orderList'] = $orderList;
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
 
         return Response::view('user/orderList', $view);
     }
@@ -430,6 +445,8 @@ class UserController extends Controller
 
             $view['ticket'] = $ticket;
             $view['replyList'] = TicketReply::query()->where('ticket_id', $id)->with('user')->orderBy('id', 'asc')->get();
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
 
             return Response::view('user/replyTicket', $view);
         }
@@ -458,6 +475,8 @@ class UserController extends Controller
         // 已生成的邀请码数量
         $num = Invite::query()->where('uid', $user['id'])->count();
 
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
         $view['num'] = self::$config['invite_num'] - $num <= 0 ? 0 : self::$config['invite_num'] - $num; // 还可以生成的邀请码数量
         $view['inviteList'] = Invite::query()->where('uid', $user['id'])->with(['generator', 'user'])->paginate(10); // 邀请码列表
 
@@ -467,6 +486,8 @@ class UserController extends Controller
     // 公开的邀请码列表
     public function free(Request $request)
     {
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
         $view['is_invite_register'] = self::$config['is_invite_register'];
         $view['is_free_code'] = self::$config['is_free_code'];
         $view['inviteList'] = Invite::query()->where('uid', 1)->where('status', 0)->paginate();
@@ -685,6 +706,8 @@ class UserController extends Controller
 
             return Redirect::back();
         } else {
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
             $view['is_reset_password'] = self::$config['is_reset_password'];
 
             return Response::view('user/resetPassword', $view);
@@ -937,6 +960,8 @@ class UserController extends Controller
             $goods->traffic = flowAutoShow($goods->traffic * 1048576);
             $view['goods'] = $goods;
             $view['is_youzan'] = self::$config['is_youzan'];
+            $view['website_analytics'] = self::$config['website_analytics'];
+            $view['website_customer_service'] = self::$config['website_customer_service'];
 
             return Response::view('user/addOrder', $view);
         }
@@ -991,6 +1016,8 @@ class UserController extends Controller
         // 生成个人推广链接
         $user = $request->session()->get('user');
 
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
         $view['referral_traffic'] = flowAutoShow(self::$config['referral_traffic'] * 1048576);
         $view['referral_percent'] = self::$config['referral_percent'];
         $view['referral_money'] = self::$config['referral_money'];
@@ -1066,6 +1093,8 @@ class UserController extends Controller
             $code = $subscribe->code;
         }
 
+        $view['website_analytics'] = self::$config['website_analytics'];
+        $view['website_customer_service'] = self::$config['website_customer_service'];
         $view['link'] = self::$config['subscribe_domain'] ? self::$config['subscribe_domain'] . '/s/' . $code : self::$config['website_url'] . '/s/' . $code;
 
         return Response::view('/user/subscribe', $view);

+ 12 - 8
readme.md

@@ -3,12 +3,12 @@
 1.多节点账号管理面板,兼容SS、SSRR
 2.需配合SSR或SSRR版后端使用
 3.强大的管理后台、美观的界面、简单易用的开关、支持移动端自适应
-4.内含简单的购物、卡券、邀请码、推广返利&提现、文章管理、工单等模块
+4.内含简单的购物、卡券、邀请码、推广返利&提现、文章管理、工单(回复带邮件提醒)等模块
 5.用户、节点标签化,不同用户可见不同节点
-6.SS配置转SSR配置,轻松一键导入SS账号
+6.SS配置转SSR(R)配置,轻松一键导入SS账号
 7.单机单节点日志分析功能
 8.账号、节点24小时和近30天内的流量监控
-9.所有邮件投递都有记录
+9.邮件、serverChan投递都有记录
 10.账号临近到期、流量不够会自动发邮件提醒,自动禁用到期、流量异常的账号,自动清除日志等各种强大的定时任务
 11.后台一键添加加密方式、混淆、协议、等级
 12.强大的后台一键配置功能
@@ -20,7 +20,8 @@
 18.订阅防投毒机制
 19.自动释放端口机制,防止端口被大量长期占用
 20.封特定国家、地区、封IP段
-21.支持有赞云支付
+21.有赞云支付
+22.开放API,方便自行定制改造客户端
 ````
 
 ## 演示&交流
@@ -32,6 +33,8 @@ telegram千人讨论群已解散,有问题提issues
 ````
 
 ## 捐赠
+**ETH** : 0x968f797f194fcec05ea571723199748b58de38ba
+
 ![支持作者](https://github.com/ssrpanel/ssrpanel/blob/master/public/assets/images/donate.jpeg?raw=true)
 
 [VPS推荐&购买经验](https://github.com/ssrpanel/SSRPanel/wiki/VPS%E6%8E%A8%E8%8D%90&%E8%B4%AD%E4%B9%B0%E7%BB%8F%E9%AA%8C)
@@ -131,8 +134,8 @@ service php-fpm restart
 crontab加入如下命令(请自行修改php、ssrpanel路径):
 * * * * * php /home/wwwroot/SSRPanel/artisan schedule:run >> /dev/null 2>&1
 
-注意运行权限,必须跟ssrpanel项目权限一致:
-例如用lnmp的话默认权限用户组是 www:www,则添加定时任务是这样的:
+注意运行权限,必须跟ssrpanel项目权限一致,否则出现无权限报错
+例如用lnmp的话默认权限用户组是 www:www,则添加定时任务是这样的,宝塔自己搞定
 crontab -e -u www
 ````
 
@@ -180,6 +183,7 @@ crontab -e -u www
 ## 英文版
 ````
 修改 config/app.php 下的 locale 值为 en
+欢迎提交其他语言的语言包,语言包在:resources/lang下
 ````
 
 ## 日志分析(仅支持单机单节点)
@@ -238,9 +242,9 @@ vim user-config.json
     "80": {
         "passwd": "统一认证密码", // 例如 SSRP4ne1,推荐不要出现除大小写字母数字以外的任何字符
         "method": "统一认证加密方式", // 例如 aes-128-ctr
-        "protocol": "统一认证协议", // 可选值:orgin、verify_deflate、auth_sha1_v4、auth_aes128_md5(推荐)、auth_aes128_sha1(推荐)、auth_chain_a(强烈推荐)
+        "protocol": "统一认证协议", // 可选值:orgin、verify_deflate、auth_sha1_v4、auth_aes128_md5、auth_aes128_sha1、auth_chain_a
         "protocol_param": "#", // #号前面带上数字,则可以限制在线每个用户的最多在线设备数,仅限 auth_chain_a 协议下有效,例如: 3# 表示限制最多3个设备在线
-        "obfs": "tls1.2_ticket_auth", // 可选值:plain、http_simple(该值下客户端可用http_post)、random_head、tls1.2_ticket_auth(强烈推荐)
+        "obfs": "tls1.2_ticket_auth", // 可选值:plain、http_simple、http_post、random_head、tls1.2_ticket_auth
         "obfs_param": ""
     },
     "443": {

+ 3 - 3
resources/lang/zh-CN/register.php

@@ -3,9 +3,9 @@
 return [
     'title' => '注册',
     'username' => '用户名',
-    'username_placeholder' => '请入邮箱',
-    'password' => '密码',
-    'retype_password' => '重复密码',
+    'username_placeholder' => '请入邮箱',
+    'password' => '请填入密码',
+    'retype_password' => '请再次填入密码',
     'code' => '邀请码',
     'captcha' => '验证码',
     'tnc_button' => '我已阅读并同意遵守',

+ 43 - 0
resources/views/admin/system.blade.php

@@ -43,6 +43,9 @@
                                         <li>
                                             <a href="#tab_7" data-toggle="tab"> 有赞云设置 </a>
                                         </li>
+                                        <li>
+                                            <a href="#tab_8" data-toggle="tab"> 客服、统计设置 </a>
+                                        </li>
                                     </ul>
                                 </div>
                                 <div class="portlet-body">
@@ -617,6 +620,27 @@
                                                 </div>
                                             </form>
                                         </div>
+                                        <div class="tab-pane" id="tab_8">
+                                            <form action="{{url('admin/setExtend')}}" method="post" class="form-horizontal" role="form" onsubmit="return submitExtend();">
+                                                <div class="form-group">
+                                                    <label for="website_analytics" class="col-md-2 control-label">统计代码</label>
+                                                    <div class="col-md-8">
+                                                        <textarea class="form-control" rows="10" name="website_analytics" id="website_analytics">{{$website_analytics}}</textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="form-group">
+                                                    <label for="website_customer_service" class="col-md-2 control-label">客服代码</label>
+                                                    <div class="col-md-8">
+                                                        <textarea class="form-control" rows="10" name="website_customer_service" id="website_customer_service">{{$website_customer_service}}</textarea>
+                                                    </div>
+                                                </div>
+                                                <div class="form-group">
+                                                    <div class="col-md-offset-2 col-md-10">
+                                                        <button type="submit" class="btn blue">提交</button>
+                                                    </div>
+                                                </div>
+                                            </form>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -637,6 +661,25 @@
     <script src="/js/layer/layer.js" type="text/javascript"></script>
 
     <script type="text/javascript">
+        // 设置客服、统计代码
+        function submitExtend() {
+            var website_analytics = $('#website_analytics').val();
+            var website_customer_service = $('#website_customer_service').val();
+
+            $.ajax({
+                type: "POST",
+                url: "{{url('admin/setExtend')}}",
+                async: false,
+                data: {_token:'{{csrf_token()}}', website_analytics:website_analytics, website_customer_service:website_customer_service},
+                dataType: 'json',
+                success: function (ret) {
+                    layer.msg(ret.message, {time:1000});
+                }
+            });
+
+            return false;
+        }
+
         $('#initial_labels_for_user').select2({
             placeholder: '设置后则可见相同标签的节点',
             allowClear: true,

+ 61 - 67
resources/views/login.blade.php

@@ -102,83 +102,77 @@
 <script src="/assets/global/plugins/excanvas.min.js"></script>
 <script src="/assets/global/plugins/ie8.fix.min.js"></script>
 <![endif]-->
-<!-- BEGIN CORE PLUGINS -->
 <script src="/assets/global/plugins/jquery.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
-<!-- END CORE PLUGINS -->
-<!-- BEGIN PAGE LEVEL PLUGINS -->
 <script src="/assets/global/plugins/jquery-validation/js/jquery.validate.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/jquery-validation/js/additional-methods.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/jquery-validation/js/localization/messages_zh.min.js" type="text/javascript"></script>
+<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
+<script src="/assets/pages/scripts/login.js" type="text/javascript"></script>
 <script type="text/javascript">
     // 雪花特效
     /*
-    (function () {
-        var style = document.createElement("style");
-        style.innerText = "body .snow{position: fixed;color: #fff;line-height: 1;text-shadow: 0 0 .2em #ffffff;z-index: 2;}";
-        document.getElementsByTagName("head")[0].appendChild(style);
+     (function () {
+     var style = document.createElement("style");
+     style.innerText = "body .snow{position: fixed;color: #fff;line-height: 1;text-shadow: 0 0 .2em #ffffff;z-index: 2;}";
+     document.getElementsByTagName("head")[0].appendChild(style);
 
-        var dpr = ~~document.documentElement.getAttribute("data-dpr") || 1;
-        var wWidth = window.innerWidth;
-        var wHeight = window.innerHeight;
-        var maxNum = wWidth / 50;
-        var snowArr = [];
-        function createSnow (r) {
-            var size = Math.random() + .8;
-            var left = wWidth * Math.random();
-            var speed = (Math.random() * .5 + .6) * size * dpr;
-            var snow = document.createElement("div");
-            snow.innerText = "❅";
-            snow.className = "snow";
-            var text = "";
-            text += "font-size:";
-            text += size;
-            text += "em;left:";
-            text += left;
-            text += "px;bottom:100%;";
-            snow.style.cssText = text;
-            document.body.appendChild(snow);
-            var top = r ? wHeight * Math.random() : (-snow.offsetHeight);
-            snow.style.top = top + "px";
-            snow.style.bottom = "auto";
-            return {
-                snow: snow,
-                speed: speed,
-                top: top
-            }
-        }
-        function draw () {
-            for (var i = 0; i < maxNum; i++) {
-                if (!snowArr[i]) {
-                    if (typeof snowArr[i] == "undefined") {
-                        snowArr[i] = createSnow(true);
-                    } else {
-                        snowArr[i] = createSnow();
-                    }
-                }
-                var data = snowArr[i];
-                data.top += data.speed;
-                data.snow.style.top = data.top + "px";
-                if (data.top > wHeight) {
-                    document.body.removeChild(data.snow);
-                    snowArr[i] = null;
-                }
-            }
-            requestAnimationFrame(draw);
-        }
-        draw();
-    })();
-    */
+     var dpr = ~~document.documentElement.getAttribute("data-dpr") || 1;
+     var wWidth = window.innerWidth;
+     var wHeight = window.innerHeight;
+     var maxNum = wWidth / 50;
+     var snowArr = [];
+     function createSnow (r) {
+     var size = Math.random() + .8;
+     var left = wWidth * Math.random();
+     var speed = (Math.random() * .5 + .6) * size * dpr;
+     var snow = document.createElement("div");
+     snow.innerText = "❅";
+     snow.className = "snow";
+     var text = "";
+     text += "font-size:";
+     text += size;
+     text += "em;left:";
+     text += left;
+     text += "px;bottom:100%;";
+     snow.style.cssText = text;
+     document.body.appendChild(snow);
+     var top = r ? wHeight * Math.random() : (-snow.offsetHeight);
+     snow.style.top = top + "px";
+     snow.style.bottom = "auto";
+     return {
+     snow: snow,
+     speed: speed,
+     top: top
+     }
+     }
+     function draw () {
+     for (var i = 0; i < maxNum; i++) {
+     if (!snowArr[i]) {
+     if (typeof snowArr[i] == "undefined") {
+     snowArr[i] = createSnow(true);
+     } else {
+     snowArr[i] = createSnow();
+     }
+     }
+     var data = snowArr[i];
+     data.top += data.speed;
+     data.snow.style.top = data.top + "px";
+     if (data.top > wHeight) {
+     document.body.removeChild(data.snow);
+     snowArr[i] = null;
+     }
+     }
+     requestAnimationFrame(draw);
+     }
+     draw();
+     })();
+     */
 </script>
-<!-- END PAGE LEVEL PLUGINS -->
-<!-- BEGIN THEME GLOBAL SCRIPTS -->
-<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
-<!-- END THEME GLOBAL SCRIPTS -->
-<!-- BEGIN PAGE LEVEL SCRIPTS -->
-<script src="/assets/pages/scripts/login.js" type="text/javascript"></script>
-<!-- END PAGE LEVEL SCRIPTS -->
-<!-- BEGIN THEME LAYOUT SCRIPTS -->
-<!-- END THEME LAYOUT SCRIPTS -->
+<!-- 统计 -->
+{!! $website_analytics !!}
+<!-- 客服 -->
+{!! $website_customer_service !!}
 </body>
 
 </html>

+ 6 - 8
resources/views/register.blade.php

@@ -103,12 +103,10 @@
 <script src="/assets/global/plugins/excanvas.min.js"></script>
 <script src="/assets/global/plugins/ie8.fix.min.js"></script>
 <![endif]-->
-<!-- BEGIN CORE PLUGINS -->
 <script src="/assets/global/plugins/jquery.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
-<!-- END CORE PLUGINS -->
-<!-- BEGIN PAGE LEVEL PLUGINS -->
-<!-- END PAGE LEVEL PLUGINS -->
+<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
+<script src="/js/layer/layer.js" type="text/javascript"></script>
 <script type="text/javascript">
     // 登录
     function login() {
@@ -139,10 +137,10 @@
         });
     }
 </script>
-<!-- BEGIN THEME GLOBAL SCRIPTS -->
-<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
-<script src="/js/layer/layer.js" type="text/javascript"></script>
-<!-- END THEME GLOBAL SCRIPTS -->
+<!-- 统计 -->
+{!! $website_analytics !!}
+<!-- 客服 -->
+{!! $website_customer_service !!}
 </body>
 
 </html>

+ 4 - 8
resources/views/user/free.blade.php

@@ -134,22 +134,18 @@
 <script src="/assets/global/plugins/excanvas.min.js"></script>
 <script src="/assets/global/plugins/ie8.fix.min.js"></script>
 <![endif]-->
-<!-- BEGIN CORE PLUGINS -->
 <script src="/assets/global/plugins/jquery.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/js.cookie.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/jquery-slimscroll/jquery.slimscroll.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/jquery.blockui.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/bootstrap-switch/js/bootstrap-switch.min.js" type="text/javascript"></script>
-<!-- END CORE PLUGINS -->
-<!-- BEGIN PAGE LEVEL PLUGINS -->
-<!-- END PAGE LEVEL PLUGINS -->
-<!-- BEGIN THEME GLOBAL SCRIPTS -->
 <script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
-<!-- END THEME GLOBAL SCRIPTS -->
-<!-- BEGIN THEME LAYOUT SCRIPTS -->
 <script src="/assets/layouts/layout4/scripts/layout.min.js" type="text/javascript"></script>
-<!-- END THEME LAYOUT SCRIPTS -->
+<!-- 统计 -->
+{!! $website_analytics !!}
+<!-- 客服 -->
+{!! $website_customer_service !!}
 </body>
 
 </html>

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

@@ -229,6 +229,10 @@
 <!-- BEGIN THEME LAYOUT SCRIPTS -->
 <script src="/assets/layouts/layout4/scripts/layout.min.js" type="text/javascript"></script>
 <!-- END THEME LAYOUT SCRIPTS -->
+<!-- 统计 -->
+{!! $website_analytics !!}
+<!-- 客服 -->
+{!! $website_customer_service !!}
 </body>
 
 </html>

+ 5 - 5
resources/views/user/resetPassword.blade.php

@@ -80,19 +80,19 @@
 <script src="/assets/global/plugins/excanvas.min.js"></script>
 <script src="/assets/global/plugins/ie8.fix.min.js"></script>
 <![endif]-->
-<!-- BEGIN CORE PLUGINS -->
 <script src="/assets/global/plugins/jquery.min.js" type="text/javascript"></script>
 <script src="/assets/global/plugins/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
-<!-- END CORE PLUGINS -->
+<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
 <script type="text/javascript">
     // 登录
     function login() {
         window.location.href = '{{url('login')}}';
     }
 </script>
-<!-- BEGIN THEME GLOBAL SCRIPTS -->
-<script src="/assets/global/scripts/app.min.js" type="text/javascript"></script>
-<!-- END THEME GLOBAL SCRIPTS -->
+<!-- 统计 -->
+{!! $website_analytics !!}
+<!-- 客服 -->
+{!! $website_customer_service !!}
 </body>
 
 </html>

+ 1 - 0
routes/web.php

@@ -48,6 +48,7 @@ Route::group(['middleware' => ['forbidden', 'user', 'admin']], function () {
     Route::get('admin/applyDetail', 'AdminController@applyDetail'); // 提现申请管理
     Route::post('admin/setApplyStatus', 'AdminController@setApplyStatus'); // 设置提现申请状态
     Route::any('admin/config', 'AdminController@config'); // 配置列表
+    Route::post('admin/setExtend', 'AdminController@setExtend'); // 设置客服、统计代码
     Route::any('admin/addConfig', 'AdminController@addConfig'); // 添加配置
     Route::post('admin/delConfig', 'AdminController@delConfig'); // 删除配置
     Route::post('admin/addLevel', 'AdminController@addLevel'); // 增加等级

+ 3 - 1
sql/db.sql

@@ -261,7 +261,7 @@ INSERT INTO `ss_config` VALUES ('37', 'auth_chain_f', '2', '0', '0', '2017-08-01
 CREATE TABLE `config` (
   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
   `name` varchar(255) NOT NULL DEFAULT '' COMMENT '配置名',
-  `value` varchar(255) NOT NULL DEFAULT '' COMMENT '配置值',
+  `value` TEXT NULL COMMENT '配置值',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';
 
@@ -323,6 +323,8 @@ INSERT INTO `config` VALUES ('51', 'youzan_client_id', '');
 INSERT INTO `config` VALUES ('52', 'youzan_client_secret', '');
 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', '');
 
 
 -- ----------------------------

+ 7 - 0
sql/update/20180413.sql

@@ -0,0 +1,7 @@
+-- config表字段类型变更,为了加入统计代码和客服代码
+ALTER TABLE `config`
+CHANGE COLUMN `value` `value` TEXT NULL COMMENT '配置值' AFTER `name`;
+
+-- 加入网站统计代码、在线客服代码
+INSERT INTO `config` VALUES ('55', 'website_analytics', '');
+INSERT INTO `config` VALUES ('56', 'website_customer_service', '');