diff --git a/app/predefine.php b/app/predefine.php
index 6b02328f36..7694004d47 100644
--- a/app/predefine.php
+++ b/app/predefine.php
@@ -7,4 +7,4 @@
*/
const BASE_PATH = __DIR__ . '/..';
-const VERSION = '2023.5';
+const VERSION = '2023.6';
diff --git a/app/routes.php b/app/routes.php
index bdba86889e..d7692ac96b 100644
--- a/app/routes.php
+++ b/app/routes.php
@@ -22,6 +22,10 @@
// OAuth
$app->post('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
$app->get('/oauth/{type}', App\Controllers\OAuthController::class . ':index');
+ // 传统订阅(SS/V2Ray/Trojan etc.)
+ $app->get('/link/{token}', App\Controllers\SubController::class . ':getTraditionalSubContent');
+ // 通用订阅(Json/Clash/SIP008)
+ $app->get('/sub/{token}/{subtype}', App\Controllers\SubController::class . ':getUniversalSubContent');
// User Center
$app->group('/user', static function (RouteCollectorProxy $group): void {
$group->get('', App\Controllers\UserController::class . ':index');
@@ -32,25 +36,27 @@
$group->get('/announcement', App\Controllers\UserController::class . ':announcement');
// 文档
$group->get('/docs', App\Controllers\User\DocsController::class . ':index');
- $group->get('/docs/{id}/view', App\Controllers\User\DocsController::class . ':detail');
+ $group->get('/docs/{id:[0-9]+}/view', App\Controllers\User\DocsController::class . ':detail');
// 个人资料
$group->get('/profile', App\Controllers\UserController::class . ':profile');
$group->get('/invite', App\Controllers\UserController::class . ':invite');
// 封禁
$group->get('/banned', App\Controllers\UserController::class . ':banned');
// 节点
- $group->get('/server', App\Controllers\User\ServerController::class . ':server');
+ $group->get('/server', App\Controllers\User\ServerController::class . ':index');
// 动态倍率
$group->get('/rate', App\Controllers\User\RateController::class . ':index');
$group->post('/rate', App\Controllers\User\RateController::class . ':ajax');
- // 审计
- $group->get('/detect', App\Controllers\User\DetectController::class . ':index');
+ // 审计规则
+ $group->get('/detect', App\Controllers\User\DetectRuleController::class . ':index');
+ // 审计记录
+ $group->get('/detect/log', App\Controllers\User\DetectLogController::class . ':index');
// 工单
- $group->get('/ticket', App\Controllers\User\TicketController::class . ':ticket');
- $group->get('/ticket/create', App\Controllers\User\TicketController::class . ':ticketCreate');
- $group->post('/ticket', App\Controllers\User\TicketController::class . ':ticketAdd');
- $group->get('/ticket/{id}/view', App\Controllers\User\TicketController::class . ':ticketView');
- $group->put('/ticket/{id}', App\Controllers\User\TicketController::class . ':ticketUpdate');
+ $group->get('/ticket', App\Controllers\User\TicketController::class . ':index');
+ $group->get('/ticket/create', App\Controllers\User\TicketController::class . ':create');
+ $group->post('/ticket', App\Controllers\User\TicketController::class . ':add');
+ $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\User\TicketController::class . ':detail');
+ $group->put('/ticket/{id:[0-9]+}', App\Controllers\User\TicketController::class . ':update');
// 资料编辑
$group->get('/edit', App\Controllers\User\InfoController::class . ':index');
$group->post('/email', App\Controllers\User\InfoController::class . ':updateEmail');
@@ -68,32 +74,28 @@
$group->post('/kill', App\Controllers\User\InfoController::class . ':sendToGulag');
// 发送验证邮件
$group->post('/send', App\Controllers\AuthController::class . ':sendVerify');
- // 登出
- $group->get('/logout', App\Controllers\UserController::class . ':logout');
// MFA
$group->post('/ga_check', App\Controllers\User\MFAController::class . ':checkGa');
$group->post('/ga_set', App\Controllers\User\MFAController::class . ':setGa');
$group->post('/ga_reset', App\Controllers\User\MFAController::class . ':resetGa');
// 深色模式切换
$group->post('/switch_theme_mode', App\Controllers\UserController::class . ':switchThemeMode');
- // 记录
- $group->get('/subscribe/log', App\Controllers\User\LogController::class . ':subscribe');
- $group->get('/detect/log', App\Controllers\User\LogController::class . ':detect');
+ // 订阅记录
+ $group->get('/subscribe', App\Controllers\User\SubLogController::class . ':index');
// 账户余额
- $group->get('/money', App\Controllers\User\MoneyController::class . ':money');
- // 礼品卡兑换
+ $group->get('/money', App\Controllers\User\MoneyController::class . ':index');
$group->post('/giftcard', App\Controllers\User\MoneyController::class . ':applyGiftCard');
// 产品页面
- $group->get('/product', App\Controllers\User\ProductController::class . ':product');
+ $group->get('/product', App\Controllers\User\ProductController::class . ':index');
// 订单页面
- $group->get('/order', App\Controllers\User\OrderController::class . ':order');
+ $group->get('/order', App\Controllers\User\OrderController::class . ':index');
$group->get('/order/create', App\Controllers\User\OrderController::class . ':create');
$group->post('/order/create', App\Controllers\User\OrderController::class . ':process');
- $group->get('/order/{id}/view', App\Controllers\User\OrderController::class . ':detail');
+ $group->get('/order/{id:[0-9]+}/view', App\Controllers\User\OrderController::class . ':detail');
$group->post('/order/ajax', App\Controllers\User\OrderController::class . ':ajax');
// 账单页面
- $group->get('/invoice', App\Controllers\User\InvoiceController::class . ':invoice');
- $group->get('/invoice/{id}/view', App\Controllers\User\InvoiceController::class . ':detail');
+ $group->get('/invoice', App\Controllers\User\InvoiceController::class . ':index');
+ $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\User\InvoiceController::class . ':detail');
$group->post('/invoice/pay_balance', App\Controllers\User\InvoiceController::class . ':payBalance');
$group->post('/invoice/ajax', App\Controllers\User\InvoiceController::class . ':ajax');
// 新优惠码系统
@@ -104,6 +106,8 @@
$group->get('/payment/return/{type}', App\Services\Payment::class . ':returnHTML');
// Get Clients
$group->get('/clients/{name}', App\Controllers\User\ClientController::class . ':getClients');
+ // 登出
+ $group->get('/logout', App\Controllers\UserController::class . ':logout');
})->add(new Auth());
$app->group('/payment', static function (RouteCollectorProxy $group): void {
@@ -138,61 +142,63 @@
$group->get('/node', App\Controllers\Admin\NodeController::class . ':index');
$group->get('/node/create', App\Controllers\Admin\NodeController::class . ':create');
$group->post('/node', App\Controllers\Admin\NodeController::class . ':add');
- $group->get('/node/{id}/edit', App\Controllers\Admin\NodeController::class . ':edit');
- $group->post('/node/{id}/password_reset', App\Controllers\Admin\NodeController::class . ':resetNodePassword');
- $group->post('/node/{id}/copy', App\Controllers\Admin\NodeController::class . ':copy');
- $group->put('/node/{id}', App\Controllers\Admin\NodeController::class . ':update');
- $group->delete('/node/{id}', App\Controllers\Admin\NodeController::class . ':delete');
+ $group->get('/node/{id:[0-9]+}/edit', App\Controllers\Admin\NodeController::class . ':edit');
+ $group->post('/node/{id:[0-9]+}/reset', App\Controllers\Admin\NodeController::class . ':reset');
+ $group->post('/node/{id:[0-9]+}/copy', App\Controllers\Admin\NodeController::class . ':copy');
+ $group->put('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':update');
+ $group->delete('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':delete');
$group->post('/node/ajax', App\Controllers\Admin\NodeController::class . ':ajax');
// Ticket
$group->get('/ticket', App\Controllers\Admin\TicketController::class . ':index');
$group->post('/ticket', App\Controllers\Admin\TicketController::class . ':add');
- $group->get('/ticket/{id}/view', App\Controllers\Admin\TicketController::class . ':ticketView');
- $group->put('/ticket/{id}/close', App\Controllers\Admin\TicketController::class . ':close');
- $group->put('/ticket/{id}', App\Controllers\Admin\TicketController::class . ':update');
- $group->put('/ticket/{id}/ai', App\Controllers\Admin\TicketController::class . ':updateAI');
- $group->delete('/ticket/{id}', App\Controllers\Admin\TicketController::class . ':delete');
+ $group->get('/ticket/{id:[0-9]+}/view', App\Controllers\Admin\TicketController::class . ':detail');
+ $group->put('/ticket/{id:[0-9]+}/close', App\Controllers\Admin\TicketController::class . ':close');
+ $group->put('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':update');
+ $group->put('/ticket/{id:[0-9]+}/ai', App\Controllers\Admin\TicketController::class . ':updateAI');
+ $group->delete('/ticket/{id:[0-9]+}', App\Controllers\Admin\TicketController::class . ':delete');
$group->post('/ticket/ajax', App\Controllers\Admin\TicketController::class . ':ajax');
// Ann
$group->get('/announcement', App\Controllers\Admin\AnnController::class . ':index');
$group->get('/announcement/create', App\Controllers\Admin\AnnController::class . ':create');
$group->post('/announcement', App\Controllers\Admin\AnnController::class . ':add');
- $group->get('/announcement/{id}/edit', App\Controllers\Admin\AnnController::class . ':edit');
- $group->put('/announcement/{id}', App\Controllers\Admin\AnnController::class . ':update');
- $group->delete('/announcement/{id}', App\Controllers\Admin\AnnController::class . ':delete');
+ $group->get('/announcement/{id:[0-9]+}/edit', App\Controllers\Admin\AnnController::class . ':edit');
+ $group->put('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':update');
+ $group->delete('/announcement/{id:[0-9]+}', App\Controllers\Admin\AnnController::class . ':delete');
$group->post('/announcement/ajax', App\Controllers\Admin\AnnController::class . ':ajax');
// Docs
$group->get('/docs', App\Controllers\Admin\DocsController::class . ':index');
$group->get('/docs/create', App\Controllers\Admin\DocsController::class . ':create');
$group->post('/docs', App\Controllers\Admin\DocsController::class . ':add');
$group->post('/docs/generate', App\Controllers\Admin\DocsController::class . ':generate');
- $group->get('/docs/{id}/edit', App\Controllers\Admin\DocsController::class . ':edit');
- $group->put('/docs/{id}', App\Controllers\Admin\DocsController::class . ':update');
- $group->delete('/docs/{id}', App\Controllers\Admin\DocsController::class . ':delete');
+ $group->get('/docs/{id:[0-9]+}/edit', App\Controllers\Admin\DocsController::class . ':edit');
+ $group->put('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':update');
+ $group->delete('/docs/{id:[0-9]+}', App\Controllers\Admin\DocsController::class . ':delete');
$group->post('/docs/ajax', App\Controllers\Admin\DocsController::class . ':ajax');
// 审计
- $group->get('/detect', App\Controllers\Admin\DetectController::class . ':detect');
- $group->get('/detect/create', App\Controllers\Admin\DetectController::class . ':create');
- $group->post('/detect/add', App\Controllers\Admin\DetectController::class . ':add');
- $group->delete('/detect/{id}', App\Controllers\Admin\DetectController::class . ':delete');
- $group->post('/detect/ajax', App\Controllers\Admin\DetectController::class . ':ajaxRule');
- $group->get('/detect/log', App\Controllers\Admin\DetectController::class . ':log');
- $group->post('/detect/log/ajax', App\Controllers\Admin\DetectController::class . ':ajaxLog');
- $group->get('/detect/ban', App\Controllers\Admin\DetectController::class . ':ban');
- $group->post('/detect/ban/ajax', App\Controllers\Admin\DetectController::class . ':ajaxBan');
+ $group->get('/detect', App\Controllers\Admin\DetectRuleController::class . ':index');
+ $group->get('/detect/create', App\Controllers\Admin\DetectRuleController::class . ':create');
+ $group->post('/detect/add', App\Controllers\Admin\DetectRuleController::class . ':add');
+ $group->delete('/detect/{id:[0-9]+}', App\Controllers\Admin\DetectRuleController::class . ':delete');
+ $group->post('/detect/ajax', App\Controllers\Admin\DetectRuleController::class . ':ajax');
+ // 审计触发日志
+ $group->get('/detect/log', App\Controllers\Admin\DetectLogController::class . ':index');
+ $group->post('/detect/log/ajax', App\Controllers\Admin\DetectLogController::class . ':ajax');
+ // 审计封禁日志
+ $group->get('/detect/ban', App\Controllers\Admin\DetectBanController::class . ':index');
+ $group->post('/detect/ban/ajax', App\Controllers\Admin\DetectBanController::class . ':ajax');
// User
$group->get('/user', App\Controllers\Admin\UserController::class . ':index');
- $group->get('/user/{id}/edit', App\Controllers\Admin\UserController::class . ':edit');
- $group->put('/user/{id}', App\Controllers\Admin\UserController::class . ':update');
- $group->post('/user/create', App\Controllers\Admin\UserController::class . ':createNewUser');
+ $group->get('/user/{id:[0-9]+}/edit', App\Controllers\Admin\UserController::class . ':edit');
+ $group->put('/user/{id:[0-9]+}', App\Controllers\Admin\UserController::class . ':update');
+ $group->post('/user/create', App\Controllers\Admin\UserController::class . ':create');
$group->delete('/user/{id}', App\Controllers\Admin\UserController::class . ':delete');
$group->post('/user/ajax', App\Controllers\Admin\UserController::class . ':ajax');
// Coupon
$group->get('/coupon', App\Controllers\Admin\CouponController::class . ':index');
$group->post('/coupon', App\Controllers\Admin\CouponController::class . ':add');
$group->post('/coupon/ajax', App\Controllers\Admin\CouponController::class . ':ajax');
- $group->delete('/coupon/{id}', App\Controllers\Admin\CouponController::class . ':delete');
- $group->post('/coupon/{id}/disable', App\Controllers\Admin\CouponController::class . ':disable');
+ $group->delete('/coupon/{id:[0-9]+}', App\Controllers\Admin\CouponController::class . ':delete');
+ $group->post('/coupon/{id:[0-9]+}/disable', App\Controllers\Admin\CouponController::class . ':disable');
// 登录日志
$group->get('/login', App\Controllers\Admin\LoginLogController::class . ':index');
$group->post('/login/ajax', App\Controllers\Admin\LoginLogController::class . ':ajax');
@@ -200,19 +206,19 @@
$group->get('/online', App\Controllers\Admin\OnlineLogController::class . ':index');
$group->post('/online/ajax', App\Controllers\Admin\OnlineLogController::class . ':ajax');
// 订阅日志
- $group->get('/subscribe', App\Controllers\Admin\SubscribeLogController::class . ':index');
- $group->post('/subscribe/ajax', App\Controllers\Admin\SubscribeLogController::class . ':ajax');
+ $group->get('/subscribe', App\Controllers\Admin\SubLogController::class . ':index');
+ $group->post('/subscribe/ajax', App\Controllers\Admin\SubLogController::class . ':ajax');
// 邀请日志
- $group->get('/invite', App\Controllers\Admin\InviteController::class . ':invite');
+ $group->get('/invite', App\Controllers\Admin\InviteController::class . ':index');
$group->post('/invite/update_invite', App\Controllers\Admin\InviteController::class . ':update');
$group->post('/invite/add_invite', App\Controllers\Admin\InviteController::class . ':add');
$group->post('/invite/ajax', App\Controllers\Admin\InviteController::class . ':ajax');
// 流量日志
- $group->get('/trafficlog', App\Controllers\Admin\TrafficLogController::class . ':index');
- $group->post('/trafficlog/ajax', App\Controllers\Admin\TrafficLogController::class . ':ajax');
+ $group->get('/traffic', App\Controllers\Admin\TrafficLogController::class . ':index');
+ $group->post('/traffic/ajax', App\Controllers\Admin\TrafficLogController::class . ':ajax');
// 用户余额日志
- $group->get('/moneylog', App\Controllers\Admin\MoneyLogController::class . ':index');
- $group->post('/moneylog/ajax', App\Controllers\Admin\MoneyLogController::class . ':ajax');
+ $group->get('/money', App\Controllers\Admin\MoneyLogController::class . ':index');
+ $group->post('/money/ajax', App\Controllers\Admin\MoneyLogController::class . ':ajax');
// 支付网关日志
$group->get('/gateway', App\Controllers\Admin\PaylistController::class . ':index');
$group->post('/gateway/ajax', App\Controllers\Admin\PaylistController::class . ':ajax');
@@ -220,30 +226,31 @@
$group->get('/system', App\Controllers\Admin\SystemController::class . ':index');
$group->post('/system/check_update', App\Controllers\Admin\SystemController::class . ':checkUpdate');
// 设置中心
- $group->get('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':billing');
- $group->post('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':saveBilling');
- $group->get('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':captcha');
- $group->post('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':saveCaptcha');
- $group->get('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':cron');
- $group->post('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':saveCron');
- $group->get('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':email');
- $group->post('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':saveEmail');
- $group->get('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':feature');
- $group->post('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':saveFeature');
- $group->get('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':im');
- $group->post('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':saveIm');
- $group->get('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':ref');
- $group->post('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':saveRef');
- $group->get('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':reg');
- $group->post('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':saveReg');
- $group->get('/setting/sub', App\Controllers\Admin\Setting\SubscribeController::class . ':sub');
- $group->post('/setting/sub', App\Controllers\Admin\Setting\SubscribeController::class . ':saveSub');
- $group->get('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':support');
- $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':saveSupport');
- $group->post('/setting/test_email', App\Controllers\Admin\Setting\EmailController::class . ':testEmail');
- $group->post('/setting/test_telegram', App\Controllers\Admin\Setting\ImController::class . ':testTelegram');
- $group->post('/setting/test_discord', App\Controllers\Admin\Setting\ImController::class . ':testDiscord');
- $group->post('/setting/test_slack', App\Controllers\Admin\Setting\ImController::class . ':testSlack');
+ $group->get('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':index');
+ $group->post('/setting/billing', App\Controllers\Admin\Setting\BillingController::class . ':save');
+ $group->get('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':index');
+ $group->post('/setting/captcha', App\Controllers\Admin\Setting\CaptchaController::class . ':save');
+ $group->get('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':index');
+ $group->post('/setting/cron', App\Controllers\Admin\Setting\CronController::class . ':save');
+ $group->get('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':index');
+ $group->post('/setting/email', App\Controllers\Admin\Setting\EmailController::class . ':save');
+ $group->get('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':index');
+ $group->post('/setting/feature', App\Controllers\Admin\Setting\FeatureController::class . ':save');
+ $group->get('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':index');
+ $group->post('/setting/im', App\Controllers\Admin\Setting\ImController::class . ':save');
+ $group->get('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':index');
+ $group->post('/setting/ref', App\Controllers\Admin\Setting\RefController::class . ':save');
+ $group->get('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':index');
+ $group->post('/setting/reg', App\Controllers\Admin\Setting\RegController::class . ':save');
+ $group->get('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':index');
+ $group->post('/setting/sub', App\Controllers\Admin\Setting\SubController::class . ':save');
+ $group->get('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':index');
+ $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':save');
+ // 设置测试
+ $group->post('/setting/test/email', App\Controllers\Admin\Setting\EmailController::class . ':testEmail');
+ $group->post('/setting/test/telegram', App\Controllers\Admin\Setting\ImController::class . ':testTelegram');
+ $group->post('/setting/test/discord', App\Controllers\Admin\Setting\ImController::class . ':testDiscord');
+ $group->post('/setting/test/slack', App\Controllers\Admin\Setting\ImController::class . ':testSlack');
// 礼品卡
$group->get('/giftcard', App\Controllers\Admin\GiftCardController::class . ':index');
$group->post('/giftcard', App\Controllers\Admin\GiftCardController::class . ':add');
@@ -253,31 +260,43 @@
$group->get('/product', App\Controllers\Admin\ProductController::class . ':index');
$group->get('/product/create', App\Controllers\Admin\ProductController::class . ':create');
$group->post('/product', App\Controllers\Admin\ProductController::class . ':add');
- $group->get('/product/{id}/edit', App\Controllers\Admin\ProductController::class . ':edit');
- $group->post('/product/{id}/copy', App\Controllers\Admin\ProductController::class . ':copy');
- $group->put('/product/{id}', App\Controllers\Admin\ProductController::class . ':update');
- $group->delete('/product/{id}', App\Controllers\Admin\ProductController::class . ':delete');
+ $group->get('/product/{id:[0-9]+}/edit', App\Controllers\Admin\ProductController::class . ':edit');
+ $group->post('/product/{id:[0-9]+}/copy', App\Controllers\Admin\ProductController::class . ':copy');
+ $group->put('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':update');
+ $group->delete('/product/{id:[0-9]+}', App\Controllers\Admin\ProductController::class . ':delete');
$group->post('/product/ajax', App\Controllers\Admin\ProductController::class . ':ajax');
// 订单
$group->get('/order', App\Controllers\Admin\OrderController::class . ':index');
- $group->get('/order/{id}/view', App\Controllers\Admin\OrderController::class . ':detail');
- $group->post('/order/{id}/cancel', App\Controllers\Admin\OrderController::class . ':cancel');
+ $group->get('/order/{id:[0-9]+}/view', App\Controllers\Admin\OrderController::class . ':detail');
+ $group->post('/order/{id:[0-9]+}/cancel', App\Controllers\Admin\OrderController::class . ':cancel');
$group->delete('/order/{id}', App\Controllers\Admin\OrderController::class . ':delete');
$group->post('/order/ajax', App\Controllers\Admin\OrderController::class . ':ajax');
// 账单
$group->get('/invoice', App\Controllers\Admin\InvoiceController::class . ':index');
- $group->get('/invoice/{id}/view', App\Controllers\Admin\InvoiceController::class . ':detail');
- $group->post('/invoice/{id}/mark_paid', App\Controllers\Admin\InvoiceController::class . ':markPaid');
+ $group->get('/invoice/{id:[0-9]+}/view', App\Controllers\Admin\InvoiceController::class . ':detail');
+ $group->post('/invoice/{id:[0-9]+}/mark_paid', App\Controllers\Admin\InvoiceController::class . ':markPaid');
$group->post('/invoice/ajax', App\Controllers\Admin\InvoiceController::class . ':ajax');
})->add(new Admin());
- //$app->group('/admin/api', function (RouteCollectorProxy $group): void {
- // $group->post('/{action}', App\Controllers\Api\AdminApiController::class . ':actionHandler');
- //})->add(new AdminApiToken());
+ // Admin CLI API
+ //$app->group('/admin/api/v1', function (RouteCollectorProxy $group): void {
+ // $group->post('/{action}', App\Controllers\Api\AdminApiV1Controller::class . ':actionHandler');
+ //})->add(new AdminApi());
+
+ // User CLI API
+ //$app->group('/user/api/v1', function (RouteCollectorProxy $group): void {
+ // $group->post('/{action}', App\Controllers\Api\UserApiV1Controller::class . ':actionHandler');
+ //})->add(new UserApi());
- //$app->group('/user/api', function (RouteCollectorProxy $group): void {
- // $group->post('/{action}', App\Controllers\Api\UserApiController::class . ':actionHandler');
- //})->add(new UserApiToken());
+ // WebAPI V2(Aka Node API V1)
+ //$app->group('/node/api/v1', function (RouteCollectorProxy $group): void {
+ // $group->get('/info', App\Controllers\Api\NodeApiV1Controller::class . ':info');
+ // $group->get('/user', App\Controllers\Api\NodeApiV1Controller::class . ':user');
+ // $group->get('/detect_rule', App\Controllers\Api\NodeApiV1Controller::class . ':detectRule');
+ // $group->post('/user/traffic', App\Controllers\Api\NodeApiV1Controller::class . ':userTraffic');
+ // $group->post('/user/online_ip', App\Controllers\Api\NodeApiV1Controller::class . ':userOnlineIp');
+ // $group->post('/user/detect_log', App\Controllers\Api\NodeApiV1Controller::class . ':userDetectLog');
+ //})->add(new WebApi());
// WebAPI
$app->group('/mod_mu', static function (RouteCollectorProxy $group): void {
@@ -292,9 +311,4 @@
$group->get('/func/detect_rules', App\Controllers\WebAPI\FuncController::class . ':getDetectRules');
$group->get('/func/ping', App\Controllers\WebAPI\FuncController::class . ':ping');
})->add(new NodeToken());
-
- // 传统订阅(SS/V2Ray/Trojan etc.)
- $app->get('/link/{token}', App\Controllers\SubController::class . ':getTraditionalSubContent');
- // 通用订阅(Json/Clash/SIP008)
- $app->get('/sub/{token}/{subtype}', App\Controllers\SubController::class . ':getUniversalSubContent');
};
diff --git a/composer.json b/composer.json
index a1300c179b..94c880b979 100644
--- a/composer.json
+++ b/composer.json
@@ -12,36 +12,36 @@
"ext-posix": "*",
"ext-redis": "*",
"ext-xml": "*",
+ "ext-yaml": "*",
"ext-zip": "*",
"anankke/omnipay-alipay": "^3.1.3",
- "aws/aws-sdk-php": "^3",
- "cloudflare/sdk": "^1",
- "geoip2/geoip2": "~2.0",
- "guzzlehttp/guzzle": "^7.4",
- "guzzlehttp/psr7": "^2.4",
- "illuminate/database": "^10.0",
- "illuminate/pagination": "^10.0",
- "irazasyed/telegram-bot-sdk": "^3",
+ "aws/aws-sdk-php": "^3.283.14",
+ "cloudflare/sdk": "^1.3",
+ "geoip2/geoip2": "^2.13",
+ "guzzlehttp/guzzle": "^7.8",
+ "guzzlehttp/psr7": "^2.6.1",
+ "illuminate/database": "^10.29",
+ "illuminate/pagination": "^10.29",
+ "irazasyed/telegram-bot-sdk": "^3.13",
"lcobucci/jwt": "^5.0",
"league/omnipay": "^3.2.1",
- "mailgun/mailgun-php": "^3",
+ "mailgun/mailgun-php": "^3.6.1",
"nikolaposa/rate-limit": "^3.0",
- "openai-php/client": "^0.7",
- "ozdemir/datatables": "^2",
- "phpmailer/phpmailer": "^6",
+ "openai-php/client": "^0.7.4",
+ "ozdemir/datatables": "^2.3.7",
+ "phpmailer/phpmailer": "^6.8.1",
"postal/postal": "^2",
- "ramsey/uuid": "^4",
- "sendgrid/sendgrid": "^8",
- "sentry/sdk": "^3.3",
+ "ramsey/uuid": "^4.7.4",
+ "sendgrid/sendgrid": "^8.0.1",
+ "sentry/sdk": "^3.5",
"slim/http": "^1.3",
- "slim/slim": "^4.11",
- "smarty/smarty": "^4",
- "srmklive/paypal": "~3.0",
- "stripe/stripe-php": "^12",
- "symfony/yaml": "^6",
- "tronovav/geoip2-update": "^2.1",
+ "slim/slim": "^4.12",
+ "smarty/smarty": "^4.3.4",
+ "srmklive/paypal": "^3.0.26",
+ "stripe/stripe-php": "^12.8",
+ "tronovav/geoip2-update": "^2.3.1",
"vectorface/googleauthenticator": "^3.0",
- "voku/anti-xss": "^4"
+ "voku/anti-xss": "^4.1.42"
},
"autoload": {
"psr-4": {
@@ -58,14 +58,15 @@
},
"require-dev": {
"nunomaduro/phpinsights": "*",
- "phpunit/phpunit": "^10.4"
+ "phpunit/phpunit": "^10.4.2"
},
"scripts": {
"update-dev-windows": [
- "composer update --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis"
+ "composer update --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis --ignore-platform-req=ext-yaml"
],
"install-dev-windows": [
- "composer instal --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis"
+ "composer instal --ignore-platform-req=ext-posix --ignore-platform-req=ext-redis --ignore-platform-req=ext-yaml"
]
- }
+ },
+ "type": "project"
}
diff --git a/composer.lock b/composer.lock
index dab4353278..ded8693731 100644
--- a/composer.lock
+++ b/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": "a968baf5a7521ed5df3bc6127e9230c7",
+ "content-hash": "58dc2315c9baefadd2dcc29e3d794ac5",
"packages": [
{
"name": "anankke/omnipay-alipay",
@@ -123,16 +123,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.283.13",
+ "version": "3.283.16",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "853eecfb21e8d623fa1b32e597b0a75912e8a404"
+ "reference": "cb629771356d6a4d12bb030a072b832044440672"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/853eecfb21e8d623fa1b32e597b0a75912e8a404",
- "reference": "853eecfb21e8d623fa1b32e597b0a75912e8a404",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cb629771356d6a4d12bb030a072b832044440672",
+ "reference": "cb629771356d6a4d12bb030a072b832044440672",
"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.283.13"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.283.16"
},
- "time": "2023-10-26T18:14:40+00:00"
+ "time": "2023-10-31T18:21:09+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -1237,7 +1237,7 @@
},
{
"name": "illuminate/collections",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
@@ -1292,7 +1292,7 @@
},
{
"name": "illuminate/conditionable",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/conditionable.git",
@@ -1338,7 +1338,7 @@
},
{
"name": "illuminate/container",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
@@ -1389,16 +1389,16 @@
},
{
"name": "illuminate/contracts",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
- "reference": "6c39fba7b2311e28f5c6ac7d729e3d49a2a98406"
+ "reference": "f6bf37a272fda164f6c451407c99f820eb1eb95b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/contracts/zipball/6c39fba7b2311e28f5c6ac7d729e3d49a2a98406",
- "reference": "6c39fba7b2311e28f5c6ac7d729e3d49a2a98406",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/f6bf37a272fda164f6c451407c99f820eb1eb95b",
+ "reference": "f6bf37a272fda164f6c451407c99f820eb1eb95b",
"shasum": ""
},
"require": {
@@ -1433,20 +1433,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-09-05T19:07:46+00:00"
+ "time": "2023-10-30T00:59:22+00:00"
},
{
"name": "illuminate/database",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/database.git",
- "reference": "bfe1d2bcd955db6325709c36d098b2d9bd4d7c5d"
+ "reference": "1cd72b9404b41c3ed4c9d443679e8016030ae82b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/database/zipball/bfe1d2bcd955db6325709c36d098b2d9bd4d7c5d",
- "reference": "bfe1d2bcd955db6325709c36d098b2d9bd4d7c5d",
+ "url": "https://api.github.com/repos/illuminate/database/zipball/1cd72b9404b41c3ed4c9d443679e8016030ae82b",
+ "reference": "1cd72b9404b41c3ed4c9d443679e8016030ae82b",
"shasum": ""
},
"require": {
@@ -1502,11 +1502,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-10-20T10:10:54+00:00"
+ "time": "2023-10-30T14:29:38+00:00"
},
{
"name": "illuminate/macroable",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@@ -1552,7 +1552,7 @@
},
{
"name": "illuminate/pagination",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/pagination.git",
@@ -1602,16 +1602,16 @@
},
{
"name": "illuminate/support",
- "version": "v10.29.0",
+ "version": "v10.30.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
- "reference": "e46e5864314d59fa690637e51d6cd2113acb2e7b"
+ "reference": "5244b825e8988db7c91254c31ce224dc3892eeae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/illuminate/support/zipball/e46e5864314d59fa690637e51d6cd2113acb2e7b",
- "reference": "e46e5864314d59fa690637e51d6cd2113acb2e7b",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/5244b825e8988db7c91254c31ce224dc3892eeae",
+ "reference": "5244b825e8988db7c91254c31ce224dc3892eeae",
"shasum": ""
},
"require": {
@@ -1669,7 +1669,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2023-10-18T14:12:13+00:00"
+ "time": "2023-10-30T01:00:17+00:00"
},
{
"name": "irazasyed/telegram-bot-sdk",
@@ -1815,16 +1815,16 @@
},
{
"name": "lcobucci/jwt",
- "version": "5.0.0",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/lcobucci/jwt.git",
- "reference": "47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34"
+ "reference": "f0031c07b96db6a0ca649206e7eacddb7e9d5908"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/lcobucci/jwt/zipball/47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34",
- "reference": "47bdb0e0b5d00c2f89ebe33e7e384c77e84e7c34",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/f0031c07b96db6a0ca649206e7eacddb7e9d5908",
+ "reference": "f0031c07b96db6a0ca649206e7eacddb7e9d5908",
"shasum": ""
},
"require": {
@@ -1832,20 +1832,20 @@
"ext-json": "*",
"ext-openssl": "*",
"ext-sodium": "*",
- "php": "~8.1.0 || ~8.2.0",
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0",
"psr/clock": "^1.0"
},
"require-dev": {
- "infection/infection": "^0.26.19",
+ "infection/infection": "^0.27.0",
"lcobucci/clock": "^3.0",
- "lcobucci/coding-standard": "^9.0",
- "phpbench/phpbench": "^1.2.8",
+ "lcobucci/coding-standard": "^11.0",
+ "phpbench/phpbench": "^1.2.9",
"phpstan/extension-installer": "^1.2",
- "phpstan/phpstan": "^1.10.3",
- "phpstan/phpstan-deprecation-rules": "^1.1.2",
- "phpstan/phpstan-phpunit": "^1.3.8",
+ "phpstan/phpstan": "^1.10.7",
+ "phpstan/phpstan-deprecation-rules": "^1.1.3",
+ "phpstan/phpstan-phpunit": "^1.3.10",
"phpstan/phpstan-strict-rules": "^1.5.0",
- "phpunit/phpunit": "^10.0.12"
+ "phpunit/phpunit": "^10.2.6"
},
"suggest": {
"lcobucci/clock": ">= 3.0"
@@ -1874,7 +1874,7 @@
],
"support": {
"issues": "https://github.com/lcobucci/jwt/issues",
- "source": "https://github.com/lcobucci/jwt/tree/5.0.0"
+ "source": "https://github.com/lcobucci/jwt/tree/5.1.0"
},
"funding": [
{
@@ -1886,7 +1886,7 @@
"type": "patreon"
}
],
- "time": "2023-02-25T21:35:16+00:00"
+ "time": "2023-10-31T06:41:47+00:00"
},
{
"name": "league/event",
@@ -4961,16 +4961,16 @@
},
{
"name": "symfony/http-client",
- "version": "v6.3.6",
+ "version": "v6.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "ab8446f997efb9913627e9da10fa784d2182fe92"
+ "reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/ab8446f997efb9913627e9da10fa784d2182fe92",
- "reference": "ab8446f997efb9913627e9da10fa784d2182fe92",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d",
+ "reference": "cd67fcaf4524ec6ae5d9b2d9497682d7ad3ce57d",
"shasum": ""
},
"require": {
@@ -5033,7 +5033,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v6.3.6"
+ "source": "https://github.com/symfony/http-client/tree/v6.3.7"
},
"funding": [
{
@@ -5049,7 +5049,7 @@
"type": "tidelift"
}
],
- "time": "2023-10-06T10:08:56+00:00"
+ "time": "2023-10-29T12:41:36+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -5131,16 +5131,16 @@
},
{
"name": "symfony/http-foundation",
- "version": "v6.3.6",
+ "version": "v6.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "c186627f52febe09c6d5270b04f8462687a250a6"
+ "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/c186627f52febe09c6d5270b04f8462687a250a6",
- "reference": "c186627f52febe09c6d5270b04f8462687a250a6",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/59d1837d5d992d16c2628cd0d6b76acf8d69b33e",
+ "reference": "59d1837d5d992d16c2628cd0d6b76acf8d69b33e",
"shasum": ""
},
"require": {
@@ -5188,7 +5188,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v6.3.6"
+ "source": "https://github.com/symfony/http-foundation/tree/v6.3.7"
},
"funding": [
{
@@ -5204,7 +5204,7 @@
"type": "tidelift"
}
],
- "time": "2023-10-17T11:32:53+00:00"
+ "time": "2023-10-28T23:55:27+00:00"
},
{
"name": "symfony/options-resolver",
@@ -5273,88 +5273,6 @@
],
"time": "2023-05-12T14:21:09+00:00"
},
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.28.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.28-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2023-01-26T09:26:14+00:00"
- },
{
"name": "symfony/polyfill-iconv",
"version": "v1.28.0",
@@ -6009,16 +5927,16 @@
},
{
"name": "symfony/translation",
- "version": "v6.3.6",
+ "version": "v6.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "869b26c7a9d4b8a48afdd77ab36031909c87e3a2"
+ "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/869b26c7a9d4b8a48afdd77ab36031909c87e3a2",
- "reference": "869b26c7a9d4b8a48afdd77ab36031909c87e3a2",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/30212e7c87dcb79c83f6362b00bde0e0b1213499",
+ "reference": "30212e7c87dcb79c83f6362b00bde0e0b1213499",
"shasum": ""
},
"require": {
@@ -6084,7 +6002,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v6.3.6"
+ "source": "https://github.com/symfony/translation/tree/v6.3.7"
},
"funding": [
{
@@ -6100,7 +6018,7 @@
"type": "tidelift"
}
],
- "time": "2023-10-17T11:32:53+00:00"
+ "time": "2023-10-28T23:11:45+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -6180,78 +6098,6 @@
],
"time": "2023-05-30T17:17:10+00:00"
},
- {
- "name": "symfony/yaml",
- "version": "v6.3.3",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/e23292e8c07c85b971b44c1c4b87af52133e2add",
- "reference": "e23292e8c07c85b971b44c1c4b87af52133e2add",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "symfony/console": "<5.4"
- },
- "require-dev": {
- "symfony/console": "^5.4|^6.0"
- },
- "bin": [
- "Resources/bin/yaml-lint"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Yaml\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Loads and dumps YAML files",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/yaml/tree/v6.3.3"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2023-07-31T07:08:24+00:00"
- },
{
"name": "tronovav/geoip2-update",
"version": "v2.3.1",
@@ -7045,16 +6891,16 @@
},
{
"name": "friendsofphp/php-cs-fixer",
- "version": "v3.36.0",
+ "version": "v3.37.1",
"source": {
"type": "git",
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "e889301f276c6ce2c391d6aafae9a162e785b064"
+ "reference": "c3fe76976081ab871aa654e872da588077e19679"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e889301f276c6ce2c391d6aafae9a162e785b064",
- "reference": "e889301f276c6ce2c391d6aafae9a162e785b064",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/c3fe76976081ab871aa654e872da588077e19679",
+ "reference": "c3fe76976081ab871aa654e872da588077e19679",
"shasum": ""
},
"require": {
@@ -7126,7 +6972,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.36.0"
+ "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.37.1"
},
"funding": [
{
@@ -7134,7 +6980,7 @@
"type": "github"
}
],
- "time": "2023-10-27T10:12:29+00:00"
+ "time": "2023-10-29T20:51:23+00:00"
},
{
"name": "justinrainbow/json-schema",
@@ -9777,6 +9623,88 @@
],
"time": "2023-09-26T12:56:25+00:00"
},
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
{
"name": "symfony/polyfill-php81",
"version": "v1.28.0",
@@ -10208,6 +10136,7 @@
"ext-posix": "*",
"ext-redis": "*",
"ext-xml": "*",
+ "ext-yaml": "*",
"ext-zip": "*"
},
"platform-dev": [],
diff --git a/config/.config.example.php b/config/.config.example.php
index 88d1b87ea1..7a1b8c4a30 100644
--- a/config/.config.example.php
+++ b/config/.config.example.php
@@ -80,7 +80,7 @@
//节点检测-----------------------------------------------------------------------------------------------
#GFW检测
$_ENV['detect_gfw_port'] = 443; //所有节点服务器都打开的TCP端口
-$_ENV['detect_gfw_url'] = 'http://example.com:8080/tcping?ip={ip}&port={port}'; //检测节点是否被gfw墙了的API的URL
+$_ENV['detect_gfw_url'] = 'http://example.com:8080/v1/tcping?ip={ip}&port={port}'; //检测节点是否被gfw墙了的API的URL
#离线检测
$_ENV['enable_detect_offline'] = true;
diff --git a/resources/views/tabler/admin/coupon.tpl b/resources/views/tabler/admin/coupon.tpl
index a87249007e..8eac1da877 100644
--- a/resources/views/tabler/admin/coupon.tpl
+++ b/resources/views/tabler/admin/coupon.tpl
@@ -1,6 +1,9 @@
{include file='admin/header.tpl'}
+{if $user->is_dark_mode}
+
+{/if}
diff --git a/resources/views/tabler/admin/header.tpl b/resources/views/tabler/admin/header.tpl
index 05fc86ea58..029dd9fef5 100644
--- a/resources/views/tabler/admin/header.tpl
+++ b/resources/views/tabler/admin/header.tpl
@@ -193,7 +193,7 @@
邀请
-
+
余额
@@ -205,7 +205,7 @@
在线IP
-
+
流量使用
diff --git a/resources/views/tabler/admin/log/money.tpl b/resources/views/tabler/admin/log/money.tpl
index f8cd05ae7f..cd77739721 100644
--- a/resources/views/tabler/admin/log/money.tpl
+++ b/resources/views/tabler/admin/log/money.tpl
@@ -40,7 +40,7 @@