package database import ( "healthapi/internal/config" "healthapi/internal/model" "github.com/zeromicro/go-zero/core/logx" "golang.org/x/crypto/bcrypt" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) // NewDB 创建数据库连接 func NewDB(cfg config.DatabaseConfig) (*gorm.DB, error) { var dialector gorm.Dialector switch cfg.Driver { case "sqlite": dialector = sqlite.Open(cfg.DataSource) case "mysql": dialector = mysql.Open(cfg.DataSource) case "postgres": dialector = postgres.Open(cfg.DataSource) default: dialector = sqlite.Open(cfg.DataSource) } db, err := gorm.Open(dialector, &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { return nil, err } // 自动迁移 if err := model.AutoMigrate(db); err != nil { return nil, err } logx.Info("Database connected successfully") return db, nil } // SeedQuestionBank 初始化问卷题库 func SeedQuestionBank(db *gorm.DB) error { var count int64 db.Model(&model.QuestionBank{}).Count(&count) if count > 0 { return nil // 已有数据,跳过 } questions := []model.QuestionBank{ // 平和质问题 {ConstitutionType: model.ConstitutionPinghe, QuestionText: "您精力充沛吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionPinghe, QuestionText: "您容易疲乏吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionPinghe, QuestionText: "您说话声音低弱无力吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 气虚质问题 {ConstitutionType: model.ConstitutionQixu, QuestionText: "您容易气短,呼吸短促吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionQixu, QuestionText: "您容易心慌吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionQixu, QuestionText: "您容易头晕或站起时晕眩吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 阳虚质问题 {ConstitutionType: model.ConstitutionYangxu, QuestionText: "您手脚发凉吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionYangxu, QuestionText: "您胃脘部、背部或腰膝部怕冷吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionYangxu, QuestionText: "您比一般人耐受不了寒冷吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 阴虚质问题 {ConstitutionType: model.ConstitutionYinxu, QuestionText: "您感到手脚心发热吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionYinxu, QuestionText: "您感觉身体、脸上发热吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionYinxu, QuestionText: "您口唇干吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 痰湿质问题 {ConstitutionType: model.ConstitutionTanshi, QuestionText: "您感到胸闷或腹部胀满吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionTanshi, QuestionText: "您感到身体沉重不轻松吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionTanshi, QuestionText: "您腹部肥满松软吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 湿热质问题 {ConstitutionType: model.ConstitutionShire, QuestionText: "您面部或鼻部有油腻感或者油亮发光吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionShire, QuestionText: "您容易生痤疮或疮疖吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionShire, QuestionText: "您感到口苦或嘴里有异味吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 血瘀质问题 {ConstitutionType: model.ConstitutionXueyu, QuestionText: "您皮肤常在不知不觉中出现青紫瘀斑吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionXueyu, QuestionText: "您两颧部有细微红丝吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionXueyu, QuestionText: "您身体上有哪里疼痛吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 气郁质问题 {ConstitutionType: model.ConstitutionQiyu, QuestionText: "您感到闷闷不乐、情绪低沉吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionQiyu, QuestionText: "您容易精神紧张、焦虑不安吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionQiyu, QuestionText: "您多愁善感、容易感到害怕吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, // 特禀质问题 {ConstitutionType: model.ConstitutionTebing, QuestionText: "您没有感冒时也会打喷嚏吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 1}, {ConstitutionType: model.ConstitutionTebing, QuestionText: "您没有感冒时也会鼻塞、流鼻涕吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 2}, {ConstitutionType: model.ConstitutionTebing, QuestionText: "您对某些药物、食物、气味或花粉过敏吗?", Options: `["没有","很少","有时","经常","总是"]`, OrderNum: 3}, } return db.Create(&questions).Error } // SeedTestUser 创建测试用户 func SeedTestUser(db *gorm.DB) error { var count int64 db.Model(&model.User{}).Count(&count) if count > 0 { return nil } // 测试用户,密码: 123456 passwordHash, _ := bcrypt.GenerateFromPassword([]byte("123456"), bcrypt.DefaultCost) testUser := model.User{ Phone: "13800138000", Email: "test@example.com", PasswordHash: string(passwordHash), Nickname: "测试用户", } return db.Create(&testUser).Error }