- 实现用户注册、登录、JWT令牌认证功能 - 集成Gin、GORM、Viper、Zap等框架 - 添加密码加密、数据库操作、中间件等完整功能 - 配置多环境支持、日志轮转、CORS处理 - 创建完整的项目结构和配置文件体系
160 lines
3.3 KiB
Go
160 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// 注册用户
|
|
func Register(cfg *Config) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
var req RegisterRequest
|
|
err := c.ShouldBindJSON(&req)
|
|
if err != nil {
|
|
Logger.Error("参数错误", zap.Error(err))
|
|
c.JSON(400, gin.H{
|
|
"message": "参数错误",
|
|
})
|
|
return
|
|
}
|
|
|
|
// 验证邮箱
|
|
if EmailExists(req.Email) {
|
|
c.JSON(400, gin.H{
|
|
"message": "邮箱已存在",
|
|
})
|
|
return
|
|
}
|
|
|
|
//密码加密
|
|
hashedPassword, err := HashPassword(req.Password)
|
|
if err != nil {
|
|
Logger.Error("密码加密失败", zap.Error(err))
|
|
c.JSON(500, gin.H{
|
|
"message": "密码加密失败",
|
|
})
|
|
return
|
|
}
|
|
|
|
// 创建用户
|
|
user := User{
|
|
Name: req.Name,
|
|
Email: req.Email,
|
|
Password: hashedPassword,
|
|
Phone: req.Phone,
|
|
}
|
|
|
|
err = DB.Create(&user).Error
|
|
if err != nil {
|
|
Logger.Error("创建用户失败", zap.Error(err))
|
|
c.JSON(500, gin.H{
|
|
"message": "创建用户失败",
|
|
})
|
|
return
|
|
}
|
|
|
|
Logger.Info("用户注册成功", zap.String("email", req.Email))
|
|
|
|
c.JSON(200, gin.H{
|
|
"message": "用户注册成功",
|
|
})
|
|
}
|
|
}
|
|
|
|
// 登录
|
|
func Login(cfg *Config) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
var req LoginRequest
|
|
|
|
err := c.ShouldBindJSON(&req)
|
|
if err != nil {
|
|
c.JSON(400, gin.H{"错误": err.Error()})
|
|
return
|
|
}
|
|
|
|
//查找用户
|
|
var user User
|
|
err = DB.Where("email = ?", req.Email).First(&user).Error
|
|
if err != nil {
|
|
Logger.Warn("用户不存在", zap.String("email", req.Email))
|
|
c.JSON(401, gin.H{"错误": "电子邮件或密码无效"})
|
|
return
|
|
}
|
|
|
|
//验证密码
|
|
if !VerifyPassword(user.Password, req.Password) {
|
|
Logger.Warn("密码错误", zap.String("email", req.Email))
|
|
c.JSON(401, gin.H{"错误": "电子邮件或密码无效"})
|
|
return
|
|
}
|
|
|
|
//生成token
|
|
token, err := GenerateToken(user.ID, user.Email, cfg.JWT.Secret, int64(cfg.JWT.Expire))
|
|
|
|
if err != nil {
|
|
Logger.Error("生成token失败", zap.Error(err))
|
|
c.JSON(500, gin.H{"错误": "生成token失败"})
|
|
return
|
|
}
|
|
|
|
Logger.Info("用户登录成功", zap.String("email", req.Email))
|
|
|
|
c.JSON(200, LoginResponse{
|
|
Token: token,
|
|
User: User{
|
|
ID: user.ID,
|
|
Name: user.Name,
|
|
Email: user.Email,
|
|
Phone: user.Phone,
|
|
Age: user.Age,
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
// 获取用户信息
|
|
func GetProfile(c *gin.Context) {
|
|
userID, _ := c.Get("user_id")
|
|
|
|
var user User
|
|
if err := DB.First(&user, userID.(uint)).Error; err != nil {
|
|
c.JSON(404, gin.H{"error": "User not found"})
|
|
return
|
|
}
|
|
|
|
c.JSON(200, user)
|
|
}
|
|
|
|
// 更新用户信息
|
|
func UpdateProfile(c *gin.Context) {
|
|
userID, _ := c.Get("user_id")
|
|
|
|
var req struct {
|
|
Name string `json:"name"`
|
|
Phone string `json:"phone"`
|
|
Age int `json:"age"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(400, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
if err := DB.Model(&User{}).Where("id = ?", userID.(uint)).Updates(req).Error; err != nil {
|
|
Logger.Error("Failed to update user", zap.Error(err))
|
|
c.JSON(500, gin.H{"error": "Failed to update profile"})
|
|
return
|
|
}
|
|
|
|
Logger.Info("User profile updated", zap.Uint("user_id", userID.(uint)))
|
|
c.JSON(200, gin.H{"message": "Profile updated successfully"})
|
|
}
|
|
|
|
// 健康检查
|
|
func HealthCheck(c *gin.Context) {
|
|
c.JSON(200, gin.H{
|
|
"status": "ok",
|
|
"app": "AuthAPI",
|
|
})
|
|
}
|