实现用户通过邮件重置密码功能

This commit is contained in:
GoEdgeLab
2022-12-10 15:57:17 +08:00
parent b402bed15c
commit ea6b1bcbfb
8 changed files with 142 additions and 8 deletions

View File

@@ -142,7 +142,24 @@ func (this *UserDAO) FindEnabledUserIdWithUsername(tx *dbs.Tx, username string)
FindInt64Col(0) FindInt64Col(0)
} }
// FindUserFullname 获取管理员名称 // FindUserId 根据多个条件查找用户ID
func (this *UserDAO) FindUserId(tx *dbs.Tx, verifiedEmail string, verifiedMobile string) (int64, error) {
var query = this.Query(tx).
State(UserStateEnabled).
ResultPk()
if len(verifiedEmail) > 0 {
query.Attr("verifiedEmail", verifiedEmail)
} else if len(verifiedMobile) > 0 {
query.Attr("verifiedMobile", verifiedMobile)
} else {
return 0, nil
}
return query.FindInt64Col(0)
}
// FindUserFullname 获取用户名称
func (this *UserDAO) FindUserFullname(tx *dbs.Tx, userId int64) (string, error) { func (this *UserDAO) FindUserFullname(tx *dbs.Tx, userId int64) (string, error) {
return this.Query(tx). return this.Query(tx).
Pk(userId). Pk(userId).
@@ -150,6 +167,14 @@ func (this *UserDAO) FindUserFullname(tx *dbs.Tx, userId int64) (string, error)
FindStringCol("") FindStringCol("")
} }
// FindUserVerifiedEmail 查询用户已绑定邮箱
func (this *UserDAO) FindUserVerifiedEmail(tx *dbs.Tx, userId int64) (string, error) {
return this.Query(tx).
Pk(userId).
Result("verifiedEmail").
FindStringCol("")
}
// CreateUser 创建用户 // CreateUser 创建用户
func (this *UserDAO) CreateUser(tx *dbs.Tx, username string, func (this *UserDAO) CreateUser(tx *dbs.Tx, username string,
password string, password string,
@@ -257,8 +282,20 @@ func (this *UserDAO) UpdateUserLogin(tx *dbs.Tx, userId int64, username string,
if len(password) > 0 { if len(password) > 0 {
op.Password = stringutil.Md5(password) op.Password = stringutil.Md5(password)
} }
err := this.Save(tx, op) return this.Save(tx, op)
return err }
// UpdateUserPassword 修改用户密码
func (this *UserDAO) UpdateUserPassword(tx *dbs.Tx, userId int64, password string) error {
if userId <= 0 {
return errors.New("invalid userId")
}
var op = NewUserOperator()
op.Id = userId
if len(password) > 0 {
op.Password = stringutil.Md5(password)
}
return this.Save(tx, op)
} }
// CountAllEnabledUsers 计算用户数量 // CountAllEnabledUsers 计算用户数量

View File

@@ -10,6 +10,7 @@ type User struct {
Password string `field:"password"` // 密码 Password string `field:"password"` // 密码
Fullname string `field:"fullname"` // 真实姓名 Fullname string `field:"fullname"` // 真实姓名
Mobile string `field:"mobile"` // 手机号 Mobile string `field:"mobile"` // 手机号
VerifiedMobile string `field:"verifiedMobile"` // 已验证手机号
Tel string `field:"tel"` // 联系电话 Tel string `field:"tel"` // 联系电话
Remark string `field:"remark"` // 备注 Remark string `field:"remark"` // 备注
Email string `field:"email"` // 邮箱地址 Email string `field:"email"` // 邮箱地址
@@ -41,6 +42,7 @@ type UserOperator struct {
Password any // 密码 Password any // 密码
Fullname any // 真实姓名 Fullname any // 真实姓名
Mobile any // 手机号 Mobile any // 手机号
VerifiedMobile any // 已验证手机号
Tel any // 联系电话 Tel any // 联系电话
Remark any // 备注 Remark any // 备注
Email any // 邮箱地址 Email any // 邮箱地址

View File

@@ -0,0 +1,28 @@
package models
import (
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/dbs"
)
type UserVerifyCodeDAO dbs.DAO
func NewUserVerifyCodeDAO() *UserVerifyCodeDAO {
return dbs.NewDAO(&UserVerifyCodeDAO{
DAOObject: dbs.DAOObject{
DB: Tea.Env,
Table: "edgeUserVerifyCodes",
Model: new(UserVerifyCode),
PkName: "id",
},
}).(*UserVerifyCodeDAO)
}
var SharedUserVerifyCodeDAO *UserVerifyCodeDAO
func init() {
dbs.OnReady(func() {
SharedUserVerifyCodeDAO = NewUserVerifyCodeDAO()
})
}

View File

@@ -0,0 +1,6 @@
package models_test
import (
_ "github.com/go-sql-driver/mysql"
_ "github.com/iwind/TeaGo/bootstrap"
)

View File

@@ -0,0 +1,32 @@
package models
// UserVerifyCode 重置密码之验证码
type UserVerifyCode struct {
Id uint64 `field:"id"` // ID
Email string `field:"email"` // 邮箱地址
Mobile string `field:"mobile"` // 手机号
Code string `field:"code"` // 验证码
Type string `field:"type"` // 类型
IsSent bool `field:"isSent"` // 是否已发送
IsVerified bool `field:"isVerified"` // 是否已激活
CreatedAt uint64 `field:"createdAt"` // 创建时间
ExpiresAt uint64 `field:"expiresAt"` // 过期时间
Day string `field:"day"` // YYYYMMDD
}
type UserVerifyCodeOperator struct {
Id any // ID
Email any // 邮箱地址
Mobile any // 手机号
Code any // 验证码
Type any // 类型
IsSent any // 是否已发送
IsVerified any // 是否已激活
CreatedAt any // 创建时间
ExpiresAt any // 过期时间
Day any // YYYYMMDD
}
func NewUserVerifyCodeOperator() *UserVerifyCodeOperator {
return &UserVerifyCodeOperator{}
}

View File

@@ -0,0 +1 @@
package models

View File

@@ -797,8 +797,8 @@ func (this *UserService) RenewUserServersState(ctx context.Context, req *pb.Rene
}, nil }, nil
} }
// CheckUserEmailIsUsing 检查邮箱是否被使用 // CheckUserEmail 检查邮箱是否被使用
func (this *UserService) CheckUserEmailIsUsing(ctx context.Context, req *pb.CheckUserEmailIsUsingRequest) (*pb.CheckUserEmailIsUsingResponse, error) { func (this *UserService) CheckUserEmail(ctx context.Context, req *pb.CheckUserEmailRequest) (*pb.CheckUserEmailResponse, error) {
userId, err := this.ValidateUserNode(ctx, false) userId, err := this.ValidateUserNode(ctx, false)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -814,7 +814,35 @@ func (this *UserService) CheckUserEmailIsUsing(ctx context.Context, req *pb.Chec
return nil, err return nil, err
} }
if emailOwnerUserId > 0 && userId != emailOwnerUserId { if emailOwnerUserId > 0 && userId != emailOwnerUserId {
return &pb.CheckUserEmailIsUsingResponse{IsUsing: true}, nil return &pb.CheckUserEmailResponse{Exists: true}, nil
} }
return &pb.CheckUserEmailIsUsingResponse{IsUsing: false}, nil return &pb.CheckUserEmailResponse{Exists: false}, nil
}
// FindUserVerifiedEmailWithUsername 根据用户名查询用户绑定的邮箱
func (this *UserService) FindUserVerifiedEmailWithUsername(ctx context.Context, req *pb.FindUserVerifiedEmailWithUsernameRequest) (*pb.FindUserVerifiedEmailWithUsernameResponse, error) {
_, err := this.ValidateUserNode(ctx, false)
if err != nil {
return nil, err
}
var tx = this.NullTx()
userId, err := models.SharedUserDAO.FindEnabledUserIdWithUsername(tx, req.Username)
if err != nil {
return nil, err
}
if userId <= 0 {
return &pb.FindUserVerifiedEmailWithUsernameResponse{
Email: "",
}, nil
}
email, err := models.SharedUserDAO.FindUserVerifiedEmail(tx, userId)
if err != nil {
return nil, err
}
return &pb.FindUserVerifiedEmailWithUsernameResponse{
Email: email,
}, nil
} }

File diff suppressed because one or more lines are too long