mirror of https://gitee.com/godoos/godoos.git
21 changed files with 273 additions and 150 deletions
@ -1,16 +1,28 @@ |
|||||
package login |
package login |
||||
|
|
||||
import "errors" |
import ( |
||||
|
"errors" |
||||
|
"fmt" |
||||
|
) |
||||
|
|
||||
type LoginHandlerFactory struct{} |
type LoginHandlerFactory struct{} |
||||
|
|
||||
func (f *LoginHandlerFactory) GetHandler(loginType string) (LoginHandler, error) { |
// factory.go
|
||||
switch loginType { |
func (f *LoginHandlerFactory) GetHandler(req LoginRequest) (LoginHandler, error) { |
||||
|
var handler LoginHandler |
||||
|
|
||||
|
switch req.LoginType { |
||||
case LoginTypePassword: |
case LoginTypePassword: |
||||
return &PasswordLoginHandler{}, nil |
handler = &PasswordLoginHandler{} |
||||
case LoginTypeSmsCode: |
case LoginTypeSmsCode: |
||||
return &SmsCodeLoginHandler{}, nil |
handler = &SmsCodeLoginHandler{} |
||||
default: |
default: |
||||
return nil, errors.New("unsupported login type") |
return nil, errors.New("unsupported login type") |
||||
} |
} |
||||
|
|
||||
|
if err := handler.Init(req); err != nil { |
||||
|
return nil, fmt.Errorf("参数初始化失败: %v", err) |
||||
|
} |
||||
|
|
||||
|
return handler, nil |
||||
} |
} |
||||
|
@ -1,22 +1,88 @@ |
|||||
package login |
package login |
||||
|
|
||||
import ( |
import ( |
||||
|
"encoding/json" |
||||
|
"errors" |
||||
|
"godocms/common" |
||||
"godocms/model" |
"godocms/model" |
||||
"log" |
"godocms/pkg/db" |
||||
|
"godocms/utils" |
||||
|
"time" |
||||
|
|
||||
|
"gorm.io/gorm" |
||||
) |
) |
||||
|
|
||||
type PasswordLoginHandler struct{} |
type PasswordLoginHandler struct { |
||||
|
loginParam *PasswordLoginParam |
||||
|
} |
||||
|
|
||||
func (h *PasswordLoginHandler) Login(param LoginParam) (*model.User, error) { |
func (h *PasswordLoginHandler) Init(req LoginRequest) error { |
||||
p := param.(PasswordLoginParam) |
//此处可以根据action处理不同的数据类型的解析
|
||||
log.Printf("用户登录: %+v", p) |
h.loginParam = new(PasswordLoginParam) |
||||
|
return json.Unmarshal(req.Param, h.loginParam) |
||||
|
} |
||||
|
func (h *PasswordLoginHandler) Login() (user *model.User, err error) { |
||||
|
if !common.LoginConf.UserNameLogin.Enable { |
||||
|
return nil, errors.New("登录已关闭") |
||||
|
} |
||||
|
//log.Printf("用户登录: %+v", h.loginParam.Password)
|
||||
|
user = new(model.User) |
||||
|
if err := db.DB.Where("username = ?", h.loginParam.Username).First(&user).Error; err != nil { |
||||
|
return nil, errors.New("用户不存在") |
||||
|
} |
||||
|
if utils.HashPassword(h.loginParam.Password, user.Salt) != user.Password { |
||||
|
return nil, errors.New("密码错误") |
||||
|
} |
||||
// 实现短信验证码登录逻辑
|
// 实现短信验证码登录逻辑
|
||||
return nil, nil |
return user, nil |
||||
} |
} |
||||
|
|
||||
func (h *PasswordLoginHandler) Register(param LoginParam) (*model.User, error) { |
func (h *PasswordLoginHandler) Register() (user *model.User, err error) { |
||||
p := param.(PasswordLoginParam) |
//log.Printf("用户登录: %+v", h.loginParam)
|
||||
log.Printf("用户登录: %+v", p) |
// 检查用户名和邮箱是否已存在
|
||||
|
var existingUser model.User |
||||
|
result := db.DB.Where("username = ?", h.loginParam.Username).First(&existingUser) |
||||
|
if result.RowsAffected > 0 { |
||||
|
return nil, errors.New("用户名或邮箱/手机号已存在") |
||||
|
} |
||||
|
salt, err := utils.GenerateSalt(16) |
||||
|
if err != nil { |
||||
|
return nil, err |
||||
|
} |
||||
|
hashedPassword := utils.HashPassword(h.loginParam.Password, salt) |
||||
|
user = &model.User{ |
||||
|
Username: h.loginParam.Username, |
||||
|
Password: hashedPassword, |
||||
|
Salt: salt, |
||||
|
Email: "", |
||||
|
Nickname: h.loginParam.Username, |
||||
|
Phone: "", |
||||
|
RoleId: 1, |
||||
|
Status: 0, |
||||
|
DeptId: 1, |
||||
|
AddTime: int32(time.Now().Unix()), |
||||
|
UpTime: 0, |
||||
|
} |
||||
|
|
||||
|
err = db.DB.Transaction(func(tx *gorm.DB) error { |
||||
|
if err := tx.Create(&user).Error; err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
|
thirdInfo := &model.UserThird{ |
||||
|
UserID: user.ID, |
||||
|
Platform: LoginPlatformPassword, |
||||
|
ThirdUserID: h.loginParam.Username, |
||||
|
UnionID: h.loginParam.Username, |
||||
|
} |
||||
|
if err := tx.Create(thirdInfo).Error; err != nil { |
||||
|
return err |
||||
|
} |
||||
|
|
||||
return nil, nil |
return nil |
||||
|
}) |
||||
|
if err != nil { |
||||
|
return user, err |
||||
|
} |
||||
|
return user, nil |
||||
} |
} |
||||
|
@ -1,22 +1,27 @@ |
|||||
package login |
package login |
||||
|
|
||||
import ( |
import ( |
||||
|
"encoding/json" |
||||
"godocms/model" |
"godocms/model" |
||||
"log" |
"log" |
||||
) |
) |
||||
|
|
||||
type SmsCodeLoginHandler struct{} |
type SmsCodeLoginHandler struct { |
||||
|
param *SmsCodeLoginParam |
||||
|
} |
||||
|
|
||||
func (h *SmsCodeLoginHandler) Login(param LoginParam) (*model.User, error) { |
func (h *SmsCodeLoginHandler) Init(req LoginRequest) error { |
||||
p := param.(SmsCodeLoginParam) |
h.param = new(SmsCodeLoginParam) |
||||
log.Printf("手机号登录: %+v", p) |
return json.Unmarshal(req.Param, h.param) |
||||
|
} |
||||
|
func (h *SmsCodeLoginHandler) Login() (*model.User, error) { |
||||
|
log.Printf("用户登录: %+v", h.param) |
||||
// 实现短信验证码登录逻辑
|
// 实现短信验证码登录逻辑
|
||||
return nil, nil |
return nil, nil |
||||
} |
} |
||||
|
|
||||
func (h *SmsCodeLoginHandler) Register(param LoginParam) (*model.User, error) { |
func (h *SmsCodeLoginHandler) Register() (*model.User, error) { |
||||
p := param.(SmsCodeLoginParam) |
log.Printf("用户登录: %+v", h.param) |
||||
log.Printf("手机号登录: %+v", p) |
|
||||
// 实现短信验证码注册逻辑
|
// 实现短信验证码注册逻辑
|
||||
return nil, nil |
return nil, nil |
||||
} |
} |
||||
|
@ -1 +1 @@ |
|||||
exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 |
exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 |
Binary file not shown.
Loading…
Reference in new issue