修复了一些问题

This commit is contained in:
李琦
2026-08-24 15:29:53 +08:00
parent 3417856607
commit cb15328e5d
47 changed files with 5514 additions and 966 deletions

View File

@@ -10,8 +10,16 @@ import (
"xk-websocket-v2/internal/utils"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
)
// isProdEnv 判断是否为生产环境(app.env 为 production/prod)。
// 用于决定是否把验证码等敏感信息返回给客户端:仅非生产环境返回,便于本地调试。
func isProdEnv() bool {
env := viper.GetString("app.env")
return env == "production" || env == "prod"
}
/**
* LoginHandler
* 功能:用户登录
@@ -69,19 +77,20 @@ func RegisterHandler(c *gin.Context) {
return
}
// 如果提供了验证码,验证验证码
// 如果提供了验证码,验证验证码(只校验不消费——注册还可能失败)
codeTarget, codeType := "", ""
if req.Code != "" {
// 根据邮箱或手机号确定类型
codeType := "email"
codeType = "email"
if len(req.Phone) > 0 {
codeType = "sms"
}
target := req.Email
codeTarget = req.Email
if codeType == "sms" {
target = req.Phone
codeTarget = req.Phone
}
valid, err := service.AuthSvc.VerifyCode(target, req.Code, codeType)
valid, err := service.AuthSvc.VerifyCode(codeTarget, req.Code, codeType)
if err != nil || !valid {
utils.BadRequest(c, "验证码无效或已过期")
return
@@ -91,6 +100,7 @@ func RegisterHandler(c *gin.Context) {
// 调用认证服务注册
user, err := service.AuthSvc.Register(&req)
if err != nil {
// 注册失败时验证码未被消费,用户可用同一验证码修正参数后重试
utils.BadRequest(c, err.Error())
return
}
@@ -102,6 +112,12 @@ func RegisterHandler(c *gin.Context) {
return
}
// 全流程成功(注册+Token)后才消费验证码,防止同码重放注册;
// 中途任何失败都保留验证码,把"可重试"的窗口留到最后一刻
if req.Code != "" {
service.AuthSvc.ConsumeCode(codeTarget, req.Code, codeType)
}
utils.SuccessWithData(c, model.RegisterResponse{
Token: token,
User: *user,
@@ -170,10 +186,12 @@ func SendEmailCodeHandler(c *gin.Context) {
return
}
// 开发环境返回验证码,生产环境不应返回
utils.SuccessWithData(c, gin.H{
"code": code, // 仅开发环境,生产环境应移除
}, "验证码已发送")
// 生产环境不返回验证码,避免直接绕过邮件校验;仅非生产环境返回以便调试
data := gin.H{}
if !isProdEnv() {
data["code"] = code
}
utils.SuccessWithData(c, data, "验证码已发送")
}
/**
@@ -199,8 +217,10 @@ func SendSmsCodeHandler(c *gin.Context) {
return
}
// 开发环境返回验证码,生产环境不应返回
utils.SuccessWithData(c, gin.H{
"code": code, // 仅开发环境,生产环境应移除
}, "验证码已发送")
// 生产环境不返回验证码,避免直接绕过短信校验;仅非生产环境返回以便调试
data := gin.H{}
if !isProdEnv() {
data["code"] = code
}
utils.SuccessWithData(c, data, "验证码已发送")
}