opus / internal /model /user.go
llzai's picture
Upload 42 files
644c352 verified
package model
import (
"log"
"os"
"time"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
// User 用户模型
type User struct {
ID uint `gorm:"primaryKey" json:"id"`
Username string `gorm:"uniqueIndex;size:50;not null" json:"username"`
PasswordHash string `gorm:"size:255;not null" json:"-"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// UserSession 用户会话模型
type UserSession struct {
ID uint `gorm:"primaryKey" json:"id"`
UserID uint `gorm:"not null;index" json:"user_id"`
User User `gorm:"foreignKey:UserID;constraint:OnDelete:CASCADE" json:"-"`
TokenHash string `gorm:"uniqueIndex;size:255;not null" json:"-"`
ExpiresAt time.Time `gorm:"not null;index" json:"expires_at"`
CreatedAt time.Time `json:"created_at"`
}
// SetPassword 设置用户密码(加密)
func (u *User) SetPassword(password string) error {
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return err
}
u.PasswordHash = string(hash)
return nil
}
// CheckPassword 验证密码
func (u *User) CheckPassword(password string) bool {
err := bcrypt.CompareHashAndPassword([]byte(u.PasswordHash), []byte(password))
return err == nil
}
// TableName 指定表名
func (User) TableName() string {
return "users"
}
// TableName 指定表名
func (UserSession) TableName() string {
return "user_sessions"
}
// CreateDefaultAdmin 创建默认管理员用户
func CreateDefaultAdmin(db *gorm.DB) error {
username := os.Getenv("DEFAULT_ADMIN_USERNAME")
if username == "" {
username = "admin"
}
password := os.Getenv("DEFAULT_ADMIN_PASSWORD")
if password == "" {
password = "changeme123"
}
// 检查用户是否已存在
var existingUser User
result := db.Where("username = ?", username).First(&existingUser)
if result.Error == nil {
// 用户已存在
log.Printf("Default admin user '%s' already exists", username)
return nil
}
// 创建新用户
user := &User{
Username: username,
}
if err := user.SetPassword(password); err != nil {
return err
}
if err := db.Create(user).Error; err != nil {
return err
}
log.Printf("Default admin user '%s' created successfully", username)
return nil
}