diff --git a/api/go/handler/admin/admin_handler.go b/api/go/handler/admin/admin_handler.go index c69727ea..b64ede19 100644 --- a/api/go/handler/admin/admin_handler.go +++ b/api/go/handler/admin/admin_handler.go @@ -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") } diff --git a/api/go/main.go b/api/go/main.go index 7b8cf8f7..eb99f673 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -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/") diff --git a/api/go/utils/string.go b/api/go/utils/common.go similarity index 59% rename from api/go/utils/string.go rename to api/go/utils/common.go index 174c4783..f3597012 100644 --- a/api/go/utils/string.go +++ b/api/go/utils/common.go @@ -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 { diff --git a/api/go/utils/strings.go b/api/go/utils/strings.go new file mode 100644 index 00000000..5a796d30 --- /dev/null +++ b/api/go/utils/strings.go @@ -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) +}