Files
虾司令 881144269c 🚀 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 上线部署完成
2026-03-29 18:16:41 +08:00

122 lines
5.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 // 已处理
)