Files
ProxyPanel/app/Http/Controllers/Api/WebApi/BaseController.php
兔姬桑 f25f2aea62 优化数据库 与 简化控制器 & more
1. 继续修改表表关系,与关联字段的限制;
2. 通过表表关系,简化一部分代码,自动让Laravel建立关联;
3. 拆分验证 与 优化数据创建与修改的获取数据操作;
4. 修改部分无意义的数据名称;
2020-12-28 12:09:20 +08:00

176 lines
5.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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('上报用户触发审计规则日志失败');
}
}