瀏覽代碼

feat: 账号登陆

runningwater 6 月之前
父節點
當前提交
53245d6752
共有 3 個文件被更改,包括 70 次插入0 次删除
  1. 22 0
      app/http/controllers/api/v1/auth/login_controller.go
  2. 46 0
      app/requests/login_request.go
  3. 2 0
      routes/api.go

+ 22 - 0
app/http/controllers/api/v1/auth/login_controller.go

@@ -26,6 +26,7 @@ func (lc *LoginController) LoginByPhone(c *gin.Context) {
 	if err != nil {
 		// 失败,显示错误提示
 		response.Error(c, err, "账号不存在或密码错误")
+		return
 	}
 	// 登录成功
 	token := jwt.NewJWT().IssueToken(user.GetStringID(), user.Name)
@@ -35,3 +36,24 @@ func (lc *LoginController) LoginByPhone(c *gin.Context) {
 	})
 
 }
+
+// LoginByPassword 用户名 + 密码登录
+func (lc *LoginController) LoginByPassword(c *gin.Context) {
+	// 1. 验证表单
+	request := requests.LoginByPasswordRequest{}
+	if ok := requests.Validate(c, &request, requests.LoginByPassword); !ok {
+		return
+	}
+	// 2. 尝试登录
+	user, err := auth.Attemp(request.LoginID, request.Password)
+	if err != nil {
+		// 失败,显示错误提示
+		response.Unauthorized(c, "账号不存在或密码错误")
+		return
+	}
+	// 登录成功
+	token := jwt.NewJWT().IssueToken(user.GetStringID(), user.Name)
+	response.JSON(c, gin.H{
+		"token": token,
+	})
+}

+ 46 - 0
app/requests/login_request.go

@@ -40,3 +40,49 @@ func LoginByPhone(data any, c *gin.Context) map[string][]string {
 	return errs
 
 }
+
+type LoginByPasswordRequest struct {
+	CaptchaID     string `json:"captcha_id,omitempty" valid:"captcha_id"`
+	CaptchaAnswer string `json:"captcha_answer,omitempty" valid:"captcha_answer"`
+
+	LoginID  string `json:"login_id" valid:"login_id"`
+	Password string `json:"password,omitempty" valid:"password"`
+}
+
+// LoginByPassword 验证表单,返回长度等于零即通过
+func LoginByPassword(data any, c *gin.Context) map[string][]string {
+	// 1. 定制认证规则
+	rules := govalidator.MapData{
+		"captcha_id":     []string{"required"},
+		"captcha_answer": []string{"required", "digits:6"},
+		"login_id":       []string{"required", "min:3"},
+		"password":       []string{"required", "min:6"},
+	}
+	// 2. 定制错误消息
+	messages := govalidator.MapData{
+		"captcha_id": []string{
+			"required:图片验证码的 ID 为必填",
+		},
+		"captcha_answer": []string{
+			"required:图片验证码答案必填",
+			"digits:图片验证码长度必须为 6 位的数字",
+		},
+		"login_id": []string{
+			"required: 登录 ID 为必填项,支持手机号、邮箱和用户名",
+			"min:登录 ID 长度需大于 3",
+		},
+		"password": []string{
+			"required:密码为必填项",
+			"min:密码长度需大于 6",
+		},
+	}
+
+	errs := validate(data, rules, messages)
+
+	// 3....  增加其他业务逻辑
+	_data := data.(*LoginByPasswordRequest)
+	errs = validators.ValidateVerifyCode(_data.CaptchaID, _data.CaptchaAnswer, errs)
+
+	// 4. 返回错误消息
+	return errs
+}

+ 2 - 0
routes/api.go

@@ -33,6 +33,8 @@ func RegisterAPIRoutes(router *gin.Engine) {
 			logc := new(auth.LoginController)
 			// 手机号登录
 			authGroup.POST("/login/using-phone", logc.LoginByPhone)
+			// 账号登录,支持手机号,email 和用户名登录
+			authGroup.POST("/login/using-password", logc.LoginByPassword)
 		}
 	}
 }