fix
This commit is contained in:
150
backend-old/internal/model/entity/user.go
Normal file
150
backend-old/internal/model/entity/user.go
Normal file
@ -0,0 +1,150 @@
|
||||
package entity
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// UserRole 用户角色枚举
|
||||
type UserRole string
|
||||
|
||||
const (
|
||||
UserRoleUser UserRole = "user"
|
||||
UserRoleAdmin UserRole = "admin"
|
||||
UserRolePhotographer UserRole = "photographer"
|
||||
)
|
||||
|
||||
// User 用户实体
|
||||
type User struct {
|
||||
ID uint `json:"id" gorm:"primarykey"`
|
||||
Username string `json:"username" gorm:"uniqueIndex;not null;size:50"`
|
||||
Email string `json:"email" gorm:"uniqueIndex;not null;size:100"`
|
||||
Password string `json:"-" gorm:"not null;size:255"`
|
||||
Name string `json:"name" gorm:"size:100"`
|
||||
Avatar string `json:"avatar" gorm:"size:500"`
|
||||
Bio string `json:"bio" gorm:"type:text"`
|
||||
Website string `json:"website" gorm:"size:200"`
|
||||
Location string `json:"location" gorm:"size:100"`
|
||||
Role UserRole `json:"role" gorm:"default:user;size:20"`
|
||||
IsActive bool `json:"is_active" gorm:"default:true"`
|
||||
IsPublic bool `json:"is_public" gorm:"default:true"`
|
||||
EmailVerified bool `json:"email_verified" gorm:"default:false"`
|
||||
LastLogin *time.Time `json:"last_login"`
|
||||
LoginCount int `json:"login_count" gorm:"default:0"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"index"`
|
||||
|
||||
// 关联
|
||||
Photos []Photo `json:"photos,omitempty" gorm:"foreignKey:UserID"`
|
||||
Albums []Album `json:"albums,omitempty" gorm:"foreignKey:UserID"`
|
||||
}
|
||||
|
||||
// TableName 指定表名
|
||||
func (User) TableName() string {
|
||||
return "users"
|
||||
}
|
||||
|
||||
// IsAdmin 检查是否为管理员
|
||||
func (u *User) IsAdmin() bool {
|
||||
return u.Role == UserRoleAdmin
|
||||
}
|
||||
|
||||
// IsPhotographer 检查是否为摄影师
|
||||
func (u *User) IsPhotographer() bool {
|
||||
return u.Role == UserRolePhotographer || u.Role == UserRoleAdmin
|
||||
}
|
||||
|
||||
// CanManagePhoto 检查是否可以管理指定照片
|
||||
func (u *User) CanManagePhoto(photo *Photo) bool {
|
||||
return u.ID == photo.UserID || u.IsAdmin()
|
||||
}
|
||||
|
||||
// CanManageAlbum 检查是否可以管理指定相册
|
||||
func (u *User) CanManageAlbum(album *Album) bool {
|
||||
return u.ID == album.UserID || u.IsAdmin()
|
||||
}
|
||||
|
||||
// UserStats 用户统计信息
|
||||
type UserStats struct {
|
||||
Total int64 `json:"total"` // 总用户数
|
||||
Active int64 `json:"active"` // 活跃用户数
|
||||
ThisMonth int64 `json:"this_month"` // 本月新增
|
||||
Today int64 `json:"today"` // 今日新增
|
||||
RoleStats map[string]int64 `json:"role_stats"` // 角色统计
|
||||
}
|
||||
|
||||
// CreateUserRequest 创建用户请求
|
||||
type CreateUserRequest struct {
|
||||
Username string `json:"username" binding:"required,min=3,max=50"`
|
||||
Email string `json:"email" binding:"required,email"`
|
||||
Password string `json:"password" binding:"required,min=6"`
|
||||
Name string `json:"name" binding:"max=100"`
|
||||
Role UserRole `json:"role" binding:"oneof=user admin photographer"`
|
||||
}
|
||||
|
||||
// UpdateUserRequest 更新用户请求
|
||||
type UpdateUserRequest struct {
|
||||
Username *string `json:"username" binding:"omitempty,min=3,max=50"`
|
||||
Email *string `json:"email" binding:"omitempty,email"`
|
||||
Name *string `json:"name" binding:"omitempty,max=100"`
|
||||
Avatar *string `json:"avatar" binding:"omitempty,max=500"`
|
||||
Bio *string `json:"bio" binding:"omitempty,max=1000"`
|
||||
Website *string `json:"website" binding:"omitempty,max=200"`
|
||||
Location *string `json:"location" binding:"omitempty,max=100"`
|
||||
Role *UserRole `json:"role" binding:"omitempty,oneof=user admin photographer"`
|
||||
IsActive *bool `json:"is_active"`
|
||||
}
|
||||
|
||||
// UpdateCurrentUserRequest 更新当前用户请求
|
||||
type UpdateCurrentUserRequest struct {
|
||||
Username *string `json:"username" binding:"omitempty,min=3,max=50"`
|
||||
Email *string `json:"email" binding:"omitempty,email"`
|
||||
Name *string `json:"name" binding:"omitempty,max=100"`
|
||||
Avatar *string `json:"avatar" binding:"omitempty,max=500"`
|
||||
Bio *string `json:"bio" binding:"omitempty,max=1000"`
|
||||
Website *string `json:"website" binding:"omitempty,max=200"`
|
||||
Location *string `json:"location" binding:"omitempty,max=100"`
|
||||
}
|
||||
|
||||
// ChangePasswordRequest 修改密码请求
|
||||
type ChangePasswordRequest struct {
|
||||
OldPassword string `json:"old_password" binding:"required"`
|
||||
NewPassword string `json:"new_password" binding:"required,min=6"`
|
||||
}
|
||||
|
||||
// UserStatus 用户状态
|
||||
type UserStatus string
|
||||
|
||||
const (
|
||||
UserStatusActive UserStatus = "active"
|
||||
UserStatusInactive UserStatus = "inactive"
|
||||
UserStatusBanned UserStatus = "banned"
|
||||
UserStatusPending UserStatus = "pending"
|
||||
)
|
||||
|
||||
// UserListParams 用户列表查询参数
|
||||
type UserListParams struct {
|
||||
Page int `json:"page"`
|
||||
Limit int `json:"limit"`
|
||||
Sort string `json:"sort"`
|
||||
Order string `json:"order"`
|
||||
Role *UserRole `json:"role"`
|
||||
Status *UserStatus `json:"status"`
|
||||
Search string `json:"search"`
|
||||
CreatedFrom *time.Time `json:"created_from"`
|
||||
CreatedTo *time.Time `json:"created_to"`
|
||||
LastLoginFrom *time.Time `json:"last_login_from"`
|
||||
LastLoginTo *time.Time `json:"last_login_to"`
|
||||
}
|
||||
|
||||
// UserGlobalStats 全局用户统计信息
|
||||
type UserGlobalStats struct {
|
||||
Total int64 `json:"total"`
|
||||
Active int64 `json:"active"`
|
||||
Admins int64 `json:"admins"`
|
||||
Editors int64 `json:"editors"`
|
||||
Users int64 `json:"users"`
|
||||
MonthlyRegistrations int64 `json:"monthly_registrations"`
|
||||
}
|
||||
Reference in New Issue
Block a user