package user import ( "context" "demo/configs" "demo/router" "demo/share" "fmt" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" "github.com/spf13/cast" "log" "net/http" "regexp" "time" ) var ctx = context.Background() func UserRouth(engine *gin.RouterGroup) { user := engine.Group("/user") { user.POST("/login", login) user.POST("/register", register) user.POST("sendSms", SendVerificationCode) user.GET("/captcha", VerificationCode) } } func VerificationCode(c *gin.Context) { // 配置 driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80) store := base64Captcha.DefaultMemStore captcha := base64Captcha.NewCaptcha(driver, store) // 生成验证码 id, b64s, answer, err := captcha.Generate() if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } fmt.Println(answer) err = configs.RedisDb.Set(ctx, "VerificationCode_"+id, answer, 0).Err() if err != nil { fmt.Println(err) } err = configs.RedisDb.Expire(ctx, "VerificationCode_"+id, 60*time.Second).Err() if err != nil { panic(err) } // 返回验证码图片 c.JSON(200, gin.H{ "message": "获取成功!!!", "expires": time.Now().Add(time.Minute * 5).Unix(), "code": 200, "data": map[string]string{"id": id, "image": b64s}, }) } func login(c *gin.Context) { data := share.GetJsonAnyParam(c) var user configs.User var err error username, _ := data("username") password, _ := data("password") t, _ := data("type") // 定义正则表达式 if cast.ToString(t) == "email" { regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` // 编译正则表达式 reg, err := regexp.Compile(regexPattern) if err != nil { fmt.Println("编译正则表达式时出错:", err) return } //判断是否为邮箱格式 matched := reg.MatchString(cast.ToString(username)) if !matched { fmt.Println("无效的电子邮件格式.") c.JSON(http.StatusOK, router.CreateResultError(400, "邮箱格式错误!!!")) return } } else if cast.ToString(t) == "phone" { regexPattern := `^1[3-9]\d{9}$` // 编译正则表达式 reg, err := regexp.Compile(regexPattern) if err != nil { fmt.Println("编译正则表达式时出错:", err) return } //判断是否为邮箱格式 matched := reg.MatchString(cast.ToString(username)) if !matched { fmt.Println("无效的手机号格式.") c.JSON(http.StatusOK, router.CreateResultError(400, "手机格式错误!!!")) return } } user, err = logins(cast.ToString(username), cast.ToString(password), cast.ToString(t)) if err == nil && user.Id != 0 { fmt.Println("用户登录成功!!!") token, err := share.GenerateToken(cast.ToString(user.Id)) if err == nil { c.Header("auth-sign", token) c.JSON(http.StatusOK, router.CreateResultData(map[string]string{"token": token})) } else { c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!")) } } else { fmt.Println("用户登录失败!!!") c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!")) } } func register(c *gin.Context) { //data := share.GetJsonAnyParam(c) //var user configs.User //var err error //username, _ := data("username") //password, _ := data("password") //// 定义正则表达式 //regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` // //// 编译正则表达式 //reg, err := regexp.Compile(regexPattern) //if err != nil { // fmt.Println("Error compiling regex:", err) // return //} //判断是否为邮箱格式 //matched := reg.MatchString(cast.ToString(username)) //user, err = logins(cast.ToString(username), cast.ToString(password), matched) // //if err == nil && user.Id != 0 { // fmt.Println("用户登录成功!!!") // token, err := share.GenerateToken(cast.ToString(user.Id)) // if err == nil { // c.Header("auth-sign", token) // c.JSON(http.StatusOK, router.CreateResult()) // } else { // c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!")) // } //} else { // fmt.Println("用户登录失败!!!") // c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!")) //} } // SendVerificationCode func SendVerificationCode(c *gin.Context) { data := share.GetJsonAnyParam(c) var err error username, _ := data("username") code, _ := data("code") codeId, _ := data("codeId") val, err := configs.RedisDb.Get(ctx, cast.ToString(codeId)).Result() if err != nil { log.Fatal(err) } if val != cast.ToString(code) { c.JSON(200, gin.H{"code": 400, "message": "验证码错误!!!"}) c.Abort() return } // 定义正则表达式 regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$` // 编译正则表达式 reg, err := regexp.Compile(regexPattern) if err != nil { fmt.Println("Error compiling regex:", err) return } matched := reg.MatchString(cast.ToString(username)) sendSms(matched, cast.ToString(username)) c.JSON(200, gin.H{"code": 200, "message": "发送成功!!!"}) }