输出消息改为中文

This commit is contained in:
2025-09-12 14:54:07 +08:00
parent 588c819c3c
commit 41bbe69442
7 changed files with 55 additions and 55 deletions

View File

@@ -88,18 +88,18 @@ func (a *API) Start() {
go func() {
// 启动服务器并检查错误。http.ErrServerClosed 是正常关闭时的错误,无需处理。
if err := a.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
a.logger.Fatalf("HTTP server listen: %s", err) // 如果是其他错误,则记录致命错误并退出
a.logger.Fatalf("HTTP 服务器监听失败: %s", err) // 如果是其他错误,则记录致命错误并退出
}
}()
// 记录服务器已启动的信息
a.logger.Infof("HTTP server listening on %s", addr)
a.logger.Infof("HTTP 服务器正在监听 %s", addr)
}
// Stop 优雅地停止 HTTP 服务器
// 在停止服务器时,会给一个超时时间,确保正在处理的请求能够完成。
func (a *API) Stop() {
// 记录服务器正在关闭的信息
a.logger.Info("Shutting down HTTP server...")
a.logger.Info("正在关闭 HTTP 服务器...")
// 创建一个带有 5 秒超时时间的上下文
// 在此时间内,服务器会尝试完成所有活跃的连接。
@@ -110,8 +110,8 @@ func (a *API) Stop() {
// 如果在超时时间内未能关闭Shutdown 会返回错误。
if err := a.httpServer.Shutdown(ctx); err != nil {
// 如果关闭失败,记录致命错误并退出
a.logger.Fatalf("HTTP server shutdown failed: %s", err)
a.logger.Fatalf("HTTP 服务器关闭失败: %s", err)
}
// 记录服务器已停止的信息
a.logger.Info("HTTP server stopped.")
a.logger.Info("HTTP 服务器已停止。")
}

View File

@@ -57,7 +57,7 @@ type LoginResponse struct {
func (c *Controller) CreateUser(ctx *gin.Context) {
var req CreateUserRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
c.logger.Errorf("CreateUser: 参数绑定失败: %v", err)
c.logger.Errorf("创建用户: 参数绑定失败: %v", err)
controller.SendErrorResponse(ctx, http.StatusBadRequest, err.Error())
return
}
@@ -68,7 +68,7 @@ func (c *Controller) CreateUser(ctx *gin.Context) {
}
if err := c.userRepo.Create(user); err != nil {
c.logger.Errorf("CreateUser: 创建用户失败: %v", err)
c.logger.Errorf("创建用户: 创建用户失败: %v", err)
// 尝试查询用户,以判断是否是用户名重复导致的错误
_, findErr := c.userRepo.FindByUsername(req.Username)
@@ -92,7 +92,7 @@ func (c *Controller) CreateUser(ctx *gin.Context) {
func (c *Controller) Login(ctx *gin.Context) {
var req LoginRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
c.logger.Errorf("Login: 参数绑定失败: %v", err)
c.logger.Errorf("登录: 参数绑定失败: %v", err)
controller.SendErrorResponse(ctx, http.StatusBadRequest, err.Error())
return
}
@@ -103,7 +103,7 @@ func (c *Controller) Login(ctx *gin.Context) {
controller.SendErrorResponse(ctx, http.StatusUnauthorized, "用户名或密码不正确")
return
}
c.logger.Errorf("Login: 查询用户失败: %v", err)
c.logger.Errorf("登录: 查询用户失败: %v", err)
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "登录失败")
return
}
@@ -116,7 +116,7 @@ func (c *Controller) Login(ctx *gin.Context) {
// 登录成功,生成 JWT token
tokenString, err := c.tokenService.GenerateToken(user.ID)
if err != nil {
c.logger.Errorf("Login: 生成 token 失败: %v", err)
c.logger.Errorf("登录: 生成令牌失败: %v", err)
controller.SendErrorResponse(ctx, http.StatusInternalServerError, "登录失败,无法生成认证信息")
return
}

View File

@@ -182,7 +182,7 @@ func TestCreateUser(t *testing.T) {
// 初始化 Gin 上下文和记录器
w := httptest.NewRecorder()
ctx, _ := gin.CreateTestContext(w)
ctx.Request = httptest.NewRequest(http.MethodPost, "/users", nil) // 初始请求,后续会替换 Body
ctx.Request = httptest.NewRequest(http.MethodPost, "/users", nil) // URL 路径不重要,因为我们不测试路由
// 设置请求体
jsonBody, _ := json.Marshal(tt.requestBody)

View File

@@ -17,30 +17,30 @@ func TestGenerateToken(t *testing.T) {
tokenString, err := service.GenerateToken(userID)
if err != nil {
t.Fatalf("GenerateToken failed: %v", err)
t.Fatalf("生成令牌失败: %v", err)
}
if tokenString == "" {
t.Fatal("Generated token string is empty")
t.Fatal("生成的令牌字符串为空")
}
// 解析 token 以确保其有效性及声明
claims, err := service.ParseToken(tokenString)
if err != nil {
t.Fatalf("ParseToken failed after generation: %v", err)
t.Fatalf("生成后解析令牌失败: %v", err)
}
if claims.UserID != userID {
t.Errorf("Expected UserID %d, got %d", userID, claims.UserID)
t.Errorf("期望用户ID %d, 实际为 %d", userID, claims.UserID)
}
// 检查 token 是否未过期 (在合理范围内)
if claims.ExpiresAt == nil || claims.ExpiresAt.Time.Before(time.Now().Add(-time.Minute)) {
t.Errorf("Token expiration time is invalid or already expired")
t.Errorf("令牌过期时间无效或已过期")
}
if claims.Issuer != "pig-farm-controller" {
t.Errorf("Expected Issuer \"pig-farm-controller\", got \"%s\"", claims.Issuer)
t.Errorf("期望签发者 \"pig-farm-controller\", 实际为 \"%s\"", claims.Issuer)
}
}
@@ -54,24 +54,24 @@ func TestParseToken(t *testing.T) {
// 生成一个有效的 token 用于解析测试
validToken, err := service.GenerateToken(userID)
if err != nil {
t.Fatalf("Failed to generate valid token for parsing test: %v", err)
t.Fatalf("为解析测试生成有效令牌失败: %v", err)
}
// 测试用例 1: 有效 token
claims, err := service.ParseToken(validToken)
if err != nil {
t.Errorf("ParseToken failed for valid token: %v", err)
t.Errorf("解析有效令牌失败: %v", err)
}
if claims.UserID != userID {
t.Errorf("Expected UserID %d, got %d for valid token", userID, claims.UserID)
t.Errorf("解析有效令牌时期望用户ID %d, 实际为 %d", userID, claims.UserID)
}
// 测试用例 2: 无效 token (例如, 错误的签名)
invalidToken := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImV4cCI6MTY3ODkwNTYwMCwiaXNzIjoicGlnLWZhcm0tY29udHJvbGxlciJ9.invalid_signature_here"
_, err = service.ParseToken(invalidToken)
if err == nil {
t.Error("ParseToken unexpectedly succeeded for invalid token")
t.Error("解析无效令牌意外成功")
}
// 测试用例 3: 过期 token (创建一个过期时间在过去的 token)
@@ -85,11 +85,11 @@ func TestParseToken(t *testing.T) {
expiredTokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, expiredClaims)
expiredTokenString, err := expiredTokenClaims.SignedString(testSecret)
if err != nil {
t.Fatalf("Failed to generate expired token: %v", err)
t.Fatalf("生成过期令牌失败: %v", err)
}
_, err = service.ParseToken(expiredTokenString)
if err == nil {
t.Error("ParseToken unexpectedly succeeded for expired token")
t.Error("解析过期令牌意外成功")
}
}