mirror of
				https://github.com/yangjian102621/geekai.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	refactor: embed xdb file for ip2region
This commit is contained in:
		@@ -72,36 +72,40 @@ func (h *ManagerHandler) Session(c *gin.Context) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestUser 修正用户配置数据接口
 | 
			
		||||
// 将用户订阅角色的数据结构从 map 改成数组
 | 
			
		||||
func (h *ManagerHandler) TestUser(c *gin.Context) {
 | 
			
		||||
	var users []model.User
 | 
			
		||||
	h.db.Find(&users)
 | 
			
		||||
	for _, u := range users {
 | 
			
		||||
		var m map[string]int
 | 
			
		||||
		var roleKeys = make([]string, 0)
 | 
			
		||||
		err := utils.JsonDecode(u.ChatRoles, &m)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
// Migrate 数据修正
 | 
			
		||||
func (h *ManagerHandler) Migrate(c *gin.Context) {
 | 
			
		||||
	opt := c.Query("opt")
 | 
			
		||||
	switch opt {
 | 
			
		||||
	case "user":
 | 
			
		||||
		// 将用户订阅角色的数据结构从 map 改成数组
 | 
			
		||||
		var users []model.User
 | 
			
		||||
		h.db.Find(&users)
 | 
			
		||||
		for _, u := range users {
 | 
			
		||||
			var m map[string]int
 | 
			
		||||
			var roleKeys = make([]string, 0)
 | 
			
		||||
			err := utils.JsonDecode(u.ChatRoles, &m)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		for k, _ := range m {
 | 
			
		||||
			roleKeys = append(roleKeys, k)
 | 
			
		||||
		}
 | 
			
		||||
		u.ChatRoles = utils.JsonEncode(roleKeys)
 | 
			
		||||
		h.db.Updates(&u)
 | 
			
		||||
			for k, _ := range m {
 | 
			
		||||
				roleKeys = append(roleKeys, k)
 | 
			
		||||
			}
 | 
			
		||||
			u.ChatRoles = utils.JsonEncode(roleKeys)
 | 
			
		||||
			h.db.Updates(&u)
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		break
 | 
			
		||||
	case "role":
 | 
			
		||||
		// TestRole 修改角色图片,改成绝对路径
 | 
			
		||||
		var roles []model.ChatRole
 | 
			
		||||
		h.db.Find(&roles)
 | 
			
		||||
		for _, r := range roles {
 | 
			
		||||
			r.Icon = "/" + r.Icon
 | 
			
		||||
			h.db.Updates(&r)
 | 
			
		||||
		}
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
	resp.SUCCESS(c, "SUCCESS")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestRole 修改角色图片,改成绝对路径
 | 
			
		||||
func (h *ManagerHandler) TestRole(c *gin.Context) {
 | 
			
		||||
	var roles []model.ChatRole
 | 
			
		||||
	h.db.Find(&roles)
 | 
			
		||||
	for _, r := range roles {
 | 
			
		||||
		r.Icon = "/" + r.Icon
 | 
			
		||||
		h.db.Updates(&r)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	resp.SUCCESS(c, "SUCCESS")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,10 @@ import (
 | 
			
		||||
	logger2 "chatplus/logger"
 | 
			
		||||
	"chatplus/store"
 | 
			
		||||
	"context"
 | 
			
		||||
	"embed"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
@@ -22,10 +24,12 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var logger = logger2.GetLogger()
 | 
			
		||||
 | 
			
		||||
var configFile string
 | 
			
		||||
var debugMode bool
 | 
			
		||||
 | 
			
		||||
//go:embed res/ip2region.xdb
 | 
			
		||||
var xdbFS embed.FS
 | 
			
		||||
 | 
			
		||||
// AppLifecycle 应用程序生命周期
 | 
			
		||||
type AppLifecycle struct {
 | 
			
		||||
}
 | 
			
		||||
@@ -67,8 +71,11 @@ func main() {
 | 
			
		||||
 | 
			
		||||
		// 创建 Ip2Region 查询对象
 | 
			
		||||
		fx.Provide(func() (*xdb.Searcher, error) {
 | 
			
		||||
			dbPath := "res/ip2region.xdb"
 | 
			
		||||
			cBuff, err := xdb.LoadContentFromFile(dbPath)
 | 
			
		||||
			file, err := xdbFS.Open("res/ip2region.xdb")
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			cBuff, err := io.ReadAll(file)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
@@ -125,8 +132,7 @@ func main() {
 | 
			
		||||
			group.POST("login", h.Login)
 | 
			
		||||
			group.GET("logout", h.Logout)
 | 
			
		||||
			group.GET("session", h.Session)
 | 
			
		||||
			group.GET("test/user", h.TestUser)
 | 
			
		||||
			group.GET("test/role", h.TestRole)
 | 
			
		||||
			group.GET("migrate", h.Migrate)
 | 
			
		||||
		}),
 | 
			
		||||
		fx.Invoke(func(s *core.AppServer, h *admin.ApiKeyHandler) {
 | 
			
		||||
			group := s.Engine.Group("/api/admin/apikey/")
 | 
			
		||||
 
 | 
			
		||||
@@ -3,83 +3,12 @@ package utils
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
 | 
			
		||||
	"golang.org/x/crypto/sha3"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RandString generate rand string with specified length
 | 
			
		||||
func RandString(length int) string {
 | 
			
		||||
	str := "0123456789abcdefghijklmnopqrstuvwxyz"
 | 
			
		||||
	data := []byte(str)
 | 
			
		||||
	var result []byte
 | 
			
		||||
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
 | 
			
		||||
	for i := 0; i < length; i++ {
 | 
			
		||||
		result = append(result, data[r.Intn(len(data))])
 | 
			
		||||
	}
 | 
			
		||||
	return string(result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RandomNumber(bit int) int {
 | 
			
		||||
	rand.Seed(time.Now().UnixNano())
 | 
			
		||||
	min := 1 // min value
 | 
			
		||||
	max := 1 //max value
 | 
			
		||||
	for i := 0; i < bit; i++ {
 | 
			
		||||
		min = min * 10
 | 
			
		||||
		max = max * 10
 | 
			
		||||
	}
 | 
			
		||||
	max = max * 10
 | 
			
		||||
	return rand.Intn(max-min+1) + min
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ContainsStr(slice []string, item string) bool {
 | 
			
		||||
	for _, e := range slice {
 | 
			
		||||
		if e == item {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stamp2str 时间戳转字符串
 | 
			
		||||
func Stamp2str(timestamp int64) string {
 | 
			
		||||
	if timestamp == 0 {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Str2stamp 字符串转时间戳
 | 
			
		||||
func Str2stamp(str string) int64 {
 | 
			
		||||
	layout := "2006-01-02 15:04:05"
 | 
			
		||||
	t, err := time.Parse(layout, str)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return t.Unix()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GenPassword(pass string, salt string) string {
 | 
			
		||||
	data := []byte(pass + salt)
 | 
			
		||||
	hash := sha3.Sum256(data)
 | 
			
		||||
	return fmt.Sprintf("%x", hash)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JsonEncode(value interface{}) string {
 | 
			
		||||
	bytes, err := json.Marshal(value)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return string(bytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JsonDecode(src string, dest interface{}) error {
 | 
			
		||||
	return json.Unmarshal([]byte(src), dest)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CopyObject 拷贝对象
 | 
			
		||||
func CopyObject(src interface{}, dst interface{}) error {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										79
									
								
								api/go/utils/strings.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								api/go/utils/strings.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
package utils
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/sha3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RandString generate rand string with specified length
 | 
			
		||||
func RandString(length int) string {
 | 
			
		||||
	str := "0123456789abcdefghijklmnopqrstuvwxyz"
 | 
			
		||||
	data := []byte(str)
 | 
			
		||||
	var result []byte
 | 
			
		||||
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
 | 
			
		||||
	for i := 0; i < length; i++ {
 | 
			
		||||
		result = append(result, data[r.Intn(len(data))])
 | 
			
		||||
	}
 | 
			
		||||
	return string(result)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RandomNumber(bit int) int {
 | 
			
		||||
	rand.Seed(time.Now().UnixNano())
 | 
			
		||||
	min := 1 // min value
 | 
			
		||||
	max := 1 //max value
 | 
			
		||||
	for i := 0; i < bit; i++ {
 | 
			
		||||
		min = min * 10
 | 
			
		||||
		max = max * 10
 | 
			
		||||
	}
 | 
			
		||||
	max = max * 10
 | 
			
		||||
	return rand.Intn(max-min+1) + min
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ContainsStr(slice []string, item string) bool {
 | 
			
		||||
	for _, e := range slice {
 | 
			
		||||
		if e == item {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stamp2str 时间戳转字符串
 | 
			
		||||
func Stamp2str(timestamp int64) string {
 | 
			
		||||
	if timestamp == 0 {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Str2stamp 字符串转时间戳
 | 
			
		||||
func Str2stamp(str string) int64 {
 | 
			
		||||
	layout := "2006-01-02 15:04:05"
 | 
			
		||||
	t, err := time.Parse(layout, str)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	return t.Unix()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GenPassword(pass string, salt string) string {
 | 
			
		||||
	data := []byte(pass + salt)
 | 
			
		||||
	hash := sha3.Sum256(data)
 | 
			
		||||
	return fmt.Sprintf("%x", hash)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JsonEncode(value interface{}) string {
 | 
			
		||||
	bytes, err := json.Marshal(value)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return ""
 | 
			
		||||
	}
 | 
			
		||||
	return string(bytes)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func JsonDecode(src string, dest interface{}) error {
 | 
			
		||||
	return json.Unmarshal([]byte(src), dest)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user