5--用户登录接口
注册API顺利完工,与之相对应的便是登录API
一. 新增DTO
internal/api/handlers/dto/user.go
// LoginRequest 定义了用户登录请求的DTO结构体,包含用户名和密码字段
type LoginRequest struct {
Username string `json:"username" binding:"required"` // 用户名,必填
Password string `json:"password" binding:"required"` // 密码,必填
}
二. 新增Service方法
internal/service/user.go
func Login(req *dto.LoginRequest) (*model.User, error) {
// 根据用户名获取用户
var user *model.User
var err error
user, err = repository.GetUserByUsername(req.Username)
if err != nil {
return nil, errors.New("User not found")
}
// bcrypt验证密码
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
return nil, errors.New("invalid password")
}
return user, nil
}
三. 新增Handler
internal/api/handlers/user.go
func Login(c *gin.Context) {
var req dto.LoginRequest
// 绑定请求参数到DTO结构体,并进行验证
if err := c.ShouldBindJSON(&req); err != nil {
response.Fail(c, 400, "invalid request parameters: "+err.Error())
return
}
// 调用服务层的登录逻辑
user, err := service.Login(&req)
if err != nil {
response.Fail(c, 401, "login failed: "+err.Error())
return
}
// 登录成功,返回用户信息(不包含密码)
response.Sucess(c, gin.H{
"uid": user.Uid,
"username": user.Username,
"email": user.Email,
"phone": user.Phone,
"createdAt": user.CreatedAt,
})
}
四. 添加login路由
cmd\secgo-mall\main.go
r.POST("/api/user/login", handlers.Login)
五. 使用Postman测试API
1. 新建请求
Method: POST
URL: http://localhost:8080/api/user/login
2. 配置 Body
在 Body 选项卡中选择 raw,格式选择 JSON,填写:
{
"username": "admin",
"password": "123456"
}
3. 发送请求
点击 Send 按钮,预期返回:
{
"code": 0,
"message": "success",
"data": {
"createdAt": "2026-04-10T...",
"email": "admin@admin.admin",
"phone": "13800000000",
"uid": 1,
"username": "admin"
}
}


浙公网安备 33010602011771号