Task 4 — 认证服务层: - pkg/utils/password.go: bcrypt 密码加密与校验 - pkg/utils/jwt.go: Access/Refresh Token 生成与解析(jwt/v5@v5.2.1,兼容 Go 1.23) - app/dto/auth_dto.go: 认证相关请求/响应 DTO(含参数校验 binding tag) - app/auth/service/auth_service.go: 核心业务逻辑(注册、登录、管理员登录、Token 刷新、个人信息、改密码) - pkg/middleware/auth.go: JWT 认证中间件 + 角色权限检查中间件 Task 5 — Controller 与路由注册: - app/auth/controller/auth_controller.go: 前台认证接口(7 个 API) - app/auth/controller/admin_auth_controller.go: 后台管理认证接口 - app/auth/router.go: auth 模块路由定义(模块自包含) - router/router.go: 主路由汇总入口(仅做调度,不含具体路由定义) - cmd/server/main.go: 路由注册迁移到 router.Setup() 已验证全部接口:注册 ✓ 登录 ✓ 获取 profile ✓ 错误密码 ✓ 未认证拒绝 ✓ 非管理员拒绝 ✓ Made-with: Cursor
55 lines
2.5 KiB
Go
55 lines
2.5 KiB
Go
// Package dto 定义数据传输对象,用于 Controller 层的请求/响应参数绑定
|
||
package dto
|
||
|
||
// RegisterRequest 用户注册请求参数
|
||
type RegisterRequest struct {
|
||
Username string `json:"username" binding:"required,min=3,max=50"` // 用户名,3-50 字符
|
||
Email string `json:"email" binding:"required,email"` // 邮箱地址,必须符合邮箱格式
|
||
Password string `json:"password" binding:"required,min=6,max=50"` // 密码,6-50 字符
|
||
Nickname string `json:"nickname" binding:"max=50"` // 昵称,可选,最多 50 字符
|
||
}
|
||
|
||
// LoginRequest 用户登录请求参数
|
||
type LoginRequest struct {
|
||
Account string `json:"account" binding:"required"` // 登录账号,支持用户名或邮箱
|
||
Password string `json:"password" binding:"required"` // 登录密码
|
||
}
|
||
|
||
// LoginResponse 登录成功响应数据
|
||
type LoginResponse struct {
|
||
Token string `json:"token"` // Access Token,用于接口认证
|
||
RefreshToken string `json:"refresh_token"` // Refresh Token,用于刷新 Access Token
|
||
ExpiresIn int64 `json:"expires_in"` // Access Token 有效期(秒)
|
||
User UserInfo `json:"user"` // 当前登录用户基本信息
|
||
}
|
||
|
||
// UserInfo 用户基本信息(用于响应返回,不含敏感字段)
|
||
type UserInfo struct {
|
||
ID int64 `json:"id"` // 用户 ID
|
||
Username string `json:"username"` // 用户名
|
||
Email string `json:"email"` // 邮箱
|
||
Nickname string `json:"nickname"` // 昵称
|
||
Avatar string `json:"avatar"` // 头像 URL
|
||
Gender int `json:"gender"` // 性别:0=未知, 1=男, 2=女
|
||
Roles []string `json:"roles"` // 角色代码列表
|
||
}
|
||
|
||
// RefreshTokenRequest 刷新 Token 请求参数
|
||
type RefreshTokenRequest struct {
|
||
RefreshToken string `json:"refresh_token" binding:"required"` // 原 Refresh Token
|
||
}
|
||
|
||
// UpdateProfileRequest 更新个人资料请求参数
|
||
type UpdateProfileRequest struct {
|
||
Nickname string `json:"nickname" binding:"max=50"` // 新昵称
|
||
Avatar string `json:"avatar" binding:"max=500"` // 新头像 URL
|
||
Gender *int `json:"gender" binding:"omitempty,oneof=0 1 2"` // 新性别,指针类型区分「未传」和「传 0」
|
||
Phone string `json:"phone" binding:"max=20"` // 新手机号
|
||
}
|
||
|
||
// ChangePasswordRequest 修改密码请求参数
|
||
type ChangePasswordRequest struct {
|
||
OldPassword string `json:"old_password" binding:"required"` // 旧密码
|
||
NewPassword string `json:"new_password" binding:"required,min=6,max=50"` // 新密码,6-50 字符
|
||
}
|