feat: 实现邮箱验证码登录功能,支持新用户自动注册并记录登录日志
Build docker and publish / build (20.15.1) (push) Successful in 5m40s

This commit is contained in:
2025-12-31 00:55:11 -08:00
parent fd185bcfe1
commit 4ffccd5ad8
9 changed files with 466 additions and 165 deletions
+23
View File
@@ -84,6 +84,29 @@ func (m *defaultUserModel) DeleteUserAuthMethods(ctx context.Context, userId int
})
}
func (m *defaultUserModel) DeleteUserAuthMethodByIdentifier(ctx context.Context, userId int64, platform, identifier string, tx ...*gorm.DB) error {
u, err := m.FindOne(ctx, userId)
if err != nil {
return err
}
defer func() {
if err = m.ClearUserCache(context.Background(), u); err != nil {
logger.Errorf("[UserModel] clear user cache failed: %v", err.Error())
}
}()
return m.ExecNoCacheCtx(ctx, func(conn *gorm.DB) error {
if len(tx) > 0 {
conn = tx[0]
}
// Delete by user_id, auth_type AND auth_identifier
return conn.Model(&AuthMethods{}).
Where("user_id = ? AND auth_type = ? AND auth_identifier = ?", userId, platform, identifier).
Delete(&AuthMethods{}).Error
})
}
func (m *defaultUserModel) FindUserAuthMethodByUserId(ctx context.Context, method string, userId int64) (*AuthMethods, error) {
var data AuthMethods
err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, v interface{}) error {
+21 -20
View File
@@ -96,6 +96,7 @@ type customUserLogicModel interface {
FindUserAuthMethodByOpenID(ctx context.Context, method, openID string) (*AuthMethods, error)
FindUserAuthMethodByUserId(ctx context.Context, method string, userId int64) (*AuthMethods, error)
FindUserAuthMethodByPlatform(ctx context.Context, userId int64, platform string) (*AuthMethods, error)
DeleteUserAuthMethodByIdentifier(ctx context.Context, userId int64, platform, identifier string, tx ...*gorm.DB) error
FindOneByEmail(ctx context.Context, email string) (*User, error)
FindOneDevice(ctx context.Context, id int64) (*Device, error)
QueryDeviceList(ctx context.Context, userid int64) ([]*Device, int64, error)
@@ -134,27 +135,27 @@ func (m *customUserModel) QueryPageList(ctx context.Context, page, size int, fil
var list []*User
var total int64
err := m.QueryNoCacheCtx(ctx, &list, func(conn *gorm.DB, v interface{}) error {
if filter != nil {
if filter.UserId != nil {
conn = conn.Where("user.id =?", *filter.UserId)
}
if filter.Search != "" {
conn = conn.Joins("LEFT JOIN user_auth_methods ON user.id = user_auth_methods.user_id").
Where("user_auth_methods.auth_identifier LIKE ?", "%"+filter.Search+"%").Or("user.refer_code like ?", "%"+filter.Search+"%")
}
if filter.DeviceId != "" {
conn = conn.Joins("LEFT JOIN user_device ON user.id = user_device.user_id")
if id, err := strconv.ParseInt(filter.DeviceId, 10, 64); err == nil {
conn = conn.Where("user_device.id = ? OR user_device.identifier = ?", id, filter.DeviceId)
} else {
conn = conn.Where("user_device.identifier = ?", filter.DeviceId)
if filter != nil {
if filter.UserId != nil {
conn = conn.Where("user.id =?", *filter.UserId)
}
}
if filter.UserSubscribeId != nil {
conn = conn.Joins("LEFT JOIN user_subscribe ON user.id = user_subscribe.user_id").
Where("user_subscribe.id =? and `status` IN (0,1)", *filter.UserSubscribeId)
}
if filter.SubscribeId != nil {
if filter.Search != "" {
conn = conn.Joins("LEFT JOIN user_auth_methods ON user.id = user_auth_methods.user_id").
Where("user_auth_methods.auth_identifier LIKE ?", "%"+filter.Search+"%").Or("user.refer_code like ?", "%"+filter.Search+"%")
}
if filter.DeviceId != "" {
conn = conn.Joins("LEFT JOIN user_device ON user.id = user_device.user_id")
if id, err := strconv.ParseInt(filter.DeviceId, 10, 64); err == nil {
conn = conn.Where("user_device.id = ? OR user_device.identifier = ?", id, filter.DeviceId)
} else {
conn = conn.Where("user_device.identifier = ?", filter.DeviceId)
}
}
if filter.UserSubscribeId != nil {
conn = conn.Joins("LEFT JOIN user_subscribe ON user.id = user_subscribe.user_id").
Where("user_subscribe.id =? and `status` IN (0,1)", *filter.UserSubscribeId)
}
if filter.SubscribeId != nil {
conn = conn.Joins("LEFT JOIN user_subscribe ON user.id = user_subscribe.user_id").
Where("user_subscribe.subscribe_id =? and `status` IN (0,1)", *filter.SubscribeId)
}