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 @@