healthapp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

135 lines
4.6 KiB

package model
import (
"time"
"gorm.io/gorm"
)
// User 用户表
type User struct {
gorm.Model
Phone string `gorm:"uniqueIndex;size:20" json:"phone"`
Email string `gorm:"uniqueIndex;size:100" json:"email"`
PasswordHash string `gorm:"size:255" json:"-"`
Nickname string `gorm:"size:50" json:"nickname"`
Avatar string `gorm:"size:255" json:"avatar"`
SurveyCompleted bool `gorm:"default:false" json:"survey_completed"`
// 会员相关字段
MemberLevel string `gorm:"size:20;default:normal" json:"member_level"` // normal/silver/gold/diamond
TotalSpent float64 `gorm:"default:0" json:"total_spent"` // 累计消费金额
Points int `gorm:"default:0" json:"points"` // 当前积分
MemberSince *time.Time `json:"member_since"` // 首次消费时间
}
// 会员等级常量
const (
MemberLevelNormal = "normal" // 普通用户
MemberLevelSilver = "silver" // 银卡会员
MemberLevelGold = "gold" // 金卡会员
MemberLevelDiamond = "diamond" // 钻石会员
)
// MemberLevelConfig 会员等级配置
type MemberLevelConfig struct {
Level string // 等级标识
Name string // 等级名称
MinSpent float64 // 升级所需累计消费
Discount float64 // 折扣率 (0.92-1.0)
PointsMultiplier float64 // 积分倍率
FreeShippingMin float64 // 包邮门槛
}
// MemberLevelConfigs 会员等级配置表
var MemberLevelConfigs = map[string]MemberLevelConfig{
MemberLevelNormal: {
Level: MemberLevelNormal,
Name: "普通用户",
MinSpent: 0,
Discount: 1.0,
PointsMultiplier: 1.0,
FreeShippingMin: 99,
},
MemberLevelSilver: {
Level: MemberLevelSilver,
Name: "银卡会员",
MinSpent: 500,
Discount: 0.98,
PointsMultiplier: 1.2,
FreeShippingMin: 69,
},
MemberLevelGold: {
Level: MemberLevelGold,
Name: "金卡会员",
MinSpent: 2000,
Discount: 0.95,
PointsMultiplier: 1.5,
FreeShippingMin: 49,
},
MemberLevelDiamond: {
Level: MemberLevelDiamond,
Name: "钻石会员",
MinSpent: 5000,
Discount: 0.92,
PointsMultiplier: 2.0,
FreeShippingMin: 0, // 全场包邮
},
}
// GetMemberLevelBySpent 根据累计消费获取会员等级
func GetMemberLevelBySpent(totalSpent float64) string {
if totalSpent >= 5000 {
return MemberLevelDiamond
} else if totalSpent >= 2000 {
return MemberLevelGold
} else if totalSpent >= 500 {
return MemberLevelSilver
}
return MemberLevelNormal
}
// HealthProfile 健康档案
type HealthProfile struct {
gorm.Model
UserID uint `gorm:"uniqueIndex" json:"user_id"`
Name string `gorm:"size:50" json:"name"`
BirthDate *time.Time `json:"birth_date"`
Gender string `gorm:"size:10" json:"gender"` // male, female
Height float64 `json:"height"` // cm
Weight float64 `json:"weight"` // kg
BMI float64 `json:"bmi"`
BloodType string `gorm:"size:10" json:"blood_type"` // A, B, AB, O
Occupation string `gorm:"size:50" json:"occupation"`
MaritalStatus string `gorm:"size:20" json:"marital_status"` // single, married, divorced
Region string `gorm:"size:100" json:"region"`
}
// LifestyleInfo 生活习惯
type LifestyleInfo struct {
gorm.Model
UserID uint `gorm:"uniqueIndex" json:"user_id"`
SleepTime string `gorm:"size:10" json:"sleep_time"` // HH:MM
WakeTime string `gorm:"size:10" json:"wake_time"` // HH:MM
SleepQuality string `gorm:"size:20" json:"sleep_quality"` // good, normal, poor
MealRegularity string `gorm:"size:20" json:"meal_regularity"` // regular, irregular
DietPreference string `gorm:"size:50" json:"diet_preference"` // 偏好
DailyWaterML int `json:"daily_water_ml"` // 每日饮水量 ml
ExerciseFrequency string `gorm:"size:20" json:"exercise_frequency"` // never, sometimes, often, daily
ExerciseType string `gorm:"size:100" json:"exercise_type"`
ExerciseDurationMin int `json:"exercise_duration_min"` // 每次运动时长
IsSmoker bool `json:"is_smoker"`
AlcoholFrequency string `gorm:"size:20" json:"alcohol_frequency"` // never, sometimes, often
}
// TableName 指定表名
func (User) TableName() string {
return "users"
}
func (HealthProfile) TableName() string {
return "health_profiles"
}
func (LifestyleInfo) TableName() string {
return "lifestyle_infos"
}