输出消息改为中文
This commit is contained in:
@@ -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 服务器已停止。")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("解析过期令牌意外成功")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user