You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/models/user.go

73 lines
2.5 KiB
Go

//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2025-03-04 16:08:06
// Distributed under terms of the MIT license.
//
package models
import (
"time"
"github.com/veypi/vigo"
)
// User 全局用户表
type User struct {
vigo.Model
Username string `json:"username" gorm:"uniqueIndex;size:50;not null"`
Password string `json:"-" gorm:"size:255"` // bcrypt hash
Nickname string `json:"nickname" gorm:"size:50"`
Avatar string `json:"avatar" gorm:"size:500"`
Email *string `json:"email" gorm:"uniqueIndex;size:100"`
Phone *string `json:"phone" gorm:"uniqueIndex;size:20"`
Status int `json:"status" gorm:"default:1"` // 0:禁用 1:正常 2:未激活
EmailVerified bool `json:"email_verified" gorm:"default:false"`
PhoneVerified bool `json:"phone_verified" gorm:"default:false"`
LastLoginAt *time.Time `json:"last_login_at"`
}
// Identity 第三方身份绑定
type Identity struct {
vigo.Model
UserID string `json:"user_id" gorm:"index;not null"`
Provider string `json:"provider" gorm:"size:20;not null"` // google/github/wechat/ldap
ProviderUID string `json:"provider_uid" gorm:"index;size:100;not null"` // 第三方唯一ID
ProviderName string `json:"provider_name" gorm:"size:50"`
Avatar string `json:"avatar" gorm:"size:500"`
Email string `json:"email" gorm:"size:100"`
AccessToken string `json:"-" gorm:"size:500"`
RefreshToken string `json:"-" gorm:"size:500"`
ExpiresAt *time.Time `json:"-"`
// 外键关联
User User `json:"user,omitempty" gorm:"foreignKey:UserID;references:ID"`
}
// Session 登录会话(每次登录创建一个)
type Session struct {
vigo.Model
UserID string `json:"user_id" gorm:"index;not null"`
Version int64 `json:"version" gorm:"default:1"` // 会话内 token 版本号,用于刷新轮换
DeviceInfo string `json:"device_info" gorm:"size:300"`
IP string `json:"ip" gorm:"size:50"`
ExpiresAt time.Time `json:"expires_at"` // 会话过期时间(= refresh token 过期时间)
Revoked bool `json:"revoked" gorm:"default:false"`
RevokedAt *time.Time `json:"revoked_at"`
// 外键关联
User User `json:"user,omitempty" gorm:"foreignKey:UserID;references:ID"`
}
// UserStatus 用户状态常量
const (
UserStatusDisabled = 0
UserStatusActive = 1
UserStatusInactive = 2
)
// IsActive 用户是否激活
func (u *User) IsActive() bool {
return u.Status == UserStatusActive
}