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>
This commit is contained in:
杭州明婳科技
2026-06-22 21:40:10 +08:00
parent 2cc8c70960
commit dcfd24b624
61 changed files with 5604 additions and 1299 deletions
-20
View File
@@ -6,8 +6,6 @@ import (
)
// IsBlank 检查字符串是否为空或仅包含空白字符
// 评分: ⭐⭐⭐⭐⭐
// 理由: 常用函数,正确处理 Unicode 空白字符
func IsBlank(s string) bool {
if s == "" {
return true
@@ -21,15 +19,11 @@ func IsBlank(s string) bool {
}
// IsNotBlank 检查字符串是否非空且不全是空白字符
// 评分: ⭐⭐⭐⭐⭐
// 理由: IsBlank 的反向,语义更清晰
func IsNotBlank(s string) bool {
return !IsBlank(s)
}
// IsAnyBlank 检查多个字符串中是否有任意一个为空或空白
// 评分: ⭐⭐⭐⭐
// 理由: 参数校验场景常用,避免多次调用 IsBlank
func IsAnyBlank(strs ...string) bool {
for _, s := range strs {
if IsBlank(s) {
@@ -40,8 +34,6 @@ func IsAnyBlank(strs ...string) bool {
}
// IsAllBlank 检查所有字符串是否都为空或空白
// 评分: ⭐⭐⭐⭐
// 理由: IsAnyBlank 的反向,适用于批量校验
func IsAllBlank(strs ...string) bool {
for _, s := range strs {
if IsNotBlank(s) {
@@ -52,8 +44,6 @@ func IsAllBlank(strs ...string) bool {
}
// DefaultIfBlank 如果字符串为空或空白,返回默认值
// 评分: ⭐⭐⭐⭐⭐
// 理由: 配置默认值场景常用,代码简洁
func DefaultIfBlank(s, def string) string {
if IsBlank(s) {
return def
@@ -62,8 +52,6 @@ func DefaultIfBlank(s, def string) string {
}
// IsEmpty 检查任意类型是否为空值
// 评分: ⭐⭐⭐
// 理由: 功能实用,但使用反射有性能开销;建议仅在必要时使用
// 支持: string, []T, map[K]V, nil, 零值
func IsEmpty(v any) bool {
if v == nil {
@@ -80,8 +68,6 @@ func IsEmpty(v any) bool {
}
// Trim 去除字符串首尾的空白字符(包括空格、制表符、换行符)
// 评分: ⭐⭐⭐⭐
// 理由: 比标准库 strings.Trim 更语义化,预设常用空白字符
func Trim(s string) string {
return trimFunc(s, unicode.IsSpace)
}
@@ -113,8 +99,6 @@ func trimRightFunc(s string, f func(rune) bool) string {
}
// Substr 截取子字符串(按 Unicode 字符计数)
// 评分: ⭐⭐⭐⭐
// 理由: 正确处理多字节字符(中文等),避免截断
// 参数: start 起始位置(支持负数从末尾计算),length 截取长度
func Substr(s string, start, length int) string {
runes := []rune(s)
@@ -147,15 +131,11 @@ func Substr(s string, start, length int) string {
}
// StrLen 获取字符串的 Unicode 字符数
// 评分: ⭐⭐⭐⭐⭐
// 理由: 正确计算多字节字符长度,比 len() 更准确
func StrLen(s string) int {
return utf8.RuneCountInString(s)
}
// EqualsIgnoreCase 不区分大小写比较字符串
// 评分: ⭐⭐⭐⭐
// 理由: 常用比较函数,使用标准库实现保证正确性
func EqualsIgnoreCase(a, b string) bool {
if a == b {
return true