主要变更: - 采用 go-zero 框架替代 Gin,提升开发效率 - 重构项目结构,API 文件模块化组织 - 将 model 移至 api/internal/model 目录 - 移除 common 包,改为标准 pkg 目录结构 - 实现统一的仓储模式,支持配置驱动数据库切换 - 简化测试策略,专注 API 集成测试 - 更新 CLAUDE.md 文档,提供详细的开发指导 技术栈更新: - 框架: Gin → go-zero v1.6.0+ - 代码生成: 引入 goctl 工具 - 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model) - 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
107 lines
3.4 KiB
Go
107 lines
3.4 KiB
Go
package dto
|
|
|
|
import (
|
|
"time"
|
|
|
|
"photography-backend/internal/model/entity"
|
|
)
|
|
|
|
// LoginRequest 登录请求
|
|
type LoginRequest struct {
|
|
Email string `json:"email" binding:"required,email" validate:"required,email"`
|
|
Password string `json:"password" binding:"required" validate:"required"`
|
|
}
|
|
|
|
// RegisterRequest 注册请求
|
|
type RegisterRequest struct {
|
|
Username string `json:"username" binding:"required,min=3,max=50" validate:"required,min=3,max=50"`
|
|
Email string `json:"email" binding:"required,email" validate:"required,email"`
|
|
Password string `json:"password" binding:"required,min=6" validate:"required,min=6"`
|
|
Name string `json:"name" binding:"max=100" validate:"max=100"`
|
|
}
|
|
|
|
// RefreshTokenRequest 刷新令牌请求
|
|
type RefreshTokenRequest struct {
|
|
RefreshToken string `json:"refresh_token" binding:"required" validate:"required"`
|
|
}
|
|
|
|
// TokenResponse 令牌响应
|
|
type TokenResponse struct {
|
|
AccessToken string `json:"access_token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
TokenType string `json:"token_type"`
|
|
ExpiresIn int64 `json:"expires_in"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
}
|
|
|
|
// LoginResponse 登录响应
|
|
type LoginResponse struct {
|
|
Token TokenResponse `json:"token"`
|
|
User UserResponse `json:"user"`
|
|
}
|
|
|
|
// RegisterResponse 注册响应
|
|
type RegisterResponse struct {
|
|
Token TokenResponse `json:"token"`
|
|
User UserResponse `json:"user"`
|
|
}
|
|
|
|
// TokenClaims JWT 令牌声明
|
|
type TokenClaims struct {
|
|
UserID uint `json:"user_id"`
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
Role entity.UserRole `json:"role"`
|
|
TokenID string `json:"token_id"`
|
|
IssuedAt time.Time `json:"issued_at"`
|
|
ExpiresAt time.Time `json:"expires_at"`
|
|
}
|
|
|
|
// ResetPasswordRequest 重置密码请求
|
|
type ResetPasswordRequest struct {
|
|
Email string `json:"email" binding:"required,email" validate:"required,email"`
|
|
}
|
|
|
|
// ConfirmResetPasswordRequest 确认重置密码请求
|
|
type ConfirmResetPasswordRequest struct {
|
|
Token string `json:"token" binding:"required" validate:"required"`
|
|
NewPassword string `json:"new_password" binding:"required,min=6" validate:"required,min=6"`
|
|
}
|
|
|
|
// VerifyEmailRequest 验证邮箱请求
|
|
type VerifyEmailRequest struct {
|
|
Token string `json:"token" binding:"required" validate:"required"`
|
|
}
|
|
|
|
// LogoutRequest 登出请求
|
|
type LogoutRequest struct {
|
|
Token string `json:"token" binding:"required" validate:"required"`
|
|
}
|
|
|
|
// AuthStatsResponse 认证统计响应
|
|
type AuthStatsResponse struct {
|
|
TotalLogins int64 `json:"total_logins"`
|
|
ActiveSessions int64 `json:"active_sessions"`
|
|
FailedAttempts int64 `json:"failed_attempts"`
|
|
RecentLogins []LoginInfo `json:"recent_logins"`
|
|
LoginsByHour map[string]int64 `json:"logins_by_hour"`
|
|
LoginsByDevice map[string]int64 `json:"logins_by_device"`
|
|
}
|
|
|
|
// LoginInfo 登录信息
|
|
type LoginInfo struct {
|
|
UserID uint `json:"user_id"`
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
LoginTime time.Time `json:"login_time"`
|
|
IPAddress string `json:"ip_address"`
|
|
UserAgent string `json:"user_agent"`
|
|
Success bool `json:"success"`
|
|
}
|
|
|
|
// ValidateTokenResponse 验证令牌响应
|
|
type ValidateTokenResponse struct {
|
|
Valid bool `json:"valid"`
|
|
Claims *TokenClaims `json:"claims,omitempty"`
|
|
Error string `json:"error,omitempty"`
|
|
} |