Итерация 3: инвентарь устройств

- Миграция devices (name, type, ip, mac, hostname, vendor, os, location, importance, status)
- Device model + DeviceRepository с полным CRUD
- DeviceService для бизнес-логики
- MergeSuggestionService для предложений объединения (MAC→90%, hostname→60%)
- DeviceController: список, создание, редактирование, карточка, удаление, создание из discovered_host
- Шаблоны: devices/index, devices/form, devices/show
- Dashboard с реальными счётчиками (устройства, новые находки)
- Кнопка «Создать устройство» в Discovery для новых хостов
- DeviceRepository + DeviceService + DeviceController в DI
This commit is contained in:
2026-05-26 07:50:37 +08:00
parent 177e44f015
commit 15772bc17e
13 changed files with 760 additions and 28 deletions
+57
View File
@@ -0,0 +1,57 @@
<?php ob_start(); ?>
<h2>Устройства</h2>
<div class="mb-3">
<a href="/devices/create" class="btn btn-primary">Добавить устройство</a>
</div>
<?php if (empty($devices)): ?>
<div class="alert alert-info">Нет устройств. Добавьте первое устройство вручную или создайте из найденного хоста.</div>
<?php else: ?>
<table class="table table-striped">
<thead>
<tr>
<th>Название</th>
<th>Тип</th>
<th>IP</th>
<th>MAC</th>
<th>Vendor</th>
<th>Важность</th>
<th>Статус</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
<?php foreach ($devices as $device): ?>
<tr>
<td><a href="/devices/<?= $device->id ?>"><?= htmlspecialchars($device->name) ?></a></td>
<td><?= htmlspecialchars($device->type) ?></td>
<td><?= htmlspecialchars($device->primaryIp ?? '-') ?></td>
<td><?= htmlspecialchars($device->macAddress ?? '-') ?></td>
<td><?= htmlspecialchars($device->vendor ?? '-') ?></td>
<td>
<?php
$badge = match ($device->importance) {
'critical' => 'bg-danger',
'high' => 'bg-warning',
'low' => 'bg-secondary',
default => 'bg-light text-dark',
};
?>
<span class="badge <?= $badge ?>"><?= htmlspecialchars($device->importance) ?></span>
</td>
<td>
<span class="badge <?= $device->status === 'active' ? 'bg-success' : 'bg-secondary' ?>">
<?= htmlspecialchars($device->status) ?>
</span>
</td>
<td>
<a href="/devices/<?= $device->id ?>/edit" class="btn btn-sm btn-outline-primary">Изменить</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<?php $content = ob_get_clean(); ?>
<?php require dirname(__DIR__) . '/layout.php'; ?>