123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- <?php
- declare(strict_types=1);
- namespace App\Controllers\Admin;
- use App\Controllers\BaseController;
- use App\Models\Config;
- use App\Models\Node;
- use App\Services\IM\Telegram;
- use App\Utils\Tools;
- use Psr\Http\Message\ResponseInterface;
- use Slim\Http\Response;
- use Slim\Http\ServerRequest;
- use SmartyException;
- use Telegram\Bot\Exceptions\TelegramSDKException;
- use function json_decode;
- use function json_encode;
- use function round;
- use function str_replace;
- use function trim;
- final class NodeController extends BaseController
- {
- private static array $details = [
- 'field' => [
- 'op' => '操作',
- 'id' => '节点ID',
- 'name' => '名称',
- 'server' => '地址',
- 'type' => '状态',
- 'sort' => '类型',
- 'traffic_rate' => '倍率',
- 'is_dynamic_rate' => '动态倍率',
- 'dynamic_rate_type' => '动态倍率计算方式',
- 'node_class' => '等级',
- 'node_group' => '组别',
- 'node_bandwidth_limit' => '流量限制/GB',
- 'node_bandwidth' => '已用流量/GB',
- 'bandwidthlimit_resetday' => '重置日',
- ],
- ];
- private static array $update_field = [
- 'name',
- 'server',
- 'traffic_rate',
- 'is_dynamic_rate',
- 'dynamic_rate_type',
- 'max_rate',
- 'max_rate_time',
- 'min_rate',
- 'min_rate_time',
- 'node_group',
- 'node_speedlimit',
- 'sort',
- 'node_class',
- 'node_bandwidth_limit',
- 'bandwidthlimit_resetday',
- ];
- /**
- * 后台节点页面
- *
- * @throws SmartyException
- */
- public function index(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- return $response->write(
- $this->view()
- ->assign('details', self::$details)
- ->fetch('admin/node/index.tpl')
- );
- }
- /**
- * 后台创建节点页面
- *
- * @throws SmartyException
- */
- public function create(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- return $response->write(
- $this->view()
- ->assign('update_field', self::$update_field)
- ->fetch('admin/node/create.tpl')
- );
- }
- /**
- * 后台添加节点
- */
- public function add(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- $node = new Node();
- $node->name = $request->getParam('name');
- $node->node_group = $request->getParam('node_group');
- $node->server = trim($request->getParam('server'));
- $node->traffic_rate = $request->getParam('traffic_rate') ?? 1;
- $node->is_dynamic_rate = $request->getParam('is_dynamic_rate') === 'true' ? 1 : 0;
- $node->dynamic_rate_type = $request->getParam('dynamic_rate_type') ?? 0;
- $node->dynamic_rate_config = json_encode([
- 'max_rate' => $request->getParam('max_rate') ?? 1,
- 'max_rate_time' => $request->getParam('max_rate_time') ?? 3,
- 'min_rate' => $request->getParam('min_rate') ?? 1,
- 'min_rate_time' => $request->getParam('min_rate_time') ?? 22,
- ]);
- $custom_config = $request->getParam('custom_config') ?? '{}';
- if ($custom_config !== '') {
- $node->custom_config = $custom_config;
- } else {
- $node->custom_config = '{}';
- }
- $node->node_speedlimit = $request->getParam('node_speedlimit');
- $node->type = $request->getParam('type') === 'true' ? 1 : 0;
- $node->sort = $request->getParam('sort');
- $node->node_class = $request->getParam('node_class');
- $node->node_bandwidth_limit = Tools::toGB($request->getParam('node_bandwidth_limit'));
- $node->bandwidthlimit_resetday = $request->getParam('bandwidthlimit_resetday');
- $node->password = Tools::genRandomChar(32);
- if (! $node->save()) {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '添加失败',
- ]);
- }
- if (Config::obtain('telegram_add_node')) {
- try {
- (new Telegram())->send(
- 0,
- str_replace(
- '%node_name%',
- $request->getParam('name'),
- Config::obtain('telegram_add_node_text')
- )
- );
- } catch (TelegramSDKException $e) {
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '添加成功,但 Telegram 通知失败',
- 'node_id' => $node->id,
- ]);
- }
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '添加成功',
- 'node_id' => $node->id,
- ]);
- }
- /**
- * 后台编辑指定节点页面
- *
- * @throws SmartyException
- */
- public function edit(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- $node = (new Node())->find($args['id']);
- $dynamic_rate_config = json_decode($node->dynamic_rate_config);
- $node->max_rate = $dynamic_rate_config?->max_rate ?? 1;
- $node->max_rate_time = $dynamic_rate_config?->max_rate_time ?? 3;
- $node->min_rate = $dynamic_rate_config?->min_rate ?? 1;
- $node->min_rate_time = $dynamic_rate_config?->min_rate_time ?? 22;
- $node->node_bandwidth = Tools::flowToGB($node->node_bandwidth);
- $node->node_bandwidth_limit = Tools::flowToGB($node->node_bandwidth_limit);
- return $response->write(
- $this->view()
- ->assign('node', $node)
- ->assign('update_field', self::$update_field)
- ->fetch('admin/node/edit.tpl')
- );
- }
- /**
- * 后台更新指定节点内容
- */
- public function update(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- $node = (new Node())->find($args['id']);
- $node->name = $request->getParam('name');
- $node->node_group = $request->getParam('node_group') ?? 0;
- $node->server = trim($request->getParam('server'));
- $node->traffic_rate = $request->getParam('traffic_rate') ?? 1;
- $node->is_dynamic_rate = $request->getParam('is_dynamic_rate') === 'true' ? 1 : 0;
- $node->dynamic_rate_type = $request->getParam('dynamic_rate_type') ?? 0;
- $node->dynamic_rate_config = json_encode([
- 'max_rate' => $request->getParam('max_rate') ?? 1,
- 'max_rate_time' => $request->getParam('max_rate_time') ?? 0,
- 'min_rate' => $request->getParam('min_rate') ?? 1,
- 'min_rate_time' => $request->getParam('min_rate_time') ?? 0,
- ]);
- $custom_config = $request->getParam('custom_config') ?? '{}';
- if ($custom_config !== '') {
- $node->custom_config = $custom_config;
- } else {
- $node->custom_config = '{}';
- }
- $node->node_speedlimit = $request->getParam('node_speedlimit');
- $node->type = $request->getParam('type') === 'true' ? 1 : 0;
- $node->sort = $request->getParam('sort');
- $node->node_class = $request->getParam('node_class');
- $node->node_bandwidth_limit = Tools::toGB($request->getParam('node_bandwidth_limit'));
- $node->bandwidthlimit_resetday = $request->getParam('bandwidthlimit_resetday');
- if (! $node->save()) {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '修改失败',
- ]);
- }
- if (Config::obtain('telegram_update_node')) {
- try {
- (new Telegram())->send(
- 0,
- str_replace(
- '%node_name%',
- $request->getParam('name'),
- Config::obtain('telegram_update_node_text')
- )
- );
- } catch (TelegramSDKException $e) {
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '修改成功,但 Telegram 通知失败',
- ]);
- }
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '修改成功',
- ]);
- }
- public function reset(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
- {
- $node = (new Node())->find($args['id']);
- $node->password = Tools::genRandomChar(32);
- $node->save();
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '重置节点通讯密钥成功',
- ]);
- }
- /**
- * 后台删除指定节点
- */
- public function delete(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- $node = (new Node())->find($args['id']);
- if (! $node->delete()) {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '删除失败',
- ]);
- }
- if (Config::obtain('telegram_delete_node')) {
- try {
- (new Telegram())->send(
- 0,
- str_replace(
- '%node_name%',
- $node->name,
- Config::obtain('telegram_delete_node_text')
- )
- );
- } catch (TelegramSDKException $e) {
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '删除成功,但Telegram通知失败',
- ]);
- }
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '删除成功',
- ]);
- }
- public function copy($request, $response, $args)
- {
- $old_node = (new Node())->find($args['id']);
- $new_node = $old_node->replicate([
- 'node_bandwidth',
- ]);
- $new_node->name .= ' (副本)';
- $new_node->node_bandwidth = 0;
- if (! $new_node->save()) {
- return $response->withJson([
- 'ret' => 0,
- 'msg' => '复制失败',
- ]);
- }
- return $response->withJson([
- 'ret' => 1,
- 'msg' => '复制成功',
- ]);
- }
- /**
- * 后台节点页面 AJAX
- */
- public function ajax(ServerRequest $request, Response $response, array $args): ResponseInterface
- {
- $nodes = (new Node())->orderBy('id', 'desc')->get();
- foreach ($nodes as $node) {
- $node->op = '<button type="button" class="btn btn-red" id="delete-node-' . $node->id . '"
- onclick="deleteNode(' . $node->id . ')">删除</button>
- <button type="button" class="btn btn-orange" id="copy-node-' . $node->id . '"
- onclick="copyNode(' . $node->id . ')">复制</button>
- <a class="btn btn-blue" href="/admin/node/' . $node->id . '/edit">编辑</a>';
- $node->type = $node->type();
- $node->sort = $node->sort();
- $node->is_dynamic_rate = $node->isDynamicRate();
- $node->node_bandwidth = round(Tools::flowToGB($node->node_bandwidth), 2);
- $node->node_bandwidth_limit = Tools::flowToGB($node->node_bandwidth_limit);
- }
- return $response->withJson([
- 'nodes' => $nodes,
- ]);
- }
- }
|