'integer', 'data' => 'array', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; /** * 获取操作类型枚举 * * @return ADMIN_ACTION_TYPE|null */ public function getActionTypeEnumAttribute(): ?ADMIN_ACTION_TYPE { try { return ADMIN_ACTION_TYPE::from($this->action_type); } catch (\ValueError $e) { return null; } } /** * 获取操作类型标签 * * @return string */ public function getActionTypeLabelAttribute(): string { $enum = $this->getActionTypeEnumAttribute(); return $enum ? $enum->getLabel() : $this->action_type; } /** * 获取操作类型颜色 * * @return string */ public function getActionTypeColorAttribute(): string { $enum = $this->getActionTypeEnumAttribute(); return $enum ? $enum->getColor() : 'secondary'; } /** * 获取操作类型图标 * * @return string */ public function getActionTypeIconAttribute(): string { $enum = $this->getActionTypeEnumAttribute(); return $enum ? $enum->getIcon() : 'fa-question'; } /** * 判断是否为危险操作 * * @return bool */ public function getIsDangerousAttribute(): bool { $enum = $this->getActionTypeEnumAttribute(); return $enum ? $enum->isDangerous() : false; } /** * 获取格式化的数据 * * @return string */ public function getFormattedDataAttribute(): string { if (empty($this->data)) { return ''; } if (is_array($this->data)) { return json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } return (string) $this->data; } /** * 获取简短的用户代理 * * @return string */ public function getShortUserAgentAttribute(): string { if (empty($this->user_agent)) { return ''; } // 提取浏览器信息 if (preg_match('/Chrome\/[\d.]+/', $this->user_agent, $matches)) { return $matches[0]; } if (preg_match('/Firefox\/[\d.]+/', $this->user_agent, $matches)) { return $matches[0]; } if (preg_match('/Safari\/[\d.]+/', $this->user_agent, $matches)) { return $matches[0]; } if (preg_match('/Edge\/[\d.]+/', $this->user_agent, $matches)) { return $matches[0]; } // 如果没有匹配到,返回前50个字符 return mb_substr($this->user_agent, 0, 50) . '...'; } /** * 按操作类型查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string|ADMIN_ACTION_TYPE $actionType * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByActionType($query, $actionType) { if ($actionType instanceof ADMIN_ACTION_TYPE) { $actionType = $actionType->value; } return $query->where('action_type', $actionType); } /** * 按管理员查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $adminId * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByAdmin($query, int $adminId) { return $query->where('admin_id', $adminId); } /** * 按IP地址查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $ipAddress * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByIpAddress($query, string $ipAddress) { return $query->where('ip_address', $ipAddress); } /** * 按时间范围查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $startDate * @param string $endDate * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByDateRange($query, string $startDate, string $endDate) { return $query->whereBetween('created_at', [$startDate, $endDate]); } /** * 查询危险操作 * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeDangerousActions($query) { $dangerousTypes = []; foreach (ADMIN_ACTION_TYPE::cases() as $type) { if ($type->isDangerous()) { $dangerousTypes[] = $type->value; } } return $query->whereIn('action_type', $dangerousTypes); } /** * 最近的操作 * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $hours * @return \Illuminate\Database\Eloquent\Builder */ public function scopeRecent($query, int $hours = 24) { return $query->where('created_at', '>=', now()->subHours($hours)); } }