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
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"
|
|
}
|
|
|