Explorar o código

perf: optimize db data types

M1Screw %!s(int64=2) %!d(string=hai) anos
pai
achega
56eb0983dc

+ 1 - 1
composer.json

@@ -23,7 +23,7 @@
         "league/html-to-markdown": "^5.1",
         "league/omnipay": "^3.2.1",
         "mailgun/mailgun-php": "^3",
-        "openai-php/client": "^0.5.1",
+        "openai-php/client": "^0.6.1",
         "ozdemir/datatables": "^2",
         "phpmailer/phpmailer": "^6",
         "postal/postal": "^1.0",

+ 43 - 41
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "2a8168eeedde7a53da86b9371da7afae",
+    "content-hash": "f06e99c90dc29efd2947c37630c51a33",
     "packages": [
         {
             "name": "anankke/omnipay-alipay",
@@ -123,16 +123,16 @@
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.272.2",
+            "version": "3.273.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "0c4cba74c79f9b44393c27721fa1fa9138c95387"
+                "reference": "10631467bdf9869a45197a25b490948af2ef7acd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0c4cba74c79f9b44393c27721fa1fa9138c95387",
-                "reference": "0c4cba74c79f9b44393c27721fa1fa9138c95387",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/10631467bdf9869a45197a25b490948af2ef7acd",
+                "reference": "10631467bdf9869a45197a25b490948af2ef7acd",
                 "shasum": ""
             },
             "require": {
@@ -212,9 +212,9 @@
             "support": {
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.272.2"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.273.2"
             },
-            "time": "2023-06-12T18:21:59+00:00"
+            "time": "2023-06-16T18:53:48+00:00"
         },
         {
             "name": "bacon/bacon-qr-code",
@@ -2584,16 +2584,16 @@
         },
         {
             "name": "openai-php/client",
-            "version": "v0.5.3",
+            "version": "v0.6.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/openai-php/client.git",
-                "reference": "a0ca38da78f7420a0b381e4274e416abbf6e563d"
+                "reference": "67937756931af848c03112e52706aa6ad175aa7a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/openai-php/client/zipball/a0ca38da78f7420a0b381e4274e416abbf6e563d",
-                "reference": "a0ca38da78f7420a0b381e4274e416abbf6e563d",
+                "url": "https://api.github.com/repos/openai-php/client/zipball/67937756931af848c03112e52706aa6ad175aa7a",
+                "reference": "67937756931af848c03112e52706aa6ad175aa7a",
                 "shasum": ""
             },
             "require": {
@@ -2608,7 +2608,7 @@
             "require-dev": {
                 "guzzlehttp/guzzle": "^7.7.0",
                 "guzzlehttp/psr7": "^2.5.0",
-                "laravel/pint": "^1.10.0",
+                "laravel/pint": "^1.10.2",
                 "nunomaduro/collision": "^7.5.2",
                 "pestphp/pest": "dev-develop as 2.6.2",
                 "pestphp/pest-plugin-arch": "^2.2.0",
@@ -2656,7 +2656,7 @@
             ],
             "support": {
                 "issues": "https://github.com/openai-php/client/issues",
-                "source": "https://github.com/openai-php/client/tree/v0.5.3"
+                "source": "https://github.com/openai-php/client/tree/v0.6.1"
             },
             "funding": [
                 {
@@ -2672,7 +2672,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-06-07T16:17:31+00:00"
+            "time": "2023-06-15T04:11:23+00:00"
         },
         {
             "name": "ozdemir/datatables",
@@ -4239,21 +4239,21 @@
         },
         {
             "name": "sentry/sdk",
-            "version": "3.4.0",
+            "version": "3.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/getsentry/sentry-php-sdk.git",
-                "reference": "7f1e04a5380a91e41a1a68c363ec19f88619a870"
+                "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/7f1e04a5380a91e41a1a68c363ec19f88619a870",
-                "reference": "7f1e04a5380a91e41a1a68c363ec19f88619a870",
+                "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/cd91b752f07c4bab9fb3b173f81af68a78a78d6d",
+                "reference": "cd91b752f07c4bab9fb3b173f81af68a78a78d6d",
                 "shasum": ""
             },
             "require": {
                 "http-interop/http-factory-guzzle": "^1.0",
-                "sentry/sentry": "^3.18",
+                "sentry/sentry": "^3.19",
                 "symfony/http-client": "^4.3|^5.0|^6.0"
             },
             "type": "metapackage",
@@ -4280,7 +4280,7 @@
             ],
             "support": {
                 "issues": "https://github.com/getsentry/sentry-php-sdk/issues",
-                "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.4.0"
+                "source": "https://github.com/getsentry/sentry-php-sdk/tree/3.5.0"
             },
             "funding": [
                 {
@@ -4292,26 +4292,26 @@
                     "type": "custom"
                 }
             ],
-            "time": "2023-05-22T16:02:39+00:00"
+            "time": "2023-06-12T17:50:36+00:00"
         },
         {
             "name": "sentry/sentry",
-            "version": "3.18.2",
+            "version": "3.19.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/getsentry/sentry-php.git",
-                "reference": "c634615c09a69bfdc3bb5f6ffeee78db3711167c"
+                "reference": "dd1057fb37d4484ebb2d1bc9b05fa5969c078436"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/c634615c09a69bfdc3bb5f6ffeee78db3711167c",
-                "reference": "c634615c09a69bfdc3bb5f6ffeee78db3711167c",
+                "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/dd1057fb37d4484ebb2d1bc9b05fa5969c078436",
+                "reference": "dd1057fb37d4484ebb2d1bc9b05fa5969c078436",
                 "shasum": ""
             },
             "require": {
                 "ext-json": "*",
                 "ext-mbstring": "*",
-                "guzzlehttp/promises": "^1.4",
+                "guzzlehttp/promises": "^1.5.3|^2.0",
                 "jean85/pretty-package-versions": "^1.5|^2.0.4",
                 "php": "^7.2|^8.0",
                 "php-http/async-client-implementation": "^1.0",
@@ -4385,7 +4385,7 @@
             ],
             "support": {
                 "issues": "https://github.com/getsentry/sentry-php/issues",
-                "source": "https://github.com/getsentry/sentry-php/tree/3.18.2"
+                "source": "https://github.com/getsentry/sentry-php/tree/3.19.1"
             },
             "funding": [
                 {
@@ -4397,7 +4397,7 @@
                     "type": "custom"
                 }
             ],
-            "time": "2023-05-17T10:56:54+00:00"
+            "time": "2023-05-25T06:19:09+00:00"
         },
         {
             "name": "slim/http",
@@ -4985,16 +4985,16 @@
         },
         {
             "name": "symfony/http-client",
-            "version": "v6.2.10",
+            "version": "v6.2.11",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-client.git",
-                "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9"
+                "reference": "39f679c12648cc43bd9f0db12cc69b82041b91a1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-client/zipball/3f5545a91c8e79dedd1a06c4b04e1682c80c42f9",
-                "reference": "3f5545a91c8e79dedd1a06c4b04e1682c80c42f9",
+                "url": "https://api.github.com/repos/symfony/http-client/zipball/39f679c12648cc43bd9f0db12cc69b82041b91a1",
+                "reference": "39f679c12648cc43bd9f0db12cc69b82041b91a1",
                 "shasum": ""
             },
             "require": {
@@ -5018,6 +5018,7 @@
                 "guzzlehttp/promises": "^1.4",
                 "nyholm/psr7": "^1.0",
                 "php-http/httplug": "^1.0|^2.0",
+                "php-http/message-factory": "^1.0",
                 "psr/http-client": "^1.0",
                 "symfony/dependency-injection": "^5.4|^6.0",
                 "symfony/http-kernel": "^5.4|^6.0",
@@ -5053,7 +5054,7 @@
                 "http"
             ],
             "support": {
-                "source": "https://github.com/symfony/http-client/tree/v6.2.10"
+                "source": "https://github.com/symfony/http-client/tree/v6.2.11"
             },
             "funding": [
                 {
@@ -5069,7 +5070,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-04-20T13:12:48+00:00"
+            "time": "2023-05-12T08:48:34+00:00"
         },
         {
             "name": "symfony/http-client-contracts",
@@ -5229,21 +5230,21 @@
         },
         {
             "name": "symfony/options-resolver",
-            "version": "v6.2.7",
+            "version": "v6.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/options-resolver.git",
-                "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629"
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/aa0e85b53bbb2b4951960efd61d295907eacd629",
-                "reference": "aa0e85b53bbb2b4951960efd61d295907eacd629",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.1",
-                "symfony/deprecation-contracts": "^2.1|^3"
+                "symfony/deprecation-contracts": "^2.5|^3"
             },
             "type": "library",
             "autoload": {
@@ -5276,7 +5277,7 @@
                 "options"
             ],
             "support": {
-                "source": "https://github.com/symfony/options-resolver/tree/v6.2.7"
+                "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
             },
             "funding": [
                 {
@@ -5292,7 +5293,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2023-02-14T08:44:56+00:00"
+            "time": "2023-05-12T14:21:09+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
@@ -8843,6 +8844,7 @@
         "ext-mysqli": "*",
         "ext-openssl": "*",
         "ext-pdo": "*",
+        "ext-posix": "*",
         "ext-xml": "*",
         "ext-zip": "*"
     },

+ 184 - 177
db/migrations/2023020100-init.php

@@ -10,16 +10,16 @@ return new class() implements MigrationInterface {
     {
         DB::getPdo()->exec(
             "CREATE TABLE `announcement` (
-                `id` int(11) NOT NULL AUTO_INCREMENT,
-                `date` datetime DEFAULT NULL,
-                `content` text DEFAULT NULL,
+                `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公告ID',
+                `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '公告日期',
+                `content` text NOT NULL DEFAULT '' COMMENT '公告内容',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `config` (
                 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
                 `item` varchar(255) DEFAULT NULL COMMENT '项',
-                `value` varchar(2048) DEFAULT NULL,
+                `value` varchar(2048) DEFAULT NULL COMMENT '值',
                 `class` varchar(255) DEFAULT 'default' COMMENT '配置分类',
                 `is_public` int(11) DEFAULT 0 COMMENT '是否为公共参数',
                 `type` varchar(255) DEFAULT NULL COMMENT '值类型',
@@ -29,35 +29,35 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `detect_ban_log` (
-                `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
-                `user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
-                `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '用户 ID',
-                `email` varchar(255) DEFAULT NULL COMMENT '用户邮箱',
-                `detect_number` int(11) DEFAULT NULL COMMENT '本次违规次数',
-                `ban_time` int(11) DEFAULT NULL COMMENT '本次封禁时长',
-                `start_time` bigint(20) DEFAULT NULL COMMENT '统计开始时间',
-                `end_time` bigint(20) DEFAULT NULL COMMENT '统计结束时间',
-                `all_detect_number` int(11) DEFAULT NULL COMMENT '累计违规次数',
+                `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                `detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次违规次数',
+                `ban_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次封禁时长',
+                `start_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计开始时间',
+                `end_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计结束时间',
+                `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数',
                 PRIMARY KEY (`id`),
                 KEY `user_id` (`user_id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `detect_list` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `name` varchar(255) DEFAULT NULL,
-                `text` varchar(255) DEFAULT NULL,
-                `regex` varchar(255) DEFAULT NULL,
-                `type` int(11) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '审计规则ID',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称',
+                `text` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称',
+                `regex` varchar(255) NOT NULL DEFAULT '' COMMENT '正则表达式',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '规则类型',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `detect_log` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `user_id` bigint(20) unsigned DEFAULT NULL,
-                `list_id` bigint(20) unsigned DEFAULT NULL,
-                `datetime` bigint(20) unsigned DEFAULT NULL,
-                `node_id` int(11) DEFAULT NULL,
-                `status` int(11) DEFAULT 0,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `list_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '规则ID',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '触发时间',
+                `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态',
                 PRIMARY KEY (`id`),
                 KEY `user_id` (`user_id`),
                 KEY `node_id` (`node_id`),
@@ -66,55 +66,54 @@ return new class() implements MigrationInterface {
 
             CREATE TABLE `docs` (
                 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `date` datetime DEFAULT NULL,
-                `title` varchar(255) DEFAULT NULL,
-                `content` varchar(255) DEFAULT NULL,
-                `markdown` varchar(255) DEFAULT NULL,
+                `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '文档日期',
+                `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题',
+                `content` longtext NOT NULL DEFAULT '' COMMENT '文档内容',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `email_queue` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `to_email` varchar(255) DEFAULT NULL,
-                `subject` varchar(255) DEFAULT NULL,
-                `template` varchar(255) DEFAULT NULL,
-                `array` longtext DEFAULT NULL,
-                `time` int(11) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `to_email` varchar(255) NOT NULL DEFAULT '' COMMENT '收件人邮箱',
+                `subject` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件标题',
+                `template` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件模板',
+                `array` longtext NOT NULL DEFAULT '{}' COMMENT '模板参数' CHECK (json_valid(`array`)),
+                `time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加时间',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `email_verify` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `email` varchar(255) DEFAULT NULL,
-                `ip` varchar(255) DEFAULT NULL,
-                `code` varchar(255) DEFAULT NULL,
-                `expire_in` bigint(20) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT 'IP',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '验证码',
+                `expire_in` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `gift_card` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `card` text DEFAULT NULL COMMENT '卡号',
-                `balance` int(11) DEFAULT NULL COMMENT '余额',
-                `create_time` int(11) DEFAULT NULL COMMENT '创建时间',
-                `status` int(11) DEFAULT NULL COMMENT '使用状态',
-                `use_time` int(11) DEFAULT NULL COMMENT '使用时间',
-                `use_user` int(11) DEFAULT NULL COMMENT '使用用户',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '礼品卡ID',
+                `card` text NOT NULL DEFAULT '' COMMENT '卡号',
+                `balance` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '余额',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '使用状态',
+                `use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '使用时间',
+                `use_user` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '使用用户',
                 PRIMARY KEY (`id`),
                 KEY `id` (`id`),
                 KEY `status` (`status`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `invoice` (
-                `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '账单ID',
-                `user_id` int(11) DEFAULT NULL COMMENT '归属用户',
-                `order_id` int(11) DEFAULT NULL COMMENT '订单ID',
-                `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账单内容' CHECK (json_valid(`content`)),
-                `price` double DEFAULT NULL COMMENT '账单金额',
-                `status` varchar(255) DEFAULT NULL COMMENT '账单状态',
-                `create_time` int(11) DEFAULT NULL COMMENT '创建时间',
-                `update_time` int(11) DEFAULT NULL COMMENT '更新时间',
-                `pay_time` int(11) DEFAULT NULL COMMENT '支付时间',
+                `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单ID',
+                `user_id` bigint(20) unsigned DEFAULT 0 COMMENT '归属用户',
+                `order_id` bigint(20) unsigned DEFAULT 0 COMMENT '订单ID',
+                `content` longtext DEFAULT '{}' COMMENT '账单内容' CHECK (json_valid(`content`)),
+                `price` double unsigned DEFAULT 0 COMMENT '账单金额',
+                `status` varchar(255) DEFAULT '' COMMENT '账单状态',
+                `create_time` int(11) unsigned DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned DEFAULT 0 COMMENT '更新时间',
+                `pay_time` int(11) unsigned DEFAULT 0 COMMENT '支付时间',
                 PRIMARY KEY (`id`),
                 KEY `id` (`id`),
                 KEY `user_id` (`user_id`),
@@ -123,75 +122,79 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `link` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `token` varchar(255) DEFAULT NULL,
-                `userid` bigint(20) unsigned DEFAULT NULL,
+                `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `token` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅token',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
                 PRIMARY KEY (`id`),
                 UNIQUE KEY `token` (`token`),
                 UNIQUE KEY `userid` (`userid`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `login_ip` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `userid` bigint(20) unsigned DEFAULT NULL,
-                `ip` varchar(255) DEFAULT NULL,
-                `datetime` bigint(20) DEFAULT NULL,
-                `type` int(11) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '登录IP',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '登录时间',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '登录类型',
                 PRIMARY KEY (`id`),
-                KEY `userid` (`userid`)
+                KEY `userid` (`userid`),
+                KEY `type` (`type`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `node` (
-                `id` int(11) NOT NULL AUTO_INCREMENT,
-                `name` varchar(255) DEFAULT NULL,
-                `type` int(11) DEFAULT NULL,
-                `server` varchar(255) DEFAULT NULL,
-                `custom_config` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '{}' COMMENT '自定义配置' CHECK (json_valid(`custom_config`)),
-                `info` text DEFAULT '',
-                `status` varchar(255) DEFAULT '',
-                `sort` int(11) DEFAULT NULL,
-                `traffic_rate` float DEFAULT 1,
-                `node_class` int(11) DEFAULT 0,
-                `node_speedlimit` double NOT NULL DEFAULT 0 COMMENT '节点限速',
-                `node_connector` int(11) DEFAULT 0,
-                `node_bandwidth` bigint(20) DEFAULT 0,
-                `node_bandwidth_limit` bigint(20) DEFAULT 0,
-                `bandwidthlimit_resetday` int(11) DEFAULT 0,
-                `node_heartbeat` bigint(20) DEFAULT 0,
-                `online_user` int(11) DEFAULT 0 COMMENT '节点在线用户',
-                `node_ip` varchar(255) DEFAULT NULL,
-                `node_group` int(11) DEFAULT 0,
-                `mu_only` tinyint(1) DEFAULT 0,
-                `online` tinyint(1) DEFAULT 1,
-                `gfw_block` tinyint(1) DEFAULT 0,
-                `password` varchar(255) DEFAULT NULL,
-                PRIMARY KEY (`id`)
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '节点ID',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称',
+                `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '节点显示',
+                `server` varchar(255) NOT NULL DEFAULT '' COMMENT '节点地址',
+                `custom_config` longtext NOT NULL DEFAULT '{}' COMMENT '自定义配置' CHECK (json_valid(`custom_config`)),
+                `info` varchar(255) NOT NULL DEFAULT '' COMMENT '节点信息',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '节点状态',
+                `sort` tinyint(2) unsigned NOT NULL DEFAULT 14 COMMENT '节点类型',
+                `traffic_rate` float unsigned NOT NULL DEFAULT 1 COMMENT '流量倍率',
+                `node_class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点等级',
+                `node_speedlimit` double unsigned NOT NULL DEFAULT 0 COMMENT '节点限速',
+                `node_bandwidth` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量',
+                `node_bandwidth_limit` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量限制',
+                `bandwidthlimit_resetday` tinyint(2) unsigned NOT NULL DEFAULT 0 COMMENT '流量重置日',
+                `node_heartbeat` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点心跳',
+                `online_user` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点在线用户',
+                `node_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '节点IP',
+                `node_group` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点群组',
+                `online` tinyint(1) NOT NULL DEFAULT 1 COMMENT '在线状态',
+                `gfw_block` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否被GFW封锁',
+                `password` varchar(255) NOT NULL DEFAULT '' COMMENT '后端连接密码',
+                PRIMARY KEY (`id`),
+                KEY `type` (`type`),
+                KEY `sort` (`sort`),
+                KEY `node_class` (`node_class`),
+                KEY `node_group` (`node_group`),
+                KEY `online` (`online`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
             
             CREATE TABLE `online_log` (
-                `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
-                `user_id` INT UNSIGNED NOT NULL,
-                `ip` INET6 NOT NULL,
-                `node_id` INT UNSIGNED NOT NULL,
-                `first_time` INT UNSIGNED NOT NULL,
-                `last_time` INT UNSIGNED NOT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID',
+                `ip` inet6 NOT NULL COMMENT 'IP地址',
+                `node_id` int(11) unsigned NOT NULL COMMENT '节点ID',
+                `first_time` int(11) unsigned NOT NULL COMMENT '首次在线时间',
+                `last_time` int(11) unsigned NOT NULL COMMENT '最后在线时间',
                 PRIMARY KEY (`id`),
                 UNIQUE KEY (`user_id`, `ip`),
                 KEY (`last_time`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `order` (
-                `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
-                `user_id` int(11) DEFAULT NULL COMMENT '提交用户',
-                `product_id` int(11) DEFAULT NULL COMMENT '商品ID',
-                `product_type` varchar(255) DEFAULT NULL COMMENT '商品类型',
-                `product_name` varchar(255) DEFAULT NULL COMMENT '商品名称',
-                `product_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品内容' CHECK (json_valid(`product_content`)),
-                `coupon` varchar(255) DEFAULT NULL COMMENT '订单优惠码',
-                `price` double DEFAULT NULL COMMENT '订单金额',
-                `status` varchar(255) DEFAULT NULL COMMENT '订单状态',
-                `create_time` int(11) DEFAULT NULL COMMENT '创建时间',
-                `update_time` int(11) DEFAULT NULL COMMENT '更新时间',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '提交用户',
+                `product_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '商品ID',
+                `product_type` varchar(255) NOT NULL DEFAULT 0 COMMENT '商品类型',
+                `product_name` varchar(255) NOT NULL DEFAULT 0 COMMENT '商品名称',
+                `product_content` longtext NOT NULL DEFAULT '{}' COMMENT '商品内容' CHECK (json_valid(`product_content`)),
+                `coupon` varchar(255) NOT NULL DEFAULT '' COMMENT '订单优惠码',
+                `price` double unsigned NOT NULL DEFAULT 0 COMMENT '订单金额',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '订单状态',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
                 PRIMARY KEY (`id`),
                 KEY `id` (`id`),
                 KEY `user_id` (`user_id`),
@@ -200,50 +203,51 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `payback` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `total` decimal(12,2) DEFAULT NULL,
-                `userid` bigint(20) DEFAULT NULL,
-                `ref_by` bigint(20) DEFAULT NULL,
-                `ref_get` decimal(12,2) DEFAULT NULL,
-                `datetime` bigint(20) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `total` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '总金额',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人ID',
+                `ref_get` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人获得金额',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `paylist` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `userid` bigint(20) unsigned DEFAULT NULL,
-                `total` decimal(12,2) DEFAULT NULL,
-                `status` int(11) DEFAULT 0,
-                `invoice_id` int(11) DEFAULT 0,
-                `tradeno` varchar(255) DEFAULT NULL,
-                `gateway` varchar(255) NOT NULL DEFAULT '',
-                `datetime` bigint(20) DEFAULT 0,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `total` decimal(12,2) NOT NULL DEFAULT 0 COMMENT '总金额',
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态',
+                `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID',
+                `tradeno` varchar(255) NOT NULL DEFAULT '' COMMENT '网关单号',
+                `gateway` varchar(255) NOT NULL DEFAULT '' COMMENT '支付网关',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
                 PRIMARY KEY (`id`),
                 KEY `userid` (`userid`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `product` (
-                `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
-                `type` varchar(255) DEFAULT NULL COMMENT '类型',
-                `name` varchar(255) DEFAULT NULL COMMENT '名称',
-                `price` double DEFAULT NULL COMMENT '售价',
-                `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '内容' CHECK (json_valid(`content`)),
-                `limit` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '购买限制' CHECK (json_valid(`limit`)),
-                `status` int(11) DEFAULT NULL COMMENT '销售状态',
-                `create_time` int(11) DEFAULT NULL COMMENT '创建时间',
-                `update_time` int(11) DEFAULT NULL COMMENT '更新时间',
-                `sale_count` int(11) DEFAULT NULL COMMENT '累计销售数',
-                `stock` int(11) DEFAULT NULL COMMENT '库存',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID',
+                `type` varchar(255) NOT NULL DEFAULT 'tabp' COMMENT '类型',
+                `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+                `price` double unsigned NOT NULL DEFAULT 0 COMMENT '售价',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '内容' CHECK (json_valid(`content`)),
+                `limit` longtext NOT NULL DEFAULT '{}' COMMENT '购买限制' CHECK (json_valid(`limit`)),
+                `status` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '销售状态',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
+                `sale_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计销售数',
+                `stock` int(11) NOT NULL DEFAULT -1 COMMENT '库存',
                 PRIMARY KEY (`id`),
                 KEY `id` (`id`),
-                KEY `type` (`type`)
+                KEY `type` (`type`),
+                KEY `status` (`status`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `stream_media` (
-                `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
-                `node_id` int(11) DEFAULT NULL COMMENT '节点id',
-                `result` text DEFAULT NULL COMMENT '检测结果',
-                `created_at` int(11) DEFAULT NULL COMMENT '创建时间',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID',
+                `result` text NOT NULL DEFAULT '' COMMENT '检测结果',
+                `created_at` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
                 PRIMARY KEY (`id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
@@ -257,14 +261,16 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `ticket` (
-                `id` bigint(20) NOT NULL AUTO_INCREMENT,
-                `title` varchar(255) DEFAULT NULL,
-                `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '' COMMENT '工单内容' CHECK (json_valid(`content`)),
-                `userid` bigint(20) DEFAULT NULL,
-                `datetime` bigint(20) DEFAULT NULL,
-                `status` varchar(255) DEFAULT '' COMMENT '工单状态',
-                `type` varchar(255) DEFAULT 'other' COMMENT '工单类型',
-                PRIMARY KEY (`id`)
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '工单ID',
+                `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工单标题',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '工单内容' CHECK (json_valid(`content`)),
+                `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `status` varchar(255) NOT NULL DEFAULT '' COMMENT '工单状态',
+                `type` varchar(255) NOT NULL DEFAULT '' COMMENT '工单类型',
+                PRIMARY KEY (`id`),
+                KEY `userid` (`userid`),
+                KEY `status` (`status`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user` (
@@ -292,12 +298,11 @@ return new class() implements MigrationInterface {
                 `reg_ip` varchar(255) NOT NULL DEFAULT '127.0.0.1' COMMENT '注册IP',
                 `node_speedlimit` double NOT NULL DEFAULT 0 COMMENT '用户限速',
                 `node_iplimit` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '同时可连接IP数',
-                `node_connector` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '同时可使用连接数',
                 `is_admin` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否管理员',
                 `im_type` smallint(6) unsigned NOT NULL DEFAULT 1 COMMENT '联系方式类型',
                 `im_value` varchar(255) NOT NULL DEFAULT '' COMMENT '联系方式',
                 `daily_mail_enable` tinyint(1) NOT NULL DEFAULT 0 COMMENT '每日报告开关',
-                `class` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '等级',
+                `class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '等级',
                 `class_expire` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '等级过期时间',
                 `expire_in` datetime NOT NULL DEFAULT '2199-01-01 00:00:00' COMMENT '账户过期时间',
                 `theme` varchar(255) NOT NULL DEFAULT 'tabler' COMMENT '网站主题',
@@ -328,13 +333,13 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user_coupon` (
-                `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '优惠码ID',
-                `code` varchar(255) DEFAULT NULL COMMENT '优惠码',
-                `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '优惠码内容' CHECK (json_valid(`content`)),
-                `limit` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '优惠码限制' CHECK (json_valid(`limit`)),
-                `use_count` int(11) NOT NULL DEFAULT 0 COMMENT '累计使用次数',
-                `create_time` int(11) DEFAULT NULL COMMENT '创建时间',
-                `expire_time` int(11) DEFAULT NULL COMMENT '过期时间',
+                `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '优惠码ID',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '优惠码',
+                `content` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码内容' CHECK (json_valid(`content`)),
+                `limit` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码限制' CHECK (json_valid(`limit`)),
+                `use_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计使用次数',
+                `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
                 PRIMARY KEY (`id`),
                 KEY `id` (`id`),
                 KEY `code` (`code`),
@@ -342,28 +347,28 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user_hourly_usage` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `user_id` bigint(20) unsigned DEFAULT NULL,
-                `traffic` bigint(20) DEFAULT NULL,
-                `hourly_usage` bigint(20) DEFAULT NULL,
-                `datetime` int(11) DEFAULT NULL,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `traffic` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '当前总流量',
+                `hourly_usage` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '过去一小时流量',
+                `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '记录时间',
                 PRIMARY KEY (`id`),
                 KEY `user_id` (`user_id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user_invite_code` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `code` varchar(255) DEFAULT NULL,
-                `user_id` bigint(20) unsigned DEFAULT NULL,
-                `created_at` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
-                `updated_at` timestamp NULL DEFAULT '1989-06-04 00:05:00',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `code` varchar(255) NOT NULL DEFAULT '' COMMENT '邀请码',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `created_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '创建时间',
+                `updated_at` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '更新时间',
                 PRIMARY KEY (`id`),
                 UNIQUE KEY `code` (`code`),
                 UNIQUE KEY `user_id` (`user_id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
             
             CREATE TABLE `user_money_log` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
                 `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
                 `before` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动前账户余额',
                 `after` decimal(10,2) NOT NULL DEFAULT 0 COMMENT '用户变动后账户余额',
@@ -375,23 +380,25 @@ return new class() implements MigrationInterface {
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user_password_reset` (
-                `id` int(11) NOT NULL AUTO_INCREMENT,
-                `email` varchar(255) DEFAULT NULL,
-                `token` varchar(255) DEFAULT NULL,
-                `init_time` int(11) DEFAULT NULL,
-                `expire_time` int(11) DEFAULT NULL,
-                PRIMARY KEY (`id`)
+                `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                `token` varchar(255) NOT NULL DEFAULT '' COMMENT '重置密码的 token',
+                `init_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
+                `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间',
+                PRIMARY KEY (`id`),
+                KEY `email` (`email`),
+                KEY `token` (`token`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
             CREATE TABLE `user_subscribe_log` (
-                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
-                `user_name` varchar(255) DEFAULT NULL COMMENT '用户名',
-                `user_id` bigint(20) unsigned DEFAULT NULL COMMENT '用户 ID',
-                `email` varchar(255) DEFAULT NULL COMMENT '用户邮箱',
-                `subscribe_type` varchar(255) DEFAULT NULL COMMENT '获取的订阅类型',
-                `request_ip` varchar(255) DEFAULT NULL COMMENT '请求 IP',
-                `request_time` datetime DEFAULT NULL COMMENT '请求时间',
-                `request_user_agent` text DEFAULT NULL COMMENT '请求 UA 信息',
+                `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID',
+                `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
+                `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
+                `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                `subscribe_type` varchar(255) NOT NULL DEFAULT '' COMMENT '获取的订阅类型',
+                `request_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '请求IP',
+                `request_time` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '请求时间',
+                `request_user_agent` varchar(255) NOT NULL DEFAULT '' COMMENT '请求UA信息',
                 PRIMARY KEY (`id`),
                 KEY `user_id` (`user_id`)
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"

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

@@ -29,7 +29,6 @@ return new class() implements MigrationInterface {
         ALTER TABLE user MODIFY COLUMN `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '邀请人ID';
         ALTER TABLE user MODIFY COLUMN `method` varchar(255) NOT NULL DEFAULT 'aes-128-gcm' COMMENT 'Shadowsocks加密方式';
         ALTER TABLE user MODIFY COLUMN `reg_ip` varchar(255) NOT NULL DEFAULT '127.0.0.1' COMMENT '注册IP';
-        ALTER TABLE user MODIFY COLUMN `node_connector` smallint(6) unsigned NOT NULL DEFAULT 0 COMMENT '同时可使用连接数';
         ALTER TABLE user MODIFY COLUMN `is_admin` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否管理员';
         ALTER TABLE user MODIFY COLUMN `im_type` smallint(6) unsigned NOT NULL DEFAULT 1 COMMENT '联系方式类型';
         UPDATE user SET im_value = '' WHERE im_value IS NULL;

+ 204 - 0
db/migrations/2023061800-update_new_shop_data_type.php

@@ -0,0 +1,204 @@
+<?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("SET FOREIGN_KEY_CHECKS = 0;
+        ALTER TABLE announcement MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公告ID';
+        ALTER TABLE announcement MODIFY COLUMN `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '公告日期';
+        ALTER TABLE announcement MODIFY COLUMN `content` text NOT NULL DEFAULT '' COMMENT '公告内容';
+        ALTER TABLE config MODIFY COLUMN `value` varchar(2048) DEFAULT NULL COMMENT '值';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次违规次数';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `ban_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '本次封禁时长';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `start_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计开始时间';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `end_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '统计结束时间';
+        ALTER TABLE detect_ban_log MODIFY COLUMN `all_detect_number` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计违规次数';
+        ALTER TABLE detect_list MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '审计规则ID';
+        ALTER TABLE detect_list MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称';
+        ALTER TABLE detect_list MODIFY COLUMN `text` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称';
+        ALTER TABLE detect_list MODIFY COLUMN `regex` varchar(255) NOT NULL DEFAULT '' COMMENT '正则表达式';
+        ALTER TABLE detect_list MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '规则类型';
+        ALTER TABLE detect_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE detect_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE detect_log MODIFY COLUMN `list_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '规则ID';
+        ALTER TABLE detect_log MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '触发时间';
+        ALTER TABLE detect_log MODIFY COLUMN `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID';
+        ALTER TABLE detect_log MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态';
+        ALTER TABLE docs MODIFY COLUMN `date` datetime NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '文档日期';
+        ALTER TABLE docs MODIFY COLUMN `title` varchar(255) NOT NULL DEFAULT '' COMMENT '文档标题';
+        ALTER TABLE docs MODIFY COLUMN `content` longtext NOT NULL DEFAULT '' COMMENT '文档内容';
+        ALTER TABLE docs DROP COLUMN IF EXISTS `markdown`;
+        ALTER TABLE email_queue MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE email_queue MODIFY COLUMN `to_email` varchar(255) NOT NULL DEFAULT '' COMMENT '收件人邮箱';
+        ALTER TABLE email_queue MODIFY COLUMN `subject` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件标题';
+        ALTER TABLE email_queue MODIFY COLUMN `template` varchar(255) NOT NULL DEFAULT '' COMMENT '邮件模板';
+        ALTER TABLE email_queue MODIFY COLUMN `array` longtext NOT NULL DEFAULT '{}' COMMENT '模板参数' CHECK (json_valid(`array`));
+        ALTER TABLE email_queue MODIFY COLUMN `time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '添加时间';
+        ALTER TABLE email_verify MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE email_verify MODIFY COLUMN `email` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱';
+        ALTER TABLE email_verify MODIFY COLUMN `ip` varchar(255) NOT NULL DEFAULT '' COMMENT 'IP';
+        ALTER TABLE email_verify MODIFY COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '验证码';
+        ALTER TABLE email_verify MODIFY COLUMN `expire_in` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间';
+        ALTER TABLE gift_card MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '礼品卡ID';
+        ALTER TABLE gift_card MODIFY COLUMN `card` text NOT NULL DEFAULT '' COMMENT '卡号';
+        ALTER TABLE gift_card MODIFY COLUMN `balance` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '余额';
+        ALTER TABLE gift_card MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE gift_card MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '使用状态';
+        ALTER TABLE gift_card MODIFY COLUMN `use_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '使用时间';
+        ALTER TABLE gift_card MODIFY COLUMN `use_user` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '使用用户';
+        ALTER TABLE invoice MODIFY COLUMN `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '账单ID';
+        ALTER TABLE invoice MODIFY COLUMN `user_id` bigint(20) unsigned DEFAULT 0 COMMENT '归属用户';
+        ALTER TABLE invoice MODIFY COLUMN `order_id` bigint(20) unsigned DEFAULT 0 COMMENT '订单ID';
+        ALTER TABLE invoice MODIFY COLUMN `content` longtext DEFAULT '{}' COMMENT '账单内容' CHECK (json_valid(`content`));
+        ALTER TABLE invoice MODIFY COLUMN `price` double unsigned DEFAULT 0 COMMENT '账单金额';
+        ALTER TABLE invoice MODIFY COLUMN `status` varchar(255) DEFAULT '' COMMENT '账单状态';
+        ALTER TABLE invoice MODIFY COLUMN `create_time` int(11) unsigned DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE invoice MODIFY COLUMN `update_time` int(11) unsigned DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE invoice MODIFY COLUMN `pay_time` int(11) unsigned DEFAULT 0 COMMENT '支付时间';
+        ALTER TABLE link MODIFY COLUMN `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE link MODIFY COLUMN `token` varchar(255) NOT NULL DEFAULT '' COMMENT '订阅token';
+        ALTER TABLE link MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE login_ip MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE login_ip MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE login_ip MODIFY COLUMN `ip` varchar(255) NOT NULL DEFAULT '' COMMENT '登录IP';
+        ALTER TABLE login_ip MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '登录时间';
+        ALTER TABLE login_ip MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '登录类型';
+        ALTER TABLE login_ip ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE node MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '节点ID';
+        ALTER TABLE node MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '节点名称';
+        ALTER TABLE node MODIFY COLUMN `type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '节点显示';
+        ALTER TABLE node MODIFY COLUMN `server` varchar(255) NOT NULL DEFAULT '' COMMENT '节点地址';
+        ALTER TABLE node MODIFY COLUMN `custom_config` longtext NOT NULL DEFAULT '{}' COMMENT '自定义配置' CHECK (json_valid(`custom_config`));
+        ALTER TABLE node MODIFY COLUMN `info` varchar(255) NOT NULL DEFAULT '' COMMENT '节点信息';
+        ALTER TABLE node MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '节点状态';
+        ALTER TABLE node MODIFY COLUMN `sort` tinyint(2) unsigned NOT NULL DEFAULT 14 COMMENT '节点类型';
+        ALTER TABLE node MODIFY COLUMN `traffic_rate` float unsigned NOT NULL DEFAULT 1 COMMENT '流量倍率';
+        ALTER TABLE node MODIFY COLUMN `node_class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点等级';
+        ALTER TABLE node MODIFY COLUMN `node_speedlimit` double unsigned NOT NULL DEFAULT 0 COMMENT '节点限速';
+        ALTER TABLE node MODIFY COLUMN `node_bandwidth` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量';
+        ALTER TABLE node MODIFY COLUMN `node_bandwidth_limit` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点流量限制';
+        ALTER TABLE node MODIFY COLUMN `bandwidthlimit_resetday` tinyint(2) unsigned NOT NULL DEFAULT 0 COMMENT '流量重置日';
+        ALTER TABLE node MODIFY COLUMN `node_heartbeat` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点心跳';
+        ALTER TABLE node MODIFY COLUMN `online_user` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '节点在线用户';
+        ALTER TABLE node MODIFY COLUMN `node_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '节点IP';
+        ALTER TABLE node MODIFY COLUMN `node_group` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '节点群组';
+        ALTER TABLE node MODIFY COLUMN `online` tinyint(1) NOT NULL DEFAULT 1 COMMENT '在线状态';
+        ALTER TABLE node MODIFY COLUMN `gfw_block` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '是否被GFW封锁';
+        ALTER TABLE node MODIFY COLUMN `password` varchar(255) NOT NULL DEFAULT '' COMMENT '后端连接密码';
+        ALTER TABLE node DROP COLUMN IF EXISTS `node_connector`;
+        ALTER TABLE node DROP COLUMN IF EXISTS `mu_only`;
+        ALTER TABLE node ADD KEY IF NOT EXISTS `type` (`type`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `sort` (`sort`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `node_class` (`node_class`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `node_group` (`node_group`);
+        ALTER TABLE node ADD KEY IF NOT EXISTS `online` (`online`);
+        ALTER TABLE online_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE online_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID';
+        ALTER TABLE online_log MODIFY COLUMN `ip` inet6 NOT NULL COMMENT 'IP地址';
+        ALTER TABLE online_log MODIFY COLUMN `node_id` int(11) unsigned NOT NULL COMMENT '节点ID';
+        ALTER TABLE online_log MODIFY COLUMN `first_time` int(11) unsigned NOT NULL COMMENT '首次在线时间';
+        ALTER TABLE online_log MODIFY COLUMN `last_time` int(11) unsigned NOT NULL COMMENT '最后在线时间';
+        ALTER TABLE `order` MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '订单ID';
+        ALTER TABLE `order` MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '提交用户';
+        ALTER TABLE `order` MODIFY COLUMN `product_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '商品ID';
+        ALTER TABLE `order` MODIFY COLUMN `product_type` varchar(255) NOT NULL DEFAULT 0 COMMENT '商品类型';
+        ALTER TABLE `order` MODIFY COLUMN `product_name` varchar(255) NOT NULL DEFAULT 0 COMMENT '商品名称';
+        ALTER TABLE `order` MODIFY COLUMN `product_content` longtext NOT NULL DEFAULT '{}' COMMENT '商品内容' CHECK (json_valid(`product_content`));
+        ALTER TABLE `order` MODIFY COLUMN `coupon` varchar(255) NOT NULL DEFAULT '' COMMENT '订单优惠码';
+        ALTER TABLE `order` MODIFY COLUMN `price` double unsigned NOT NULL DEFAULT 0 COMMENT '订单金额';
+        ALTER TABLE `order` MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '订单状态';
+        ALTER TABLE `order` MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE `order` MODIFY COLUMN `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE payback MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE payback MODIFY COLUMN `total` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '总金额';
+        ALTER TABLE payback MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE payback MODIFY COLUMN `ref_by` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人ID';
+        ALTER TABLE payback MODIFY COLUMN `ref_get` decimal(12,2) unsigned NOT NULL DEFAULT 0 COMMENT '推荐人获得金额';
+        ALTER TABLE payback MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE paylist MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE paylist MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE paylist MODIFY COLUMN `total` decimal(12,2) NOT NULL DEFAULT 0 COMMENT '总金额';
+        ALTER TABLE paylist MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '状态';
+        ALTER TABLE paylist MODIFY COLUMN `invoice_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '账单ID';
+        ALTER TABLE paylist MODIFY COLUMN `tradeno` varchar(255) NOT NULL DEFAULT '' COMMENT '网关单号';
+        ALTER TABLE paylist MODIFY COLUMN `gateway` varchar(255) NOT NULL DEFAULT '' COMMENT '支付网关';
+        ALTER TABLE paylist MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE product MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '商品ID';
+        ALTER TABLE product MODIFY COLUMN `type` varchar(255) NOT NULL DEFAULT 'tabp' COMMENT '类型';
+        ALTER TABLE product MODIFY COLUMN `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称';
+        ALTER TABLE product MODIFY COLUMN `price` double unsigned NOT NULL DEFAULT 0 COMMENT '售价';
+        ALTER TABLE product MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '内容' CHECK (json_valid(`content`));
+        ALTER TABLE product MODIFY COLUMN `limit` longtext NOT NULL DEFAULT '{}' COMMENT '购买限制' CHECK (json_valid(`limit`));
+        ALTER TABLE product MODIFY COLUMN `status` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '销售状态';
+        ALTER TABLE product MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE product MODIFY COLUMN `update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间';
+        ALTER TABLE product MODIFY COLUMN `sale_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计销售数';
+        ALTER TABLE product MODIFY COLUMN `stock` int(11) NOT NULL DEFAULT -1 COMMENT '库存';
+        ALTER TABLE product ADD KEY IF NOT EXISTS `status` (`status`);
+        ALTER TABLE stream_media MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE stream_media MODIFY COLUMN `node_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '节点ID';
+        ALTER TABLE stream_media MODIFY COLUMN `result` text NOT NULL DEFAULT '' COMMENT '检测结果';
+        ALTER TABLE stream_media MODIFY COLUMN `created_at` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE ticket MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '工单ID';
+        ALTER TABLE ticket MODIFY COLUMN `title` varchar(255) NOT NULL DEFAULT '' COMMENT '工单标题';
+        ALTER TABLE ticket MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '工单内容' CHECK (json_valid(`content`));
+        ALTER TABLE ticket MODIFY COLUMN `userid` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE ticket MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE ticket MODIFY COLUMN `status` varchar(255) NOT NULL DEFAULT '' COMMENT '工单状态';
+        ALTER TABLE ticket MODIFY COLUMN `type` varchar(255) NOT NULL DEFAULT '' COMMENT '工单类型';
+        ALTER TABLE ticket ADD KEY IF NOT EXISTS `userid` (`userid`);
+        ALTER TABLE ticket ADD KEY IF NOT EXISTS `status` (`status`);
+        ALTER TABLE user MODIFY COLUMN `class` smallint(5) unsigned NOT NULL DEFAULT 0 COMMENT '等级';
+        ALTER TABLE user DROP COLUMN IF EXISTS `node_connector`;
+        ALTER TABLE user_coupon MODIFY COLUMN `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '优惠码ID';
+        ALTER TABLE user_coupon MODIFY COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '优惠码';
+        ALTER TABLE user_coupon MODIFY COLUMN `content` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码内容' CHECK (json_valid(`content`));
+        ALTER TABLE user_coupon MODIFY COLUMN `limit` longtext NOT NULL DEFAULT '{}' COMMENT '优惠码限制' CHECK (json_valid(`limit`));
+        ALTER TABLE user_coupon MODIFY COLUMN `use_count` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '累计使用次数';
+        ALTER TABLE user_coupon MODIFY COLUMN `create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE user_coupon MODIFY COLUMN `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间';
+        ALTER TABLE user_hourly_usage MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_hourly_usage MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE user_hourly_usage MODIFY COLUMN `traffic` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '当前总流量';
+        ALTER TABLE user_hourly_usage MODIFY COLUMN `hourly_usage` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '过去一小时流量';
+        ALTER TABLE user_hourly_usage MODIFY COLUMN `datetime` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '记录时间';
+        ALTER TABLE user_invite_code MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_invite_code MODIFY COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '邀请码';
+        ALTER TABLE user_invite_code MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE user_invite_code MODIFY COLUMN `created_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '创建时间';
+        ALTER TABLE user_invite_code MODIFY COLUMN `updated_at` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '更新时间';
+        ALTER TABLE user_money_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_password_reset MODIFY COLUMN `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_password_reset MODIFY COLUMN `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱';
+        ALTER TABLE user_password_reset MODIFY COLUMN `token` varchar(255) NOT NULL DEFAULT '' COMMENT '重置密码的 token';
+        ALTER TABLE user_password_reset MODIFY COLUMN `init_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间';
+        ALTER TABLE user_password_reset MODIFY COLUMN `expire_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '过期时间';
+        ALTER TABLE user_password_reset ADD KEY IF NOT EXISTS `email` (`email`);
+        ALTER TABLE user_password_reset ADD KEY IF NOT EXISTS `token` (`token`);
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '记录ID';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `user_name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `subscribe_type` varchar(255) NOT NULL DEFAULT '' COMMENT '获取的订阅类型';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `request_ip` varchar(255) NOT NULL DEFAULT '' COMMENT '请求IP';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `request_time` timestamp NOT NULL DEFAULT '1989-06-04 00:05:00' COMMENT '请求时间';
+        ALTER TABLE user_subscribe_log MODIFY COLUMN `request_user_agent` varchar(255) NOT NULL DEFAULT '' COMMENT '请求UA信息';
+        SET FOREIGN_KEY_CHECKS = 1;");
+
+        return 2023061800;
+    }
+
+    public function down(): int
+    {
+        return 2023061800;
+    }
+};

+ 1 - 0
db/update.sql

@@ -3,6 +3,7 @@ ALTER TABLE detect_ban_log DROP FOREIGN KEY detect_ban_log_ibfk_1;
 ALTER TABLE detect_log DROP FOREIGN KEY detect_log_ibfk_1;
 ALTER TABLE detect_log DROP FOREIGN KEY detect_log_ibfk_2;
 ALTER TABLE detect_log DROP FOREIGN KEY detect_log_ibfk_3;
+ALTER TABLE detect_log DROP FOREIGN KEY detect_log_ibfk_5;
 ALTER TABLE link DROP FOREIGN KEY link_ibfk_1;
 ALTER TABLE login_ip DROP FOREIGN KEY login_ip_ibfk_1;
 ALTER TABLE paylist DROP FOREIGN KEY paylist_ibfk_1;

+ 0 - 1
src/Controllers/Admin/NodeController.php

@@ -39,7 +39,6 @@ final class NodeController extends BaseController
     public static array $update_field = [
         'name',
         'server',
-        'mu_only',
         'traffic_rate',
         'info',
         'node_group',

+ 0 - 1
src/Controllers/AuthController.php

@@ -291,7 +291,6 @@ final class AuthController extends BaseController
 
         $user->class_expire = date('Y-m-d H:i:s', time() + (int) $configs['sign_up_for_class_time'] * 86400);
         $user->class = $configs['sign_up_for_class'];
-        $user->node_connector = 0;
         $user->node_iplimit = $configs['connection_ip_limit'];
         $user->node_speedlimit = $configs['connection_rate_limit'];
         $user->expire_in = date('Y-m-d H:i:s', time() + (int) $configs['sign_up_for_free_time'] * 86400);

+ 6 - 1
src/Controllers/User/OrderController.php

@@ -20,6 +20,7 @@ use function explode;
 use function in_array;
 use function json_decode;
 use function json_encode;
+use function property_exists;
 use function time;
 
 final class OrderController extends BaseController
@@ -182,7 +183,11 @@ final class OrderController extends BaseController
                 }
             }
 
-            $coupon_total_use_limit = $coupon_limit->total_use_time;
+            if (property_exists($coupon_limit, 'total_use_time')) {
+                $coupon_total_use_limit = $coupon_limit->total_use_time;
+            } else {
+                $coupon_total_use_limit = -1;
+            }
 
             if ($coupon_total_use_limit > 0 && $coupon->use_count >= $coupon_total_use_limit) {
                 return $response->withJson([

+ 1 - 1
src/Controllers/WebAPI/NodeController.php

@@ -56,7 +56,7 @@ final class NodeController extends BaseController
             'node_class' => $node->node_class,
             'node_speedlimit' => $node->node_speedlimit,
             'traffic_rate' => $node->traffic_rate,
-            'mu_only' => $node->mu_only,
+            'mu_only' => 0,
             'sort' => $node->sort,
             'server' => $node_server,
             'custom_config' => json_decode($node->custom_config, true, JSON_UNESCAPED_SLASHES),

+ 3 - 1
src/Controllers/WebAPI/UserController.php

@@ -58,7 +58,6 @@ final class UserController extends BaseController
                 user.u,
                 user.d,
                 user.transfer_enable,
-                user.node_connector,
                 user.node_speedlimit,
                 user.node_iplimit,
                 user.method,
@@ -106,9 +105,12 @@ final class UserController extends BaseController
                 }
             }
 
+            $user_raw->node_connector = 0;
+
             foreach ($keys_unset as $key) {
                 unset($user_raw->$key);
             }
+
             $users[] = $user_raw;
         }
 

+ 2 - 1
src/Services/Gateway/PayPal.php

@@ -15,6 +15,7 @@ use Slim\Http\ServerRequest;
 use Srmklive\PayPal\Services\PayPal as PayPalClient;
 use Throwable;
 use voku\helper\AntiXSS;
+use function round;
 
 final class PayPal extends AbstractPayment
 {
@@ -125,7 +126,7 @@ final class PayPal extends AbstractPayment
 
         $result = $pp->capturePaymentOrder($order_id);
 
-        if ($result['status'] === 'COMPLETED') {
+        if (isset($result['status']) && $result['status'] === 'COMPLETED') {
             $trade_no = $result['purchase_units'][0]['reference_id'];
             $this->postPayment($trade_no);
 

+ 5 - 2
src/Utils/Telegram/Commands/SetuserCommand.php

@@ -47,9 +47,12 @@ final class SetuserCommand extends Command
             'username' => $Message->getFrom()->getUsername(),
         ];
 
-        if (! in_array($SendUser['id'], json_decode(Setting::obtain('telegram_admins')))) {
+        if (! in_array($SendUser['id'], json_decode(Setting::obtain('telegram_admins'), true))) {
             $AdminUser = User::where('is_admin', 1)->where('telegram_id', $SendUser['id'])->first();
-            if ($AdminUser === null && Setting::obtain('enable_not_admin_reply') && Setting::obtain('not_admin_reply_msg') !== '') {
+            if ($AdminUser === null
+                && Setting::obtain('enable_not_admin_reply')
+                && Setting::obtain('not_admin_reply_msg') !== ''
+            ) {
                 // 非管理员回复消息
                 $this->replyWithMessage(
                     [