feat: 迁移商务登录品牌和三步找回密码

This commit is contained in:
Yvan
2026-11-03 19:07:30 +08:00
parent 317c253ba9
commit 8048dfb514
39 changed files with 2190 additions and 283 deletions
@@ -0,0 +1,72 @@
package business
import (
"context"
"kra/internal/biz/business"
"kra/internal/service/dto"
"strings"
"unicode/utf8"
)
type PasswordResetUsecase interface {
Check(context.Context, string) (string, error)
SendCode(context.Context, string) (string, error)
VerifyCode(context.Context, string, string) (string, error)
Reset(context.Context, string, string, string) error
}
type PasswordResetService struct{ uc PasswordResetUsecase }
func NewPasswordResetService(uc *business.PasswordResetUsecase) *PasswordResetService {
return &PasswordResetService{uc: uc}
}
func resetUsername(req *dto.PasswordResetRequest) (string, error) {
if req == nil || strings.TrimSpace(req.Username) == "" || utf8.RuneCountInString(req.Username) > 30 {
return "", business.ErrAccountInput
}
return strings.TrimSpace(req.Username), nil
}
func (s *PasswordResetService) Check(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetPhoneResponse, error) {
name, err := resetUsername(req)
if err != nil {
return nil, err
}
phone, err := s.uc.Check(ctx, name)
if err != nil {
return nil, err
}
return &dto.PasswordResetPhoneResponse{MaskedPhone: phone}, nil
}
func (s *PasswordResetService) SendCode(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetPhoneResponse, error) {
name, err := resetUsername(req)
if err != nil {
return nil, err
}
phone, err := s.uc.SendCode(ctx, name)
if err != nil {
return nil, err
}
return &dto.PasswordResetPhoneResponse{MaskedPhone: phone}, nil
}
func (s *PasswordResetService) VerifyCode(ctx context.Context, req *dto.PasswordResetRequest) (*dto.PasswordResetTokenResponse, error) {
name, err := resetUsername(req)
if err != nil {
return nil, err
}
if len(req.SMSCode) != 6 {
return nil, business.ErrResetCode
}
token, err := s.uc.VerifyCode(ctx, name, req.SMSCode)
if err != nil {
return nil, err
}
return &dto.PasswordResetTokenResponse{ResetToken: token}, nil
}
func (s *PasswordResetService) Reset(ctx context.Context, req *dto.PasswordResetRequest) error {
if req == nil || strings.TrimSpace(req.ResetToken) == "" || strings.TrimSpace(req.NewPassword) == "" || strings.TrimSpace(req.ConfirmPassword) == "" {
return business.ErrAccountInput
}
if len(req.ResetToken) != 64 {
return business.ErrResetToken
}
return s.uc.Reset(ctx, req.ResetToken, req.NewPassword, req.ConfirmPassword)
}
+15
View File
@@ -0,0 +1,15 @@
package dto
type PasswordResetRequest struct {
Username string `json:"username"`
SMSCode string `json:"smsCode"`
ResetToken string `json:"resetToken"`
NewPassword string `json:"newPassword"`
ConfirmPassword string `json:"confirmPassword"`
}
type PasswordResetPhoneResponse struct {
MaskedPhone string `json:"maskedPhone"`
}
type PasswordResetTokenResponse struct {
ResetToken string `json:"resetToken"`
}
+1
View File
@@ -15,6 +15,7 @@ var ProviderSet = wire.NewSet(
businessservice.NewUserPreferenceService,
businessservice.NewAccountService,
businessservice.NewBindingService,
businessservice.NewPasswordResetService,
systemservice.ProviderSet,
paymentservice.ProviderSet,
integrationservice.ProviderSet,