diff --git a/.gitignore b/.gitignore
index 4794692..f04e8b3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,4 @@
.vscode
*.log
goinit.sh
-gomod.sh
-/vendor/
\ No newline at end of file
+gomod.sh
\ No newline at end of file
diff --git a/vendor/go.dtapp.net/gostring/.drone.yml b/vendor/go.dtapp.net/gostring/.drone.yml
new file mode 100644
index 0000000..c56c479
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/.drone.yml
@@ -0,0 +1,17 @@
+kind: pipeline
+type: docker
+name: clone
+
+steps:
+ - name: Test
+ image: golang:1.18
+ commands:
+ - go env -w GO111MODULE=on
+ - go env -w GOPROXY=https://goproxy.cn,direct
+ - go test -v ./...
+ - name: Benchmark
+ image: golang:1.18
+ commands:
+ - go env -w GO111MODULE=on
+ - go env -w GOPROXY=https://goproxy.cn,direct
+ - go test -bench=. -benchmem
\ No newline at end of file
diff --git a/vendor/go.dtapp.net/gostring/.gitignore b/vendor/go.dtapp.net/gostring/.gitignore
new file mode 100644
index 0000000..8f33b64
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/.gitignore
@@ -0,0 +1,7 @@
+.env
+.git
+.svn
+.idea
+.vscode
+*.log
+gomod.sh
\ No newline at end of file
diff --git a/vendor/go.dtapp.net/gostring/LICENSE b/vendor/go.dtapp.net/gostring/LICENSE
new file mode 100644
index 0000000..ff84bbf
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 李光春
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/go.dtapp.net/gostring/README.md b/vendor/go.dtapp.net/gostring/README.md
new file mode 100644
index 0000000..fc529be
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/README.md
@@ -0,0 +1,17 @@
+
+
+📦 Golang 字符串处理
+
+[comment]: <> (go)
+[![godoc](https://pkg.go.dev/badge/go.dtapp.net/gostring?status.svg)](https://pkg.go.dev/go.dtapp.net/gostring)
+[![goproxy.cn](https://goproxy.cn/stats/go.dtapp.net/gostring/badges/download-count.svg)](https://goproxy.cn/stats/go.dtapp.net/gostring)
+[![goreportcard.com](https://goreportcard.com/badge/go.dtapp.net/gostring)](https://goreportcard.com/report/go.dtapp.net/gostring)
+[![deps.dev](https://img.shields.io/badge/deps-go-red.svg)](https://deps.dev/go/go.dtapp.net%2Fgostring)
+
+#### 安装
+
+```go
+go get -v -u go.dtapp.net/gostring
+```
diff --git a/vendor/go.dtapp.net/gostring/gostring.go b/vendor/go.dtapp.net/gostring/gostring.go
new file mode 100644
index 0000000..0929b2f
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/gostring.go
@@ -0,0 +1,152 @@
+package gostring
+
+import (
+ "crypto/hmac"
+ "crypto/sha256"
+ "encoding/hex"
+ "fmt"
+ "strconv"
+ "strings"
+ "unicode/utf8"
+)
+
+// ToString 转换成string
+func ToString(value interface{}) string {
+ if value == nil {
+ return ""
+ }
+ return fmt.Sprint(value)
+}
+
+// ToFloat64 string到float64
+func ToFloat64(s string) float64 {
+ i, _ := strconv.ParseFloat(s, 64)
+ return i
+}
+
+// ToInt string到int
+func ToInt(s string) int {
+ i, _ := strconv.Atoi(s)
+ return i
+}
+
+// ToInt64 string到int64
+func ToInt64(s string) int64 {
+ i, err := strconv.ParseInt(s, 10, 64)
+ if err == nil {
+ return i
+ }
+ return int64(ToFloat64(s))
+}
+
+// ToUint string到uint64
+func ToUint(s string) uint {
+ i, err := strconv.ParseUint(s, 10, 64)
+ if err == nil {
+ return uint(i)
+ }
+ return 0
+}
+
+// ToUint64 string到uint64
+func ToUint64(s string) uint64 {
+ i, err := strconv.ParseUint(s, 10, 64)
+ if err == nil {
+ return i
+ }
+ return 0
+}
+
+// Replace 字符串替换
+func Replace(str, old, new string) string {
+ return strings.Replace(str, old, new, -1)
+}
+
+func HmacSha256Hex(key, strToSign string) string {
+ hasHer := hmac.New(sha256.New, []byte(key))
+ hasHer.Write([]byte(strToSign))
+ return hex.EncodeToString(hasHer.Sum(nil))
+}
+
+// Space 去除空格
+func Space(str string) string {
+ return strings.Replace(str, " ", "", -1)
+}
+
+// LineBreak 去除换行符
+func LineBreak(str string) string {
+ return strings.Replace(str, "\n", "", -1)
+}
+
+// SpaceAndLineBreak 去除空格和去除换行符
+func SpaceAndLineBreak(str string) string {
+ return LineBreak(Space(str))
+}
+
+// TrimLastChar 删除字符串中的最后一个
+func TrimLastChar(s string) string {
+ r, size := utf8.DecodeLastRuneInString(s)
+ if r == utf8.RuneError && (size == 0 || size == 1) {
+ size = 0
+ }
+ return s[:len(s)-size]
+}
+
+// Split 字符串分隔
+func Split(s string, sep string) []string {
+ if len(s) <= 0 {
+ return []string{}
+ }
+ return strings.Split(s, sep)
+}
+
+// Contains 判断字符串是否包含某个字符
+func Contains(s, sep string) bool {
+ return strings.Contains(s, sep)
+}
+
+func NumericalToString(value interface{}) (string, bool) {
+ var val string
+
+ switch value.(type) {
+ default:
+ return "0", false
+ case int:
+ intVal, _ := value.(int)
+ val = strconv.FormatInt(int64(intVal), 10)
+ case int8:
+ intVal, _ := value.(int8)
+ val = strconv.FormatInt(int64(intVal), 10)
+ case int16:
+ intVal, _ := value.(int16)
+ val = strconv.FormatInt(int64(intVal), 10)
+ case int32:
+ intVal, _ := value.(int32)
+ val = strconv.FormatInt(int64(intVal), 10)
+ case int64:
+ intVal, _ := value.(int64)
+ val = strconv.FormatInt(int64(intVal), 10)
+ case uint:
+ intVal, _ := value.(uint)
+ val = strconv.FormatUint(uint64(intVal), 10)
+ case uint8:
+ intVal, _ := value.(uint8)
+ val = strconv.FormatUint(uint64(intVal), 10)
+ case uint16:
+ intVal, _ := value.(uint16)
+ val = strconv.FormatUint(uint64(intVal), 10)
+ case uint32:
+ intVal, _ := value.(uint32)
+ val = strconv.FormatUint(uint64(intVal), 10)
+ case uint64:
+ intVal, _ := value.(uint64)
+ val = strconv.FormatUint(intVal, 10)
+ case float32:
+ floatVal, _ := value.(float32)
+ val = strconv.FormatFloat(float64(floatVal), 'f', -1, 32)
+ case float64:
+ floatVal, _ := value.(float64)
+ val = strconv.FormatFloat(floatVal, 'f', -1, 64)
+ }
+ return val, true
+}
diff --git a/vendor/go.dtapp.net/gostring/version.go b/vendor/go.dtapp.net/gostring/version.go
new file mode 100644
index 0000000..e38a843
--- /dev/null
+++ b/vendor/go.dtapp.net/gostring/version.go
@@ -0,0 +1,3 @@
+package gostring
+
+const Version = "1.0.5"
diff --git a/vendor/modules.txt b/vendor/modules.txt
new file mode 100644
index 0000000..a7865ec
--- /dev/null
+++ b/vendor/modules.txt
@@ -0,0 +1,3 @@
+# go.dtapp.net/gostring v1.0.5
+## explicit; go 1.18
+go.dtapp.net/gostring