mirror of
https://github.com/ProxyPanel/ProxyPanel.git
synced 2026-04-06 20:50:01 +00:00
1. 继续修改表表关系,与关联字段的限制; 2. 通过表表关系,简化一部分代码,自动让Laravel建立关联; 3. 拆分验证 与 优化数据创建与修改的获取数据操作; 4. 修改部分无意义的数据名称;
176 lines
5.5 KiB
PHP
176 lines
5.5 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\Api\WebApi;
|
||
|
||
use App\Components\Helpers;
|
||
use App\Models\Node;
|
||
use App\Models\NodeHeartBeat;
|
||
use App\Models\NodeOnlineIp;
|
||
use App\Models\NodeOnlineLog;
|
||
use App\Models\RuleLog;
|
||
use App\Models\User;
|
||
use App\Models\UserDataFlowLog;
|
||
use Arr;
|
||
use Illuminate\Http\JsonResponse;
|
||
use Illuminate\Http\Request;
|
||
use Response;
|
||
|
||
class BaseController
|
||
{
|
||
// 上报节点心跳信息
|
||
public function setNodeStatus(Request $request, $id): JsonResponse
|
||
{
|
||
$cpu = (int) $request->input('cpu') / 100;
|
||
$mem = (int) $request->input('mem') / 100;
|
||
$disk = (int) $request->input('disk') / 100;
|
||
|
||
if (is_null($request->input('uptime'))) {
|
||
return $this->returnData('上报节点心跳信息失败,请检查字段');
|
||
}
|
||
|
||
$obj = new NodeHeartBeat();
|
||
$obj->node_id = $id;
|
||
$obj->uptime = (int) $request->input('uptime');
|
||
//$obj->load = $request->input('load');
|
||
$obj->load = implode(' ', [$cpu, $mem, $disk]);
|
||
$obj->log_time = time();
|
||
$obj->save();
|
||
|
||
if (! $obj->id) {
|
||
return $this->returnData('生成节点心跳信息失败');
|
||
}
|
||
|
||
return $this->returnData('上报节点心跳信息成功', 'success', 200);
|
||
}
|
||
|
||
// 返回数据
|
||
public function returnData($message, $status = 'fail', $code = 400, $data = [], $addition = []): JsonResponse
|
||
{
|
||
$etag = Helpers::abortIfNotModified($data);
|
||
$data = [
|
||
'status' => $status,
|
||
'code' => $code,
|
||
'data' => $data,
|
||
'message' => $message,
|
||
];
|
||
|
||
if ($addition) {
|
||
$data = array_merge($data, $addition);
|
||
}
|
||
|
||
return Response::json($data)->header('ETAG', $etag);
|
||
}
|
||
|
||
// 上报节点在线人数
|
||
public function setNodeOnline(Request $request, $id): JsonResponse
|
||
{
|
||
$inputArray = $request->all();
|
||
$onlineCount = 0;
|
||
foreach ($inputArray as $input) {
|
||
if (! Arr::has($input, ['ip', 'uid'])) {
|
||
return $this->returnData('上报节点在线用户IP信息失败,请检查字段');
|
||
}
|
||
|
||
$obj = new NodeOnlineIp();
|
||
$obj->node_id = $id;
|
||
$obj->user_id = $input['uid'];
|
||
$obj->ip = $input['ip'];
|
||
$obj->port = User::find($input['uid'])->port;
|
||
$obj->created_at = time();
|
||
$obj->save();
|
||
|
||
if (! $obj->id) {
|
||
return $this->returnData('生成节点在线用户IP信息失败');
|
||
}
|
||
$onlineCount++;
|
||
}
|
||
|
||
$obj = new NodeOnlineLog();
|
||
$obj->node_id = $id;
|
||
$obj->online_user = $onlineCount;
|
||
$obj->log_time = time();
|
||
$obj->save();
|
||
|
||
if ($obj->id) {
|
||
return $this->returnData('上报节点在线情况成功', 'success', 200);
|
||
}
|
||
|
||
return $this->returnData('生成节点在线情况失败');
|
||
}
|
||
|
||
// 上报用户流量日志
|
||
public function setUserTraffic(Request $request, $id): JsonResponse
|
||
{
|
||
foreach ($request->all() as $input) {
|
||
if (! Arr::exists($input, 'uid')) {
|
||
return $this->returnData('上报用户流量日志失败,请检查字段');
|
||
}
|
||
|
||
$rate = Node::find($id)->traffic_rate;
|
||
|
||
$log = new UserDataFlowLog();
|
||
$log->user_id = (int) $input['uid'];
|
||
$log->u = (int) $input['upload'] * $rate;
|
||
$log->d = (int) $input['download'] * $rate;
|
||
$log->node_id = $id;
|
||
$log->rate = $rate;
|
||
$log->traffic = flowAutoShow($log->u + $log->d);
|
||
$log->log_time = time();
|
||
$log->save();
|
||
|
||
if (! $log->id) {
|
||
return $this->returnData('生成用户流量日志失败');
|
||
}
|
||
$user = User::find($log->user_id);
|
||
if ($user) {
|
||
$user->u += $log->u;
|
||
$user->d += $log->d;
|
||
$user->t = time();
|
||
$user->save();
|
||
}
|
||
}
|
||
|
||
return $this->returnData('上报用户流量日志成功', 'success', 200);
|
||
}
|
||
|
||
// 获取节点的审计规则
|
||
public function getNodeRule(Node $node): JsonResponse
|
||
{
|
||
$data = [];
|
||
//节点未设置任何审计规则
|
||
if ($node->rule_group_id) {
|
||
$ruleGroup = $node->ruleGroup;
|
||
foreach ($ruleGroup->rules as $rule) {
|
||
$data[] = [
|
||
'id' => $rule->id,
|
||
'type' => $rule->type_api_label,
|
||
'pattern' => $rule->pattern,
|
||
];
|
||
}
|
||
|
||
return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => $ruleGroup->type ? 'reject' : 'allow', 'rules' => $data]);
|
||
}
|
||
|
||
//放行
|
||
return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => 'all', 'rules' => $data]);
|
||
}
|
||
|
||
// 上报用户触发的审计规则记录
|
||
public function addRuleLog(Request $request, $id): JsonResponse
|
||
{
|
||
if ($request->has(['uid', 'rule_id', 'reason'])) {
|
||
$obj = new RuleLog();
|
||
$obj->user_id = $request->input('uid');
|
||
$obj->node_id = $id;
|
||
$obj->rule_id = $request->input('rule_id');
|
||
$obj->reason = $request->input('reason');
|
||
|
||
if ($obj->save()) {
|
||
return $this->returnData('上报用户触发审计规则日志成功', 'success', 200);
|
||
}
|
||
}
|
||
|
||
return $this->returnData('上报用户触发审计规则日志失败');
|
||
}
|
||
}
|