feat 初次提交

This commit is contained in:
2026-01-03 14:26:09 +08:00
parent 18eb946934
commit 3ea3a3ac6d
48 changed files with 5420 additions and 1 deletions

56
utils/jwt.go Normal file
View File

@@ -0,0 +1,56 @@
package utils
import (
"context"
"errors"
"github.com/golang-jwt/jwt/v5"
"google.golang.org/grpc/metadata"
"strconv"
"time"
)
type Claims struct {
USN int64 `json:"usn"`
jwt.RegisteredClaims
}
func GenToken(usn int64, secret string, expires time.Duration) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, Claims{
USN: usn,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(expires)),
},
})
return token.SignedString([]byte(secret))
}
func ParseToken(tokenString string, secret string) (*Claims, error) {
if tokenString == "" {
return nil, errors.New("invalid token")
}
claims := &Claims{}
token, err := jwt.ParseWithClaims(tokenString, claims, func(_ *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
if err != nil {
return nil, err
}
if !token.Valid {
return nil, errors.New("invalid token")
}
return claims, nil
}
func ShouldBindUsn(ctx context.Context, usn *int64) bool {
if md, ok := metadata.FromIncomingContext(ctx); ok {
usnArr := md.Get("X-Usn")
if len(usnArr) == 0 || usnArr[0] == "" {
return false
}
s, _ := strconv.Atoi(usnArr[0])
if s > 0 {
*usn = int64(s)
}
}
return *usn > 0
}

23
utils/number.go Normal file
View File

@@ -0,0 +1,23 @@
package utils
import (
"math/rand"
"strconv"
)
// RandInt 生成 [min, max] 范围内的随机整数
func RandInt(min, max int) int {
if min > max {
min, max = max, min
}
return rand.Intn(max-min+1) + min
}
// StringToInt64 converts a string to int64, returns 0 if failed
func StringToInt64(s string) int64 {
i, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return 0
}
return i
}

24
utils/snowflake.go Normal file
View File

@@ -0,0 +1,24 @@
package utils
import (
"github.com/bwmarrin/snowflake"
"log"
)
var instance *snowflake.Node
func InitSnowflake(node int64) *snowflake.Node {
n, err := snowflake.NewNode(node)
if err != nil {
log.Fatalf("create snowflake's node failed: %v", err)
}
instance = n
return instance
}
func SnowflakeInstance() *snowflake.Node {
if instance == nil {
log.Fatal("snowflake's not init")
}
return instance
}

41
utils/workerpool.go Normal file
View File

@@ -0,0 +1,41 @@
package utils
import (
"sync"
)
// DefaultMaxWorkers 默认并发数
const DefaultMaxWorkers = 32
// WorkerPool 并发执行一批任务。
func WorkerPool(tasks []interface{}, taskFunc func(interface{}), maxWorkers ...int) {
if len(tasks) == 0 {
return
}
workers := DefaultMaxWorkers
if len(maxWorkers) > 0 && maxWorkers[0] > 0 {
workers = maxWorkers[0]
}
if workers > len(tasks) {
workers = len(tasks)
}
jobs := make(chan interface{}, len(tasks))
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for task := range jobs {
taskFunc(task)
}
}()
}
for _, task := range tasks {
jobs <- task
}
close(jobs)
wg.Wait()
}