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"
    }
}

user_admin_login

posted @ 2026-04-17 17:32  Chuan81  阅读(32)  评论(0)    收藏  举报