1. 增加新类型中继设备

2. 优化代码
This commit is contained in:
2025-09-08 12:27:54 +08:00
parent bab44e7e3a
commit c7e2aaee89
7 changed files with 285 additions and 207 deletions

View File

@@ -6,6 +6,7 @@ import (
"net/http"
"git.huangwc.com/pig/pig-farm-controller/internal/api/middleware"
"git.huangwc.com/pig/pig-farm-controller/internal/controller"
"git.huangwc.com/pig/pig-farm-controller/internal/logs"
"git.huangwc.com/pig/pig-farm-controller/internal/storage/repository"
"github.com/gin-gonic/gin"
@@ -26,101 +27,104 @@ func NewController(userRepo repository.UserRepo) *Controller {
}
}
// RegisterRequest 注册请求结构体
// RegisterRequest 用户注册请求结构体
type RegisterRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
// RegisterResponse 注册响应结构体
type RegisterResponse struct {
ID uint `json:"id"`
Username string `json:"username"`
CreatedAt string `json:"created_at"`
}
// Register 用户注册
func (c *Controller) Register(ctx *gin.Context) {
var req RegisterRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
return
}
user, err := c.userRepo.CreateUser(req.Username, req.Password)
if err != nil {
c.logger.Error("创建用户失败: " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "创建用户失败"})
return
}
response := RegisterResponse{
ID: user.ID,
Username: user.Username,
CreatedAt: user.CreatedAt.Format("2006-01-02 15:04:05"),
}
ctx.JSON(http.StatusOK, gin.H{
"message": "用户创建成功",
"user": response,
})
}
// LoginRequest 登录请求结构体
// LoginRequest 用户登录请求结构体
type LoginRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
// LoginResponse 登录响应结构体
type LoginResponse struct {
ID uint `json:"id"`
Username string `json:"username"`
Token string `json:"token"`
CreatedAt string `json:"created_at"`
// RegisterResponseData 用户注册响应数据
type RegisterResponseData struct {
ID uint `json:"id"`
Username string `json:"username"`
}
// Login 用户登录
// LoginResponseData 用户登录响应数据
type LoginResponseData struct {
ID uint `json:"id"`
Username string `json:"username"`
Token string `json:"token"`
}
// Register 用户注册接口
func (c *Controller) Register(ctx *gin.Context) {
var req RegisterRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
controller.SendErrorResponse(ctx, http.StatusBadRequest, "请求参数错误")
return
}
// 检查用户名是否已存在
_, err := c.userRepo.FindByUsername(req.Username)
if err == nil {
controller.SendErrorResponse(ctx, http.StatusBadRequest, "用户名已存在")
return
}
// 对密码进行哈希处理
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
if err != nil {
c.logger.Error("密码哈希处理失败: " + err.Error())
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "用户注册失败")
return
}
// 创建用户
user, err := c.userRepo.CreateUser(req.Username, string(hashedPassword))
if err != nil {
c.logger.Error("创建用户失败: " + err.Error())
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "用户注册失败")
return
}
data := RegisterResponseData{
ID: user.ID,
Username: user.Username,
}
controller.SendSuccessResponse(ctx, "用户注册成功", data)
}
// Login 用户登录接口
func (c *Controller) Login(ctx *gin.Context) {
var req LoginRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "请求参数错误"})
controller.SendErrorResponse(ctx, http.StatusBadRequest, "请求参数错误")
return
}
// 查找用户
user, err := c.userRepo.FindByUsername(req.Username)
if err != nil {
c.logger.Error("查找用户失败: " + err.Error())
ctx.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
controller.SendErrorResponse(ctx, http.StatusUnauthorized, "用户名或密码错误")
return
}
// 验证密码
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password))
if err != nil {
ctx.JSON(http.StatusUnauthorized, gin.H{"error": "用户名或密码错误"})
if err := bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(req.Password)); err != nil {
controller.SendErrorResponse(ctx, http.StatusUnauthorized, "用户名或密码错误")
return
}
// 生成JWT访问令牌
authMiddleware := middleware.NewAuthMiddleware(c.userRepo)
token, err := authMiddleware.GenerateToken(user.ID, user.Username)
// 生成JWT token
token, err := middleware.NewAuthMiddleware(c.userRepo).GenerateToken(user.ID, user.Username)
if err != nil {
c.logger.Error("生成令牌失败: " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "登录失败"})
c.logger.Error("生成JWT token失败: " + err.Error())
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "登录失败")
return
}
response := LoginResponse{
ID: user.ID,
Username: user.Username,
Token: token,
CreatedAt: user.CreatedAt.Format("2006-01-02 15:04:05"),
data := LoginResponseData{
ID: user.ID,
Username: user.Username,
Token: token,
}
ctx.JSON(http.StatusOK, gin.H{
"message": "登录成功",
"user": response,
})
controller.SendSuccessResponse(ctx, "登录成功", data)
}