package user import ( "context" "regexp" "backend/usercenter/api/internal/svc" "backend/usercenter/api/internal/types" "backend/usercenter/orm" "backend/utils" "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" // github.com/spf13/cast // 类型转换 // github.com/golang-module/carbon/v2 // 日期时间处理 // github.com/jinzhu/copier/v2 // 结构体复制 // orm 目录下的 orm 包 ) type UserRegisterLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewUserRegisterLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserRegisterLogic { return &UserRegisterLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *UserRegisterLogic) UserRegister(req *types.RegisterRequest) (resp *types.UsersResponse, err error) { // 1. 检查用户名是否符合要求 if len(req.Username) < 4 || len(req.Username) > 16 { return &types.UsersResponse{ Success: false, Message: "用户名长度不能小于4位或大于16位", Data: nil, Code: 200, }, nil } // 1.1 正则检查用户名是否符合要求 usernameRegex := regexp.MustCompile(`^[a-zA-Z0-9]+$`) if !usernameRegex.MatchString(req.Username) { return &types.UsersResponse{ Success: false, Message: "用户名只能包含字母和数字", Data: nil, Code: 200, }, nil } // 1. 检查用户名,手机号是否存在 user := new(orm.User) result := l.svcCtx.Db.Where("name = ? or phone = ?", req.Username, req.Phone).First(user) if result.Error != nil && result.Error != gorm.ErrRecordNotFound { return &types.UsersResponse{ Success: false, Message: result.Error.Error(), Data: nil, Code: 200, }, nil } if result.RowsAffected > 0 { return &types.UsersResponse{ Success: false, Message: "用户名或手机号已存在", Data: nil, Code: 200, }, nil } // 2. 检查密码是否符合要求 if len(req.Password) < 6 || len(req.Password) > 16 { return &types.UsersResponse{ Success: false, Message: "密码长度不能小于6位或大于16位", Data: nil, Code: 200, }, nil } // 2.1 检查手机号是否符合要求 if len(req.Phone) != 11 { return &types.UsersResponse{ Success: false, Message: "手机号长度不正确", Data: nil, Code: 200, }, nil } // 2.2 正则检查手机号是否符合要求 phoneRegex := regexp.MustCompile(`^1[3-9]\d{9}$`) if !phoneRegex.MatchString(req.Phone) { return &types.UsersResponse{ Success: false, Message: "手机号格式不正确", Data: nil, Code: 200, }, nil } // 3. 加密密码,使用utils.Bcrypt.GenerateFromPassword hashedPassword, err := utils.HashPassword(req.Password) if err != nil { return &types.UsersResponse{ Success: false, Message: err.Error(), Data: nil, Code: 200, }, nil } user.Password = string(hashedPassword) // 如果其他字段有值,则赋值 if req.Email != "" { user.Email = req.Email } // 4. 创建用户 user.Name = req.Username user.Password = hashedPassword user.Phone = req.Phone // 4. 创建用户 result = l.svcCtx.Db.Create(user) if result.Error != nil { return &types.UsersResponse{ Success: false, Message: result.Error.Error(), Data: nil, Code: 200, }, nil } // 5. 返回用户信息 resp = &types.UsersResponse{ Success: true, Message: "注册成功", Data: user.ID, Code: 200, } return }