Browse Source

Merge pull request #2084 from sspanel-uim/dev

Dev 20230717
M1Screw 2 years ago
parent
commit
11cf73480d

+ 8 - 7
composer.lock

@@ -7359,16 +7359,16 @@
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.21.1",
+            "version": "v3.22.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-                "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86"
+                "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/229b55b3eae4729a8e2a321441ba40fcb3720b86",
-                "reference": "229b55b3eae4729a8e2a321441ba40fcb3720b86",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3",
+                "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3",
                 "shasum": ""
             },
             "require": {
@@ -7378,7 +7378,7 @@
                 "doctrine/lexer": "^2 || ^3",
                 "ext-json": "*",
                 "ext-tokenizer": "*",
-                "php": "^8.0.1",
+                "php": "^7.4 || ^8.0",
                 "sebastian/diff": "^4.0 || ^5.0",
                 "symfony/console": "^5.4 || ^6.0",
                 "symfony/event-dispatcher": "^5.4 || ^6.0",
@@ -7392,6 +7392,7 @@
                 "symfony/stopwatch": "^5.4 || ^6.0"
             },
             "require-dev": {
+                "facile-it/paraunit": "^1.3 || ^2.0",
                 "justinrainbow/json-schema": "^5.2",
                 "keradus/cli-executor": "^2.0",
                 "mikey179/vfsstream": "^1.6.11",
@@ -7443,7 +7444,7 @@
             ],
             "support": {
                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
-                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.21.1"
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.22.0"
             },
             "funding": [
                 {
@@ -7451,7 +7452,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-07-05T21:50:25+00:00"
+            "time": "2023-07-16T23:08:06+00:00"
         },
         {
             "name": "justinrainbow/json-schema",

+ 10 - 0
config/settings.json

@@ -1389,6 +1389,16 @@
         "default": "1",
         "mark": "显示文档"
     },
+    {
+        "id": null,
+        "item": "display_docs_only_for_paid_user",
+        "value": "0",
+        "class": "feature",
+        "is_public": 1,
+        "type": "bool",
+        "default": "0",
+        "mark": "文档仅付费用户可见"
+    },
     {
         "id": null,
         "item": "enable_forced_replacement",

+ 3 - 3
db/migrations/2023020100-init.php

@@ -287,6 +287,7 @@ return new class() implements MigrationInterface {
                 `node_group` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '节点分组',
                 `is_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否封禁',
                 `banned_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '封禁理由',
+                `is_shadow_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于账户异常状态'
                 `telegram_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 'Telegram ID',
                 `expire_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '过期提醒',
                 `traffic_notified` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '流量提醒',
@@ -295,9 +296,8 @@ return new class() implements MigrationInterface {
                 `auto_reset_day` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量日',
                 `auto_reset_bandwidth` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量',
                 `api_token` char(36) NOT NULL DEFAULT '' COMMENT 'API 密钥',
-                `use_new_shop` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用新商店',
-                `is_dark_mode` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用暗黑模式',
-                `is_inactive` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态',
+                `is_dark_mode` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用暗黑模式',
+                `is_inactive` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态',
                 `locale` varchar(16) NOT NULL DEFAULT 'zh-TW' COMMENT '显示语言',
                 PRIMARY KEY (`id`),
                 UNIQUE KEY `uuid` (`uuid`),

+ 0 - 1
db/migrations/2023060300-add_user_locale_and_update_data_type.php

@@ -50,7 +50,6 @@ return new class() implements MigrationInterface {
         ALTER TABLE user MODIFY COLUMN `forbidden_port` varchar(255) NOT NULL DEFAULT '' COMMENT '禁止访问端口';
         ALTER TABLE user MODIFY COLUMN `auto_reset_day` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '自动重置流量日';
         ALTER TABLE user MODIFY COLUMN `auto_reset_bandwidth` decimal(12,2) unsigned NOT NULL DEFAULT 0.00 COMMENT '自动重置流量';
-        ALTER TABLE user MODIFY COLUMN `use_new_shop` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否启用新商店';
         ALTER TABLE user MODIFY COLUMN `is_dark_mode` tinyint(1) NOT NULL DEFAULT 0;
         ALTER TABLE user DROP KEY IF EXISTS `user_name`;
         ALTER TABLE user ADD UNIQUE KEY IF NOT EXISTS `api_token` (`api_token`);

+ 30 - 0
db/migrations/2023071700-add_user_is_shadow_banned.php

@@ -0,0 +1,30 @@
+<?php
+
+declare(strict_types=1);
+
+use App\Interfaces\MigrationInterface;
+use App\Services\DB;
+
+return new class() implements MigrationInterface {
+    public function up(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `is_shadow_banned` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于账户异常状态';
+            ALTER TABLE user MODIFY COLUMN `is_dark_mode` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否启用暗黑模式';
+            ALTER TABLE user MODIFY COLUMN `is_inactive` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否处于闲置状态';
+            ALTER TABLE user DROP COLUMN IF EXISTS `use_new_shop`;
+        ");
+
+        return 2023071700;
+    }
+
+    public function down(): int
+    {
+        DB::getPdo()->exec("
+            ALTER TABLE user DROP COLUMN IF EXISTS `is_shadow_banned`;
+            ALTER TABLE user ADD COLUMN IF NOT EXISTS `use_new_shop` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '是否启用新商店',
+        ");
+
+        return 2023071600;
+    }
+};

+ 2 - 2
resources/views/tabler/admin/header.tpl

@@ -11,12 +11,12 @@
     <!-- CSS files -->
     <link href="//cdn.jsdelivr.net/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet" />
     <link href="//cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet" />
-    <link href="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.css" rel="stylesheet" />
+    <link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
     <!-- JS files -->
     <script src="//cdn.jsdelivr.net/npm/qrcode_js@latest/qrcode.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/clipboard@latest/dist/clipboard.min.js"></script>
     <script src="//cdn.jsdelivr.net/npm/jquery/dist/jquery.min.js"></script>
-    <script src="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.js"></script>
+    <script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
     <style>
         .home-subtitle {
             font-size: 14px;

+ 9 - 0
resources/views/tabler/admin/setting/feature.tpl

@@ -75,6 +75,15 @@
                                         </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="display_docs_only_for_paid_user" class="col form-select" value="{$settings['display_docs_only_for_paid_user']}">
+                                            <option value="0" {if $settings['display_docs_only_for_paid_user'] === false}selected{/if}>关闭</option>
+                                            <option value="1" {if $settings['display_docs_only_for_paid_user']}selected{/if}>开启</option>
+                                        </select>
+                                    </div>
+                                </div>
                             </div>
                         </div>
                     </div>

+ 5 - 7
resources/views/tabler/admin/user/edit.tpl

@@ -121,12 +121,10 @@
                                 </span>
                             </div>
                             <div class="form-group mb-3 row">
-                                <span class="col">使用新的商店系统</span>
-                                <span class="col-auto">
-                                    <label class="form-check form-check-single form-switch">
-                                        <input id="use_new_shop" class="form-check-input" type="checkbox"
-                                            {if $edit_user->use_new_shop}checked="" {/if}>
-                                    </label>
+                                <span class="col">账户异常状态</span>
+                                <span class="col-auto form-check-single form-switch">
+                                    <input id="is_shadow_banned" class="form-check-input" type="checkbox"
+                                            {if $edit_user->is_shadow_banned}checked=""{/if}>
                                 </span>
                             </div>
                             <div class="form-group mb-3 row">
@@ -286,7 +284,7 @@
                 is_admin: $("#is_admin").is(":checked"),
                 is_banned: $("#is_banned").is(":checked"),
                 ga_enable: $("#ga_enable").is(":checked"),
-                use_new_shop: $("#use_new_shop").is(":checked"),
+                is_shadow_banned: $("#is_shadow_banned").is(":checked"),
             },
             success: function(data) {
                 if (data.ret === 1) {

+ 6 - 5
resources/views/tabler/user/header.tpl

@@ -148,11 +148,12 @@
                                         工单
                                     </a>
                                     {/if}
-                                    {if $public_setting['display_docs']}
-                                    <a class="dropdown-item" href="/user/docs">
-                                        <i class="ti ti-notes"></i>&nbsp;
-                                        文档
-                                    </a>
+                                    {if $public_setting['display_docs'] &&
+                                    (! $public_setting['display_docs_only_for_paid_user'] || $user->class !== 0)}
+                                        <a class="dropdown-item" href="/user/docs">
+                                            <i class="ti ti-notes"></i>&nbsp;
+                                            文档
+                                        </a>
                                     {/if}
                                 </div>
                             </li>

+ 2 - 2
resources/views/tabler/user/invoice/index.tpl

@@ -1,7 +1,7 @@
 {include file='user/header.tpl'}
 
-<link href="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.css" rel="stylesheet" />
-<script src="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.js"></script>
+<link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
+<script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">       

+ 2 - 2
resources/views/tabler/user/order/index.tpl

@@ -1,7 +1,7 @@
 {include file='user/header.tpl'}
 
-<link href="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.css" rel="stylesheet" />
-<script src="//cdn.datatables.net/v/bs5/dt-1.13.4/datatables.min.js"></script>
+<link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
+<script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">       

+ 1 - 0
src/Controllers/Admin/Setting/FeatureController.php

@@ -16,6 +16,7 @@ final class FeatureController extends BaseController
         'display_subscribe_log',
         'display_detect_log',
         'display_docs',
+        'display_docs_only_for_paid_user',
     ];
 
     /**

+ 0 - 10
src/Controllers/Admin/TicketController.php

@@ -213,16 +213,6 @@ final class TicketController extends BaseController
             ]);
         }
 
-        $user = User::find($ticket->userid);
-        $user->sendMail(
-            $_ENV['appName'] . '-工单已被关闭',
-            'warn.tpl',
-            [
-                'text' => '你好,你的工单 #'. $ticket->id .' 已被关闭,如果你还有问题,欢迎提交新的工单。',
-            ],
-            []
-        );
-
         $ticket->status = 'closed';
         $ticket->save();
 

+ 2 - 2
src/Controllers/Admin/UserController.php

@@ -72,9 +72,9 @@ final class UserController extends BaseController
         'money',
         'is_admin',
         'ga_enable',
-        'use_new_shop',
         'is_banned',
         'banned_reason',
+        'is_shadow_banned',
         'transfer_enable',
         'invite_num',
         'ref_by',
@@ -190,9 +190,9 @@ final class UserController extends BaseController
         $user->remark = $request->getParam('remark');
         $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
         $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
-        $user->use_new_shop = $request->getParam('use_new_shop') === 'true' ? 1 : 0;
         $user->is_banned = $request->getParam('is_banned') === 'true' ? 1 : 0;
         $user->banned_reason = $request->getParam('banned_reason');
+        $user->is_shadow_banned = $request->getParam('is_shadow_banned') === 'true' ? 1 : 0;
         $user->transfer_enable = Tools::toGB($request->getParam('transfer_enable'));
         $user->invite_num = $request->getParam('invite_num');
         $user->ref_by = $request->getParam('ref_by');

+ 0 - 1
src/Controllers/AuthController.php

@@ -297,7 +297,6 @@ final class AuthController extends BaseController
         $user->reg_date = date('Y-m-d H:i:s');
         $user->reg_ip = $_SERVER['REMOTE_ADDR'];
         $user->theme = $_ENV['theme'];
-        $user->use_new_shop = 1;
         $random_group = Setting::obtain('random_group');
 
         if ($random_group === '') {

+ 11 - 0
src/Controllers/User/DocsController.php

@@ -6,6 +6,7 @@ namespace App\Controllers\User;
 
 use App\Controllers\BaseController;
 use App\Models\Docs;
+use App\Models\Setting;
 use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Slim\Http\Response;
@@ -18,6 +19,11 @@ final class DocsController extends BaseController
      */
     public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
+        if (! Setting::obtain('display_docs') ||
+            (Setting::obtain('display_docs_only_for_paid_user') && $this->user->class === 0)) {
+            return $response->withRedirect('/user');
+        }
+
         $docs = Docs::orderBy('id', 'desc')->get();
 
         return $response->write(
@@ -32,6 +38,11 @@ final class DocsController extends BaseController
      */
     public function detail(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
+        if (! Setting::obtain('display_docs') ||
+            (Setting::obtain('display_docs_only_for_paid_user') && $this->user->class === 0)) {
+            return $response->withRedirect('/user');
+        }
+
         $id = $args['id'];
         $doc = Docs::find($id);
 

+ 7 - 0
src/Controllers/User/InvoiceController.php

@@ -97,6 +97,13 @@ final class InvoiceController extends BaseController
 
         $user = $this->user;
 
+        if ($user->is_shadow_banned) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '支付失败,请稍后再试',
+            ]);
+        }
+
         if ($user->money < $invoice->price) {
             return $response->withJson([
                 'ret' => 0,

+ 7 - 1
src/Controllers/User/MoneyController.php

@@ -43,7 +43,6 @@ final class MoneyController extends BaseController
     {
         $antiXss = new AntiXSS();
         $giftcard_raw = $antiXss->xss_clean($request->getParam('giftcard'));
-
         $giftcard = GiftCard::where('card', $giftcard_raw)->first();
 
         if ($giftcard === null || $giftcard->status !== 0) {
@@ -55,6 +54,13 @@ final class MoneyController extends BaseController
 
         $user = $this->user;
 
+        if ($user->is_shadow_banned) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '礼品卡无效',
+            ]);
+        }
+
         $giftcard->status = 1;
         $giftcard->use_time = time();
         $giftcard->use_user = $user->id;

+ 7 - 0
src/Controllers/User/OrderController.php

@@ -135,6 +135,13 @@ final class OrderController extends BaseController
         $buy_price = $product->price;
         $user = $this->user;
 
+        if ($user->is_shadow_banned) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '商品无效',
+            ]);
+        }
+
         if ($coupon_raw !== '') {
             $coupon = UserCoupon::where('code', $coupon_raw)->first();
 

+ 33 - 0
src/Controllers/User/TicketController.php

@@ -51,10 +51,24 @@ final class TicketController extends BaseController
 
     public function ticketAdd(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
+        if (! Setting::obtain('enable_ticket')) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '暂时无法开启工单,请稍后再试',
+            ]);
+        }
+
         $title = $request->getParam('title') ?? '';
         $comment = $request->getParam('comment') ?? '';
         $type = $request->getParam('type') ?? '';
 
+        if ($this->user->is_shadow_banned) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '暂时无法开启工单,请稍后再试',
+            ]);
+        }
+
         if ($title === '' || $comment === '' || $type === '') {
             return $response->withJson([
                 'ret' => 0,
@@ -84,6 +98,7 @@ final class TicketController extends BaseController
 
         if (Setting::obtain('mail_ticket')) {
             $adminUser = User::where('is_admin', 1)->get();
+
             foreach ($adminUser as $user) {
                 $user->sendMail(
                     $_ENV['appName'] . '-新工单被开启',
@@ -104,9 +119,23 @@ final class TicketController extends BaseController
 
     public function ticketUpdate(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
+        if (! Setting::obtain('enable_ticket')) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '暂时无法回复工单,请稍后再试',
+            ]);
+        }
+
         $id = $args['id'];
         $comment = $request->getParam('comment') ?? '';
 
+        if ($this->user->is_shadow_banned) {
+            return $response->withJson([
+                'ret' => 0,
+                'msg' => '暂时无法回复工单,请稍后再试',
+            ]);
+        }
+
         if ($comment === '') {
             return $response->withJson([
                 'ret' => 0,
@@ -166,6 +195,10 @@ final class TicketController extends BaseController
      */
     public function ticketView(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
+        if (! Setting::obtain('enable_ticket')) {
+            return $response->withRedirect('/user');
+        }
+
         $id = $args['id'];
         $ticket = Ticket::where('id', '=', $id)->where('userid', $this->user->id)->first();
 

+ 4 - 3
src/Models/User.php

@@ -380,7 +380,6 @@ final class User extends Model
     public function killUser(): bool
     {
         $uid = $this->id;
-        $email = $this->email;
 
         DetectBanLog::where('user_id', '=', $uid)->delete();
         DetectLog::where('user_id', '=', $uid)->delete();
@@ -441,9 +440,10 @@ final class User extends Model
         $return = [
             'ok' => true,
         ];
-        if (! $this->isAbleToCheckin()) {
+
+        if (! $this->isAbleToCheckin() || $this->is_shadow_banned) {
             $return['ok'] = false;
-            $return['msg'] = '你似乎已经签到过了...';
+            $return['msg'] = '签到失败,请稍后再试';
         } else {
             try {
                 $traffic = random_int((int) $_ENV['checkinMin'], (int) $_ENV['checkinMax']);
@@ -470,6 +470,7 @@ final class User extends Model
         ];
         $telegram_id = $this->telegram_id;
         $this->telegram_id = 0;
+
         if ($this->save()) {
             if (
                 $_ENV['enable_telegram']

+ 1 - 14
src/Services/Gateway/Epay.php

@@ -141,12 +141,9 @@ final class Epay extends AbstractPayment
 
     public function getReturnHTML($request, $response, $args): ResponseInterface
     {
-        $user = Auth::getUser();
-
         $money = $_GET['money'];
 
-        if ($user->use_new_shop) {
-            $html = <<<HTML
+        $html = <<<HTML
             你已成功充值 {$money} 元,正在跳转..
             <script>
                 setTimeout(function() {
@@ -154,16 +151,6 @@ final class Epay extends AbstractPayment
                 },500)
             </script>
             HTML;
-        } else {
-            $html = <<<HTML
-            你已成功充值 {$money} 元,正在跳转..
-            <script>
-                setTimeout(function() {
-                    location.href="/user/code";
-                },500)
-            </script>
-            HTML;
-        }
 
         return $response->write($html);
     }