添加MongoDB认证支持并优化序列号生成工具
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"net"
|
||||
"reflect"
|
||||
"sort"
|
||||
@@ -339,3 +340,44 @@ func Struct(params any, pointer any) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// IncrSequence 自增序列号 - 通用序列号工具
|
||||
func IncrSequence(ctx context.Context, prefix string, incrLen int, seqSep string) (string, error) {
|
||||
// 1. 校验incrLen合法性(至少1位,最多10位,避免位数过大)
|
||||
if incrLen < 1 || incrLen > 8 {
|
||||
g.Log().Warningf(ctx, "自增数位数[%d]不合法,默认使用8位", incrLen)
|
||||
incrLen = 8 // 兜底默认8位
|
||||
}
|
||||
// 2. 获取当前时间,格式化为"年月日"(如20260226)
|
||||
timeStr := gtime.Now().Format("Ymd")
|
||||
// 3. 拼接Redis的key(seq:前缀:时间字符串),确保每天一个独立的自增序列
|
||||
redisKey := fmt.Sprintf("%s:%s:%s", "SEQ", prefix, timeStr)
|
||||
// 4. 调用Redis的Incr做自增,失败则生成兜底序列号
|
||||
seqNum, err := g.Redis().Incr(ctx, redisKey)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("redis自增失败: %w", err)
|
||||
}
|
||||
// 5. 自动清理过期key,定时任务
|
||||
|
||||
// 6. 校验自增数是否超过incrLen位上限,超过则取模(避免格式混乱)
|
||||
maxSeq := intPow10(incrLen) - 1
|
||||
if seqNum > int64(maxSeq) {
|
||||
return "", fmt.Errorf("自增数[%d]超过%d位上限[%d]", seqNum, incrLen, maxSeq)
|
||||
}
|
||||
// 7. 格式化自增数为指定位数,不足补零
|
||||
seqFormat := fmt.Sprintf("%%0%dd", incrLen) // 动态生成格式化字符串
|
||||
seqStr := fmt.Sprintf(seqFormat, seqNum)
|
||||
// 8. 拼接最终序列号
|
||||
finalSeq := fmt.Sprintf("%s%s%s%s%s", prefix, seqSep, timeStr, seqSep, seqStr)
|
||||
|
||||
return finalSeq, nil
|
||||
}
|
||||
|
||||
// intPow10 计算10的n次方(辅助函数,如intPow10(6)=1000000)
|
||||
func intPow10(n int) int {
|
||||
result := 1
|
||||
for i := 0; i < n; i++ {
|
||||
result *= 10
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user