17b936f566
modified: serv_nginx/bbvue/src/views/Profile.vue add shadow into avatar image profile page begushiybashkir.ru site
76 lines
3.0 KiB
Go
76 lines
3.0 KiB
Go
// models/training_plan.go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type TrainingPlan struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
UserID uint `json:"user_id" gorm:"not null;index"`
|
|
Title string `json:"title" gorm:"size:255;not null"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Weeks int `json:"weeks" gorm:"not null;default:12"` // Длительность плана в неделях
|
|
WorkoutsPerWeek int `json:"workouts_per_week" gorm:"not null;default:3"` // Тренировок в неделю
|
|
TargetDistance string `json:"target_distance" gorm:"size:50"` // Целевая дистанция
|
|
TargetDate time.Time `json:"target_date"` // Дата цели
|
|
CurrentWeek int `json:"current_week" gorm:"default:1"` // Текущая неделя
|
|
Completed bool `json:"completed" gorm:"default:false"` // Завершен ли план
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Связи
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|
Workouts []TrainingWorkout `json:"workouts,omitempty" gorm:"foreignKey:PlanID"`
|
|
}
|
|
|
|
type TrainingWorkout struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
PlanID uint `json:"plan_id" gorm:"not null;index"`
|
|
Week int `json:"week" gorm:"not null"` // Неделя плана
|
|
Day int `json:"day" gorm:"not null"` // День недели (1-7)
|
|
Type WorkoutType `json:"type" gorm:"type:varchar(20);not null"`
|
|
Description string `json:"description" gorm:"type:text"`
|
|
Distance float64 `json:"distance_km" gorm:"type:decimal(5,2)"`
|
|
Duration int `json:"duration_min"`
|
|
Completed bool `json:"completed" gorm:"default:false"`
|
|
CompletedAt *time.Time `json:"completed_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// BeforeCreate hooks
|
|
func (tp *TrainingPlan) BeforeCreate(tx *gorm.DB) error {
|
|
if tp.CreatedAt.IsZero() {
|
|
tp.CreatedAt = time.Now()
|
|
}
|
|
if tp.UpdatedAt.IsZero() {
|
|
tp.UpdatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (tw *TrainingWorkout) BeforeCreate(tx *gorm.DB) error {
|
|
if tw.CreatedAt.IsZero() {
|
|
tw.CreatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BeforeUpdate hook
|
|
func (tp *TrainingPlan) BeforeUpdate(tx *gorm.DB) error {
|
|
tp.UpdatedAt = time.Now()
|
|
return nil
|
|
}
|
|
|
|
// DTO для создания плана тренировок
|
|
type TrainingPlanCreateRequest struct {
|
|
Title string `json:"title" validate:"required,min=5,max=255"`
|
|
Description string `json:"description" validate:"max=1000"`
|
|
Weeks int `json:"weeks" validate:"required,min=1,max=52"`
|
|
WorkoutsPerWeek int `json:"workouts_per_week" validate:"required,min=1,max=7"`
|
|
TargetDistance string `json:"target_distance" validate:"max=50"`
|
|
TargetDate time.Time `json:"target_date"`
|
|
}
|