相对文件路径:git.com/gin_basic/gin_web/internal/api/handlers/user_handler.go
代码格式如下:
package handlers
import (
regexp "github.com/dlclark/regexp2"
"github.com/gin-gonic/gin"
"net/http"
)
const (
emailRegexPattern = `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`
passwordRegexPattern = `^(?=.*[0-9])(?=.*[a-zA-Z])[0-9a-zA-Z!@#$%^&*(),.?\":{}|<> ]{8,}$`
)
// UserHandlers 处理用户相关请求的结构体
type UserHandlers struct {
emailRegexPattern *regexp.Regexp
passwordRegexPattern *regexp.Regexp
}
// RegisterRoutes 注册用户相关路由
// 该方法用于将用户操作的路由绑定到对应的处理函数
func NewUserHandlers() *UserHandlers {
return &UserHandlers{
emailRegexPattern: regexp.MustCompile(emailRegexPattern, regexp.None),
passwordRegexPattern: regexp.MustCompile(passwordRegexPattern, regexp.None),
}
}
func (h *UserHandlers) RegisterRoutes(routers *gin.Engine) {
// 用户路由组
rg := routers.Group("/users")
// 注册路由
rg.POST("/signup", h.SignUp)
// 登录路由
rg.POST("/sign", h.Login)
// 用户资料路由
rg.GET("/profile", h.Profile)
// 编辑资料路由
rg.POST("/edit", h.Edit)
}
// Signup 处理用户注册请求
// 该方法用于处理用户注册流程,包括验证数据,创建用户等
// 它接收一个 gin.Context 类型的参数,用于获取请求数据和发送响应
// 定义几个方法,包含注册、登录、编辑、查看
func (h *UserHandlers) SignUp(ctx *gin.Context) {
// 注册
// 字段标签,固定接收json格式,内部类
type SignUpReq struct {
Email string `json:"email"`
Password string `json:"password"`
ConfirmPassword string `json:"confirmPassword"`
}
//Bind 方法,类似是格式校验的一个方法,如果格式不是上面SignUp设置的格式就会报错。
var req SignUpReq
if err := ctx.Bind(&req); err != nil {
ctx.String(200, "输入的格式不合法")
return
}
// 邮箱格式校验
isEmail, err := h.emailRegexPattern.MatchString(req.Email)
if err != nil {
ctx.String(http.StatusOK, "系统错误")
return
}
if !isEmail {
ctx.String(http.StatusOK, "邮箱格式不对")
return
}
// 密码格式校验
isPassword, err := h.passwordRegexPattern.MatchString(req.Password)
if err != nil {
ctx.String(http.StatusOK, "系统错误")
return
}
if !isPassword {
ctx.String(http.StatusOK, "邮箱格式不对")
return
}
// 确认密码校验
if req.Password != req.ConfirmPassword {
ctx.String(200, "两次输入密码不一致")
return
}
ctx.String(http.StatusOK, "你正在注册")
}
相对文件路径:git.com/gin_basic/gin_web/cmd/main.go
package main
import (
"git.com/gin_basic/gin_web/internal/api/handlers"
"github.com/gin-gonic/gin"
)
// main函数是程序的入口点
func main() {
// 初始化Gin框架的默认路由器
router := gin.Default()
// 创建UserHandlers实例,用于处理用户相关的请求
//hdl := &handlers.UserHandlers{}
newhdl := handlers.NewUserHandlers()
// 注册用户相关的路由
//hdl.RegisterRoutes(router)
newhdl.RegisterRoutes(router)
// 启动服务器
router.Run(":8080")
}
apipost测试结果如下
代码输出“你正在注册”是在如下代码中展示经过了代码的邮箱、以及密码长度校验和密码一致性验证之后输出的。
ctx.String(http.StatusOK, "你正在注册")
关于密码和邮箱代码的准确性验证
首先在apipost上面修改完邮箱的格式,然后进行post测试,输出结果如下:
关于邮箱格式验证的代码输出如下:
isEmail, err := h.emailRegExp.MatchString(req.Email)
if err != nil {
ctx.String(http.StatusOK, "系统错误")
return
}
if !isEmail {
ctx.String(http.StatusOK, "邮箱格式不对")
return
}
** 进行密码格式验证,然后进行post测试,输出结果如下:**
- 第一种是密码长度不对出现的错误输出
关于密码校验的代码输出如下:
// 密码格式校验
isPassword, err := h.passwordRegExp.MatchString(req.Password)
if err != nil {
ctx.String(http.StatusOK, "系统错误")
return
}
if !isPassword {
ctx.String(http.StatusOK, "密码格式不对,密码长度应该不小于8位,且包含特殊符号")
return
}
// 确认密码校验
if req.Password != req.ConfirmPassword {
ctx.String(200, "两次输入密码不一致")
return
}
- 第二种是两次输入的密码不一致出现的报错
关于输入字符串验证的输出结果如下
关于字符串校验的代码输出如下:
func (h *UserHandlers) SignUp(ctx *gin.Context) {
// 注册
// 字段标签,固定接收json格式,内部类
type SignUpReq struct {
Email string `json:"email"`
Password string `json:"password"`
ConfirmPassword string `json:"confirmPassword"`
}
//Bind 方法,类似是格式校验的一个方法,如果格式不是上面SignUp设置的格式就会报错。
var req SignUpReq
if err := ctx.Bind(&req); err != nil {
ctx.String(200, "输入的格式不合法")
return
}
一些关于代码的说明:
1.密码正则表达式和密码引用包的说明
golang原本的包是regexp,但是不支持正则表达是的"(?="这种格式,所以在代码里面做了修改,如下是代码展示
// regexp 是给这个包起的别名
regexp "github.com/dlclark/regexp2"
// 密码和邮箱的正则表达式都在常量里面,如下,这里是拆开的单独看的,不能作为完整代码使用。好像单独使用也没问题。
const (
emailRegexPattern = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
// 和上面比起来,用 ` 看起来就比较清爽
passwordRegexPattern = `^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&.])[A-Za-z\d$@$!%*#?&.]{8,}$`
)