mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-05 01:20:25 +08:00
实现用户通过邮件重置密码功能
This commit is contained in:
@@ -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 计算用户数量
|
||||||
|
|||||||
@@ -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 // 邮箱地址
|
||||||
|
|||||||
28
internal/db/models/user_verify_code_dao.go
Normal file
28
internal/db/models/user_verify_code_dao.go
Normal 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()
|
||||||
|
})
|
||||||
|
}
|
||||||
6
internal/db/models/user_verify_code_dao_test.go
Normal file
6
internal/db/models/user_verify_code_dao_test.go
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package models_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
_ "github.com/iwind/TeaGo/bootstrap"
|
||||||
|
)
|
||||||
32
internal/db/models/user_verify_code_model.go
Normal file
32
internal/db/models/user_verify_code_model.go
Normal 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{}
|
||||||
|
}
|
||||||
1
internal/db/models/user_verify_code_model_ext.go
Normal file
1
internal/db/models/user_verify_code_model_ext.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package models
|
||||||
@@ -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
Reference in New Issue
Block a user