- Client: Go-based Windows hardware monitoring (CPU, GPU, memory, disk, network, power) - Server: Go + Gin + SQLite backend with REST API - Frontend: Vue 3 + Element Plus dashboard - Docker deployment support - Windows service installation script
88 lines
2.3 KiB
Go
88 lines
2.3 KiB
Go
package repository
|
|
|
|
import (
|
|
"database/sql"
|
|
"pc-monitor-server/model"
|
|
"time"
|
|
)
|
|
|
|
type DeviceRepository struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func NewDeviceRepository(db *sql.DB) *DeviceRepository {
|
|
return &DeviceRepository{db: db}
|
|
}
|
|
|
|
func (r *DeviceRepository) Create(device *model.Device) error {
|
|
_, err := r.db.Exec(
|
|
`INSERT INTO devices (id, hostname, os, ip, registered_at, last_report_at, status)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
device.ID, device.Hostname, device.OS, device.IP,
|
|
device.RegisteredAt, device.LastReportAt, device.Status,
|
|
)
|
|
return err
|
|
}
|
|
|
|
func (r *DeviceRepository) Update(device *model.Device) error {
|
|
_, err := r.db.Exec(
|
|
`UPDATE devices SET hostname=?, os=?, ip=?, last_report_at=?, status=?
|
|
WHERE id=?`,
|
|
device.Hostname, device.OS, device.IP,
|
|
device.LastReportAt, device.Status, device.ID,
|
|
)
|
|
return err
|
|
}
|
|
|
|
func (r *DeviceRepository) GetByID(id string) (*model.Device, error) {
|
|
device := &model.Device{}
|
|
err := r.db.QueryRow(
|
|
`SELECT id, hostname, os, ip, registered_at, last_report_at, status
|
|
FROM devices WHERE id=?`, id,
|
|
).Scan(&device.ID, &device.Hostname, &device.OS, &device.IP,
|
|
&device.RegisteredAt, &device.LastReportAt, &device.Status)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return device, nil
|
|
}
|
|
|
|
func (r *DeviceRepository) GetAll() ([]model.Device, error) {
|
|
rows, err := r.db.Query(
|
|
`SELECT id, hostname, os, ip, registered_at, last_report_at, status
|
|
FROM devices ORDER BY last_report_at DESC`)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var devices []model.Device
|
|
for rows.Next() {
|
|
var d model.Device
|
|
if err := rows.Scan(&d.ID, &d.Hostname, &d.OS, &d.IP,
|
|
&d.RegisteredAt, &d.LastReportAt, &d.Status); err != nil {
|
|
return nil, err
|
|
}
|
|
devices = append(devices, d)
|
|
}
|
|
return devices, nil
|
|
}
|
|
|
|
func (r *DeviceRepository) Delete(id string) error {
|
|
_, err := r.db.Exec("DELETE FROM devices WHERE id=?", id)
|
|
return err
|
|
}
|
|
|
|
func (r *DeviceRepository) UpdateStatus(id string, status string) error {
|
|
_, err := r.db.Exec("UPDATE devices SET status=? WHERE id=?", status, id)
|
|
return err
|
|
}
|
|
|
|
func (r *DeviceRepository) MarkOffline(threshold time.Duration) error {
|
|
cutoff := time.Now().Add(-threshold)
|
|
_, err := r.db.Exec(
|
|
`UPDATE devices SET status='offline'
|
|
WHERE last_report_at < ? AND status='online'`, cutoff)
|
|
return err
|
|
}
|