diff --git a/backend/country/src/logic/create.go b/backend/country/src/logic/create.go index 67c88d8..505930c 100644 --- a/backend/country/src/logic/create.go +++ b/backend/country/src/logic/create.go @@ -4,7 +4,7 @@ import ( "net/http" "country/db" "time" - + "github.com/google/uuid" // 补充uuid导入(原代码使用但未显示导入) "github.com/gin-gonic/gin" "go.uber.org/zap" ) @@ -29,31 +29,84 @@ type CreateData struct { // CreateHandler 处理国家创建逻辑 func CreateHandler(c *gin.Context) { - - tartTime := time.Now() + startTime := time.Now() reqID := c.Request.Header.Get("X-RegisterRequest-ID") if reqID == "" { reqID = uuid.New().String() + zap.L().Debug("生成新的请求ID", zap.String("req_id", reqID)) } - // 使用zap.Info记录开始处理日志,添加请求ID字段 - zap.L().Info("⌛️ 收到注册请求,开始处理", zap.String("req_id", reqID)) + + // 标准化日志字段,增加请求路径和方法 + zap.L().Info("收到国家创建请求", + zap.String("req_id", reqID), + zap.String("path", c.Request.URL.Path), + zap.String("method", c.Request.Method), + ) var req CreateRequest // 绑定并验证请求参数 if err := c.ShouldBindJSON(&req); err != nil { - zap.L().Warn("❗ 请求参数验证失败", zap.Error(err)) + zap.L().Warn("请求参数验证失败", + zap.String("req_id", reqID), + zap.Error(err), + zap.Any("request_body", c.Request.Body), + ) c.JSON(http.StatusBadRequest, CreateResponse{ Success: false, - Message: "name和code为必填参数,不能为空", + Message: "请求参数错误:name和code为必填项", }) return } - // 在country表中创建记录并获取ID - var countryID string - err := db.DB.QueryRow("INSERT INTO \"country\" DEFAULT VALUES RETURNING id").Scan(&countryID) + // 记录有效请求参数(敏感信息需脱敏,此处假设name和code非敏感) + zap.L().Debug("请求参数验证通过", + zap.String("req_id", reqID), + zap.String("name", req.Name), + zap.String("code", req.Code), + ) + + // 开启事务(将事务提前,确保country表插入也在事务中) + tx, err := db.DB.Begin() if err != nil { - zap.L().Error("❌ 插入country表失败", zap.Error(err)) + zap.L().Error("事务开启失败", + zap.String("req_id", reqID), + zap.Error(err), + ) + c.JSON(http.StatusInternalServerError, CreateResponse{ + Success: false, + Message: "系统错误,请稍后重试", + }) + return + } + defer func() { + // 发生panic时回滚事务 + if r := recover(); r != nil { + if err := tx.Rollback(); err != nil { + zap.L().Error("panic后事务回滚失败", + zap.String("req_id", reqID), + zap.Error(err), + ) + } + zap.L().Error("事务处理发生panic", + zap.String("req_id", reqID), + zap.Any("recover", r), + ) + c.JSON(http.StatusInternalServerError, CreateResponse{ + Success: false, + Message: "系统错误,请稍后重试", + }) + } + }() + + // 在country表中创建记录并获取ID(纳入事务管理) + var countryID string + err = tx.QueryRow("INSERT INTO \"country\" DEFAULT VALUES RETURNING id").Scan(&countryID) + if err != nil { + tx.Rollback() + zap.L().Error("country表插入失败", + zap.String("req_id", reqID), + zap.Error(err), + ) c.JSON(http.StatusInternalServerError, CreateResponse{ Success: false, Message: "创建国家记录失败", @@ -61,29 +114,20 @@ func CreateHandler(c *gin.Context) { return } - // 开启事务 - tx, err := db.DB.Begin() - if err != nil { - zap.L().Error("❌ 开启事务失败", zap.Error(err)) - c.JSON(http.StatusInternalServerError, CreateResponse{ - Success: false, - Message: "系统错误,无法开启事务", - }) - return - } - defer func() { - // 发生panic时回滚事务 - if r := recover(); r != nil { - tx.Rollback() - zap.L().Error("❌事务处理发生panic", zap.Any("recover", r)) - } - }() + zap.L().Debug("country表插入成功", + zap.String("req_id", reqID), + zap.String("country_id", countryID), + ) // 插入name表 _, err = tx.Exec("INSERT INTO name (country_id, name) VALUES ($1, $2)", countryID, req.Name) if err != nil { tx.Rollback() - zap.L().Error("❌插入name表失败", zap.Error(err), zap.String("country_id", countryID)) + zap.L().Error("name表插入失败", + zap.String("req_id", reqID), + zap.String("country_id", countryID), + zap.Error(err), + ) c.JSON(http.StatusInternalServerError, CreateResponse{ Success: false, Message: "保存名称信息失败", @@ -95,7 +139,11 @@ func CreateHandler(c *gin.Context) { _, err = tx.Exec("INSERT INTO code (country_id, code) VALUES ($1, $2)", countryID, req.Code) if err != nil { tx.Rollback() - zap.L().Error("❌插入code表失败", zap.Error(err), zap.String("country_id", countryID)) + zap.L().Error("code表插入失败", + zap.String("req_id", reqID), + zap.String("country_id", countryID), + zap.Error(err), + ) c.JSON(http.StatusInternalServerError, CreateResponse{ Success: false, Message: "保存代码信息失败", @@ -105,17 +153,27 @@ func CreateHandler(c *gin.Context) { // 提交事务 if err := tx.Commit(); err != nil { - tx.Rollback() - zap.L().Error("❌提交事务失败", zap.Error(err), zap.String("country_id", countryID)) + tx.Rollback() // 尝试回滚提交失败的事务 + zap.L().Error("事务提交失败", + zap.String("req_id", reqID), + zap.String("country_id", countryID), + zap.Error(err), + ) c.JSON(http.StatusInternalServerError, CreateResponse{ Success: false, - Message: "提交数据失败", + Message: "数据提交失败,请稍后重试", }) return } + // 记录请求处理耗时 duration := time.Since(startTime) - + zap.L().Info("国家创建请求处理完成", + zap.String("req_id", reqID), + zap.String("country_id", countryID), + zap.Duration("duration", duration), + ) + // 返回成功响应 c.JSON(http.StatusOK, CreateResponse{ Success: true,