Files
hr_data_analyzer/main.go
T
2026-07-08 15:31:58 +08:00

114 lines
3.3 KiB
Go

// @title 智能心率采集分析平台 API
// @version 1.0
// @description 智能心率采集分析平台后端服务,基于 Gin 框架,提供心率采集、AI 分析、教案管理、设备管理等功能
// @host localhost:8081
// @BasePath /api/v1
// @securityDefinitions.apikey BearerAuth
// @in header
// @name Authorization
package main
import (
"hr_receiver/config"
"hr_receiver/controllers"
"hr_receiver/models"
"hr_receiver/mqtt"
"hr_receiver/routes"
"log"
)
func main() {
// 初始化配置
config.InitConfig()
// 连接数据库
config.ConnectDB()
config.DB.Debug()
// 自动迁移模型
config.DB.AutoMigrate(&models.TrainRecord{},
&models.TrainingData{},
&models.Belt{},
&models.HeartRate{},
&models.BeltAnalysis{},
&models.StepTrainRecord{},
&models.StepHeartRate{},
&models.StepStrideFreq{},
&models.RegressionResult{},
&models.User{},
&models.UserRegionBinding{},
&models.Kindergarten{},
&models.ProjectType{},
&models.ProductDefinition{},
&models.ProductPrototype{},
&models.ProjectProductTemplate{},
&models.ProductInventory{},
&models.ProductSuite{},
&models.AppFile{},
&models.AppFileShareCode{},
&models.MqttHeartRateRecord{},
&models.MqttStepCountRecord{},
&models.MqttGatewayStatusRecord{},
&models.MqttTrainingSessionRecord{},
&models.MqttListenerSetting{},
&models.Gateway{},
&models.AIAnalysisRecord{},
&models.AIPricingConfig{},
)
if err := models.BackfillLegacyUserPermissions(config.DB); err != nil {
log.Printf("legacy user permission backfill failed: %v", err)
}
if err := models.EnsureDefaultAdmin(config.DB); err != nil {
log.Printf("default admin init failed: %v", err)
}
if err := models.EnsureDefaultAIPricing(config.DB); err != nil {
log.Printf("default ai pricing init failed: %v", err)
}
if err := models.EnsureDefaultProjectTypes(config.DB); err != nil {
log.Printf("default project types init failed: %v", err)
}
if err := models.EnsureDefaultProductDefinitions(config.DB); err != nil {
log.Printf("default product definitions init failed: %v", err)
}
if err := models.EnsureDefaultProductPrototypes(config.DB); err != nil {
log.Printf("default product prototypes init failed: %v", err)
}
if err := models.EnsureDefaultMqttListenerSetting(config.DB); err != nil {
log.Printf("default mqtt listener setting init failed: %v", err)
}
if err := models.EnsureDefaultProjectProductTemplates(config.DB); err != nil {
log.Printf("default project product templates init failed: %v", err)
}
if err := mqtt.InitListenerStorageConfig(config.DB); err != nil {
log.Printf("mqtt listener config init failed: %v", err)
}
if err := mqtt.Start(config.DB, config.App.MQTT); err != nil {
log.Printf("mqtt listener start failed: %v", err)
}
mqtt.InitDebugService(config.DB, config.App.MQTT)
mqtt.InitDebugV3Service(config.DB, config.App.MQTT)
mqtt.InitReplayService(config.DB, config.App.MQTT)
controllers.StartLessonPlanCleanupJob(config.DB)
controllers.StartMqttMeasurementCleanupJob(config.DB)
// 启动服务
r := routes.SetupRouter()
port := config.App.Server.Port
if port == "" {
port = ":8081"
} else if port[0] != ':' {
port = ":" + port
}
if config.App.Swagger.Enabled {
host := "localhost"
addr := host + port
log.Printf("Swagger UI: http://%s/swagger/index.html", addr)
log.Printf("Scalar 文档: http://%s/scalar", addr)
}
r.Run(port)
}