feat 初次提交
This commit is contained in:
56
utils/jwt.go
Normal file
56
utils/jwt.go
Normal 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
23
utils/number.go
Normal 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
24
utils/snowflake.go
Normal 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
41
utils/workerpool.go
Normal 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()
|
||||
}
|
||||
Reference in New Issue
Block a user