Files
xlgo-core/response/response.go
T
杭州明婳科技 dcfd24b624 release: v1.0.3 bug fix release
v1.0.3 定位为 bug fix release,收口 v1.0.2 引入的破坏性清理并修复
4 个轻量 bug + 依赖复查 + 版本号治理 + 文档对齐。同时包含此前未提交
的 v1.0.2 全部工作。

v1.0.3 变更:

Fixed:
- generateJTI 忽略 rand.Read 错误(jwt)— 改为 (string, error) 并传播
- QueryBuilder.Page Count 受残留 Limit 截断(repository)— countDB 加 Limit(-1).Offset(-1)
- OSS/本地存储文件名冲突(storage)— 新增 uniqueFilename 加 8 字节随机后缀
- 数据库重试策略对不可恢复错误无效(database)— 新增 isTransientDBError

Dependencies:
- go mod tidy 补全 postgres 方言传递依赖;安全补丁升级
  x/crypto v0.49→v0.53、golang-jwt/jwt/v5 v5.2.1→v5.3.1、gorilla/websocket v1.5.1→v1.5.3

Removed:
- Breaking: 清理 v1.0.2 兼容别名(InitMySQL* / driverName)
- 死代码 database.DBResolver
- 代码中 292 行"评分/理由"自夸注释(#26,23 个文件)

Changed:
- Breaking: 错误码体系重构 CodeSuccess 1→0、CodeFail 0→1,删除 CodeInvalidParams,加编译期防撞码
- database/mysql.go → manager.go;Logger 拆分三独立 core 修复 Tee 重复写入
- 版本号常量化:app.go 新增 const Version 作为唯一来源,CLI/脚手架模板引用之,不再散落字面量

Security:
- CORS 中间件按 W3C 规范修复 Allow-Credentials / Vary: Origin / 非白名单不回显

Added:
- console 包显式 level 控制(SetLevel/WithLevel/LevelSilent,atomic.Int32 并发安全)
- 新增测试 jwt/repository/storage/database/router/middleware/app
- 文档:新增 CHANGELOG.md、Version_v1.0.2_report.md;更新 README/GUIDE 顶部更新日志
- 文档对齐:删除对不存在的 config.DefaultManager() getter 的描述(保持 API 与文档一致)

详见 CHANGELOG.md 与 README.md 更新日志。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 21:40:10 +08:00

141 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package response
import (
"net/http"
"github.com/EthanCodeCraft/xlgo-core/utils"
"github.com/gin-gonic/gin"
)
// Response 统一响应结构
type Response struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data any `json:"data,omitempty"`
RequestID string `json:"request_id,omitempty"` // 请求追踪ID
}
// PageData 分页数据结构
type PageData struct {
Items any `json:"items"`
Total int64 `json:"total"`
Page int `json:"page"`
PageSize int `json:"page_size"`
}
// getRequestID 从上下文获取请求ID
func getRequestID(c *gin.Context) string {
return c.GetString("request_id")
}
// Success 成功响应
func Success(c *gin.Context, data any) {
c.JSON(http.StatusOK, Response{
Code: CodeSuccess,
Msg: "操作成功",
Data: data,
RequestID: getRequestID(c),
})
}
// SuccessWithMsg 成功响应(自定义消息)
func SuccessWithMsg(c *gin.Context, msg string, data any) {
c.JSON(http.StatusOK, Response{
Code: CodeSuccess,
Msg: msg,
Data: data,
RequestID: getRequestID(c),
})
}
// Fail 失败响应
func Fail(c *gin.Context, msg string) {
c.JSON(http.StatusOK, Response{
Code: CodeFail,
Msg: msg,
RequestID: getRequestID(c),
})
}
// FailWithCode 失败响应(自定义错误码)
func FailWithCode(c *gin.Context, code int, msg string) {
c.JSON(http.StatusOK, Response{
Code: code,
Msg: msg,
RequestID: getRequestID(c),
})
}
// Unauthorized 未授权响应
func Unauthorized(c *gin.Context, msg string) {
c.JSON(http.StatusOK, Response{
Code: CodeUnauthorized,
Msg: msg,
RequestID: getRequestID(c),
})
}
// NotFound 资源不存在响应
func NotFound(c *gin.Context, msg string) {
c.JSON(http.StatusOK, Response{
Code: CodeNotFound,
Msg: msg,
RequestID: getRequestID(c),
})
}
// ServerError 服务器错误响应
func ServerError(c *gin.Context, msg string) {
c.JSON(http.StatusOK, Response{
Code: CodeServerError,
Msg: msg,
RequestID: getRequestID(c),
})
}
// RateLimit 请求过于频繁响应
func RateLimit(c *gin.Context) {
c.JSON(http.StatusOK, Response{
Code: CodeRateLimit,
Msg: "请求过于频繁,请稍后再试",
RequestID: getRequestID(c),
})
}
// Page 分页响应
func Page(c *gin.Context, items any, total int64, page, pageSize int) {
Success(c, PageData{
Items: items,
Total: total,
Page: page,
PageSize: pageSize,
})
}
// Download 文件下载响应
func Download(c *gin.Context, filename string, data []byte) {
c.Header("Content-Type", "application/octet-stream")
c.Header("Content-Disposition", "attachment; filename="+filename)
c.Header("Content-Length", utils.ToString(len(data)))
c.Data(http.StatusOK, "application/octet-stream", data)
}
// DownloadWithContentType 文件下载(自定义Content-Type
func DownloadWithContentType(c *gin.Context, filename string, contentType string, data []byte) {
c.Header("Content-Type", contentType)
c.Header("Content-Disposition", "attachment; filename="+filename)
c.Header("Content-Length", utils.ToString(len(data)))
c.Data(http.StatusOK, contentType, data)
}
// HTML HTML内容响应
func HTML(c *gin.Context, data string) {
c.Header("Content-Type", "text/html; charset=utf-8")
c.String(http.StatusOK, data)
}
// Redirect 页面跳转
func Redirect(c *gin.Context, code int, url string) {
c.Redirect(code, url)
}