🚀 AI 近视防控系统 - 生产环境上线版本 v1.0

 已完成功能:
- 后端 Go 服务 (认证/授权/检测)
- JWT 认证 + RBAC 权限控制
- 登录速率限制 (5 次失败锁定 15 分钟)
- 密码强度校验
- 敏感数据脱敏
- Vue3 管理后台
- 路由守卫
- 删除二次确认

📦 部署配置:
- Docker Compose 生产环境配置
- MySQL/Redis/MongoDB 数据库
- Nginx 前端服务
- 强密码安全配置

⚠️ P2 待办 (下次迭代):
- 学生/检测/预警等业务模块实现
- 错误处理统一化
- 缓存策略优化
- 日志分级

📍 生产环境:
- 服务器:192.168.15.222
- 管理后台:http://192.168.15.222:8081
- API 服务:http://192.168.15.222:8080

2026-03-29 上线部署完成
This commit is contained in:
虾司令
2026-03-29 18:16:41 +08:00
commit 881144269c
38 changed files with 4967 additions and 0 deletions

122
db/models/alert.go Normal file
View File

@@ -0,0 +1,122 @@
package models
import (
"time"
)
// Alert 预警记录模型
type Alert struct {
ID uint `gorm:"primaryKey" json:"id"`
StudentID uint `json:"student_id"`
Student Student `gorm:"foreignKey:StudentID" json:"student"`
DetectionID *uint `json:"detection_id"`
Detection *Detection `gorm:"foreignKey:DetectionID" json:"detection"`
AlertLevel int `json:"alert_level"` // 1:关注, 2:预警, 3:告警
AlertType string `gorm:"type:varchar(32)" json:"alert_type"` // vision_drop, fatigue_high, abnormal
AlertContent string `gorm:"type:text" json:"alert_content"`
Status int `gorm:"default:0" json:"status"` // 0:未处理, 1:已通知, 2:已处理
NotifiedAt *time.Time `json:"notified_at"`
HandledAt *time.Time `json:"handled_at"`
HandlerID *uint `json:"handler_id"` // 处理人ID
HandleRemark string `gorm:"type:text" json:"handle_remark"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// AlertConfig 预警配置模型
type AlertConfig struct {
ID uint `gorm:"primaryKey" json:"id"`
SchoolID *uint `json:"school_id"`
School *School `gorm:"foreignKey:SchoolID" json:"school"`
AlertLevel int `json:"alert_level"` // 1:关注, 2:预警, 3:告警
VisionThreshold float64 `json:"vision_threshold"` // 视力阈值
DropThreshold float64 `json:"drop_threshold"` // 下降幅度阈值
NotifyParent bool `gorm:"default:true" json:"notify_parent"` // 通知家长
NotifyTeacher bool `gorm:"default:true" json:"notify_teacher"` // 通知老师
NotifySchoolDoctor bool `gorm:"default:false" json:"notify_school_doctor"` // 通知校医
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// AlertSummary 预警摘要
type AlertSummary struct {
ID uint `gorm:"primaryKey" json:"id"`
EntityID uint `json:"entity_id"` // 学生/班级/学校的ID
EntityType string `gorm:"type:varchar(20)" json:"entity_type"` // student, class, school
TotalAlerts int `json:"total_alerts"`
HighRiskCount int `json:"high_risk_count"` // 高风险数量
MediumRiskCount int `json:"medium_risk_count"` // 中风险数量
LowRiskCount int `json:"low_risk_count"` // 低风险数量
LastAlertDate *time.Time `json:"last_alert_date"`
LastAlertType string `gorm:"type:varchar(32)" json:"last_alert_type"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// AlertNotification 预警通知模型
type AlertNotification struct {
ID uint `gorm:"primaryKey" json:"id"`
AlertID uint `json:"alert_id"`
Alert Alert `gorm:"foreignKey:AlertID" json:"alert"`
RecipientID uint `json:"recipient_id"` // 接收者ID
RecipientType string `gorm:"type:varchar(20)" json:"recipient_type"` // parent, teacher, school_doctor
Channel string `gorm:"type:varchar(20)" json:"channel"` // sms, email, app_push
Title string `gorm:"type:varchar(255)" json:"title"`
Content string `gorm:"type:text" json:"content"`
SentAt time.Time `json:"sent_at"`
ReadAt *time.Time `json:"read_at"`
Status int `gorm:"default:0" json:"status"` // 0:待发送, 1:已发送, 2:已读
CreatedAt time.Time `json:"created_at"`
}
// AlertDistribution 预警分布统计
type AlertDistribution struct {
ID uint `gorm:"primaryKey" json:"id"`
Date time.Time `json:"date"`
EntityType string `gorm:"type:varchar(20)" json:"entity_type"` // student, class, school
EntityID uint `json:"entity_id"`
GreenCount int `json:"green_count"` // 绿色预警数量
YellowCount int `json:"yellow_count"` // 黄色预警数量
OrangeCount int `json:"orange_count"` // 橙色预警数量
RedCount int `json:"red_count"` // 红色预警数量
CreatedAt time.Time `json:"created_at"`
}
// VisionDistribution 视力分布统计
type VisionDistribution struct {
ID uint `gorm:"primaryKey" json:"id"`
Date time.Time `json:"date"`
EntityType string `gorm:"type:varchar(20)" json:"entity_type"` // student, class, school
EntityID uint `json:"entity_id"`
NormalCount int `json:"normal_count"` // 正常人数
MildMyopiaCount int `json:"mild_myopia_count"` // 轻度近视人数
ModerateMyopiaCount int `json:"moderate_myopia_count"` // 中度近视人数
SevereMyopiaCount int `json:"severe_myopia_count"` // 高度近视人数
CreatedAt time.Time `json:"created_at"`
}
// JSONMap 自定义JSON类型已在其他模型中定义这里引用
// 为避免重复定义,我们可以将其移到公共包中
// AlertType 预警类型枚举
const (
AlertTypeVisionDrop = "vision_drop" // 视力下降
AlertTypeFatigueHigh = "fatigue_high" // 疲劳度过高
AlertTypeAbnormalBehavior = "abnormal_behavior" // 异常行为
AlertTypeDeviceError = "device_error" // 设备异常
)
// AlertLevel 预警级别枚举
const (
AlertLevelGreen = 0 // 正常
AlertLevelYellow = 1 // 关注
AlertLevelOrange = 2 // 预警
AlertLevelRed = 3 // 告警
)
// AlertStatus 预警状态枚举
const (
AlertStatusUnhandled = 0 // 未处理
AlertStatusNotified = 1 // 已通知
AlertStatusHandled = 2 // 已处理
)