b19ce8fdfe
modified: serv_nginx/api_bb/go.mod modified: serv_nginx/api_bb/go.sum new file: serv_nginx/api_bb/internal/models/achievement.go new file: serv_nginx/api_bb/internal/models/common.go new file: serv_nginx/api_bb/internal/models/event.go new file: serv_nginx/api_bb/internal/models/gallery.go modified: serv_nginx/api_bb/internal/models/news.go new file: serv_nginx/api_bb/internal/models/personal_best.go new file: serv_nginx/api_bb/internal/models/training_plan.go modified: serv_nginx/api_bb/internal/models/user.go new file: serv_nginx/api_bb/internal/models/user_stats.go modified: serv_nginx/api_bb/internal/models/workout.go modified: serv_nginx/bbvue/src/components/NavigationMenu.vue new file: serv_nginx/bbvue/src/components/writeLogo.vue add satructs for begushiybashkir.ru site
68 lines
3.1 KiB
Go
68 lines
3.1 KiB
Go
// models/user_stats.go
|
|
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type UserStats struct {
|
|
ID uint `json:"id" gorm:"primaryKey"`
|
|
UserID uint `json:"user_id" gorm:"uniqueIndex;not null"`
|
|
TotalDistance float64 `json:"total_distance" gorm:"type:decimal(10,2);default:0"` // Общий пробег в км
|
|
TotalTime int `json:"total_time" gorm:"default:0"` // Общее время в минутах
|
|
AvgPace string `json:"avg_pace" gorm:"size:20"` // Средний темп
|
|
WorkoutsCount int `json:"workouts_count" gorm:"default:0"` // Количество тренировок
|
|
CurrentStreak int `json:"current_streak" gorm:"default:0"` // Текущая серия дней подряд
|
|
LongestStreak int `json:"longest_streak" gorm:"default:0"` // Самая длинная серия
|
|
WeeklyDistance float64 `json:"weekly_distance" gorm:"type:decimal(8,2);default:0"` // Пробег за неделю
|
|
MonthlyDistance float64 `json:"monthly_distance" gorm:"type:decimal(8,2);default:0"` // Пробег за месяц
|
|
Best5K string `json:"best_5k" gorm:"size:20"` // Лучший результат на 5к
|
|
Best10K string `json:"best_10k" gorm:"size:20"` // Лучший результат на 10к
|
|
BestHalf string `json:"best_half" gorm:"size:20"` // Лучший результат на полумарафон
|
|
BestMarathon string `json:"best_marathon" gorm:"size:20"` // Лучший результат на марафон
|
|
LastWorkout time.Time `json:"last_workout"` // Последняя тренировка
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
|
|
// Связи
|
|
User User `json:"user,omitempty" gorm:"foreignKey:UserID"`
|
|
}
|
|
|
|
// BeforeCreate hook
|
|
func (us *UserStats) BeforeCreate(tx *gorm.DB) error {
|
|
if us.CreatedAt.IsZero() {
|
|
us.CreatedAt = time.Now()
|
|
}
|
|
if us.UpdatedAt.IsZero() {
|
|
us.UpdatedAt = time.Now()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BeforeUpdate hook
|
|
func (us *UserStats) BeforeUpdate(tx *gorm.DB) error {
|
|
us.UpdatedAt = time.Now()
|
|
return nil
|
|
}
|
|
|
|
// DTO для статистики пользователя
|
|
type UserStatsResponse struct {
|
|
TotalDistance float64 `json:"total_distance"`
|
|
TotalTime int `json:"total_time"`
|
|
AvgPace string `json:"avg_pace"`
|
|
WorkoutsCount int `json:"workouts_count"`
|
|
CurrentStreak int `json:"current_streak"`
|
|
LongestStreak int `json:"longest_streak"`
|
|
WeeklyDistance float64 `json:"weekly_distance"`
|
|
MonthlyDistance float64 `json:"monthly_distance"`
|
|
PersonalBests PersonalBestsSummary `json:"personal_bests"`
|
|
}
|
|
|
|
type PersonalBestsSummary struct {
|
|
Best5K string `json:"best_5k"`
|
|
Best10K string `json:"best_10k"`
|
|
BestHalf string `json:"best_half"`
|
|
BestMarathon string `json:"best_marathon"`
|
|
} |