Merge branch 'dev' of github.com:wyx2685/v2board into dev

This commit is contained in:
root 2023-08-13 23:52:58 +09:00
commit 24205f60f5
94 changed files with 991 additions and 650 deletions

View File

@ -14,7 +14,7 @@ DB_USERNAME=root
DB_PASSWORD=123456 DB_PASSWORD=123456
BROADCAST_DRIVER=log BROADCAST_DRIVER=log
CACHE_DRIVER=file CACHE_DRIVER=redis
QUEUE_CONNECTION=redis QUEUE_CONNECTION=redis
SESSION_DRIVER=redis SESSION_DRIVER=redis
SESSION_LIFETIME=120 SESSION_LIFETIME=120

View File

@ -4,12 +4,9 @@ namespace App\Console\Commands;
use App\Models\StatServer; use App\Models\StatServer;
use App\Models\StatUser; use App\Models\StatUser;
use App\Models\User;
use App\Services\StatisticalService; use App\Services\StatisticalService;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use App\Models\Order;
use App\Models\Stat; use App\Models\Stat;
use App\Models\CommissionLog;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class V2boardStatistics extends Command class V2boardStatistics extends Command
@ -50,82 +47,94 @@ class V2boardStatistics extends Command
$this->statUser(); $this->statUser();
$this->statServer(); $this->statServer();
$this->stat(); $this->stat();
$this->info('耗时' . (microtime(true) - $startAt)); info('统计任务执行完毕。耗时:' . (microtime(true) - $startAt) / 1000);
} }
private function statServer() private function statServer()
{ {
$createdAt = time(); try {
$recordAt = strtotime('-1 day', strtotime(date('Y-m-d'))); DB::beginTransaction();
$statService = new StatisticalService(); $createdAt = time();
$statService->setStartAt($recordAt); $recordAt = strtotime('-1 day', strtotime(date('Y-m-d')));
$statService->setServerStats(); $statService = new StatisticalService();
$stats = $statService->getStatServer(); $statService->setStartAt($recordAt);
DB::beginTransaction(); $statService->setServerStats();
foreach ($stats as $stat) { $stats = $statService->getStatServer();
if (!StatServer::insert([ foreach ($stats as $stat) {
'server_id' => $stat['server_id'], if (!StatServer::insert([
'server_type' => $stat['server_type'], 'server_id' => $stat['server_id'],
'u' => $stat['u'], 'server_type' => $stat['server_type'],
'd' => $stat['d'], 'u' => $stat['u'],
'created_at' => $createdAt, 'd' => $stat['d'],
'updated_at' => $createdAt, 'created_at' => $createdAt,
'record_type' => 'd', 'updated_at' => $createdAt,
'record_at' => $recordAt 'record_type' => 'd',
])) { 'record_at' => $recordAt
DB::rollback(); ])) {
throw new \Exception('stat server fail'); throw new \Exception('stat server fail');
}
} }
DB::commit();
$statService->clearStatServer();
} catch (\Exception $e) {
DB::rollback();
\Log::error($e->getMessage(), ['exception' => $e]);
} }
DB::commit();
$statService->clearStatServer();
} }
private function statUser() private function statUser()
{ {
$createdAt = time(); try {
$recordAt = strtotime('-1 day', strtotime(date('Y-m-d'))); DB::beginTransaction();
$statService = new StatisticalService(); $createdAt = time();
$statService->setStartAt($recordAt); $recordAt = strtotime('-1 day', strtotime(date('Y-m-d')));
$statService->setUserStats(); $statService = new StatisticalService();
$stats = $statService->getStatUser(); $statService->setStartAt($recordAt);
DB::beginTransaction(); $statService->setUserStats();
foreach ($stats as $stat) { $stats = $statService->getStatUser();
if (!StatUser::insert([ foreach ($stats as $stat) {
'user_id' => $stat['user_id'], if (!StatUser::insert([
'u' => $stat['u'], 'user_id' => $stat['user_id'],
'd' => $stat['d'], 'u' => $stat['u'],
'server_rate' => $stat['server_rate'], 'd' => $stat['d'],
'created_at' => $createdAt, 'server_rate' => $stat['server_rate'],
'updated_at' => $createdAt, 'created_at' => $createdAt,
'record_type' => 'd', 'updated_at' => $createdAt,
'record_at' => $recordAt 'record_type' => 'd',
])) { 'record_at' => $recordAt
DB::rollback(); ])) {
throw new \Exception('stat user fail'); throw new \Exception('stat user fail');
}
} }
DB::commit();
$statService->clearStatUser();
} catch (\Exception $e) {
DB::rollback();
\Log::error($e->getMessage(), ['exception' => $e]);
} }
DB::commit();
$statService->clearStatUser();
} }
private function stat() private function stat()
{ {
$endAt = strtotime(date('Y-m-d')); try {
$startAt = strtotime('-1 day', $endAt); $endAt = strtotime(date('Y-m-d'));
$statisticalService = new StatisticalService(); $startAt = strtotime('-1 day', $endAt);
$statisticalService->setStartAt($startAt); $statisticalService = new StatisticalService();
$statisticalService->setEndAt($endAt); $statisticalService->setStartAt($startAt);
$data = $statisticalService->generateStatData(); $statisticalService->setEndAt($endAt);
$data['record_at'] = $startAt; $data = $statisticalService->generateStatData();
$data['record_type'] = 'd'; $data['record_at'] = $startAt;
$statistic = Stat::where('record_at', $startAt) $data['record_type'] = 'd';
->where('record_type', 'd') $statistic = Stat::where('record_at', $startAt)
->first(); ->where('record_type', 'd')
if ($statistic) { ->first();
$statistic->update($data); if ($statistic) {
return; $statistic->update($data);
return;
}
Stat::create($data);
} catch (\Exception $e) {
\Log::error($e->getMessage(), ['exception' => $e]);
} }
Stat::create($data);
} }
} }

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ConfigSave; use App\Http\Requests\Admin\ConfigSave;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use App\Services\TelegramService; use App\Services\TelegramService;
use Illuminate\Http\Request;
use App\Utils\Dict; use App\Utils\Dict;
use App\Http\Controllers\Controller; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;

View File

@ -1,15 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Requests\Admin\CouponSave;
use App\Http\Requests\Admin\CouponGenerate;
use App\Models\Plan;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\CouponGenerate;
use App\Http\Requests\Admin\CouponSave;
use App\Models\Coupon; use App\Models\Coupon;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class CouponController extends Controller class CouponController extends Controller

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\KnowledgeSave; use App\Http\Requests\Admin\KnowledgeSave;
use App\Http\Requests\Admin\KnowledgeSort; use App\Http\Requests\Admin\KnowledgeSort;
use App\Models\Knowledge; use App\Models\Knowledge;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class KnowledgeController extends Controller class KnowledgeController extends Controller

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Requests\Admin\NoticeSave;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\NoticeSave;
use App\Models\Notice; use App\Models\Notice;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class NoticeController extends Controller class NoticeController extends Controller

View File

@ -1,19 +1,19 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\OrderAssign; use App\Http\Requests\Admin\OrderAssign;
use App\Http\Requests\Admin\OrderUpdate;
use App\Http\Requests\Admin\OrderFetch; use App\Http\Requests\Admin\OrderFetch;
use App\Http\Requests\Admin\OrderUpdate;
use App\Models\CommissionLog; use App\Models\CommissionLog;
use App\Models\Order;
use App\Models\Plan;
use App\Models\User;
use App\Services\OrderService; use App\Services\OrderService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Order;
use App\Models\User;
use App\Models\Plan;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class OrderController extends Controller class OrderController extends Controller

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\PaymentSave; use App\Http\Requests\Admin\PaymentSave;
use App\Models\Payment;
use App\Services\PaymentService; use App\Services\PaymentService;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Payment;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class PaymentController extends Controller class PaymentController extends Controller

View File

@ -1,16 +1,16 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\PlanSave; use App\Http\Requests\Admin\PlanSave;
use App\Http\Requests\Admin\PlanSort; use App\Http\Requests\Admin\PlanSort;
use App\Http\Requests\Admin\PlanUpdate; use App\Http\Requests\Admin\PlanUpdate;
use App\Models\Order;
use App\Models\Plan;
use App\Models\User;
use App\Services\PlanService; use App\Services\PlanService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Plan;
use App\Models\Order;
use App\Models\User;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class PlanController extends Controller class PlanController extends Controller

View File

@ -1,16 +1,14 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Models\Plan; use App\Models\Plan;
use App\Models\ServerShadowsocks;
use App\Models\ServerTrojan;
use App\Models\ServerVmess;
use App\Models\ServerGroup; use App\Models\ServerGroup;
use App\Models\ServerVmess;
use App\Models\User; use App\Models\User;
use App\Services\ServerService; use App\Services\ServerService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class GroupController extends Controller class GroupController extends Controller
{ {

View File

@ -1,14 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Requests\Admin\ServerVmessSave;
use App\Http\Requests\Admin\ServerVmessUpdate;
use App\Models\ServerHysteria;
use App\Services\ServerService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\ServerVmess; use App\Models\ServerHysteria;
use Illuminate\Http\Request;
class HysteriaController extends Controller class HysteriaController extends Controller
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Services\ServerService; use App\Services\ServerService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class ManageController extends Controller class ManageController extends Controller

View File

@ -1,14 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Requests\Admin\ServerShadowsocksSave;
use App\Http\Requests\Admin\ServerShadowsocksUpdate;
use App\Models\ServerRoute;
use App\Models\ServerShadowsocks;
use App\Services\ServerService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\ServerRoute;
use Illuminate\Http\Request;
class RouteController extends Controller class RouteController extends Controller
{ {

View File

@ -1,13 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ServerShadowsocksSave; use App\Http\Requests\Admin\ServerShadowsocksSave;
use App\Http\Requests\Admin\ServerShadowsocksUpdate; use App\Http\Requests\Admin\ServerShadowsocksUpdate;
use App\Models\ServerShadowsocks; use App\Models\ServerShadowsocks;
use App\Services\ServerService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ShadowsocksController extends Controller class ShadowsocksController extends Controller
{ {

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ServerTrojanSave; use App\Http\Requests\Admin\ServerTrojanSave;
use App\Http\Requests\Admin\ServerTrojanUpdate; use App\Http\Requests\Admin\ServerTrojanUpdate;
use App\Models\ServerTrojan;
use App\Services\ServerService; use App\Services\ServerService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\ServerTrojan;
class TrojanController extends Controller class TrojanController extends Controller
{ {

View File

@ -0,0 +1,119 @@
<?php
namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Models\ServerVless;
use Illuminate\Http\Request;
use ParagonIE_Sodium_Compat as SodiumCompat;
use App\Utils\Helper;
class VlessController extends Controller
{
public function save(Request $request)
{
$params = $request->validate([
'group_id' => 'required',
'route_id' => 'nullable|array',
'name' => 'required',
'parent_id' => 'nullable|integer',
'host' => 'required',
'port' => 'required',
'server_port' => 'required',
'tls' => 'required|in:0,1,2',
'tls_settings' => 'nullable|array',
'flow' => 'nullable|in:xtls-rprx-vision',
'network' => 'required',
'network_settings' => 'nullable|array',
'tags' => 'nullable|array',
'rate' => 'required',
'show' => 'nullable|in:0,1',
'sort' => 'nullable'
]);
if (isset($params['tls']) && (int)$params['tls'] === 2) {
$keyPair = SodiumCompat::crypto_box_keypair();
$params['tls_settings'] = $params['tls_settings'] ?? [];
if (!isset($params['tls_settings']['public_key'])) {
$params['tls_settings']['public_key'] = Helper::base64EncodeUrlSafe(SodiumCompat::crypto_box_publickey($keyPair));
}
if (!isset($params['tls_settings']['private_key'])) {
$params['tls_settings']['private_key'] = Helper::base64EncodeUrlSafe(SodiumCompat::crypto_box_secretkey($keyPair));
}
}
if ($request->input('id')) {
$server = ServerVless::find($request->input('id'));
if (!$server) {
abort(500, '服务器不存在');
}
try {
$server->update($params);
} catch (\Exception $e) {
abort(500, '保存失败');
}
return response([
'data' => true
]);
}
if (!ServerVless::create($params)) {
abort(500, '创建失败');
}
return response([
'data' => true
]);
}
public function drop(Request $request)
{
if ($request->input('id')) {
$server = ServerVless::find($request->input('id'));
if (!$server) {
abort(500, '节点ID不存在');
}
}
return response([
'data' => $server->delete()
]);
}
public function update(Request $request)
{
$params = $request->validate([
'show' => 'nullable|in:0,1',
]);
$server = ServerVless::find($request->input('id'));
if (!$server) {
abort(500, '该服务器不存在');
}
try {
$server->update($params);
} catch (\Exception $e) {
abort(500, '保存失败');
}
return response([
'data' => true
]);
}
public function copy(Request $request)
{
$server = ServerVless::find($request->input('id'));
$server->show = 0;
if (!$server) {
abort(500, '服务器不存在');
}
if (!ServerVless::create($server->toArray())) {
abort(500, '复制失败');
}
return response([
'data' => true
]);
}
}

View File

@ -1,13 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Admin\Server; namespace App\Http\Controllers\V1\Admin\Server;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ServerVmessSave; use App\Http\Requests\Admin\ServerVmessSave;
use App\Http\Requests\Admin\ServerVmessUpdate; use App\Http\Requests\Admin\ServerVmessUpdate;
use App\Services\ServerService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\ServerVmess; use App\Models\ServerVmess;
use Illuminate\Http\Request;
class VmessController extends Controller class VmessController extends Controller
{ {

View File

@ -1,97 +1,25 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Models\CommissionLog; use App\Models\CommissionLog;
use App\Models\Order;
use App\Models\ServerShadowsocks; use App\Models\ServerShadowsocks;
use App\Models\ServerTrojan; use App\Models\ServerTrojan;
use App\Models\StatUser;
use App\Services\ServerService;
use App\Services\StatisticalService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\ServerGroup;
use App\Models\ServerVmess; use App\Models\ServerVmess;
use App\Models\Plan;
use App\Models\User;
use App\Models\Ticket;
use App\Models\Order;
use App\Models\Stat; use App\Models\Stat;
use App\Models\StatServer; use App\Models\StatServer;
use App\Models\StatUser;
use App\Models\Ticket;
use App\Models\User;
use App\Services\StatisticalService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class StatController extends Controller class StatController extends Controller
{ {
public function getStat(Request $request)
{
$params = $request->validate([
'start_at' => '',
'end_at' => ''
]);
if (isset($params['start_at']) && isset($params['end_at'])) {
$stats = Stat::where('record_at', '>=', $params['start_at'])
->where('record_at', '<', $params['end_at'])
->get()
->makeHidden(['record_at', 'created_at', 'updated_at', 'id', 'record_type'])
->toArray();
} else {
$statisticalService = new StatisticalService();
return [
'data' => $statisticalService->generateStatData()
];
}
$stats = array_reduce($stats, function($carry, $item) {
foreach($item as $key => $value) {
if(isset($carry[$key]) && $carry[$key]) {
$carry[$key] += $value;
} else {
$carry[$key] = $value;
}
}
return $carry;
}, []);
return [
'data' => $stats
];
}
public function getStatRecord(Request $request)
{
$request->validate([
'type' => 'required|in:paid_total,commission_total,register_count',
'start_at' => '',
'end_at' => ''
]);
$statisticalService = new StatisticalService();
$statisticalService->setStartAt($request->input('start_at'));
$statisticalService->setEndAt($request->input('end_at'));
return [
'data' => $statisticalService->getStatRecord($request->input('type'))
];
}
public function getRanking(Request $request)
{
$request->validate([
'type' => 'required|in:server_traffic_rank,user_consumption_rank,invite_rank',
'start_at' => '',
'end_at' => '',
'limit' => 'nullable|integer'
]);
$statisticalService = new StatisticalService();
$statisticalService->setStartAt($request->input('start_at'));
$statisticalService->setEndAt($request->input('end_at'));
return [
'data' => $statisticalService->getRanking($request->input('type'), $request->input('limit') ?? 20)
];
}
public function getOverride(Request $request) public function getOverride(Request $request)
{ {
return [ return [

View File

@ -1,10 +1,11 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Models\Log as LogModel;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
@ -101,5 +102,18 @@ class SystemController extends Controller
return $master->status === 'paused'; return $master->status === 'paused';
})->count(); })->count();
} }
}
public function getSystemLog(Request $request) {
$current = $request->input('current') ? $request->input('current') : 1;
$pageSize = $request->input('page_size') >= 10 ? $request->input('page_size') : 10;
$builder = LogModel::orderBy('created_at', 'DESC')
->setFilterAllowKeys('level');
$total = $builder->count();
$res = $builder->forPage($current, $pageSize)
->get();
return response([
'data' => $res,
'total' => $total
]);
}
}

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Services\ThemeService; use App\Services\ThemeService;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
class ThemeController extends Controller class ThemeController extends Controller
{ {

View File

@ -1,14 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Jobs\SendEmailJob;
use App\Services\TicketService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Ticket; use App\Models\Ticket;
use App\Models\User;
use App\Models\TicketMessage; use App\Models\TicketMessage;
use App\Models\User;
use App\Services\TicketService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;

View File

@ -1,19 +1,18 @@
<?php <?php
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\V1\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\UserFetch; use App\Http\Requests\Admin\UserFetch;
use App\Http\Requests\Admin\UserGenerate; use App\Http\Requests\Admin\UserGenerate;
use App\Http\Requests\Admin\UserSendMail; use App\Http\Requests\Admin\UserSendMail;
use App\Http\Requests\Admin\UserUpdate; use App\Http\Requests\Admin\UserUpdate;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use App\Models\Plan;
use App\Models\User;
use App\Services\AuthService; use App\Services\AuthService;
use App\Services\UserService;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Plan;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class UserController extends Controller class UserController extends Controller

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client; namespace App\Http\Controllers\V1\Client;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Services\ServerService; use App\Services\ServerService;
@ -39,15 +39,15 @@ class AppController extends Controller
'chacha20-ietf-poly1305' 'chacha20-ietf-poly1305'
]) ])
) { ) {
array_push($proxy, Protocols\Clash::buildShadowsocks($user['uuid'], $item)); array_push($proxy, \App\Protocols\Clash::buildShadowsocks($user['uuid'], $item));
array_push($proxies, $item['name']); array_push($proxies, $item['name']);
} }
if ($item['type'] === 'vmess') { if ($item['type'] === 'vmess') {
array_push($proxy, Protocols\Clash::buildVmess($user['uuid'], $item)); array_push($proxy, \App\Protocols\Clash::buildVmess($user['uuid'], $item));
array_push($proxies, $item['name']); array_push($proxies, $item['name']);
} }
if ($item['type'] === 'trojan') { if ($item['type'] === 'trojan') {
array_push($proxy, Protocols\Clash::buildTrojan($user['uuid'], $item)); array_push($proxy, \App\Http\Controllers\V1\Client\Protocols\Clash::buildTrojan($user['uuid'], $item));
array_push($proxies, $item['name']); array_push($proxies, $item['name']);
} }
} }

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Client; namespace App\Http\Controllers\V1\Client;
use App\Http\Controllers\Client\Protocols\General;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Protocols\General;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\UserService;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Services\UserService;
class ClientController extends Controller class ClientController extends Controller
{ {
@ -24,8 +24,8 @@ class ClientController extends Controller
$servers = $serverService->getAvailableServers($user); $servers = $serverService->getAvailableServers($user);
$this->setSubscribeInfoToServers($servers, $user); $this->setSubscribeInfoToServers($servers, $user);
if ($flag) { if ($flag) {
foreach (array_reverse(glob(app_path('Http//Controllers//Client//Protocols') . '/*.php')) as $file) { foreach (array_reverse(glob(app_path('Protocols') . '/*.php')) as $file) {
$file = 'App\\Http\\Controllers\\Client\\Protocols\\' . basename($file, '.php'); $file = 'App\\Protocols\\' . basename($file, '.php');
$class = new $file($user, $servers); $class = new $file($user, $servers);
if (strpos($flag, $class->flag) !== false) { if (strpos($flag, $class->flag) !== false) {
die($class->handle()); die($class->handle());

View File

@ -1,9 +1,9 @@
<?php <?php
namespace App\Http\Controllers\Guest; namespace App\Http\Controllers\V1\Guest;
use App\Utils\Dict;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Utils\Dict;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
class CommController extends Controller class CommController extends Controller

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Guest; namespace App\Http\Controllers\V1\Guest;
use App\Http\Controllers\Controller;
use App\Models\Order; use App\Models\Order;
use App\Services\OrderService; use App\Services\OrderService;
use App\Services\PaymentService; use App\Services\PaymentService;
use App\Services\TelegramService; use App\Services\TelegramService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PaymentController extends Controller class PaymentController extends Controller
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Guest; namespace App\Http\Controllers\V1\Guest;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Plan; use App\Models\Plan;
use Illuminate\Http\Request;
class PlanController extends Controller class PlanController extends Controller
{ {

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Http\Controllers\Guest; namespace App\Http\Controllers\V1\Guest;
use App\Http\Controllers\Controller;
use App\Services\TelegramService; use App\Services\TelegramService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class TelegramController extends Controller class TelegramController extends Controller
{ {

View File

@ -1,21 +1,21 @@
<?php <?php
namespace App\Http\Controllers\Passport; namespace App\Http\Controllers\V1\Passport;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Passport\AuthRegister;
use App\Http\Requests\Passport\AuthForget; use App\Http\Requests\Passport\AuthForget;
use App\Http\Requests\Passport\AuthLogin; use App\Http\Requests\Passport\AuthLogin;
use App\Http\Requests\Passport\AuthRegister;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use App\Services\AuthService; use App\Models\InviteCode;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Models\Plan; use App\Models\Plan;
use App\Models\User; use App\Models\User;
use App\Models\InviteCode; use App\Services\AuthService;
use App\Utils\Helper;
use App\Utils\Dict;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use App\Utils\Dict;
use App\Utils\Helper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use ReCaptcha\ReCaptcha; use ReCaptcha\ReCaptcha;
class AuthController extends Controller class AuthController extends Controller
@ -286,7 +286,11 @@ class AuthController extends Controller
public function forget(AuthForget $request) public function forget(AuthForget $request)
{ {
$forgetRequestLimitKey = CacheKey::get('FORGET_REQUEST_LIMIT', $request->input('email'));
$forgetRequestLimit = (int)Cache::get($forgetRequestLimitKey);
if ($forgetRequestLimit >= 3) abort(500, __('Reset failed, Please try again later'));
if ((string)Cache::get(CacheKey::get('EMAIL_VERIFY_CODE', $request->input('email'))) !== (string)$request->input('email_code')) { if ((string)Cache::get(CacheKey::get('EMAIL_VERIFY_CODE', $request->input('email'))) !== (string)$request->input('email_code')) {
Cache::put($forgetRequestLimitKey, $forgetRequestLimit ? $forgetRequestLimit + 1 : 1, 300);
abort(500, __('Incorrect email verification code')); abort(500, __('Incorrect email verification code'));
} }
$user = User::where('email', $request->input('email'))->first(); $user = User::where('email', $request->input('email'))->first();

View File

@ -1,18 +1,18 @@
<?php <?php
namespace App\Http\Controllers\Passport; namespace App\Http\Controllers\V1\Passport;
use App\Http\Requests\Passport\CommSendEmailVerify;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Exceptions\HttpResponseException; use App\Http\Requests\Passport\CommSendEmailVerify;
use Illuminate\Support\Facades\Mail;
use App\Utils\Helper;
use Illuminate\Support\Facades\Cache;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use App\Models\InviteCode; use App\Models\InviteCode;
use App\Utils\Dict; use App\Models\User;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use App\Utils\Dict;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Mail;
use ReCaptcha\ReCaptcha; use ReCaptcha\ReCaptcha;
class CommController extends Controller class CommController extends Controller

View File

@ -1,19 +1,16 @@
<?php <?php
namespace App\Http\Controllers\Server; namespace App\Http\Controllers\V1\Server;
use App\Http\Controllers\Controller;
use App\Models\ServerVmess;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\StatisticalService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Cache;
use App\Models\User;
use App\Models\ServerVmess;
use App\Models\ServerLog;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Cache;
/* /*
* V2ray Aurora * V2ray Aurora

View File

@ -1,14 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Server; namespace App\Http\Controllers\V1\Server;
use App\Http\Controllers\Controller;
use App\Models\ServerShadowsocks; use App\Models\ServerShadowsocks;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\StatisticalService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
/* /*

View File

@ -1,19 +1,16 @@
<?php <?php
namespace App\Http\Controllers\Server; namespace App\Http\Controllers\V1\Server;
use App\Http\Controllers\Controller;
use App\Models\ServerTrojan;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\StatisticalService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Cache;
use App\Models\User;
use App\Models\ServerTrojan;
use App\Models\ServerLog;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Cache;
/* /*
* Tidal Lab Trojan * Tidal Lab Trojan

View File

@ -1,17 +1,13 @@
<?php <?php
namespace App\Http\Controllers\Server; namespace App\Http\Controllers\V1\Server;
use App\Http\Controllers\Controller;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\StatisticalService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\ServerShadowsocks;
use App\Models\ServerVmess;
use App\Models\ServerTrojan;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class UniProxyController extends Controller class UniProxyController extends Controller
@ -115,6 +111,16 @@ class UniProxyController extends Controller
'obfs' => Helper::getServerKey($this->nodeInfo->created_at, 16) 'obfs' => Helper::getServerKey($this->nodeInfo->created_at, 16)
]; ];
break; break;
case "vless":
$response = [
'server_port' => $this->nodeInfo->server_port,
'network' => $this->nodeInfo->network,
'network_settings' => $this->nodeInfo->network_settings,
'tls' => $this->nodeInfo->tls,
'flow' => $this->nodeInfo->flow,
'tls_settings' => $this->nodeInfo->tls_settings
];
break;
} }
$response['base_config'] = [ $response['base_config'] = [
'push_interval' => (int)config('v2board.server_push_interval', 60), 'push_interval' => (int)config('v2board.server_push_interval', 60),

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Http\Controllers\Staff; namespace App\Http\Controllers\V1\Staff;
use App\Http\Requests\Admin\NoticeSave;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\NoticeSave;
use App\Models\Notice; use App\Models\Notice;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class NoticeController extends Controller class NoticeController extends Controller

View File

@ -1,15 +1,11 @@
<?php <?php
namespace App\Http\Controllers\Staff; namespace App\Http\Controllers\V1\Staff;
use App\Http\Requests\Admin\PlanSave;
use App\Http\Requests\Admin\PlanSort;
use App\Http\Requests\Admin\PlanUpdate;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Plan; use App\Models\Plan;
use App\Models\Order;
use App\Models\User; use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class PlanController extends Controller class PlanController extends Controller

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers\Staff; namespace App\Http\Controllers\V1\Staff;
use App\Services\TicketService;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Ticket; use App\Models\Ticket;
use App\Models\TicketMessage; use App\Models\TicketMessage;
use App\Services\TicketService;
use Illuminate\Http\Request;
class TicketController extends Controller class TicketController extends Controller
{ {

View File

@ -1,14 +1,14 @@
<?php <?php
namespace App\Http\Controllers\Staff; namespace App\Http\Controllers\V1\Staff;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\UserSendMail; use App\Http\Requests\Admin\UserSendMail;
use App\Http\Requests\Staff\UserUpdate; use App\Http\Requests\Staff\UserUpdate;
use App\Jobs\SendEmailJob; use App\Jobs\SendEmailJob;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Plan; use App\Models\Plan;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller class UserController extends Controller
{ {

View File

@ -1,11 +1,11 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller;
use App\Models\Payment; use App\Models\Payment;
use App\Utils\Dict; use App\Utils\Dict;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class CommController extends Controller class CommController extends Controller
{ {

View File

@ -1,11 +1,10 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Services\CouponService; use App\Services\CouponService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Coupon;
class CouponController extends Controller class CouponController extends Controller
{ {

View File

@ -1,14 +1,14 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\CommissionLog; use App\Models\CommissionLog;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Order;
use App\Models\InviteCode; use App\Models\InviteCode;
use App\Models\Order;
use App\Models\User;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request;
class InviteController extends Controller class InviteController extends Controller
{ {

View File

@ -1,13 +1,13 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Knowledge;
use App\Models\User; use App\Models\User;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\Helper; use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Knowledge;
class KnowledgeController extends Controller class KnowledgeController extends Controller
{ {

View File

@ -1,11 +1,10 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Notice; use App\Models\Notice;
use App\Utils\Helper; use Illuminate\Http\Request;
class NoticeController extends Controller class NoticeController extends Controller
{ {

View File

@ -1,29 +1,28 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\User\OrderSave; use App\Http\Requests\User\OrderSave;
use App\Models\CommissionLog; use App\Models\Order;
use App\Models\Payment; use App\Models\Payment;
use App\Models\Plan;
use App\Models\User;
use App\Services\CouponService; use App\Services\CouponService;
use App\Services\OrderService; use App\Services\OrderService;
use App\Services\PaymentService; use App\Services\PaymentService;
use App\Services\PlanService; use App\Services\PlanService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\Helper;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use App\Models\Order;
use App\Models\Plan;
use App\Models\User;
use App\Utils\Helper;
use Omnipay\Omnipay;
use Stripe\Stripe;
use Stripe\Source;
use Library\BitpayX; use Library\BitpayX;
use Library\MGate;
use Library\Epay; use Library\Epay;
use Library\MGate;
use Omnipay\Omnipay;
use Stripe\Source;
use Stripe\Stripe;
class OrderController extends Controller class OrderController extends Controller
{ {

View File

@ -1,12 +1,12 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Plan;
use App\Models\User; use App\Models\User;
use App\Services\PlanService; use App\Services\PlanService;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Plan;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class PlanController extends Controller class PlanController extends Controller

View File

@ -1,18 +1,13 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\ServerService; use App\Services\ServerService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use App\Models\ServerVmess;
use App\Models\ServerLog;
use App\Models\User;
use App\Utils\Helper;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class ServerController extends Controller class ServerController extends Controller

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\StatUser; use App\Models\StatUser;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\User; use App\Models\User;

View File

@ -1,18 +1,17 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\User\TicketSave; use App\Http\Requests\User\TicketSave;
use App\Http\Requests\User\TicketWithdraw; use App\Http\Requests\User\TicketWithdraw;
use App\Jobs\SendTelegramJob; use App\Models\Ticket;
use App\Models\TicketMessage;
use App\Models\User; use App\Models\User;
use App\Services\TelegramService; use App\Services\TelegramService;
use App\Services\TicketService; use App\Services\TicketService;
use App\Utils\Dict; use App\Utils\Dict;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Ticket;
use App\Models\TicketMessage;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
class TicketController extends Controller class TicketController extends Controller

View File

@ -1,20 +1,20 @@
<?php <?php
namespace App\Http\Controllers\User; namespace App\Http\Controllers\V1\User;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\User\UserChangePassword;
use App\Http\Requests\User\UserTransfer; use App\Http\Requests\User\UserTransfer;
use App\Http\Requests\User\UserUpdate; use App\Http\Requests\User\UserUpdate;
use App\Http\Requests\User\UserChangePassword; use App\Models\Order;
use App\Models\Plan;
use App\Models\Ticket;
use App\Models\User;
use App\Services\AuthService; use App\Services\AuthService;
use App\Services\UserService; use App\Services\UserService;
use App\Utils\CacheKey; use App\Utils\CacheKey;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Plan;
use App\Models\Ticket;
use App\Utils\Helper; use App\Utils\Helper;
use App\Models\Order; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class UserController extends Controller class UserController extends Controller

View File

@ -0,0 +1,92 @@
<?php
namespace App\Http\Controllers\V2\Admin;
use App\Http\Controllers\Controller;
use App\Models\CommissionLog;
use App\Models\Order;
use App\Models\ServerShadowsocks;
use App\Models\ServerTrojan;
use App\Models\ServerVmess;
use App\Models\Stat;
use App\Models\StatServer;
use App\Models\StatUser;
use App\Models\Ticket;
use App\Models\User;
use App\Services\StatisticalService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class StatController extends Controller
{
public function override(Request $request)
{
$params = $request->validate([
'start_at' => '',
'end_at' => ''
]);
if (isset($params['start_at']) && isset($params['end_at'])) {
$stats = Stat::where('record_at', '>=', $params['start_at'])
->where('record_at', '<', $params['end_at'])
->get()
->makeHidden(['record_at', 'created_at', 'updated_at', 'id', 'record_type'])
->toArray();
} else {
$statisticalService = new StatisticalService();
return [
'data' => $statisticalService->generateStatData()
];
}
$stats = array_reduce($stats, function($carry, $item) {
foreach($item as $key => $value) {
if(isset($carry[$key]) && $carry[$key]) {
$carry[$key] += $value;
} else {
$carry[$key] = $value;
}
}
return $carry;
}, []);
return [
'data' => $stats
];
}
public function record(Request $request)
{
$request->validate([
'type' => 'required|in:paid_total,commission_total,register_count',
'start_at' => '',
'end_at' => ''
]);
$statisticalService = new StatisticalService();
$statisticalService->setStartAt($request->input('start_at'));
$statisticalService->setEndAt($request->input('end_at'));
return [
'data' => $statisticalService->getStatRecord($request->input('type'))
];
}
public function ranking(Request $request)
{
$request->validate([
'type' => 'required|in:server_traffic_rank,user_consumption_rank,invite_rank',
'start_at' => '',
'end_at' => '',
'limit' => 'nullable|integer'
]);
$statisticalService = new StatisticalService();
$statisticalService->setStartAt($request->input('start_at'));
$statisticalService->setEndAt($request->input('end_at'));
return [
'data' => $statisticalService->getRanking($request->input('type'), $request->input('limit') ?? 20)
];
}
}

View File

@ -1,144 +0,0 @@
<?php
namespace App\Http\Routes;
use Illuminate\Contracts\Routing\Registrar;
class AdminRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => config('v2board.secure_path', config('v2board.frontend_admin_path', hash('crc32b', config('app.key')))),
'middleware' => ['admin', 'log']
], function ($router) {
// Config
$router->get ('/config/fetch', 'Admin\\ConfigController@fetch');
$router->post('/config/save', 'Admin\\ConfigController@save');
$router->get ('/config/getEmailTemplate', 'Admin\\ConfigController@getEmailTemplate');
$router->get ('/config/getThemeTemplate', 'Admin\\ConfigController@getThemeTemplate');
$router->post('/config/setTelegramWebhook', 'Admin\\ConfigController@setTelegramWebhook');
$router->post('/config/testSendMail', 'Admin\\ConfigController@testSendMail');
// Plan
$router->get ('/plan/fetch', 'Admin\\PlanController@fetch');
$router->post('/plan/save', 'Admin\\PlanController@save');
$router->post('/plan/drop', 'Admin\\PlanController@drop');
$router->post('/plan/update', 'Admin\\PlanController@update');
$router->post('/plan/sort', 'Admin\\PlanController@sort');
// Server
$router->get ('/server/group/fetch', 'Admin\\Server\\GroupController@fetch');
$router->post('/server/group/save', 'Admin\\Server\\GroupController@save');
$router->post('/server/group/drop', 'Admin\\Server\\GroupController@drop');
$router->get ('/server/route/fetch', 'Admin\\Server\\RouteController@fetch');
$router->post('/server/route/save', 'Admin\\Server\\RouteController@save');
$router->post('/server/route/drop', 'Admin\\Server\\RouteController@drop');
$router->get ('/server/manage/getNodes', 'Admin\\Server\\ManageController@getNodes');
$router->post('/server/manage/sort', 'Admin\\Server\\ManageController@sort');
$router->group([
'prefix' => 'server/trojan'
], function ($router) {
$router->get ('fetch', 'Admin\\Server\\TrojanController@fetch');
$router->post('save', 'Admin\\Server\\TrojanController@save');
$router->post('drop', 'Admin\\Server\\TrojanController@drop');
$router->post('update', 'Admin\\Server\\TrojanController@update');
$router->post('copy', 'Admin\\Server\\TrojanController@copy');
$router->post('sort', 'Admin\\Server\\TrojanController@sort');
$router->post('viewConfig', 'Admin\\Server\\TrojanController@viewConfig');
});
$router->group([
'prefix' => 'server/vmess'
], function ($router) {
$router->get ('fetch', 'Admin\\Server\\VmessController@fetch');
$router->post('save', 'Admin\\Server\\VmessController@save');
$router->post('drop', 'Admin\\Server\\VmessController@drop');
$router->post('update', 'Admin\\Server\\VmessController@update');
$router->post('copy', 'Admin\\Server\\VmessController@copy');
$router->post('sort', 'Admin\\Server\\VmessController@sort');
});
$router->group([
'prefix' => 'server/shadowsocks'
], function ($router) {
$router->get ('fetch', 'Admin\\Server\\ShadowsocksController@fetch');
$router->post('save', 'Admin\\Server\\ShadowsocksController@save');
$router->post('drop', 'Admin\\Server\\ShadowsocksController@drop');
$router->post('update', 'Admin\\Server\\ShadowsocksController@update');
$router->post('copy', 'Admin\\Server\\ShadowsocksController@copy');
$router->post('sort', 'Admin\\Server\\ShadowsocksController@sort');
});
$router->group([
'prefix' => 'server/hysteria'
], function ($router) {
$router->get ('fetch', 'Admin\\Server\\HysteriaController@fetch');
$router->post('save', 'Admin\\Server\\HysteriaController@save');
$router->post('drop', 'Admin\\Server\\HysteriaController@drop');
$router->post('update', 'Admin\\Server\\HysteriaController@update');
$router->post('copy', 'Admin\\Server\\HysteriaController@copy');
$router->post('sort', 'Admin\\Server\\HysteriaController@sort');
});
// Order
$router->get ('/order/fetch', 'Admin\\OrderController@fetch');
$router->post('/order/update', 'Admin\\OrderController@update');
$router->post('/order/assign', 'Admin\\OrderController@assign');
$router->post('/order/paid', 'Admin\\OrderController@paid');
$router->post('/order/cancel', 'Admin\\OrderController@cancel');
$router->post('/order/detail', 'Admin\\OrderController@detail');
// User
$router->get ('/user/fetch', 'Admin\\UserController@fetch');
$router->post('/user/update', 'Admin\\UserController@update');
$router->get ('/user/getUserInfoById', 'Admin\\UserController@getUserInfoById');
$router->post('/user/generate', 'Admin\\UserController@generate');
$router->post('/user/dumpCSV', 'Admin\\UserController@dumpCSV');
$router->post('/user/sendMail', 'Admin\\UserController@sendMail');
$router->post('/user/ban', 'Admin\\UserController@ban');
$router->post('/user/resetSecret', 'Admin\\UserController@resetSecret');
$router->post('/user/setInviteUser', 'Admin\\UserController@setInviteUser');
// Stat
$router->get ('/stat/getStat', 'Admin\\StatController@getStat');
$router->get ('/stat/getOverride', 'Admin\\StatController@getOverride');
$router->get ('/stat/getServerLastRank', 'Admin\\StatController@getServerLastRank');
$router->get ('/stat/getOrder', 'Admin\\StatController@getOrder');
$router->get ('/stat/getStatUser', 'Admin\\StatController@getStatUser');
$router->get ('/stat/getRanking', 'Admin\\StatController@getRanking');
$router->get ('/stat/getStatRecord', 'Admin\\StatController@getStatRecord');
// Notice
$router->get ('/notice/fetch', 'Admin\\NoticeController@fetch');
$router->post('/notice/save', 'Admin\\NoticeController@save');
$router->post('/notice/update', 'Admin\\NoticeController@update');
$router->post('/notice/drop', 'Admin\\NoticeController@drop');
$router->post('/notice/show', 'Admin\\NoticeController@show');
// Ticket
$router->get ('/ticket/fetch', 'Admin\\TicketController@fetch');
$router->post('/ticket/reply', 'Admin\\TicketController@reply');
$router->post('/ticket/close', 'Admin\\TicketController@close');
// Coupon
$router->get ('/coupon/fetch', 'Admin\\CouponController@fetch');
$router->post('/coupon/generate', 'Admin\\CouponController@generate');
$router->post('/coupon/drop', 'Admin\\CouponController@drop');
$router->post('/coupon/show', 'Admin\\CouponController@show');
// Knowledge
$router->get ('/knowledge/fetch', 'Admin\\KnowledgeController@fetch');
$router->get ('/knowledge/getCategory', 'Admin\\KnowledgeController@getCategory');
$router->post('/knowledge/save', 'Admin\\KnowledgeController@save');
$router->post('/knowledge/show', 'Admin\\KnowledgeController@show');
$router->post('/knowledge/drop', 'Admin\\KnowledgeController@drop');
$router->post('/knowledge/sort', 'Admin\\KnowledgeController@sort');
// Payment
$router->get ('/payment/fetch', 'Admin\\PaymentController@fetch');
$router->get ('/payment/getPaymentMethods', 'Admin\\PaymentController@getPaymentMethods');
$router->post('/payment/getPaymentForm', 'Admin\\PaymentController@getPaymentForm');
$router->post('/payment/save', 'Admin\\PaymentController@save');
$router->post('/payment/drop', 'Admin\\PaymentController@drop');
$router->post('/payment/show', 'Admin\\PaymentController@show');
$router->post('/payment/sort', 'Admin\\PaymentController@sort');
// System
$router->get ('/system/getSystemStatus', 'Admin\\SystemController@getSystemStatus');
$router->get ('/system/getQueueStats', 'Admin\\SystemController@getQueueStats');
$router->get ('/system/getQueueWorkload', 'Admin\\SystemController@getQueueWorkload');
$router->get ('/system/getQueueMasters', '\\Laravel\\Horizon\\Http\\Controllers\\MasterSupervisorController@index');
$router->get ('/system/getSystemLog', 'Admin\\SystemController@getSystemLog');
// Theme
$router->get ('/theme/getThemes', 'Admin\\ThemeController@getThemes');
$router->post('/theme/saveThemeConfig', 'Admin\\ThemeController@saveThemeConfig');
$router->post('/theme/getThemeConfig', 'Admin\\ThemeController@getThemeConfig');
});
}
}

View File

@ -1,25 +0,0 @@
<?php
namespace App\Http\Routes;
use Illuminate\Contracts\Routing\Registrar;
class PassportRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'passport'
], function ($router) {
// Auth
$router->post('/auth/register', 'Passport\\AuthController@register');
$router->post('/auth/login', 'Passport\\AuthController@login');
$router->get ('/auth/token2Login', 'Passport\\AuthController@token2Login');
$router->post('/auth/forget', 'Passport\\AuthController@forget');
$router->post('/auth/getQuickLoginUrl', 'Passport\\AuthController@getQuickLoginUrl');
$router->post('/auth/loginWithMailLink', 'Passport\\AuthController@loginWithMailLink');
// Comm
$router->post('/comm/sendEmailVerify', 'Passport\\CommController@sendEmailVerify');
$router->post('/comm/pv', 'Passport\\CommController@pv');
});
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace App\Http\Routes;
use Illuminate\Contracts\Routing\Registrar;
class StaffRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'staff',
'middleware' => 'staff'
], function ($router) {
// Ticket
$router->get ('/ticket/fetch', 'Staff\\TicketController@fetch');
$router->post('/ticket/reply', 'Staff\\TicketController@reply');
$router->post('/ticket/close', 'Staff\\TicketController@close');
// User
$router->post('/user/update', 'Staff\\UserController@update');
$router->get ('/user/getUserInfoById', 'Staff\\UserController@getUserInfoById');
$router->post('/user/sendMail', 'Staff\\UserController@sendMail');
$router->post('/user/ban', 'Staff\\UserController@ban');
// Plan
$router->get ('/plan/fetch', 'Staff\\PlanController@fetch');
// Notice
$router->get ('/notice/fetch', 'Admin\\NoticeController@fetch');
$router->post('/notice/save', 'Admin\\NoticeController@save');
$router->post('/notice/update', 'Admin\\NoticeController@update');
$router->post('/notice/drop', 'Admin\\NoticeController@drop');
});
}
}

View File

@ -1,64 +0,0 @@
<?php
namespace App\Http\Routes;
use Illuminate\Contracts\Routing\Registrar;
class UserRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'user',
'middleware' => 'user'
], function ($router) {
// User
$router->get ('/resetSecurity', 'User\\UserController@resetSecurity');
$router->get ('/info', 'User\\UserController@info');
$router->post('/changePassword', 'User\\UserController@changePassword');
$router->post('/update', 'User\\UserController@update');
$router->get ('/getSubscribe', 'User\\UserController@getSubscribe');
$router->get ('/getStat', 'User\\UserController@getStat');
$router->get ('/checkLogin', 'User\\UserController@checkLogin');
$router->post('/transfer', 'User\\UserController@transfer');
$router->post('/getQuickLoginUrl', 'User\\UserController@getQuickLoginUrl');
$router->get ('/getActiveSession', 'User\\UserController@getActiveSession');
$router->post('/removeActiveSession', 'User\\UserController@removeActiveSession');
// Order
$router->post('/order/save', 'User\\OrderController@save');
$router->post('/order/checkout', 'User\\OrderController@checkout');
$router->get ('/order/check', 'User\\OrderController@check');
$router->get ('/order/detail', 'User\\OrderController@detail');
$router->get ('/order/fetch', 'User\\OrderController@fetch');
$router->get ('/order/getPaymentMethod', 'User\\OrderController@getPaymentMethod');
$router->post('/order/cancel', 'User\\OrderController@cancel');
// Plan
$router->get ('/plan/fetch', 'User\\PlanController@fetch');
// Invite
$router->get ('/invite/save', 'User\\InviteController@save');
$router->get ('/invite/fetch', 'User\\InviteController@fetch');
$router->get ('/invite/details', 'User\\InviteController@details');
// Notice
$router->get ('/notice/fetch', 'User\\NoticeController@fetch');
// Ticket
$router->post('/ticket/reply', 'User\\TicketController@reply');
$router->post('/ticket/close', 'User\\TicketController@close');
$router->post('/ticket/save', 'User\\TicketController@save');
$router->get ('/ticket/fetch', 'User\\TicketController@fetch');
$router->post('/ticket/withdraw', 'User\\TicketController@withdraw');
// Server
$router->get ('/server/fetch', 'User\\ServerController@fetch');
// Coupon
$router->post('/coupon/check', 'User\\CouponController@check');
// Telegram
$router->get ('/telegram/getBotInfo', 'User\\TelegramController@getBotInfo');
// Comm
$router->get ('/comm/config', 'User\\CommController@config');
$router->Post('/comm/getStripePublicKey', 'User\\CommController@getStripePublicKey');
// Knowledge
$router->get ('/knowledge/fetch', 'User\\KnowledgeController@fetch');
$router->get ('/knowledge/getCategory', 'User\\KnowledgeController@getCategory');
// Stat
$router->get ('/stat/getTrafficLog', 'User\\StatController@getTrafficLog');
});
}
}

View File

@ -0,0 +1,143 @@
<?php
namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar;
class AdminRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => config('v2board.secure_path', config('v2board.frontend_admin_path', hash('crc32b', config('app.key')))),
'middleware' => ['admin', 'log'],
], function ($router) {
// Config
$router->get ('/config/fetch', 'V1\\Admin\\ConfigController@fetch');
$router->post('/config/save', 'V1\\Admin\\ConfigController@save');
$router->get ('/config/getEmailTemplate', 'V1\\Admin\\ConfigController@getEmailTemplate');
$router->get ('/config/getThemeTemplate', 'V1\\Admin\\ConfigController@getThemeTemplate');
$router->post('/config/setTelegramWebhook', 'V1\\Admin\\ConfigController@setTelegramWebhook');
$router->post('/config/testSendMail', 'V1\\Admin\\ConfigController@testSendMail');
// Plan
$router->get ('/plan/fetch', 'V1\\Admin\\PlanController@fetch');
$router->post('/plan/save', 'V1\\Admin\\PlanController@save');
$router->post('/plan/drop', 'V1\\Admin\\PlanController@drop');
$router->post('/plan/update', 'V1\\Admin\\PlanController@update');
$router->post('/plan/sort', 'V1\\Admin\\PlanController@sort');
// Server
$router->get ('/server/group/fetch', 'V1\\Admin\\Server\\GroupController@fetch');
$router->post('/server/group/save', 'V1\\Admin\\Server\\GroupController@save');
$router->post('/server/group/drop', 'V1\\Admin\\Server\\GroupController@drop');
$router->get ('/server/route/fetch', 'V1\\Admin\\Server\\RouteController@fetch');
$router->post('/server/route/save', 'V1\\Admin\\Server\\RouteController@save');
$router->post('/server/route/drop', 'V1\\Admin\\Server\\RouteController@drop');
$router->get ('/server/manage/getNodes', 'V1\\Admin\\Server\\ManageController@getNodes');
$router->post('/server/manage/sort', 'V1\\Admin\\Server\\ManageController@sort');
$router->group([
'prefix' => 'server/trojan'
], function ($router) {
$router->post('save', 'V1\\Admin\\Server\\TrojanController@save');
$router->post('drop', 'V1\\Admin\\Server\\TrojanController@drop');
$router->post('update', 'V1\\Admin\\Server\\TrojanController@update');
$router->post('copy', 'V1\\Admin\\Server\\TrojanController@copy');
});
$router->group([
'prefix' => 'server/vmess'
], function ($router) {
$router->post('save', 'V1\\Admin\\Server\\VmessController@save');
$router->post('drop', 'V1\\Admin\\Server\\VmessController@drop');
$router->post('update', 'V1\\Admin\\Server\\VmessController@update');
$router->post('copy', 'V1\\Admin\\Server\\VmessController@copy');
});
$router->group([
'prefix' => 'server/shadowsocks'
], function ($router) {
$router->post('save', 'V1\\Admin\\Server\\ShadowsocksController@save');
$router->post('drop', 'V1\\Admin\\Server\\ShadowsocksController@drop');
$router->post('update', 'V1\\Admin\\Server\\ShadowsocksController@update');
$router->post('copy', 'V1\\Admin\\Server\\ShadowsocksController@copy');
});
$router->group([
'prefix' => 'server/hysteria'
], function ($router) {
$router->post('save', 'V1\\Admin\\Server\\HysteriaController@save');
$router->post('drop', 'V1\\Admin\\Server\\HysteriaController@drop');
$router->post('update', 'V1\\Admin\\Server\\HysteriaController@update');
$router->post('copy', 'V1\\Admin\\Server\\HysteriaController@copy');
});
$router->group([
'prefix' => 'server/vless'
], function ($router) {
$router->post('save', 'V1\\Admin\\Server\\VlessController@save');
$router->post('drop', 'V1\\Admin\\Server\\VlessController@drop');
$router->post('update', 'V1\\Admin\\Server\\VlessController@update');
$router->post('copy', 'V1\\Admin\\Server\\VlessController@copy');
});
// Order
$router->get ('/order/fetch', 'V1\\Admin\\OrderController@fetch');
$router->post('/order/update', 'V1\\Admin\\OrderController@update');
$router->post('/order/assign', 'V1\\Admin\\OrderController@assign');
$router->post('/order/paid', 'V1\\Admin\\OrderController@paid');
$router->post('/order/cancel', 'V1\\Admin\\OrderController@cancel');
$router->post('/order/detail', 'V1\\Admin\\OrderController@detail');
// User
$router->get ('/user/fetch', 'V1\\Admin\\UserController@fetch');
$router->post('/user/update', 'V1\\Admin\\UserController@update');
$router->get ('/user/getUserInfoById', 'V1\\Admin\\UserController@getUserInfoById');
$router->post('/user/generate', 'V1\\Admin\\UserController@generate');
$router->post('/user/dumpCSV', 'V1\\Admin\\UserController@dumpCSV');
$router->post('/user/sendMail', 'V1\\Admin\\UserController@sendMail');
$router->post('/user/ban', 'V1\\Admin\\UserController@ban');
$router->post('/user/resetSecret', 'V1\\Admin\\UserController@resetSecret');
$router->post('/user/setInviteUser', 'V1\\Admin\\UserController@setInviteUser');
// Stat
$router->get ('/stat/getStat', 'V1\\Admin\\StatController@getStat');
$router->get ('/stat/getOverride', 'V1\\Admin\\StatController@getOverride');
$router->get ('/stat/getServerLastRank', 'V1\\Admin\\StatController@getServerLastRank');
$router->get ('/stat/getOrder', 'V1\\Admin\\StatController@getOrder');
$router->get ('/stat/getStatUser', 'V1\\Admin\\StatController@getStatUser');
$router->get ('/stat/getRanking', 'V1\\Admin\\StatController@getRanking');
$router->get ('/stat/getStatRecord', 'V1\\Admin\\StatController@getStatRecord');
// Notice
$router->get ('/notice/fetch', 'V1\\Admin\\NoticeController@fetch');
$router->post('/notice/save', 'V1\\Admin\\NoticeController@save');
$router->post('/notice/update', 'V1\\Admin\\NoticeController@update');
$router->post('/notice/drop', 'V1\\Admin\\NoticeController@drop');
$router->post('/notice/show', 'V1\\Admin\\NoticeController@show');
// Ticket
$router->get ('/ticket/fetch', 'V1\\Admin\\TicketController@fetch');
$router->post('/ticket/reply', 'V1\\Admin\\TicketController@reply');
$router->post('/ticket/close', 'V1\\Admin\\TicketController@close');
// Coupon
$router->get ('/coupon/fetch', 'V1\\Admin\\CouponController@fetch');
$router->post('/coupon/generate', 'V1\\Admin\\CouponController@generate');
$router->post('/coupon/drop', 'V1\\Admin\\CouponController@drop');
$router->post('/coupon/show', 'V1\\Admin\\CouponController@show');
// Knowledge
$router->get ('/knowledge/fetch', 'V1\\Admin\\KnowledgeController@fetch');
$router->get ('/knowledge/getCategory', 'V1\\Admin\\KnowledgeController@getCategory');
$router->post('/knowledge/save', 'V1\\Admin\\KnowledgeController@save');
$router->post('/knowledge/show', 'V1\\Admin\\KnowledgeController@show');
$router->post('/knowledge/drop', 'V1\\Admin\\KnowledgeController@drop');
$router->post('/knowledge/sort', 'V1\\Admin\\KnowledgeController@sort');
// Payment
$router->get ('/payment/fetch', 'V1\\Admin\\PaymentController@fetch');
$router->get ('/payment/getPaymentMethods', 'V1\\Admin\\PaymentController@getPaymentMethods');
$router->post('/payment/getPaymentForm', 'V1\\Admin\\PaymentController@getPaymentForm');
$router->post('/payment/save', 'V1\\Admin\\PaymentController@save');
$router->post('/payment/drop', 'V1\\Admin\\PaymentController@drop');
$router->post('/payment/show', 'V1\\Admin\\PaymentController@show');
$router->post('/payment/sort', 'V1\\Admin\\PaymentController@sort');
// System
$router->get ('/system/getSystemStatus', 'V1\\Admin\\SystemController@getSystemStatus');
$router->get ('/system/getQueueStats', 'V1\\Admin\\SystemController@getQueueStats');
$router->get ('/system/getQueueWorkload', 'V1\\Admin\\SystemController@getQueueWorkload');
$router->get ('/system/getQueueMasters', '\\Laravel\\Horizon\\Http\\Controllers\\MasterSupervisorController@index');
$router->get ('/system/getSystemLog', 'V1\\Admin\\SystemController@getSystemLog');
// Theme
$router->get ('/theme/getThemes', 'V1\\Admin\\ThemeController@getThemes');
$router->post('/theme/saveThemeConfig', 'V1\\Admin\\ThemeController@saveThemeConfig');
$router->post('/theme/getThemeConfig', 'V1\\Admin\\ThemeController@getThemeConfig');
});
}
}

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Http\Routes; namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar; use Illuminate\Contracts\Routing\Registrar;
@ -12,10 +12,10 @@ class ClientRoute
'middleware' => 'client' 'middleware' => 'client'
], function ($router) { ], function ($router) {
// Client // Client
$router->get('/subscribe', 'Client\\ClientController@subscribe'); $router->get('/subscribe', 'V1\\Client\\ClientController@subscribe');
// App // App
$router->get('/app/getConfig', 'Client\\AppController@getConfig'); $router->get('/app/getConfig', 'V1\\Client\\AppController@getConfig');
$router->get('/app/getVersion', 'Client\\AppController@getVersion'); $router->get('/app/getVersion', 'V1\\Client\\AppController@getVersion');
}); });
} }
} }

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Http\Routes; namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar; use Illuminate\Contracts\Routing\Registrar;
@ -11,13 +11,13 @@ class GuestRoute
'prefix' => 'guest' 'prefix' => 'guest'
], function ($router) { ], function ($router) {
// Plan // Plan
$router->get ('/plan/fetch', 'Guest\\PlanController@fetch'); $router->get ('/plan/fetch', 'V1\\Guest\\PlanController@fetch');
// Telegram // Telegram
$router->post('/telegram/webhook', 'Guest\\TelegramController@webhook'); $router->post('/telegram/webhook', 'V1\\Guest\\TelegramController@webhook');
// Payment // Payment
$router->match(['get', 'post'], '/payment/notify/{method}/{uuid}', 'Guest\\PaymentController@notify'); $router->match(['get', 'post'], '/payment/notify/{method}/{uuid}', 'V1\\Guest\\PaymentController@notify');
// Comm // Comm
$router->get ('/comm/config', 'Guest\\CommController@config'); $router->get ('/comm/config', 'V1\\Guest\\CommController@config');
}); });
} }
} }

View File

@ -0,0 +1,25 @@
<?php
namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar;
class PassportRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'passport'
], function ($router) {
// Auth
$router->post('/auth/register', 'V1\\Passport\\AuthController@register');
$router->post('/auth/login', 'V1\\Passport\\AuthController@login');
$router->get ('/auth/token2Login', 'V1\\Passport\\AuthController@token2Login');
$router->post('/auth/forget', 'V1\\Passport\\AuthController@forget');
$router->post('/auth/getQuickLoginUrl', 'V1\\Passport\\AuthController@getQuickLoginUrl');
$router->post('/auth/loginWithMailLink', 'V1\\Passport\\AuthController@loginWithMailLink');
// Comm
$router->post('/comm/sendEmailVerify', 'V1\\Passport\\CommController@sendEmailVerify');
$router->post('/comm/pv', 'V1\\Passport\\CommController@pv');
});
}
}

View File

@ -1,5 +1,5 @@
<?php <?php
namespace App\Http\Routes; namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar; use Illuminate\Contracts\Routing\Registrar;
@ -11,7 +11,7 @@ class ServerRoute
'prefix' => 'server' 'prefix' => 'server'
], function ($router) { ], function ($router) {
$router->any('/{class}/{action}', function($class, $action) { $router->any('/{class}/{action}', function($class, $action) {
$ctrl = \App::make("\\App\\Http\\Controllers\\Server\\" . ucfirst($class) . "Controller"); $ctrl = \App::make("\\App\\Http\\Controllers\\V1\\Server\\" . ucfirst($class) . "Controller");
return \App::call([$ctrl, $action]); return \App::call([$ctrl, $action]);
}); });
}); });

View File

@ -0,0 +1,32 @@
<?php
namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar;
class StaffRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'staff',
'middleware' => 'staff'
], function ($router) {
// Ticket
$router->get ('/ticket/fetch', 'V1\\Staff\\TicketController@fetch');
$router->post('/ticket/reply', 'V1\\Staff\\TicketController@reply');
$router->post('/ticket/close', 'V1\\Staff\\TicketController@close');
// User
$router->post('/user/update', 'V1\\Staff\\UserController@update');
$router->get ('/user/getUserInfoById', 'V1\\Staff\\UserController@getUserInfoById');
$router->post('/user/sendMail', 'V1\\Staff\\UserController@sendMail');
$router->post('/user/ban', 'V1\\Staff\\UserController@ban');
// Plan
$router->get ('/plan/fetch', 'V1\\Staff\\PlanController@fetch');
// Notice
$router->get ('/notice/fetch', 'V1\\Admin\\NoticeController@fetch');
$router->post('/notice/save', 'V1\\Admin\\NoticeController@save');
$router->post('/notice/update', 'V1\\Admin\\NoticeController@update');
$router->post('/notice/drop', 'V1\\Admin\\NoticeController@drop');
});
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace App\Http\Routes\V1;
use Illuminate\Contracts\Routing\Registrar;
class UserRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => 'user',
'middleware' => 'user'
], function ($router) {
// User
$router->get ('/resetSecurity', 'V1\\User\\UserController@resetSecurity');
$router->get ('/info', 'V1\\User\\UserController@info');
$router->post('/changePassword', 'V1\\User\\UserController@changePassword');
$router->post('/update', 'V1\\User\\UserController@update');
$router->get ('/getSubscribe', 'V1\\User\\UserController@getSubscribe');
$router->get ('/getStat', 'V1\\User\\UserController@getStat');
$router->get ('/checkLogin', 'V1\\User\\UserController@checkLogin');
$router->post('/transfer', 'V1\\User\\UserController@transfer');
$router->post('/getQuickLoginUrl', 'V1\\User\\UserController@getQuickLoginUrl');
$router->get ('/getActiveSession', 'V1\\User\\UserController@getActiveSession');
$router->post('/removeActiveSession', 'V1\\User\\UserController@removeActiveSession');
// Order
$router->post('/order/save', 'V1\\User\\OrderController@save');
$router->post('/order/checkout', 'V1\\User\\OrderController@checkout');
$router->get ('/order/check', 'V1\\User\\OrderController@check');
$router->get ('/order/detail', 'V1\\User\\OrderController@detail');
$router->get ('/order/fetch', 'V1\\User\\OrderController@fetch');
$router->get ('/order/getPaymentMethod', 'V1\\User\\OrderController@getPaymentMethod');
$router->post('/order/cancel', 'V1\\User\\OrderController@cancel');
// Plan
$router->get ('/plan/fetch', 'V1\\User\\PlanController@fetch');
// Invite
$router->get ('/invite/save', 'V1\\User\\InviteController@save');
$router->get ('/invite/fetch', 'V1\\User\\InviteController@fetch');
$router->get ('/invite/details', 'V1\\User\\InviteController@details');
// Notice
$router->get ('/notice/fetch', 'V1\\User\\NoticeController@fetch');
// Ticket
$router->post('/ticket/reply', 'V1\\User\\TicketController@reply');
$router->post('/ticket/close', 'V1\\User\\TicketController@close');
$router->post('/ticket/save', 'V1\\User\\TicketController@save');
$router->get ('/ticket/fetch', 'V1\\User\\TicketController@fetch');
$router->post('/ticket/withdraw', 'V1\\User\\TicketController@withdraw');
// Server
$router->get ('/server/fetch', 'V1\\User\\ServerController@fetch');
// Coupon
$router->post('/coupon/check', 'V1\\User\\CouponController@check');
// Telegram
$router->get ('/telegram/getBotInfo', 'V1\\User\\TelegramController@getBotInfo');
// Comm
$router->get ('/comm/config', 'V1\\User\\CommController@config');
$router->Post('/comm/getStripePublicKey', 'V1\\User\\CommController@getStripePublicKey');
// Knowledge
$router->get ('/knowledge/fetch', 'V1\\User\\KnowledgeController@fetch');
$router->get ('/knowledge/getCategory', 'V1\\User\\KnowledgeController@getCategory');
// Stat
$router->get ('/stat/getTrafficLog', 'V1\\User\\StatController@getTrafficLog');
});
}
}

View File

@ -0,0 +1,20 @@
<?php
namespace App\Http\Routes\V2;
use Illuminate\Contracts\Routing\Registrar;
class AdminRoute
{
public function map(Registrar $router)
{
$router->group([
'prefix' => config('v2board.secure_path', config('v2board.frontend_admin_path', hash('crc32b', config('app.key')))),
'middleware' => ['admin', 'log'],
], function ($router) {
// Stat
$router->get ('/stat/override', 'V2\\Admin\\StatController@override');
$router->get ('/stat/record', 'V2\\Admin\\StatController@record');
$router->get ('/stat/ranking', 'V2\\Admin\\StatController@ranking');
});
}
}

View File

@ -42,7 +42,7 @@ class OrderHandleJob implements ShouldQueue
switch ($this->order->status) { switch ($this->order->status) {
// cancel // cancel
case 0: case 0:
if ($this->order->created_at <= (time() - 1800)) { if ($this->order->created_at <= (time() - 3600 * 2)) {
$orderService->cancel(); $orderService->cancel();
} }
break; break;

View File

@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Model;
class Log extends Model class Log extends Model
{ {
use \App\Scope\FilterScope;
protected $table = 'v2_log'; protected $table = 'v2_log';
protected $dateFormat = 'U'; protected $dateFormat = 'U';
protected $guarded = ['id']; protected $guarded = ['id'];

21
app/Models/ServerVless.php Executable file
View File

@ -0,0 +1,21 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ServerVless extends Model
{
protected $table = 'v2_server_vless';
protected $dateFormat = 'U';
protected $guarded = ['id'];
protected $casts = [
'created_at' => 'timestamp',
'updated_at' => 'timestamp',
'group_id' => 'array',
'route_id' => 'array',
'tls_settings' => 'array',
'network_settings' => 'array',
'tags' => 'array'
];
}

View File

@ -1,8 +1,7 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Dict;
use phpDocumentor\Reflection\Types\Self_; use phpDocumentor\Reflection\Types\Self_;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;

View File

@ -1,8 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper;
class Loon class Loon
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class Passwall class Passwall

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class QuantumultX class QuantumultX

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class SSRPlus class SSRPlus

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class SagerNet class SagerNet
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class Shadowsocks class Shadowsocks
{ {

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
use App\Utils\Helper; use App\Utils\Helper;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Client\Protocols; namespace App\Protocols;
class V2rayNG class V2rayNG

View File

@ -72,8 +72,19 @@ class RouteServiceProvider extends ServiceProvider
'middleware' => 'api', 'middleware' => 'api',
'namespace' => $this->namespace 'namespace' => $this->namespace
], function ($router) { ], function ($router) {
foreach (glob(app_path('Http//Routes') . '/*.php') as $file) { foreach (glob(app_path('Http//Routes//V1') . '/*.php') as $file) {
$this->app->make('App\\Http\\Routes\\' . basename($file, '.php'))->map($router); $this->app->make('App\\Http\\Routes\\V1\\' . basename($file, '.php'))->map($router);
}
});
Route::group([
'prefix' => '/api/v2',
'middleware' => 'api',
'namespace' => $this->namespace
], function ($router) {
foreach (glob(app_path('Http//Routes//V2') . '/*.php') as $file) {
$this->app->make('App\\Http\\Routes\\V2\\' . basename($file, '.php'))->map($router);
} }
}); });
} }

50
app/Scope/FilterScope.php Normal file
View File

@ -0,0 +1,50 @@
<?php
namespace App\Scope;
use Illuminate\Database\Eloquent\Builder;
trait FilterScope
{
public function scopeSetFilterAllowKeys($builder, ...$allowKeys)
{
$allowKeys = implode(',', $allowKeys);
if (!$allowKeys) return $builder;
$request = request();
$request->validate([
'filter.*.key' => "required|in:{$allowKeys}",
'filter.*.condition' => 'required|in:in,is,not,like,lt,gt',
'filter.*.value' => 'required'
]);
$filters = $request->input('filter');
if ($filters) {
foreach ($filters as $k => $filter) {
if ($filter['condition'] === 'in') {
$builder->whereIn($filter['key'], $filter['value']);
continue;
}
if ($filter['condition'] === 'is') {
$builder->where($filter['key'], $filter['value']);
continue;
}
if ($filter['condition'] === 'not') {
$builder->where($filter['key'], '!=', $filter['value']);
continue;
}
if ($filter['condition'] === 'gt') {
$builder->where($filter['key'], '>', $filter['value']);
continue;
}
if ($filter['condition'] === 'lt') {
$builder->where($filter['key'], '<', $filter['value']);
continue;
}
if ($filter['condition'] === 'like') {
$builder->where($filter['key'], 'like', "%{$filter['value']}%");
continue;
}
}
}
return $builder;
}
}

View File

@ -6,6 +6,7 @@ use App\Models\ServerHysteria;
use App\Models\ServerLog; use App\Models\ServerLog;
use App\Models\ServerRoute; use App\Models\ServerRoute;
use App\Models\ServerShadowsocks; use App\Models\ServerShadowsocks;
use App\Models\ServerVless;
use App\Models\User; use App\Models\User;
use App\Models\ServerVmess; use App\Models\ServerVmess;
use App\Models\ServerTrojan; use App\Models\ServerTrojan;
@ -15,6 +16,29 @@ use Illuminate\Support\Facades\Cache;
class ServerService class ServerService
{ {
public function getAvailableVless(User $user):array
{
$servers = [];
$model = ServerVless::orderBy('sort', 'ASC');
$server = $model->get();
foreach ($server as $key => $v) {
if (!$v['show']) continue;
$server[$key]['type'] = 'vless';
if (!in_array($user->group_id, $server[$key]['group_id'])) continue;
if (strpos($server[$key]['port'], '-') !== false) {
$server[$key]['port'] = Helper::randomPort($server[$key]['port']);
}
if ($server[$key]['parent_id']) {
$server[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_VLESS_LAST_CHECK_AT', $server[$key]['parent_id']));
} else {
$server[$key]['last_check_at'] = Cache::get(CacheKey::get('SERVER_VLESS_LAST_CHECK_AT', $server[$key]['id']));
}
$servers[] = $server[$key]->toArray();
}
return $servers;
}
public function getAvailableVmess(User $user):array public function getAvailableVmess(User $user):array
{ {
@ -113,7 +137,8 @@ class ServerService
$this->getAvailableShadowsocks($user), $this->getAvailableShadowsocks($user),
$this->getAvailableVmess($user), $this->getAvailableVmess($user),
$this->getAvailableTrojan($user), $this->getAvailableTrojan($user),
$this->getAvailableHysteria($user) $this->getAvailableHysteria($user),
$this->getAvailableVless($user)
); );
$tmp = array_column($servers, 'sort'); $tmp = array_column($servers, 'sort');
array_multisort($tmp, SORT_ASC, $servers); array_multisort($tmp, SORT_ASC, $servers);
@ -196,6 +221,17 @@ class ServerService
return $servers; return $servers;
} }
public function getAllVLess()
{
$servers = ServerVless::orderBy('sort', 'ASC')
->get()
->toArray();
foreach ($servers as $k => $v) {
$servers[$k]['type'] = 'vless';
}
return $servers;
}
public function getAllTrojan() public function getAllTrojan()
{ {
$servers = ServerTrojan::orderBy('sort', 'ASC') $servers = ServerTrojan::orderBy('sort', 'ASC')
@ -241,7 +277,8 @@ class ServerService
$this->getAllShadowsocks(), $this->getAllShadowsocks(),
$this->getAllVMess(), $this->getAllVMess(),
$this->getAllTrojan(), $this->getAllTrojan(),
$this->getAllHysteria() $this->getAllHysteria(),
$this->getAllVLess()
); );
$this->mergeData($servers); $this->mergeData($servers);
$tmp = array_column($servers, 'sort'); $tmp = array_column($servers, 'sort');
@ -272,6 +309,8 @@ class ServerService
return ServerTrojan::find($serverId); return ServerTrojan::find($serverId);
case 'hysteria': case 'hysteria':
return ServerHysteria::find($serverId); return ServerHysteria::find($serverId);
case 'vless':
return ServerVless::find($serverId);
default: default:
return false; return false;
} }

View File

@ -30,7 +30,7 @@ class StatisticalService {
} }
public function setServerStats() { public function setServerStats() {
$this->serverStats = Cache::get("stat_server_{$this->startAt}"); $this->serverStats = Cache::store('file')->get("stat_server_{$this->startAt}");
$this->serverStats = json_decode($this->serverStats, true) ?? []; $this->serverStats = json_decode($this->serverStats, true) ?? [];
if (!is_array($this->serverStats)) { if (!is_array($this->serverStats)) {
$this->serverStats = []; $this->serverStats = [];
@ -38,7 +38,7 @@ class StatisticalService {
} }
public function setUserStats() { public function setUserStats() {
$this->userStats = Cache::get("stat_user_{$this->startAt}"); $this->userStats = Cache::store('file')->get("stat_user_{$this->startAt}");
$this->userStats = json_decode($this->userStats, true) ?? []; $this->userStats = json_decode($this->userStats, true) ?? [];
if (!is_array($this->userStats)) { if (!is_array($this->userStats)) {
$this->userStats = []; $this->userStats = [];
@ -95,7 +95,7 @@ class StatisticalService {
} else { } else {
$this->serverStats[$serverType][$serverId] = [$u, $d]; $this->serverStats[$serverType][$serverId] = [$u, $d];
} }
Cache::set("stat_server_{$this->startAt}", json_encode($this->serverStats)); Cache::store('file')->set("stat_server_{$this->startAt}", json_encode($this->serverStats));
} }
public function statUser($rate, $userId, $u, $d) public function statUser($rate, $userId, $u, $d)
@ -107,7 +107,7 @@ class StatisticalService {
} else { } else {
$this->userStats[$rate][$userId] = [$u, $d]; $this->userStats[$rate][$userId] = [$u, $d];
} }
Cache::set("stat_user_{$this->startAt}", json_encode($this->userStats)); Cache::store('file')->set("stat_user_{$this->startAt}", json_encode($this->userStats));
} }
public function getStatUserByUserID($userId): array public function getStatUserByUserID($userId): array
@ -165,12 +165,12 @@ class StatisticalService {
public function clearStatUser() public function clearStatUser()
{ {
Cache::forget("stat_user_{$this->startAt}"); Cache::store('file')->forget("stat_user_{$this->startAt}");
} }
public function clearStatServer() public function clearStatServer()
{ {
Cache::forget("stat_server_{$this->startAt}"); Cache::store('file')->forget("stat_server_{$this->startAt}");
} }
public function getStatRecord($type) public function getStatRecord($type)

View File

@ -19,13 +19,17 @@ class CacheKey
'SERVER_HYSTERIA_ONLINE_USER' => 'hysteria节点在线用户', 'SERVER_HYSTERIA_ONLINE_USER' => 'hysteria节点在线用户',
'SERVER_HYSTERIA_LAST_CHECK_AT' => 'hysteria节点最后检查时间', 'SERVER_HYSTERIA_LAST_CHECK_AT' => 'hysteria节点最后检查时间',
'SERVER_HYSTERIA_LAST_PUSH_AT' => 'hysteria节点最后推送时间', 'SERVER_HYSTERIA_LAST_PUSH_AT' => 'hysteria节点最后推送时间',
'SERVER_VLESS_ONLINE_USER' => 'vless节点在线用户',
'SERVER_VLESS_LAST_CHECK_AT' => 'vless节点最后检查时间',
'SERVER_VLESS_LAST_PUSH_AT' => 'vless节点最后推送时间',
'TEMP_TOKEN' => '临时令牌', 'TEMP_TOKEN' => '临时令牌',
'LAST_SEND_EMAIL_REMIND_TRAFFIC' => '最后发送流量邮件提醒', 'LAST_SEND_EMAIL_REMIND_TRAFFIC' => '最后发送流量邮件提醒',
'SCHEDULE_LAST_CHECK_AT' => '计划任务最后检查时间', 'SCHEDULE_LAST_CHECK_AT' => '计划任务最后检查时间',
'REGISTER_IP_RATE_LIMIT' => '注册频率限制', 'REGISTER_IP_RATE_LIMIT' => '注册频率限制',
'LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP' => '最后一次发送登入链接时间', 'LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP' => '最后一次发送登入链接时间',
'PASSWORD_ERROR_LIMIT' => '密码错误次数限制', 'PASSWORD_ERROR_LIMIT' => '密码错误次数限制',
'USER_SESSIONS' => '用户session' 'USER_SESSIONS' => '用户session',
'FORGET_REQUEST_LIMIT' => '找回密码次数限制'
]; ];
public static function get(string $key, $uniqueValue) public static function get(string $key, $uniqueValue)

View File

@ -120,4 +120,10 @@ class Helper
$portRange = explode('-', $range); $portRange = explode('-', $range);
return rand($portRange[0], $portRange[1]); return rand($portRange[0], $portRange[1]);
} }
public static function base64EncodeUrlSafe($data)
{
$encoded = base64_encode($data);
return str_replace(['+', '/', '='], ['-', '_', ''], $encoded);
}
} }

View File

@ -23,7 +23,8 @@
"linfo/linfo": "^4.0", "linfo/linfo": "^4.0",
"php-curl-class/php-curl-class": "^8.6", "php-curl-class/php-curl-class": "^8.6",
"stripe/stripe-php": "^7.36.1", "stripe/stripe-php": "^7.36.1",
"symfony/yaml": "^4.3" "symfony/yaml": "^4.3",
"paragonie/sodium_compat": "^1.20"
}, },
"require-dev": { "require-dev": {
"facade/ignition": "^2.3.6", "facade/ignition": "^2.3.6",

View File

@ -237,5 +237,5 @@ return [
| The only modification by laravel config | The only modification by laravel config
| |
*/ */
'version' => '1.7.4.1681103823832' 'version' => '1.7.5.1685907718051'
]; ];

View File

@ -1,4 +1,4 @@
-- Adminer 4.7.7 MySQL dump -- Adminer 4.8.1 MySQL 5.7.29 dump
SET NAMES utf8; SET NAMES utf8;
SET time_zone = '+00:00'; SET time_zone = '+00:00';
@ -84,7 +84,7 @@ CREATE TABLE `v2_knowledge` (
DROP TABLE IF EXISTS `v2_log`; DROP TABLE IF EXISTS `v2_log`;
CREATE TABLE `v2_log` ( CREATE TABLE `v2_log` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL, `title` text NOT NULL,
`level` varchar(11) DEFAULT NULL, `level` varchar(11) DEFAULT NULL,
`host` varchar(255) DEFAULT NULL, `host` varchar(255) DEFAULT NULL,
`uri` varchar(255) NOT NULL, `uri` varchar(255) NOT NULL,
@ -294,6 +294,31 @@ CREATE TABLE `v2_server_trojan` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='trojan伺服器表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='trojan伺服器表';
DROP TABLE IF EXISTS `v2_server_vless`;
CREATE TABLE `v2_server_vless` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` text NOT NULL,
`route_id` text,
`name` varchar(255) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`host` varchar(255) NOT NULL,
`port` int(11) NOT NULL,
`server_port` int(11) NOT NULL,
`tls` tinyint(1) NOT NULL,
`tls_settings` text,
`flow` varchar(64) DEFAULT NULL,
`network` varchar(11) NOT NULL,
`network_settings` text,
`tags` text,
`rate` varchar(11) NOT NULL,
`show` tinyint(1) NOT NULL DEFAULT '0',
`sort` int(11) DEFAULT NULL,
`created_at` int(11) NOT NULL,
`updated_at` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DROP TABLE IF EXISTS `v2_server_vmess`; DROP TABLE IF EXISTS `v2_server_vmess`;
CREATE TABLE `v2_server_vmess` ( CREATE TABLE `v2_server_vmess` (
`id` int(11) NOT NULL AUTO_INCREMENT, `id` int(11) NOT NULL AUTO_INCREMENT,
@ -444,4 +469,4 @@ CREATE TABLE `v2_user` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 2023-05-23 17:01:12 -- 2023-07-17 07:38:59

View File

@ -684,3 +684,32 @@ CREATE TABLE `v2_log` (
`updated_at` int(11) NOT NULL, `updated_at` int(11) NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `v2_log`
CHANGE `title` `title` text COLLATE 'utf8mb4_general_ci' NOT NULL AFTER `id`;
CREATE TABLE `v2_server_vless` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_id` text NOT NULL,
`route_id` text,
`name` varchar(255) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`host` varchar(255) NOT NULL,
`port` int(11) NOT NULL,
`server_port` int(11) NOT NULL,
`tls` tinyint(1) NOT NULL,
`tls_settings` text,
`flow` varchar(11) DEFAULT NULL,
`network` varchar(11) NOT NULL,
`network_settings` text,
`tags` text,
`rate` varchar(11) NOT NULL,
`show` tinyint(1) NOT NULL DEFAULT '0',
`sort` int(11) DEFAULT NULL,
`created_at` int(11) NOT NULL,
`updated_at` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `v2_server_vless`
CHANGE `flow` `flow` varchar(64) COLLATE 'utf8mb4_general_ci' NULL AFTER `tls_settings`;

File diff suppressed because one or more lines are too long

View File

@ -94,5 +94,6 @@
"Login to :name": "Login to :name", "Login to :name": "Login to :name",
"Sending frequently, please try again later": "Sending frequently, please try again later", "Sending frequently, please try again later": "Sending frequently, please try again later",
"Current product is sold out": "Current product is sold out", "Current product is sold out": "Current product is sold out",
"There are too many password errors, please try again after :minute minutes.": "There are too many password errors, please try again after :minute minutes." "There are too many password errors, please try again after :minute minutes.": "There are too many password errors, please try again after :minute minutes.",
"Reset failed, Please try again later": "Reset failed, Please try again later"
} }

View File

@ -94,5 +94,6 @@
"Login to :name": "登入到 :name", "Login to :name": "登入到 :name",
"Sending frequently, please try again later": "发送频繁,请稍后再试", "Sending frequently, please try again later": "发送频繁,请稍后再试",
"Current product is sold out": "当前商品已售罄", "Current product is sold out": "当前商品已售罄",
"There are too many password errors, please try again after :minute minutes.": "密码错误次数过多,请 :minute 分钟后再试" "There are too many password errors, please try again after :minute minutes.": "密码错误次数过多,请 :minute 分钟后再试",
"Reset failed, Please try again later": "重置失败,请稍后再试"
} }