diff --git a/controller/admin.go b/controller/admin.go index 46634ab..86c35da 100644 --- a/controller/admin.go +++ b/controller/admin.go @@ -42,20 +42,32 @@ func AdminAdd(c *gin.Context) { func AdminLogList(c *gin.Context) { // 处理管理员日志列表请求 + type param struct { + Page int `json:"page"` + PaseSize int `json:"pageSize"` + UserName string `json:"username"` + Opration string `json:"operation"` + } + var p param + if err := c.ShouldBindJSON(&p); err != nil { + failed(c, "Invalid input: "+err.Error()) + return + } List := []*model.AdminLog{} db := util.MPool.GetGameDB() if db == nil { failed(c, "Failed to get database connection") return } - err := db.Select(&List, "SELECT * FROM admin_log ORDER BY createTime DESC") + err := db.Select(&List, "SELECT * FROM admin_log ORDER BY createTime DESC LIMIT ? OFFSET ?", p.PaseSize, (p.Page-1)*p.PaseSize) if err != nil { failed(c, "Failed to retrieve admin logs: "+err.Error()) return } - + var total int + db.Get(&total, "SELECT COUNT(*) FROM admin_log") success(c, &model.Result{ - Data: List, - Result: 0, + Data: List, + Total: total, }) } diff --git a/controller/common.go b/controller/common.go index f0a3839..9a6f43c 100644 --- a/controller/common.go +++ b/controller/common.go @@ -27,7 +27,7 @@ func failed(c *gin.Context, message string) { func USSendInfo() { c := cron.New() // 每天12:10触发 - _, err := c.AddFunc("15 12 * * *", func() { + _, err := c.AddFunc("15 13 * * *", func() { feishu.SendOperationMsg2(common.US_APP_ID) // 这里添加你的业务逻辑 }) diff --git a/data/data.db b/data/data.db new file mode 100644 index 0000000..a707a39 Binary files /dev/null and b/data/data.db differ diff --git a/feishu/server/server.go b/feishu/server/server.go index 4295bc9..a7838b3 100644 --- a/feishu/server/server.go +++ b/feishu/server/server.go @@ -42,7 +42,7 @@ func Server() { // 创建Client cli := larkws.NewClient(data.APP_ID, data.APP_SECRET, larkws.WithEventHandler(eventHandler), - larkws.WithLogLevel(larkcore.LogLevelDebug), + larkws.WithLogLevel(larkcore.LogLevelInfo), ) fmt.Printf("Start Feishu server success\n") // 启动客户端 diff --git a/go.mod b/go.mod index 2771d6d..c4a31bb 100644 --- a/go.mod +++ b/go.mod @@ -68,6 +68,7 @@ require ( github.com/xuri/efp v0.0.1 // indirect github.com/xuri/excelize/v2 v2.10.0 // indirect github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect + go.etcd.io/bbolt v1.4.3 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/sys v0.37.0 // indirect golang.org/x/text v0.30.0 // indirect diff --git a/go.sum b/go.sum index 3869ce2..a171c0e 100644 --- a/go.sum +++ b/go.sum @@ -227,6 +227,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/bbolt v1.4.3 h1:dEadXpI6G79deX5prL3QRNP6JB8UxVkqo4UPnHaNXJo= +go.etcd.io/bbolt v1.4.3/go.mod h1:tKQlpPaYCVFctUIgFKFnAlvbmB3tpy1vkTnDWohtc0E= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= diff --git a/log/app.log b/log/app.log index 9ac7c69..e69de29 100644 --- a/log/app.log +++ b/log/app.log @@ -1,104 +0,0 @@ -[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. - -[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - - using env: export GIN_MODE=release - - using code: gin.SetMode(gin.ReleaseMode) - -[GIN-debug] POST /api/auth/login --> backend/controller.Login (3 handlers) -[GIN-debug] GET /api/auth/Codes --> backend/controller.Codes (3 handlers) -[GIN-debug] POST /api/auth/phoneCode --> backend/controller.PhoneCode (3 handlers) -[GIN-debug] POST /api/auth/phoneLogin --> backend/controller.LoginCode (3 handlers) -[GIN-debug] POST /api/feishu/sendInfo --> backend/controller.FeishuSendInfo (3 handlers) -[GIN-debug] POST /api/feishu/sendInfo2 --> backend/controller.FeishuSendInfo2 (3 handlers) -[GIN-debug] POST /api/feishu/sendWeekInfo --> backend/controller.FeishuSendWeekInfo (3 handlers) -[GIN-debug] POST /api/feishu/updateApp --> backend/controller.FeishuUpdateApp (3 handlers) -[GIN-debug] POST /api/feishu/serverInfo --> backend/controller.FeishuServerInfo (3 handlers) -[GIN-debug] POST /api/feishu/notify --> backend/controller.FeishuNotify (3 handlers) -[GIN-debug] POST /api/feishu/notify/client --> backend/controller.FeishuNotifyClient (3 handlers) -[GIN-debug] POST /api/feishu/notify/order --> backend/controller.FeishuNotifyOrder (3 handlers) -[GIN-debug] POST /api/admin/list --> backend/controller.AdminList (4 handlers) -[GIN-debug] POST /api/admin/add --> backend/controller.AdminAdd (4 handlers) -[GIN-debug] POST /api/admin/log/list --> backend/controller.AdminLogList (4 handlers) -[GIN-debug] POST /api/log/user --> backend/controller.UserDetail (4 handlers) -[GIN-debug] POST /api/log/asset --> backend/controller.Asset (4 handlers) -[GIN-debug] POST /api/log/event --> backend/controller.Event (4 handlers) -[GIN-debug] POST /api/log/order --> backend/controller.Order (4 handlers) -[GIN-debug] POST /api/user/list --> backend/controller.UserList (4 handlers) -[GIN-debug] GET /api/user/info --> backend/controller.UserInfo (4 handlers) -[GIN-debug] POST /api/user/gm --> backend/controller.UserGM (4 handlers) -[GIN-debug] POST /api/user/ban --> backend/controller.UserBan (4 handlers) -[GIN-debug] POST /api/server/list --> backend/controller.AppList (4 handlers) -[GIN-debug] POST /api/server/serverList --> backend/controller.ServerList (4 handlers) -[GIN-debug] POST /api/server/addServer --> backend/controller.AddServer (4 handlers) -[GIN-debug] POST /api/server/nodeList --> backend/controller.NodeList (4 handlers) -[GIN-debug] POST /api/server/addNode --> backend/controller.AddNode (4 handlers) -[GIN-debug] POST /api/server/updateApp --> backend/controller.UpdateApp (4 handlers) -[GIN-debug] POST /api/server/updateAppFeishu --> backend/controller.UpdateAppFeishu (4 handlers) -[GIN-debug] POST /api/server/restart --> backend/controller.RestartServer (4 handlers) -[GIN-debug] POST /api/server/reload --> backend/controller.ReloadServer (4 handlers) -[GIN-debug] POST /api/statistics/level --> backend/controller.StatisticsLevel (4 handlers) -[GIN-debug] POST /api/statistics/order --> backend/controller.StatisticsOrder (4 handlers) -[GIN-debug] POST /api/statistics/info --> backend/controller.StatisticsInfo (4 handlers) -[GIN-debug] POST /api/statistics/heat --> backend/controller.StatisticsHeat (4 handlers) -[GIN-debug] POST /api/mail/send --> backend/controller.SendMail (4 handlers) -[GIN-debug] POST /api/mail/list --> backend/controller.MailList (4 handlers) -[GIN-debug] POST /api/mail/delete --> backend/controller.MailDelete (4 handlers) -[GIN-debug] POST /api/language/list --> backend/controller.Language (4 handlers) -[GIN-debug] POST /api/language/export --> backend/controller.LanguageExport (4 handlers) -[GIN-debug] POST /api/language/save --> backend/controller.LanguageSave (4 handlers) -[GIN-debug] POST /api/language/add --> backend/controller.LanguageAdd (4 handlers) -[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. -Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. -[GIN-debug] Listening and serving HTTP on :5320 -[GIN] 2025/11/10 - 17:24:59 | 401 | 0s | ::1 | GET "/api/user/info" -[GIN] 2025/11/10 - 17:24:59 | 404 | 0s | ::1 | POST "/api/auth/logout" -[GIN] 2025/11/10 - 17:25:11 | 200 | 151.2899ms | ::1 | POST "/api/auth/login" -[GIN] 2025/11/10 - 17:25:11 | 200 | 0s | ::1 | GET "/api/user/info" -[GIN] 2025/11/10 - 17:25:11 | 200 | 0s | ::1 | GET "/api/auth/Codes" -[GIN] 2025/11/10 - 17:25:12 | 200 | 445.1576ms | ::1 | POST "/api/statistics/info" -[GIN] 2025/11/10 - 17:25:25 | 200 | 13.3738348s | ::1 | POST "/api/statistics/heat" -[GIN] 2025/11/10 - 17:25:29 | 200 | 196.0188ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/10 - 17:58:13 | 200 | 114.2944ms | ::1 | POST "/api/server/list" -[GIN] 2025/11/10 - 17:58:13 | 200 | 72.9498ms | ::1 | POST "/api/server/serverList" -[GIN] 2025/11/10 - 17:58:34 | 400 | 21.008933s | ::1 | POST "/api/user/list" -[GIN] 2025/11/10 - 17:58:46 | 200 | 19.7306399s | ::1 | POST "/api/user/list" -[GIN] 2025/11/10 - 17:58:56 | 200 | 344.7428ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/10 - 17:58:58 | 200 | 54.8909ms | ::1 | POST "/api/server/list" -[GIN] 2025/11/10 - 17:58:58 | 200 | 79.213ms | ::1 | POST "/api/server/serverList" -[GIN] 2025/11/10 - 17:58:58 | 200 | 213.1083ms | ::1 | POST "/api/user/list" -[GIN] 2025/11/10 - 17:58:58 | 200 | 205.0455ms | ::1 | POST "/api/user/list" -2025/11/11 08:04:59 start statistics -2025/11/11 08:05:00 remain 2025-11-11 success -2025/11/11 08:05:01 remain 2025-11-10 success -2025/11/11 08:05:02 remain 2025-11-09 success -2025/11/11 08:05:03 remain 2025-11-08 success -2025/11/11 08:05:04 remain 2025-11-07 success -2025/11/11 08:05:05 remain 2025-11-06 success -2025/11/11 08:05:05 remain 2025-11-05 success -2025/11/11 08:05:06 remain 2025-11-04 success -2025/11/11 08:05:07 remain 2025-11-03 success -2025/11/11 08:05:08 remain 2025-11-02 success -2025/11/11 08:05:09 remain 2025-11-01 success -2025/11/11 08:05:10 remain 2025-10-31 success -2025/11/11 08:05:10 remain 2025-10-30 success -2025/11/11 08:05:11 remain 2025-10-29 success -2025/11/11 08:05:12 remain 2025-10-28 success -2025/11/11 08:05:13 remain 2025-10-27 success -2025/11/11 08:05:14 remain 2025-10-26 success -2025/11/11 08:05:15 remain 2025-10-25 success -2025/11/11 08:05:15 remain 2025-10-24 success -2025/11/11 08:05:16 remain 2025-10-23 success -2025/11/11 08:05:17 remain 2025-10-22 success -2025/11/11 08:05:18 remain 2025-10-21 success -2025/11/11 08:05:19 remain 2025-10-20 success -2025/11/11 08:05:20 remain 2025-10-19 success -2025/11/11 08:05:21 remain 2025-10-18 success -2025/11/11 08:05:21 remain 2025-10-17 success -2025/11/11 08:05:22 remain 2025-10-16 success -2025/11/11 08:05:23 remain 2025-10-15 success -2025/11/11 08:05:24 remain 2025-10-14 success -2025/11/11 08:05:24 remain 2025-10-13 success -2025/11/11 08:05:25 remain 2025-10-12 success -2025/11/11 08:05:25 end statistics -[GIN] 2025/11/11 - 09:46:47 | 200 | 667.9479ms | ::1 | POST "/api/user/list" -[GIN] 2025/11/11 - 09:46:50 | 200 | 504.1466ms | ::1 | POST "/api/log/user" diff --git a/main.go b/main.go index 41150bf..272bfe0 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,7 @@ func init() { // 让 gin 的日志也写入文件,并同时输出到控制台 gin.DefaultWriter = io.MultiWriter(file, os.Stdout) gin.DefaultErrorWriter = io.MultiWriter(file, os.Stderr) - + util.InitBBolt() common.Init() } diff --git a/model/admin.go b/model/admin.go index 338cde9..1ff457c 100644 --- a/model/admin.go +++ b/model/admin.go @@ -19,6 +19,7 @@ type Admin struct { Role int `json:"role" db:"role"` CreateTime int `json:"createTime" db:"createTime"` UpdateTime int `json:"updateTime" db:"updateTime"` + Remark string `json:"remark" db:"remark"` } type AdminLog struct { @@ -42,9 +43,11 @@ func (a *Admin) List() (*Result, error) { if err != nil { return nil, fmt.Errorf("failed to scan rows: %v", err) } + var total int + db.Get(&total, "SELECT COUNT(*) FROM admin") return &Result{ - Data: admins, - Result: 0, + Data: admins, + Total: total, }, nil } @@ -59,13 +62,15 @@ func (a *Admin) Add() (*Result, error) { a.CreateTime = int(util.Now()) a.UpdateTime = a.CreateTime a.Password, _ = util.Encrypt(a.Password) // 假设有一个加密函数 - _, err := db.NamedExec("INSERT INTO admin (`username`, `password`, `phone`, `email`, `token`, `group`, `status`, `role`, `createTime`, `updateTime`, `expires`) VALUES (:username, :password, :phone, :email, :token, :group, :status, :role, :createTime, :updateTime, :expires)", a) + _, err := db.NamedExec("INSERT INTO admin (`username`, `password`, `phone`, `email`, `token`, `group`, `status`, `role`, `createTime`, `updateTime`, `expires`, `remark`) VALUES (:username, :password, :phone, :email, :token, :group, :status, :role, :createTime, :updateTime, :expires, :remark)", a) if err != nil { return nil, fmt.Errorf("failed to add admin: %v", err) } + var total int + db.Get(&total, "SELECT COUNT(*) FROM admin") return &Result{ - Data: a, - Result: 0, + Data: a, + Total: total, }, nil } diff --git a/model/language.go b/model/language.go index 2339b99..44e05f0 100644 --- a/model/language.go +++ b/model/language.go @@ -86,7 +86,14 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) { // 导出为 xlsx 文件 f := excelize.NewFile() sheet := "Sheet1" - + SaveTime, _ := util.GetLanguageLastUpdate() + ExportTime, _ := util.GetLanguageExportLastUpdate() + if SaveTime <= ExportTime { + return map[string]interface{}{ + "code": 1, + "msg": "No changes since last export", + }, nil + } // 写表头 headers := []string{"Id", "key", "English", "ChineseSimplified", "Portuguese"} @@ -135,7 +142,22 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) { // 在 /data/docs 仓库中添加并提交该文件 repoDir := "/data/docs" - cmd := exec.Command("git", "pull") + cmd := exec.Command("git", "checkout", "main") + cmd.Dir = repoDir + if _, err := cmd.CombinedOutput(); err != nil { + // try to fetch and force-create/reset local main from origin/main + fetch := exec.Command("git", "fetch", "origin", "main") + fetch.Dir = repoDir + if fout, ferr := fetch.CombinedOutput(); ferr != nil { + return nil, fmt.Errorf("git fetch failed: %v: %s", ferr, string(fout)) + } + cmd = exec.Command("git", "checkout", "-B", "main", "origin/main") + cmd.Dir = repoDir + if out2, err2 := cmd.CombinedOutput(); err2 != nil { + return nil, fmt.Errorf("git checkout main failed: %v: %s", err2, string(out2)) + } + } + cmd = exec.Command("git", "pull") cmd.Dir = repoDir if out, err := cmd.CombinedOutput(); err != nil { return nil, fmt.Errorf("git pull failed: %v: %s", err, string(out)) @@ -165,9 +187,10 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) { if out, err := cmd.CombinedOutput(); err != nil { return nil, fmt.Errorf("git push failed: %v: %s", err, string(out)) } + util.SaveLanguageExportLastUpdate(util.Now()) // 将文件路径返回到调用方 return map[string]interface{}{ - "data": languages, + // "data": languages, "total": total, }, nil } @@ -189,6 +212,7 @@ func (l *LanguageMod) LanguageSave(langList []LanguageOp, admin string) error { if _, err := Db.Exec("DELETE FROM language WHERE `key` LIKE ?", "%obsolete%"); err != nil { return err } + util.SaveLanguageLastUpdate(util.Now()) return nil } diff --git a/model/mail.go b/model/mail.go index e7f168c..cf6a27c 100644 --- a/model/mail.go +++ b/model/mail.go @@ -31,8 +31,9 @@ type Mail struct { } type Result struct { - Data interface{} `json:"data"` - Result int `json:"result"` + Data interface{} `json:"data"` + Total int `json:"total"` + OperationList []string `json:"operationList,omitempty"` } func (m *Mail) MailList() (*Result, error) { @@ -48,13 +49,15 @@ func (m *Mail) MailList() (*Result, error) { if err != nil { return nil, fmt.Errorf("failed to scan rows: %v", err) } + var total int + Db.Get(&total, "SELECT COUNT(*) FROM system_mail_info") for _, v := range mail { v.AppId = m.AppId v.ServerId = m.ServerId } return &Result{ - Data: mail, - Result: 0, + Data: mail, + Total: total, }, nil } diff --git a/release/backend b/release/backend index 6768cd3..6d1767a 100644 Binary files a/release/backend and b/release/backend differ diff --git a/release/login_service/login b/release/login_service/login index 2948c6b..a1a2a1f 100644 Binary files a/release/login_service/login and b/release/login_service/login differ diff --git a/release/shipping_service/pack.sh b/release/shipping_service/pack.sh index 48ddb0d..db771bb 100644 --- a/release/shipping_service/pack.sh +++ b/release/shipping_service/pack.sh @@ -1,2 +1,2 @@ cd /data/admin_backend -GOOS=linux GOARCH=amd64 go build -o /data/admin_backend/release/shipping_service/shipping sdk/charge/main.go +GOOS=linux GOARCH=amd64 go build -o /data/admin_backend/release/shipping_service/shipping sdk/ship/main.go diff --git a/release/shipping_service/shipping b/release/shipping_service/shipping index 2d1fe16..54eded4 100644 Binary files a/release/shipping_service/shipping and b/release/shipping_service/shipping differ diff --git a/sdk/charge/conf/app.yml b/sdk/charge/conf/app.yml deleted file mode 100644 index 4293b40..0000000 --- a/sdk/charge/conf/app.yml +++ /dev/null @@ -1,5 +0,0 @@ -App: - name: "Admin Backend" - version: "1.0.0" - debug: true - port: 5250 diff --git a/sdk/login/conf/app.yml b/sdk/login/conf/app.yml index f1838b9..7a709ba 100644 --- a/sdk/login/conf/app.yml +++ b/sdk/login/conf/app.yml @@ -1,5 +1,5 @@ -App: - name: "Admin Backend" - version: "1.0.0" - debug: true - port: 5240 +name: "Admin Backend" +version: "1.0.0" +debug: true +port: 5240 + diff --git a/sdk/login/model/tuyou/tuyou.go b/sdk/login/model/tuyou/tuyou.go index 2dcbd38..daac5b6 100644 --- a/sdk/login/model/tuyou/tuyou.go +++ b/sdk/login/model/tuyou/tuyou.go @@ -1,15 +1,34 @@ package tuyou -import "github.com/gin-gonic/gin" +import ( + "backend/sdk/login/model/base" + "backend/util" + + "github.com/gin-gonic/gin" +) + +type TuyouModel struct { +} func Login(c *gin.Context) { - type TuyouParam struct { - Uid string `json:"uid" binding:"required"` - } + var p base.Param + // read parameters from query string for GET requests + p.Uid = c.Query("uid") + p.Token = c.Query("token") + p.AppId = util.Int(c.Query("appId")) + p.AreaCode = util.Int(c.Query("areaCode")) - var p TuyouParam - if err := c.BindJSON(&p); err != nil { - c.JSON(400, gin.H{"error": err.Error()}) + if p.Uid == "" || p.Token == "" { + c.JSON(400, gin.H{"error": "missing uid or token"}) return } + if err := (&TuyouModel{}).VerifyToken(p.Uid, p.Token); err != nil { + c.JSON(401, gin.H{"error": "invalid token"}) + return + } + util.LoginResponse(c, p.AppId, p.AreaCode) +} + +func (t *TuyouModel) VerifyToken(Uid string, Token string) error { + return nil } diff --git a/sdk/charge/README.MD b/sdk/ship/README.MD similarity index 100% rename from sdk/charge/README.MD rename to sdk/ship/README.MD diff --git a/sdk/charge/common/d.go b/sdk/ship/common/d.go similarity index 96% rename from sdk/charge/common/d.go rename to sdk/ship/common/d.go index 190e0c3..242a16a 100644 --- a/sdk/charge/common/d.go +++ b/sdk/ship/common/d.go @@ -1,4 +1,4 @@ -package chargecommon +package shipcommon import ( "os" diff --git a/sdk/ship/conf/app.yml b/sdk/ship/conf/app.yml new file mode 100644 index 0000000..62ebcd3 --- /dev/null +++ b/sdk/ship/conf/app.yml @@ -0,0 +1,4 @@ +name: "Admin Backend" +version: "1.0.0" +debug: true +port: 5250 diff --git a/sdk/charge/conf/server.yml b/sdk/ship/conf/server.yml similarity index 92% rename from sdk/charge/conf/server.yml rename to sdk/ship/conf/server.yml index b424eae..b1c332c 100644 --- a/sdk/charge/conf/server.yml +++ b/sdk/ship/conf/server.yml @@ -43,11 +43,11 @@ mysqls: password: 'pUf9tft9GOPjV1z855Jf2DpB5NUpGEc_' database: 'merge_pet_%d' idleTimeout: Infinity - - host: 'rm-f8zd2030feam53n43io.mysql.rds.aliyuncs.com' + - host: '127.0.0.1' name: 'log' port: 3306 user: 'root' - password: 'GWFj1cHaqjpzvcsHBWTFtLWtm8MUZKROx_wvbV6jPg==' + password: 'ggOb-PzivEoB6BqQaN3_yFYlVBqYBkE_CS8FtITy_Q==' database: 'game' idleTimeout: Infinity diff --git a/sdk/charge/log/charge.log b/sdk/ship/log/charge.log similarity index 100% rename from sdk/charge/log/charge.log rename to sdk/ship/log/charge.log diff --git a/sdk/charge/log/login.log b/sdk/ship/log/login.log similarity index 100% rename from sdk/charge/log/login.log rename to sdk/ship/log/login.log diff --git a/sdk/charge/main.go b/sdk/ship/main.go similarity index 83% rename from sdk/charge/main.go rename to sdk/ship/main.go index 26a5574..c8807d5 100644 --- a/sdk/charge/main.go +++ b/sdk/ship/main.go @@ -2,8 +2,10 @@ package main import ( "backend/common" - "backend/sdk/charge/model/test" - "backend/sdk/charge/model/tuyou" + shipcommon "backend/sdk/ship/common" + "backend/sdk/ship/model/test" + "backend/sdk/ship/model/tuyou" + "fmt" "io" "log" "os" @@ -35,5 +37,5 @@ func main() { ChargeApi.POST("test/charge", test.Charge) ChargeApi.POST("tuyou/charge", tuyou.Charge) } - r.Run(":5420") + r.Run(fmt.Sprintf(":%d", shipcommon.AppConf.Port)) } diff --git a/sdk/charge/model/base/base.go b/sdk/ship/model/base/base.go similarity index 100% rename from sdk/charge/model/base/base.go rename to sdk/ship/model/base/base.go diff --git a/sdk/charge/model/test/test.go b/sdk/ship/model/test/test.go similarity index 99% rename from sdk/charge/model/test/test.go rename to sdk/ship/model/test/test.go index 63fd083..a371202 100644 --- a/sdk/charge/model/test/test.go +++ b/sdk/ship/model/test/test.go @@ -2,7 +2,7 @@ package test import ( "backend/msg" - "backend/sdk/charge/model/base" + "backend/sdk/ship/model/base" "backend/util" "crypto/md5" "encoding/json" diff --git a/sdk/charge/model/tuyou/tuyou.go b/sdk/ship/model/tuyou/tuyou.go similarity index 99% rename from sdk/charge/model/tuyou/tuyou.go rename to sdk/ship/model/tuyou/tuyou.go index fd775fc..e575604 100644 --- a/sdk/charge/model/tuyou/tuyou.go +++ b/sdk/ship/model/tuyou/tuyou.go @@ -2,7 +2,7 @@ package tuyou import ( "backend/msg" - "backend/sdk/charge/model/base" + "backend/sdk/ship/model/base" "backend/util" "crypto/md5" "encoding/json" diff --git a/unit_test.go b/unit_test.go index 436abe3..5d772ca 100644 --- a/unit_test.go +++ b/unit_test.go @@ -45,12 +45,12 @@ func TestFeishu2(t *testing.T) { } func TestLogin(t *testing.T) { - ServerId, Host := util.GetUserInfo(1, 156, "test", "test") - fmt.Printf("ServerId:%d, Host:%s\n", ServerId, Host) + Port, Host, ServerId := util.GetUserInfo(1, 156, "test", "test") + fmt.Printf("ServerId:%d, Host:%s, Port:%d\n", ServerId, Host, Port) } func TestEncrypt(t *testing.T) { - str := "Z4rf7eZZe500dxa" + str := "usSdkMysql*1133" enc, _ := util.Encrypt(str) fmt.Println(enc) } diff --git a/util/bbolt.go b/util/bbolt.go new file mode 100644 index 0000000..a254f50 --- /dev/null +++ b/util/bbolt.go @@ -0,0 +1,78 @@ +package util + +import ( + "os" + "path/filepath" + + "go.etcd.io/bbolt" +) + +var bucket *bbolt.DB + +func InitBBolt() error { + // 初始化bbolt数据库的逻辑 + // ensure directory exists before opening DB + dbPath := "data/data.db" + if err := os.MkdirAll(filepath.Dir(dbPath), 0o755); err != nil { + return err + } + db, err := bbolt.Open(dbPath, 0600, nil) + if err != nil { + return err + } + + // keep the DB open for the package lifecycle + bucket = db + + // ensure the "kv" bucket exists + err = bucket.Update(func(tx *bbolt.Tx) error { + _, err := tx.CreateBucketIfNotExists([]byte("kv")) + return err + }) + if err != nil { + // cleanup on failure to initialize buckets + _ = bucket.Close() + bucket = nil + return err + } + + return nil +} + +func saveBBolt(key string, value interface{}) error { + newValue := String(value) + err := bucket.Update(func(tx *bbolt.Tx) error { + b := tx.Bucket([]byte("kv")) + return b.Put([]byte(key), []byte(newValue)) + }) + return err +} + +func getBBolt(key string) (string, error) { + var value string + err := bucket.View(func(tx *bbolt.Tx) error { + b := tx.Bucket([]byte("kv")) + v := b.Get([]byte(key)) + value = string(v) + return nil + }) + return value, err +} + +func SaveLanguageLastUpdate(timestamp interface{}) error { + return saveBBolt("language_last_update", timestamp) +} + +func GetLanguageLastUpdate() (int, error) { + v, e := getBBolt("language_last_update") + return Int(v), e +} + +func SaveLanguageExportLastUpdate(timestamp interface{}) error { + return saveBBolt("language_export_last_update", timestamp) +} + +func GetLanguageExportLastUpdate() (int, error) { + v, e := getBBolt("language_export_last_update") + return Int(v), e +} diff --git a/util/login.go b/util/login.go index 9c84d6b..4e7f5b3 100644 --- a/util/login.go +++ b/util/login.go @@ -13,11 +13,11 @@ type ServerConfig struct { func LoginResponse(c *gin.Context, AppId, AreaCode int) { Uid := c.GetString("Uid") Token := c.GetString("Token") - Port, Host := GetUserInfo(AppId, AreaCode, Uid, Token) - LoginSuccess(c, "login success", Port, Host) + Port, Host, ServerId := GetUserInfo(AppId, AreaCode, Uid, Token) + LoginSuccess(c, "login success", Port, Host, ServerId) } -func GetUserInfo(AppId, AreaCode int, Uid, Token string) (int, string) { +func GetUserInfo(AppId, AreaCode int, Uid, Token string) (int, string, int) { Db := MPool.GetGameDB() defer Db.Close() var ServerId int @@ -29,7 +29,7 @@ func GetUserInfo(AppId, AreaCode int, Uid, Token string) (int, string) { } ServerList := GetServerInfo(AppId, AreaCode) if len(ServerList) == 0 { - return 0, "" + return 0, "", 0 } if ServerId == 0 { ServerId = ServerList[0].ServerId @@ -44,11 +44,11 @@ func GetUserInfo(AppId, AreaCode int, Uid, Token string) (int, string) { } } if ServerId == 0 { - return 0, "" + return 0, "", 0 } _, err := Db.Exec("insert into user (Uid, AppId, ServerId, AuthCode, CreateTime, UpdateTime) values (?, ?, ?, ?, ?, ?)", Uid, AppId, ServerId, Token, Now(), Now()) if err != nil { - return 0, "" + return 0, "", 0 } } else { for _, server := range ServerList { @@ -60,7 +60,7 @@ func GetUserInfo(AppId, AreaCode int, Uid, Token string) (int, string) { } Db.Exec("update user set AuthCode = ?, UpdateTime = ? where Uid = ?", Token, Now(), Uid) } - return Port, Host + return Port, Host, ServerId } func GetServerInfo(AppId, AreaCode int) []ServerConfig { diff --git a/util/util.go b/util/util.go index 4375ce4..eb216da 100644 --- a/util/util.go +++ b/util/util.go @@ -110,6 +110,44 @@ func Int(a interface{}) int { return 0 } +func String(a interface{}) string { + if a == nil { + return "" + } + switch v := a.(type) { + case string: + return v + case int: + return strconv.Itoa(v) + case int32: + return strconv.Itoa(int(v)) + case int64: + return strconv.FormatInt(v, 10) + case float64: + return strconv.FormatFloat(v, 'f', -1, 64) + case []byte: + return string(v) + default: + rv := reflect.ValueOf(a) + if !rv.IsValid() { + return "" + } + // unwrap pointer + if rv.Kind() == reflect.Ptr && !rv.IsNil() { + rv = rv.Elem() + } + kind := rv.Kind() + // if it's a struct/map/slice/array convert to JSON + if kind == reflect.Struct || kind == reflect.Map || kind == reflect.Slice || kind == reflect.Array { + b, err := json.Marshal(a) + if err == nil { + return string(b) + } + } + return "" + } +} + func InArray(Id int, s []int) bool { for _, v := range s { if v == Id { @@ -423,11 +461,12 @@ func Success(c *gin.Context, message string) { }) } -func LoginSuccess(c *gin.Context, message string, Port int, Host string) { +func LoginSuccess(c *gin.Context, message string, Port int, Host string, ServerId int) { c.JSON(200, gin.H{ - "code": 0, - "message": message, - "Port": Port, - "Host": Host, + "code": 0, + "message": message, + "Port": Port, + "Host": Host, + "ServerId": ServerId, }) }