Преглед изворни кода

style: update email temp & table style

Cat пре 1 година
родитељ
комит
a9002764d2

+ 1 - 1
README.md

@@ -10,7 +10,7 @@
 
 ## TL;DR
 
-NeXT Panel is a multipurpose proxy service management system designed for Shadowsocks(2022) / V2Ray / Trojan / TUIC protocol.
+NeXT Panel is a multipurpose proxy service management system designed for Shadowsocks(2022) / Vmess / Trojan / TUIC protocol.
 
 ## Features
 

+ 721 - 12
composer.lock

@@ -622,16 +622,16 @@
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.306.5",
+            "version": "3.306.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2"
+                "reference": "bc30df54badd9d2af8d291cd0665ade6eb509598"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2",
-                "reference": "07fa90825034bf64ab3fdddc1e1f1ca2fa33d6c2",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bc30df54badd9d2af8d291cd0665ade6eb509598",
+                "reference": "bc30df54badd9d2af8d291cd0665ade6eb509598",
                 "shasum": ""
             },
             "require": {
@@ -711,9 +711,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.306.5"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.306.7"
             },
-            "time": "2024-05-13T18:04:50+00:00"
+            "time": "2024-05-15T18:04:12+00:00"
         },
         {
             "name": "bacon/bacon-qr-code",
@@ -7019,6 +7019,70 @@
         }
     ],
     "packages-dev": [
+        {
+            "name": "clue/ndjson-react",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/clue/reactphp-ndjson.git",
+                "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
+                "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+                "react/event-loop": "^1.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Clue\\React\\NDJson\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
+            "homepage": "https://github.com/clue/reactphp-ndjson",
+            "keywords": [
+                "NDJSON",
+                "json",
+                "jsonlines",
+                "newline",
+                "reactphp",
+                "streaming"
+            ],
+            "support": {
+                "issues": "https://github.com/clue/reactphp-ndjson/issues",
+                "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://clue.engineering/support",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-12-23T10:58:28+00:00"
+        },
         {
             "name": "cmgmyr/phploc",
             "version": "8.0.3",
@@ -7433,27 +7497,142 @@
             },
             "time": "2023-11-19T22:19:30+00:00"
         },
+        {
+            "name": "evenement/evenement",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/igorw/evenement.git",
+                "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
+                "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9 || ^6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Evenement\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Igor Wiedler",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Événement is a very simple event dispatching library for PHP",
+            "keywords": [
+                "event-dispatcher",
+                "event-emitter"
+            ],
+            "support": {
+                "issues": "https://github.com/igorw/evenement/issues",
+                "source": "https://github.com/igorw/evenement/tree/v3.0.2"
+            },
+            "time": "2023-08-08T05:53:35+00:00"
+        },
+        {
+            "name": "fidry/cpu-core-counter",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theofidry/cpu-core-counter.git",
+                "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42",
+                "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "fidry/makefile": "^0.2.0",
+                "fidry/php-cs-fixer-config": "^1.1.2",
+                "phpstan/extension-installer": "^1.2.0",
+                "phpstan/phpstan": "^1.9.2",
+                "phpstan/phpstan-deprecation-rules": "^1.0.0",
+                "phpstan/phpstan-phpunit": "^1.2.2",
+                "phpstan/phpstan-strict-rules": "^1.4.4",
+                "phpunit/phpunit": "^8.5.31 || ^9.5.26",
+                "webmozarts/strict-phpunit": "^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Fidry\\CpuCoreCounter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Théo FIDRY",
+                    "email": "[email protected]"
+                }
+            ],
+            "description": "Tiny utility to get the number of CPU cores.",
+            "keywords": [
+                "CPU",
+                "core"
+            ],
+            "support": {
+                "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+                "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theofidry",
+                    "type": "github"
+                }
+            ],
+            "time": "2024-02-07T09:43:46+00:00"
+        },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.56.1",
+            "version": "v3.57.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-                "reference": "69c6168ae8bc96dc656c7f6c7271120a68ae5903"
+                "reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/69c6168ae8bc96dc656c7f6c7271120a68ae5903",
-                "reference": "69c6168ae8bc96dc656c7f6c7271120a68ae5903",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/3f7efe667a8c9818aacceee478add7c0fc24cb21",
+                "reference": "3f7efe667a8c9818aacceee478add7c0fc24cb21",
                 "shasum": ""
             },
             "require": {
+                "clue/ndjson-react": "^1.0",
                 "composer/semver": "^3.4",
                 "composer/xdebug-handler": "^3.0.3",
                 "ext-filter": "*",
                 "ext-json": "*",
                 "ext-tokenizer": "*",
+                "fidry/cpu-core-counter": "^1.0",
                 "php": "^7.4 || ^8.0",
+                "react/child-process": "^0.6.5",
+                "react/event-loop": "^1.0",
+                "react/promise": "^2.0 || ^3.0",
+                "react/socket": "^1.0",
+                "react/stream": "^1.0",
                 "sebastian/diff": "^4.0 || ^5.0 || ^6.0",
                 "symfony/console": "^5.4 || ^6.0 || ^7.0",
                 "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0",
@@ -7516,7 +7695,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.56.1"
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.57.1"
             },
             "funding": [
                 {
@@ -7524,7 +7703,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-05-10T11:31:15+00:00"
+            "time": "2024-05-15T22:01:07+00:00"
         },
         {
             "name": "justinrainbow/json-schema",
@@ -8598,6 +8777,536 @@
             },
             "time": "2021-02-03T23:26:27+00:00"
         },
+        {
+            "name": "react/cache",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/cache.git",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/promise": "^3.0 || ^2.0 || ^1.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, Promise-based cache interface for ReactPHP",
+            "keywords": [
+                "cache",
+                "caching",
+                "promise",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/cache/issues",
+                "source": "https://github.com/reactphp/cache/tree/v1.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2022-11-30T15:59:55+00:00"
+        },
+        {
+            "name": "react/child-process",
+            "version": "v0.6.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/child-process.git",
+                "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
+                "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.0",
+                "react/event-loop": "^1.2",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
+                "react/socket": "^1.8",
+                "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\ChildProcess\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Event-driven library for executing child processes with ReactPHP.",
+            "keywords": [
+                "event-driven",
+                "process",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/child-process/issues",
+                "source": "https://github.com/reactphp/child-process/tree/v0.6.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/WyriHaximus",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-09-16T13:41:56+00:00"
+        },
+        {
+            "name": "react/dns",
+            "version": "v1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/dns.git",
+                "reference": "c134600642fa615b46b41237ef243daa65bb64ec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/dns/zipball/c134600642fa615b46b41237ef243daa65bb64ec",
+                "reference": "c134600642fa615b46b41237ef243daa65bb64ec",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/cache": "^1.0 || ^0.6 || ^0.5",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3.0 || ^2.7 || ^1.2.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4 || ^3 || ^2",
+                "react/promise-timer": "^1.9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Dns\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async DNS resolver for ReactPHP",
+            "keywords": [
+                "async",
+                "dns",
+                "dns-resolver",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/dns/issues",
+                "source": "https://github.com/reactphp/dns/tree/v1.12.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-11-29T12:41:06+00:00"
+        },
+        {
+            "name": "react/event-loop",
+            "version": "v1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/event-loop.git",
+                "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+                "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+            },
+            "suggest": {
+                "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\EventLoop\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
+            "keywords": [
+                "asynchronous",
+                "event-loop"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/event-loop/issues",
+                "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-11-13T13:48:05+00:00"
+        },
+        {
+            "name": "react/promise",
+            "version": "v3.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/promise.git",
+                "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/promise/zipball/e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
+                "reference": "e563d55d1641de1dea9f5e84f3cccc66d2bfe02c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "1.10.39 || 1.4.10",
+                "phpunit/phpunit": "^9.6 || ^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "keywords": [
+                "promise",
+                "promises"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/promise/issues",
+                "source": "https://github.com/reactphp/promise/tree/v3.1.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-11-16T16:21:57+00:00"
+        },
+        {
+            "name": "react/socket",
+            "version": "v1.15.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/socket.git",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.0",
+                "react/dns": "^1.11",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3 || ^2.6 || ^1.2.1",
+                "react/stream": "^1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4 || ^3 || ^2",
+                "react/promise-stream": "^1.4",
+                "react/promise-timer": "^1.10"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Socket\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
+            "keywords": [
+                "Connection",
+                "Socket",
+                "async",
+                "reactphp",
+                "stream"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/socket/issues",
+                "source": "https://github.com/reactphp/socket/tree/v1.15.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-12-15T11:02:10+00:00"
+        },
+        {
+            "name": "react/stream",
+            "version": "v1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/stream.git",
+                "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/stream/zipball/6fbc9672905c7d5a885f2da2fc696f65840f4a66",
+                "reference": "6fbc9672905c7d5a885f2da2fc696f65840f4a66",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.8",
+                "react/event-loop": "^1.2"
+            },
+            "require-dev": {
+                "clue/stream-filter": "~1.2",
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Stream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "[email protected]",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "[email protected]",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "[email protected]",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "[email protected]",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
+            "keywords": [
+                "event-driven",
+                "io",
+                "non-blocking",
+                "pipe",
+                "reactphp",
+                "readable",
+                "stream",
+                "writable"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/stream/issues",
+                "source": "https://github.com/reactphp/stream/tree/v1.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-06-16T10:52:11+00:00"
+        },
         {
             "name": "sebastian/cli-parser",
             "version": "2.0.1",

+ 18 - 27
resources/email/finance.tpl

@@ -1,35 +1,26 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                {$title}
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                                <h2 class="bigTitle">
+                                    {$title}
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                {$text}
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    {$text}
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 12 - 14
resources/email/footer.tpl

@@ -1,18 +1,16 @@
-<div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-     class="wrapperTable">
+<div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align:center;" width="100%">
     <div align="center" valign="top">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="footer">
-            <div>
-                <div align="center" valign="top"
-                     style="padding-top:15px;padding-bottom:30px;padding-left:10px;padding-right:10px;"
-                     class="brandInfo">
-                    <p class="smlText">
-                        <a href="{$config['baseUrl']}" style="color:#505050;text-decoration:none"
-                           target="_blank">{$config['appName']}</a> |
-                        <a href="{$config['baseUrl']}/user/edit" style="color:#505050;text-decoration:none"
-                           target="_blank">修改邮件接收设置</a>
-                    </p>
-                </div>
+        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+            <div align="center" valign="top" style="padding: 15px 10px 30px;">
+                <p class="smlText">
+                    <a href="{$config['baseUrl']}" style="color:#505050;text-decoration:none;" target="_blank">
+                        {$config['appName']}
+                    </a>
+                    &nbsp;|&nbsp;
+                    <a href="{$config['baseUrl']}/user/edit" style="color:#505050;text-decoration:none;" target="_blank">
+                        修改邮件接收设置
+                    </a>
+                </p>
             </div>
         </div>
     </div>

+ 0 - 1
resources/email/header.tpl

@@ -3,7 +3,6 @@
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="viewport" content="width=device-width"/>
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
-
     <link href="//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet"/>
 
     <style>

+ 18 - 27
resources/email/new_user.tpl

@@ -1,35 +1,26 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                账户已经生成
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align:center;" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px;">
+                                <h2 class="bigTitle">
+                                    账户已经生成
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                {$text}
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    {$text}
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 21 - 29
resources/email/password_reset.tpl

@@ -1,37 +1,29 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                密码重置
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0"
+                     style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px;">
+                                <h2 class="bigTitle">
+                                    密码重置
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                你收到此邮件是因为你在 {$config['appName']} 系统申请了密码重置,如果非本人申请,请忽略此邮件。
-                                <br><br>
-                                <a href="{$resetUrl}" style="color:#505050" target="_blank">点击此链接重置密码</a>
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    你收到此邮件是因为你在 {$config['appName']} 系统申请了密码重置,如果非本人申请,请忽略此邮件。
+                                    <br><br>
+                                    <a href="{$resetUrl}" style="color:#505050" target="_blank">点击此链接重置密码</a>
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 18 - 27
resources/email/test.tpl

@@ -1,35 +1,26 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                邮件发送测试
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align:center;" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                                <h2 class="bigTitle">
+                                    邮件发送测试
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                这是一封测试邮件。如果你能收到,说明邮件发送配置有效,可以正常工作。
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px; padding-left:20px; padding-right:20px;">
+                                <p class="midText">
+                                    这是一封测试邮件。如果你能收到,说明邮件发送配置有效,可以正常工作。
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 32 - 41
resources/email/traffic_report.tpl

@@ -1,49 +1,40 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                每日流量报告
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align:center;" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px;">
+                                <h2 class="bigTitle">
+                                    每日流量报告
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                用户名: {$user->user_name}
-                                <br>
-                                Email: {$user->email}
-                                <br><br>
-                                总流量: {$enable_traffic}
-                                <br>
-                                已用流量: {$used_traffic}
-                                <br>
-                                剩余流量: {$unused_traffic}
-                                <br>
-                                今日使用流量: {$lastday_traffic}
-                                <br><br>
-                            </p>
-                            <p class="midText">
-                                {$text}
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    用户名: {$user->user_name}
+                                    <br>
+                                    Email: {$user->email}
+                                    <br><br>
+                                    总流量: {$enable_traffic}
+                                    <br>
+                                    已用流量: {$used_traffic}
+                                    <br>
+                                    剩余流量: {$unused_traffic}
+                                    <br>
+                                    今日使用流量: {$lastday_traffic}
+                                    <br><br>
+                                </p>
+                                <p class="midText">
+                                    {$text}
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 20 - 29
resources/email/verify_code.tpl

@@ -1,37 +1,28 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                邮箱验证
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align:center;" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px;">
+                                <h2 class="bigTitle">
+                                    邮箱验证
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                你请求的邮箱验证代码为: <b style="color:#505050">{$code}</b> <br>
-                                本验证代码在 {$expire} 前有效。<br>
-                                如果此验证码非你本人申请,请忽视此邮件。<br>
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    你请求的邮箱验证代码为:<b style="color:#505050">{$code}</b> <br>
+                                    本验证代码在 {$expire} 前有效。<br>
+                                    如果此验证码非你本人申请,请忽视此邮件。<br>
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 18 - 27
resources/email/warn.tpl

@@ -1,35 +1,26 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-<div style="text-align: center">
-    <div border="0" cellpadding="0" cellspacing="0" width="100%"
-         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-            <div border="0" cellpadding="0" cellspacing="0"
-                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                            <h2 class="bigTitle">
-                                系统提示
-                            </h2>
+    <div style="text-align: center">
+        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;">
+            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;">
+                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align:center;" width="100%">
+                    <div align="center" valign="top">
+                        <div border="0" cellpadding="0" cellspacing="0" width="100%">
+                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px;">
+                                <h2 class="bigTitle">
+                                    系统提示
+                                </h2>
+                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
-                 class="wrapperTable">
-                <div align="center" valign="top">
-                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
-                         class="oneColumn">
-                        <div align="center" valign="top"
-                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                            <p class="midText">
-                                {$text}
-                            </p>
+                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%">
+                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;">
+                                <p class="midText">
+                                    {$text}
+                                </p>
+                            </div>
                         </div>
                     </div>
                 </div>
-            </div>
 
-            {include file='footer.tpl'}
+{include file='footer.tpl'}

+ 10 - 7
resources/locale/en_US.php

@@ -8,18 +8,21 @@ return [
     'lang_name' => 'English(Simplified)',
     'lang_code' => 'en',
     'bot' => [
+        'daily_job_run' => 'Successful execution of daily tasks',
+        'detect_rule_added' => 'Detect rule %rule_name% has been added',
+        'diary' => 'Number of people checking in today: %checkin_user%' . PHP_EOL . 'Total traffic used today: %lastday_total%',
         'node_added' => '%node_name% has been added',
-        'node_updated' => '%node_name% has been modified',
         'node_deleted' => '%node_name% was deleted',
         'node_gfwed' => '%node_name% is blocked',
-        'node_ungfwed' => '%node_name% recovered',
-        'node_online' => '%node_name% is back online',
         'node_offline' => '%node_name% has gone offline',
-        'daily_job_run' => 'Successful execution of daily tasks',
-        'diary' => 'Number of people checking in today: %checkin_user%' . PHP_EOL . 'Total traffic used today: %lastday_total%',
-        'user_not_bind' => 'You have not bound your account to this website. You can enter the **Edit Account** of the website and bind your account in the lower right corner.',
+        'node_online' => '%node_name% is back online',
+        'node_ungfwed' => '%node_name% recovered',
+        'node_updated' => '%node_name% has been modified',
+        'order_created' => 'Order #%order_id% has been created' . PHP_EOL . 'Link: %order_link%',
+        'test_message' => 'Test message',
+        'ticket_created' => 'Ticket #%ticket_id% has been created' . PHP_EOL . 'Link: %ticket_link%',
         'user_join_welcome_free' => 'Welcome %user_name%',
         'user_join_welcome_paid' => 'Welcome VIP%user_class% user %user_name% to join the group',
-        'test_message' => 'Test message',
+        'user_not_bind' => 'You have not bound your account to this website. You can enter the **Edit Account** of the website and bind your account in the lower right corner.',
     ],
 ];

+ 10 - 7
resources/locale/ja_JP.php

@@ -8,18 +8,21 @@ return [
     'lang_name' => '日本語',
     'lang_code' => 'ja',
     'bot' => [
+        'daily_job_run' => '日次タスクの正常な実行',
+        'detect_rule_added' => '追加された監査ルール %rule_name%',
+        'diary' => '今日チェックインした人の数: %checkin_user%' . PHP_EOL . '今日使用された合計トラフィック: %lastday_total%',
         'node_added' => '%node_name% が追加されました',
-        'node_updated' => '%node_name% が変更されました',
         'node_deleted' => '%node_name% が削除されました',
         'node_gfwed' => '%node_name% はブロックされています',
-        'node_ungfwed' => '%node_name% が回復しました',
-        'node_online' => '%node_name% はオンラインに戻りました',
         'node_offline' => '%node_name% にはいくつかの障害があります',
-        'daily_job_run' => '日次タスクの正常な実行',
-        'diary' => '今日チェックインした人の数: %checkin_user%' . PHP_EOL . '今日使用された合計トラフィック: %lastday_total%',
-        'user_not_bind' => 'アカウントをこの Web サイトにバインドしていません。Web サイトの **データ編集** に入り、右下隅でアカウントをバインドできます。',
+        'node_online' => '%node_name% はオンラインに戻りました',
+        'node_ungfwed' => '%node_name% が回復しました',
+        'node_updated' => '%node_name% が変更されました',
+        'order_created' => 'オーダー #%order_id% が作成されました' . PHP_EOL . 'リンク: %order_link%',
+        'test_message' => 'テストメッセージ',
+        'ticket_created' => 'チケット #%ticket_id% が作成されました' . PHP_EOL . 'リンク: %ticket_link%',
         'user_join_welcome_free' => 'ようこそ %user_name%',
         'user_join_welcome_paid' => 'VIP%user_class% ユーザー %user_name% のグループへの参加を歓迎します',
-        'test_message' => 'テストメッセージ',
+        'user_not_bind' => 'アカウントをこの Web サイトにバインドしていません。Web サイトの **データ編集** に入り、右下隅でアカウントをバインドできます。',
     ],
 ];

+ 10 - 7
resources/locale/zh_CN.php

@@ -8,18 +8,21 @@ return [
     'lang_name' => '中文',
     'lang_code' => 'zh',
     'bot' => [
+        'daily_job_run' => '成功执行每日任务',
+        'detect_rule_added' => '新增了审计规则 %rule_name%',
+        'diary' => '今日签到人数:%checkin_user%' . PHP_EOL . '今日使用总流量:%lastday_total%',
         'node_added' => '%node_name% 已被添加',
-        'node_updated' => '%node_name% 已被修改',
         'node_deleted' => '%node_name% 被删除了',
         'node_gfwed' => '%node_name% 节点被墙了',
-        'node_ungfwed' => '%node_name% 节点恢复了',
-        'node_online' => '%node_name% 节点恢复上线',
         'node_offline' => '%node_name% 节点出现了一些故障',
-        'daily_job_run' => '成功执行每日任务',
-        'diary' => '今日签到人数:%checkin_user%' . PHP_EOL . '今日使用总流量:%lastday_total%',
-        'user_not_bind' => '您未绑定本站账号,您可以进入网站的 **资料编辑**,在右下方绑定您的账号。',
+        'node_online' => '%node_name% 节点恢复上线',
+        'node_ungfwed' => '%node_name% 节点恢复了',
+        'node_updated' => '%node_name% 已被修改',
+        'order_created' => '订单 #%order_id% 已创建' . PHP_EOL . '链接:%order_link%',
+        'test_message' => '测试消息',
+        'ticket_created' => '工单 #%ticket_id% 已创建' . PHP_EOL . '链接:%ticket_link%',
         'user_join_welcome_free' => '欢迎 %user_name%',
         'user_join_welcome_paid' => '欢迎 VIP%user_class% 用户 %user_name% 加入群组',
-        'test_message' => '测试消息',
+        'user_not_bind' => '你未绑定本站账号,你可以进入网站的 **资料编辑**,在右下方绑定你的账号。',
     ],
 ];

+ 10 - 7
resources/locale/zh_TW.php

@@ -8,18 +8,21 @@ return [
     'lang_name' => '正體中文',
     'lang_code' => 'zh',
     'bot' => [
+        'daily_job_run' => '成功執行每日任務',
+        'detect_rule_added' => '新增了稽核規則 %rule_name%',
+        'diary' => '今日簽到人數:%checkin_user%' . PHP_EOL . '今日使用總流量:%lastday_total%',
         'node_added' => '%node_name% 已被加',
-        'node_updated' => '%node_name% 已被修改',
         'node_deleted' => '%node_name% 被刪除了',
         'node_gfwed' => '%node_name% 被牆了',
-        'node_ungfwed' => '%node_name% 恢復了',
-        'node_online' => '%node_name% 恢復上線',
         'node_offline' => '%node_name% 出現了一些故障',
-        'daily_job_run' => '成功執行每日任務',
-        'diary' => '今日簽到人數:%checkin_user%' . PHP_EOL . '今日使用總流量:%lastday_total%',
-        'user_not_bind' => '您未綁定本站帳號,您可以進入網站的 **資料編輯**,在右下方綁定您的帳號。',
+        'node_online' => '%node_name% 恢復上線',
+        'node_ungfwed' => '%node_name% 恢復了',
+        'node_updated' => '%node_name% 已被修改',
+        'order_created' => '訂單 #%order_id% 已建立' . PHP_EOL . '連結:%order_link%',
+        'test_message' => '測試訊息',
+        'ticket_created' => '工單 #%ticket_id% 已建立' . PHP_EOL . '連結:%ticket_link%',
         'user_join_welcome_free' => '歡迎 %user_name%',
         'user_join_welcome_paid' => '歡迎 VIP%user_class% 使用者 %user_name% 加入群組',
-        'test_message' => '測試訊息',
+        'user_not_bind' => '你未綁定本站帳號,你可以進入網站的 **資料編輯**,在右下方綁定你的帳號。',
     ],
 ];

+ 6 - 1
src/Command/Test.php

@@ -36,7 +36,12 @@ EOL;
 
     public function sendFinanceMail(): void
     {
-        [,,, $type] = $this->argv;
+        if (count($this->argv) === 3) {
+            $type = 'daily';
+        } else {
+            [, , , $type] = $this->argv;
+        }
+
         $cron = new Cron();
 
         switch ($type) {

+ 12 - 2
src/Services/Cron.php

@@ -489,8 +489,7 @@ final class Cron
             ->whereBetween('datetime', [strtotime('-1 day', $today), $today])->get();
 
         if (count($paylists) > 0) {
-            $text_html = '<table style="table, th, td {border: 1px solid black; border-collapse: collapse;}">
-                <tr><td>金额</td><td>用户ID</td><td>用户名</td><td>充值时间</td>';
+            $text_html = '<table><tr><td>金额</td><td>用户ID</td><td>用户名</td><td>充值时间</td></tr>';
 
             foreach ($paylists as $paylist) {
                 $text_html .= '<tr>';
@@ -503,6 +502,17 @@ final class Cron
 
             $text_html .= '</table>';
             $text_html .= '<br>昨日总收入笔数:' . count($paylists) . '<br>昨日总收入金额:' . $paylists->sum('total');
+
+            $text_html = str_replace([
+                '<table>',
+                '<tr>',
+                '<td>',
+            ], [
+                '<table style="width: 100%;border: 1px solid black;border-collapse: collapse;">',
+                '<tr style="border: 1px solid black;padding: 5px;">',
+                '<td style="border: 1px solid black;padding: 5px;">',
+            ], $text_html);
+
             echo 'Sending daily finance email to admin user' . PHP_EOL;
 
             try {