浏览代码

feat: admin sub settings

M1Screw 2 年之前
父节点
当前提交
5df5594797

+ 2 - 0
app/routes.php

@@ -226,6 +226,8 @@ return static function (Slim\App $app): void {
         $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':saveSupport');
         $group->get('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':feature');
         $group->post('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':saveFeature');
+        $group->get('/setting/sub', App\Controllers\Admin\Setting\SubscribeController::class . ':sub');
+        $group->post('/setting/sub', App\Controllers\Admin\Setting\SubscribeController::class . ':saveSub');
         $group->post('/setting/test_email', App\Controllers\Admin\Setting\EmailController::class . ':testEmail');
         // 礼品卡
         $group->get('/giftcard', App\Controllers\Admin\GiftCardController::class . ':index');

+ 0 - 1
config/.config.example.php

@@ -70,7 +70,6 @@ $_ENV['subscribeLog_keep_days']     = 7;                            //订阅记
 //订阅设置---------------------------------------------------------------------------------------
 $_ENV['Subscribe']                  = true;                         //本站是否提供订阅功能
 $_ENV['subUrl']                     = $_ENV['baseUrl'];             //订阅地址,如需和站点名称相同,请不要修改
-$_ENV['enable_forced_replacement']  = true;                         //用户修改账户登录密码时,是否强制更换订阅地址
 
 //审计自动封禁设置--------------------------------------------------------------------------------------------
 $_ENV['enable_auto_detect_ban']      = false;       // 审计自动封禁开关

+ 50 - 0
config/settings.json

@@ -1389,6 +1389,56 @@
         "default": "1",
         "mark": "显示用户审计记录"
     },
+    {
+        "id": null,
+        "item": "enable_forced_replacement",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 0,
+        "type": "bool",
+        "default": "1",
+        "mark": "用户修改账户登录密码时,是否强制更换订阅地址"
+    },
+    {
+        "id": null,
+        "item": "enable_traditional_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "传统订阅系统开关"
+    },
+    {
+        "id": null,
+        "item": "enable_ss_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "Shadowsocks 订阅开关"
+    },
+    {
+        "id": null,
+        "item": "enable_v2_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "V2Ray 订阅开关"
+    },
+    {
+        "id": null,
+        "item": "enable_trojan_sub",
+        "value": "1",
+        "class": "subscribe",
+        "is_public": 1,
+        "type": "bool",
+        "default": "1",
+        "mark": "Trojan 订阅开关"
+    },
     {
         "id": null,
         "item": "db_version",

+ 121 - 0
resources/views/tabler/admin/setting/sub.tpl

@@ -0,0 +1,121 @@
+{include file='admin/tabler_header.tpl'}
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">订阅设置</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">设置站点的订阅系统</span>
+                    </div>
+                </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <a id="save-setting" href="#" class="btn btn-primary">
+                            <i class="icon ti ti-device-floppy"></i>
+                            保存
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="row row-deck row-cards">
+                <div class="col-md-12">
+                    <div class="card">
+                    <div class="card-header">
+                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                        <li class="nav-item">
+                            <a href="#sub" class="nav-link active" data-bs-toggle="tab">订阅设置</a>
+                        </li>
+                    </ul>
+                </div>
+                <div class="card-body">
+                    <div class="tab-content">
+                        <div class="tab-pane active show" id="sub">
+                            <div class="card-body">
+                                <div class="form-group mb-3 row">
+                                    <label class="form-label col-3 col-form-label">传统订阅系统开关</label>
+                                    <div class="col">
+                                        <select id="enable_traditional_sub" class="col form-select" value="{$settings['enable_traditional_sub']}">
+                                            <option value="0" {if $settings['enable_traditional_sub'] == false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['enable_traditional_sub'] == true}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="form-group mb-3 row">
+                                    <label class="form-label col-3 col-form-label">Shadowsocks 订阅开关(仅影响前端显示与传统/sip002/sip008订阅)</label>
+                                    <div class="col">
+                                        <select id="enable_ss_sub" class="col form-select" value="{$settings['enable_ss_sub']}">
+                                            <option value="0" {if $settings['enable_ss_sub'] == false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['enable_ss_sub'] == true}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="form-group mb-3 row">
+                                    <label class="form-label col-3 col-form-label">V2Ray 订阅开关(仅影响前端显示与传统订阅)</label>
+                                    <div class="col">
+                                        <select id="enable_v2_sub" class="col form-select" value="{$settings['enable_v2_sub']}">
+                                            <option value="0" {if $settings['enable_v2_sub'] == false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['enable_v2_sub'] == true}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="form-group mb-3 row">
+                                    <label class="form-label col-3 col-form-label">Trojan 订阅开关(仅影响前端显示与传统订阅)</label>
+                                    <div class="col">
+                                        <select id="enable_trojan_sub" class="col form-select" value="{$settings['enable_trojan_sub']}">
+                                            <option value="0" {if $settings['enable_trojan_sub'] == false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['enable_trojan_sub'] == true}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="form-group mb-3 row">
+                                    <label class="form-label col-3 col-form-label">用户修改账户登录密码时,是否强制更换订阅地址</label>
+                                    <div class="col">
+                                        <select id="enable_forced_replacement" class="col form-select" value="{$settings['enable_forced_replacement']}">
+                                            <option value="0" {if $settings['enable_forced_replacement'] == false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['enable_forced_replacement'] == true}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    $("#save-setting").click(function() {
+        $.ajax({
+            url: '/admin/setting/sub',
+            type: 'POST',
+            dataType: "json",
+            data: {
+                {foreach $update_field as $key}
+                {$key}: $('#{$key}').val(),
+                {/foreach}
+            },
+            success: function(data) {
+                if (data.ret == 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
+    });
+</script>
+
+{include file='admin/tabler_footer.tpl'}

+ 50 - 30
resources/views/tabler/user/index.tpl

@@ -102,7 +102,7 @@
                                             </div>
                                             <div class="text-muted">
                                                 {if $user->node_speedlimit !== 0.0}
-                                                    {$user->node_speedlimit}</code> Mbps
+                                                    <code>{$user->node_speedlimit}</code> Mbps
                                                 {else}
                                                     不限制
                                                 {/if}
@@ -125,12 +125,14 @@
                                             &nbsp;通用订阅
                                         </a>
                                     </li>
+                                    {if $public_setting['enable_traditional_sub']}
                                     <li class="nav-item">
                                         <a href="#traditional-sub" class="nav-link" data-bs-toggle="tab">
                                             <i class="ti ti-rss icon"></i>
                                             &nbsp;传统订阅
                                         </a>
                                     </li>
+                                    {/if}
                                     <li class="nav-item">
                                         <a href="#windows" class="nav-link" data-bs-toggle="tab">
                                             <i class="ti ti-brand-windows icon"></i>
@@ -173,61 +175,78 @@
                                         <div class="tab-pane active show" id="sub">
                                             <div>
                                                 <p>
-                                                    通用订阅(json):<code>{$getUniversalSub}/json</code>
+                                                    通用订阅(json):<code>{$UniversalSub}/json</code>
                                                 </p>
                                                 <p>
-                                                    通用订阅(clash):<code>{$getUniversalSub}/clash</code>
+                                                    通用订阅(clash):<code>{$UniversalSub}/clash</code>
                                                 </p>
+                                                {if $public_setting['enable_ss_sub']}
                                                 <p>
-                                                    通用订阅(sip008):<code>{$getUniversalSub}/sip008</code>
+                                                    通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
                                                 </p>
+                                                {/if}
                                                 <div class="btn-list justify-content-start">
-                                                    <a data-clipboard-text="{$getUniversalSub}/json"
+                                                    <a data-clipboard-text="{$UniversalSub}/json"
                                                         class="copy btn btn-primary">
                                                         复制通用订阅(json)
                                                     </a>
-                                                    <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                    <a data-clipboard-text="{$UniversalSub}/clash"
                                                         class="copy btn btn-primary">
                                                         复制通用订阅(clash)
                                                     </a>
-                                                    <a data-clipboard-text="{$getUniversalSub}/sip008"
+                                                    {if $public_setting['enable_ss_sub']}
+                                                    <a data-clipboard-text="{$UniversalSub}/sip008"
                                                        class="copy btn btn-primary">
                                                         复制通用订阅(sip008)
                                                     </a>
+                                                    {/if}
                                                 </div>
                                             </div>
                                         </div>
+                                        {if $public_setting['enable_traditional_sub']}
                                         <div class="tab-pane show" id="traditional-sub">
                                             <div>
+                                                {if $public_setting['enable_ss_sub']}
                                                 <p>
-                                                    传统订阅(Shadowsocks):<code>{$getTraditionalSub}?ss=1</code>
+                                                    传统订阅(Shadowsocks):<code>{$TraditionalSub}?ss=1</code>
                                                 </p>
                                                 <p>
-                                                    传统订阅(Shadowsocks SIP002):<code>{$getTraditionalSub}?sip002=1</code>
+                                                    传统订阅(Shadowsocks SIP002):<code>{$TraditionalSub}?sip002=1</code>
                                                 </p>
+                                                {/if}
+                                                {if $public_setting['enable_v2_sub']}
                                                 <p>
-                                                    传统订阅(V2Ray):<code>{$getTraditionalSub}?v2ray=1</code>
+                                                    传统订阅(V2Ray):<code>{$TraditionalSub}?v2ray=1</code>
                                                 </p>
+                                                {/if}
+                                                {if $public_setting['enable_trojan_sub']}
                                                 <p>
-                                                    传统订阅(Trojan):<code>{$getTraditionalSub}?trojan=1</code>
+                                                    传统订阅(Trojan):<code>{$TraditionalSub}?trojan=1</code>
                                                 </p>
+                                                {/if}
                                                 <div class="btn-list justify-content-start">
-                                                    <a data-clipboard-text="{$getTraditionalSub}?ss=1"
+                                                    {if $public_setting['enable_ss_sub']}
+                                                    <a data-clipboard-text="{$TraditionalSub}?ss=1"
                                                         class="copy btn btn-primary">
                                                         复制传统订阅(Shadowsocks)
                                                     </a>
-                                                    <a data-clipboard-text="{$getTraditionalSub}?sip002=1"
+                                                    <a data-clipboard-text="{$TraditionalSub}?sip002=1"
                                                         class="copy btn btn-primary">
                                                         复制传统订阅(Shadowsocks SIP002)
                                                     </a>
-                                                    <a data-clipboard-text="{$getTraditionalSub}?v2ray=1"
+                                                    {/if}
+                                                    {if $public_setting['enable_v2_sub']}
+                                                    <a data-clipboard-text="{$TraditionalSub}?v2ray=1"
                                                         class="copy btn btn-primary">
                                                         复制传统订阅(V2Ray)
                                                     </a>
-                                                    <a data-clipboard-text="{$getTraditionalSub}?trojan=1"
+                                                    {/if}
+                                                    {if $public_setting['enable_trojan_sub']}
+                                                    <a data-clipboard-text="{$TraditionalSub}?trojan=1"
                                                         class="copy btn btn-primary">
                                                         复制传统订阅(Trojan)
                                                     </a>
+                                                    {/if}
                                                     <a href="/clients/v2rayN-Core.zip"
                                                         class="btn btn-primary">
                                                         下载 v2rayN(Windows)
@@ -239,13 +258,14 @@
                                                 </div>
                                             </div>
                                         </div>
+                                        {/if}
                                         <div class="tab-pane" id="windows">
                                             <div>
                                                 <p>
-                                                    适用于 Clash 的订阅:<code>{$getUniversalSub}/clash</code>
+                                                    适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
                                                 </p>
                                                 <div class="btn-list justify-content-start">
-                                                    <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                    <a data-clipboard-text="{$UniversalSub}/clash"
                                                         class="copy btn btn-primary">
                                                         复制 Clash 订阅链接
                                                     </a>
@@ -253,7 +273,7 @@
                                                         class="btn btn-primary">
                                                         下载 Clash for Windows
                                                     </a>
-                                                    <a href="clash://install-config?url={$getUniversalSub}/clash&name={$config['appName']}"
+                                                    <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
                                                         class="btn btn-primary">
                                                         导入 Clash
                                                     </a>
@@ -262,10 +282,10 @@
                                         </div>
                                         <div class="tab-pane" id="macos">
                                             <p>
-                                                适用于 Clash 的订阅:<code>{$getUniversalSub}/clash</code>
+                                                适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
                                             </p>
                                             <div class="btn-list justify-content-start">
-                                                <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                <a data-clipboard-text="{$UniversalSub}/clash"
                                                     class="copy btn btn-primary">
                                                     复制 Clash 订阅链接
                                                 </a>
@@ -273,7 +293,7 @@
                                                     class="btn btn-primary">
                                                     下载 Clash for Windows
                                                 </a>
-                                                <a href="clash://install-config?url={$getUniversalSub}/clash&name={$config['appName']}"
+                                                <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
                                                     class="btn btn-primary">
                                                     导入 Clash
                                                 </a>
@@ -281,10 +301,10 @@
                                         </div>
                                         <div class="tab-pane" id="android">
                                             <p>
-                                                适用于 Clash 的订阅:<code>{$getUniversalSub}/clash</code>
+                                                适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
                                             </p>
                                             <div class="btn-list justify-content-start">
-                                                <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                <a data-clipboard-text="{$UniversalSub}/clash"
                                                     class="copy btn btn-primary">
                                                     复制 Clash 订阅链接
                                                 </a>
@@ -292,7 +312,7 @@
                                                     class="btn btn-primary">
                                                     下载 Clash for Android
                                                 </a>
-                                                <a href="clash://install-config?url={$getUniversalSub}/clash&name={$config['appName']}"
+                                                <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
                                                     class="btn btn-primary">
                                                     导入 Clash
                                                 </a>
@@ -300,7 +320,7 @@
                                         </div>
                                         <div class="tab-pane" id="ios">
                                             <p>
-                                                适用于 Clash 兼容客户端的订阅:<code>{$getUniversalSub}/clash</code>
+                                                适用于 Clash 兼容客户端的订阅:<code>{$UniversalSub}/clash</code>
                                             </p>
                                             <p>
                                                 在购买并安装 Clash 兼容客户端(比如 Stash)之后,点击<code>复制 Clash 订阅链接</code>按钮,然后打开 Clash 兼容客户端导入即可。
@@ -310,11 +330,11 @@
                                                     class="btn btn-primary">
                                                     购买 Stash
                                                 </a>
-                                                <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                <a data-clipboard-text="{$UniversalSub}/clash"
                                                     class="copy btn btn-primary">
                                                     复制 Clash 订阅链接
                                                 </a>
-                                                <a href="stash://install-config?url={$getUniversalSub}/clash&name={$config['appName']}"
+                                                <a href="stash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
                                                     class="btn btn-primary">
                                                     导入 Stash
                                                 </a>
@@ -322,10 +342,10 @@
                                         </div>
                                         <div class="tab-pane" id="linux">
                                             <p>
-                                                适用于 Clash 的订阅:<code>{$getUniversalSub}/clash</code>
+                                                适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
                                             </p>
                                             <div class="btn-list justify-content-start">
-                                                <a data-clipboard-text="{$getUniversalSub}/clash"
+                                                <a data-clipboard-text="{$UniversalSub}/clash"
                                                     class="copy btn btn-primary">
                                                     复制 Clash 订阅链接
                                                 </a>
@@ -333,7 +353,7 @@
                                                     class="btn btn-primary">
                                                     下载 Clash for Windows
                                                 </a>
-                                                <a href="clash://install-config?url={$getUniversalSub}/clash&name={$config['appName']}"
+                                                <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
                                                     class="btn btn-primary">
                                                     导入 Clash
                                                 </a>

+ 72 - 0
src/Controllers/Admin/Setting/SubscribeController.php

@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controllers\Admin\Setting;
+
+use App\Controllers\BaseController;
+use App\Models\Setting;
+use Exception;
+use function json_encode;
+
+final class SubscribeController extends BaseController
+{
+    public static array $update_field = [
+        'enable_forced_replacement',
+        'enable_traditional_sub',
+        'enable_ss_sub',
+        'enable_v2_sub',
+        'enable_trojan_sub',
+    ];
+
+    /**
+     * @throws Exception
+     */
+    public function sub($request, $response, $args)
+    {
+        $settings = [];
+        $settings_raw = Setting::get(['item', 'value', 'type']);
+
+        foreach ($settings_raw as $setting) {
+            if ($setting->type === 'bool') {
+                $settings[$setting->item] = (bool) $setting->value;
+            } else {
+                $settings[$setting->item] = (string) $setting->value;
+            }
+        }
+
+        return $response->write(
+            $this->view()
+                ->assign('update_field', self::$update_field)
+                ->assign('settings', $settings)
+                ->fetch('admin/setting/sub.tpl')
+        );
+    }
+
+    public function saveSub($request, $response, $args)
+    {
+        $list = self::$update_field;
+
+        foreach ($list as $item) {
+            $setting = Setting::where('item', '=', $item)->first();
+
+            if ($setting->type === 'array') {
+                $setting->value = json_encode($request->getParam($item));
+            } else {
+                $setting->value = $request->getParam($item);
+            }
+
+            if (! $setting->save()) {
+                return $response->withJson([
+                    'ret' => 0,
+                    'msg' => "保存 {$item} 时出错",
+                ]);
+            }
+        }
+
+        return $response->withJson([
+            'ret' => 1,
+            'msg' => '保存成功',
+        ]);
+    }
+}

+ 23 - 0
src/Controllers/LinkController.php

@@ -6,6 +6,7 @@ namespace App\Controllers;
 
 use App\Models\Link;
 use App\Models\Node;
+use App\Models\Setting;
 use App\Models\UserSubscribeLog;
 use Slim\Http\Response;
 use Slim\Http\ServerRequest;
@@ -26,6 +27,12 @@ final class LinkController extends BaseController
                 'ret' => 0,
             ]);
         }
+        //判断是否开启传统订阅
+        if (! Setting::obtain('enable_traditional_sub')) {
+            return $response->withJson([
+                'ret' => 0,
+            ]);
+        }
 
         $token = $args['token'];
         $params = $request->getQueryParams();
@@ -114,6 +121,10 @@ final class LinkController extends BaseController
     public static function getSS($user): string
     {
         $links = '';
+        //判断是否开启SS订阅
+        if (! Setting::obtain('enable_ss_sub')) {
+            return $links;
+        }
         //篩選出用戶能連接的節點
         $nodes_raw = Node::where('type', 1)
             ->where('node_class', '<=', $user->class)
@@ -144,6 +155,10 @@ final class LinkController extends BaseController
     public static function getSIP002($user): string
     {
         $links = '';
+        //判断是否开启SS订阅
+        if (! Setting::obtain('enable_ss_sub')) {
+            return $links;
+        }
         //篩選出用戶能連接的節點
         $nodes_raw = Node::where('type', 1)
             ->where('node_class', '<=', $user->class)
@@ -177,6 +192,10 @@ final class LinkController extends BaseController
     public static function getV2Ray($user): string
     {
         $links = '';
+        //判断是否开启V2Ray订阅
+        if (! Setting::obtain('enable_v2_sub')) {
+            return $links;
+        }
         //篩選出用戶能連接的節點
         $nodes_raw = Node::where('type', 1)
             ->where('node_class', '<=', $user->class)
@@ -229,6 +248,10 @@ final class LinkController extends BaseController
     public static function getTrojan($user): string
     {
         $links = '';
+        //判断是否开启Trojan订阅
+        if (! Setting::obtain('enable_trojan_sub')) {
+            return $links;
+        }
         //篩選出用戶能連接的節點
         $nodes_raw = Node::where('type', 1)
             ->where('node_class', '<=', $user->class)

+ 1 - 1
src/Controllers/PasswordController.php

@@ -118,7 +118,7 @@ final class PasswordController extends BaseController
             return ResponseHelper::error($response, '重置失败,请重试');
         }
 
-        if ($_ENV['enable_forced_replacement'] === true) {
+        if (Setting::obtain('enable_forced_replacement')) {
             $user->cleanLink();
         }
 

+ 5 - 0
src/Controllers/SubController.php

@@ -6,6 +6,7 @@ namespace App\Controllers;
 
 use App\Models\Link;
 use App\Models\Node;
+use App\Models\Setting;
 use App\Models\UserSubscribeLog;
 use App\Utils\Tools;
 use Psr\Http\Message\ResponseInterface;
@@ -353,6 +354,10 @@ final class SubController extends BaseController
     public static function getSIP008($user): array
     {
         $nodes = [];
+        //判断是否开启SS订阅
+        if (! Setting::obtain('enable_ss_sub')) {
+            return $nodes;
+        }
         //篩選出用戶能連接的節點
         $nodes_raw = Node::where('type', 1)
             ->where('node_class', '<=', $user->class)

+ 3 - 3
src/Controllers/UserController.php

@@ -60,8 +60,8 @@ final class UserController extends BaseController
         return $response->write(
             $this->view()
                 ->assign('ann', Ann::orderBy('date', 'desc')->first())
-                ->assign('getUniversalSub', SubController::getUniversalSub($this->user))
-                ->assign('getTraditionalSub', LinkController::getTraditionalSub($this->user))
+                ->assign('UniversalSub', SubController::getUniversalSub($this->user))
+                ->assign('TraditionalSub', LinkController::getTraditionalSub($this->user))
                 ->assign('data', $data)
                 ->assign('captcha', $captcha)
                 ->fetch('user/index.tpl')
@@ -286,7 +286,7 @@ final class UserController extends BaseController
         $user->pass = $hashPwd;
         $user->save();
 
-        if ($_ENV['enable_forced_replacement'] === true) {
+        if (Setting::obtain('enable_forced_replacement')) {
             $user->cleanLink();
         }
 

+ 1 - 1
src/Services/Config.php

@@ -40,7 +40,7 @@ final class Config
             'auto_detect_ban_time' => $_ENV['auto_detect_ban_time'],
             'auto_detect_ban' => $_ENV['auto_detect_ban'],
 
-            'sentry_dsn' => ! isset($_ENV['sentry_dsn']) ? $_ENV['sentry_dsn'] : null,
+            'sentry_dsn' => ! isset($_ENV['sentry_dsn']) ? $_ENV['sentry_dsn'] : '',
         ];
     }
 

+ 2 - 2
update.sh

@@ -18,9 +18,9 @@ do_update_sspanel_dev(){
     rm -r storage/framework/smarty/compile/*
     php composer.phar update
     php composer.phar selfupdate
-    php xcat Migration latest
     php xcat Update
     php xcat Tool importAllSettings
+    php xcat Migration latest
     wget https://cdn.jsdelivr.net/gh/sspanel-uim/qqwry.dat@latest/qqwry.dat -O storage/qqwry.dat 
 }
 
@@ -32,9 +32,9 @@ do_update_sspanel_release(){
     rm -r storage/framework/smarty/compile/*
     php composer.phar update
     php composer.phar selfupdate
-    php xcat Migration $db_version
     php xcat Update
     php xcat Tool importAllSettings
+    php xcat Migration $db_version
     wget https://cdn.jsdelivr.net/gh/sspanel-uim/qqwry.dat@latest/qqwry.dat -O storage/qqwry.dat 
 }