diff --git a/conf/translater.yml b/conf/translater.yml index f514960..5462b3d 100644 --- a/conf/translater.yml +++ b/conf/translater.yml @@ -5,7 +5,4 @@ user: - account: "Daniela Cristina Schmitt" keys: "MergeData, cardName, GuideData, ChapterTip, DialogueData" keysType: "no_include" # keysType 不包含 - colunm: "key,en_US,pt_BR" - - account: "admin" # 账号名 - keys: "MergeData, cardName, GuideData, ChapterTip, DialogueData" # 需要的键值列表,逗号分隔 - colunm: "key,en_US,pt_BR" # 需要翻译的列名 \ No newline at end of file + colunm: "key,en_US,pt_BR" \ No newline at end of file diff --git a/controller/language.go b/controller/language.go index 5f0e470..a0d5a6b 100644 --- a/controller/language.go +++ b/controller/language.go @@ -66,3 +66,22 @@ func LanguageAdd(c *gin.Context) { } success(c, "添加成功") } + +func LanguageDelete(c *gin.Context) { + var request struct { + Key string `json:"key"` + } + err := c.BindJSON(&request) + if err != nil { + failed(c, err.Error()) + return + } + admin := c.GetString("admin") + langMod := &model.LanguageMod{} + err = langMod.LanguageDelete(request.Key, admin) + if err != nil { + failed(c, err.Error()) + return + } + success(c, "删除成功") +} diff --git a/controller/operation.go b/controller/operation.go new file mode 100644 index 0000000..fae1c92 --- /dev/null +++ b/controller/operation.go @@ -0,0 +1,70 @@ +package controller + +import ( + "backend/util" + "fmt" + + "github.com/gin-gonic/gin" +) + +func CopyUser(c *gin.Context) { + CopyUser := struct { + SrcAppID int `json:"src_app"` + DstAppID int `json:"dst_app"` + SrcUid int `json:"src_uid"` + DstUid int `json:"dst_uid"` + }{} + if err := c.BindJSON(&CopyUser); err != nil { + failed(c, "参数绑定失败: "+err.Error()) + return + } + err := CopyUserOperation(CopyUser.SrcAppID, CopyUser.DstAppID, CopyUser.SrcUid, CopyUser.DstUid) + if err != nil { + failed(c, "复制用户数据失败: "+err.Error()) + return + } + success(c, "复制用户数据成功") +} + +func CopyUserOperation(srcAppID, dstAppID, srcUid, dstUid int) error { + if dstAppID == 0 { + return fmt.Errorf("不能复制用户数据到正式环境") + } + type DbData struct { + DwUin int `db:"dwUin"` + MData string `db:"mData"` + UpdateTime int `db:"updateTime"` + } + SrcAppConf, err := util.GetAppConfig(srcAppID) + if err != nil { + return err + } + DstDb := &util.Db{} + SrcDb := util.MPool.GetMysqlDB(SrcAppConf, 1) + if srcAppID == dstAppID { + DstDb = SrcDb + } else { + DstAppConf, err := util.GetAppConfig(dstAppID) + if err != nil { + return err + } + DstDb = util.MPool.GetMysqlDB(DstAppConf, 1) + } + srcData := DbData{} + + err = SrcDb.Get(&srcData, "SELECT dwUin, mData, updateTime FROM t_player_mod WHERE dwUin = ? LIMIT 1", srcUid) + if err != nil { + return err + } + dstData := DbData{} + err = DstDb.Get(&dstData, "SELECT dwUin, mData, updateTime FROM t_player_mod WHERE dwUin = ? LIMIT 1", dstUid) + if err != nil { + return err + } + _, err = DstDb.Exec("UPDATE t_player_mod SET mData = ?, updateTime = ? WHERE dwUin = ?", srcData.MData, util.Now(), dstUid) + if err != nil { + return err + } + // 复制 User 表 + return nil +} diff --git a/data/data.db b/data/data.db index 4502d19..7edd441 100644 Binary files a/data/data.db and b/data/data.db differ diff --git a/go.mod b/go.mod index c4a31bb..c56c592 100644 --- a/go.mod +++ b/go.mod @@ -53,12 +53,15 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect + github.com/lestrrat-go/strftime v1.1.1 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/oschwald/geoip2-golang v1.13.0 // indirect github.com/oschwald/maxminddb-golang v1.13.0 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.4 // indirect github.com/tiendc/go-deepcopy v1.7.1 // indirect diff --git a/go.sum b/go.sum index a171c0e..8b4a5fe 100644 --- a/go.sum +++ b/go.sum @@ -159,6 +159,10 @@ github.com/larksuite/oapi-sdk-go/v3 v3.4.9 h1:ZzsPtdF2tsLbocQdKLNFwFCzWfwmKtD4kb github.com/larksuite/oapi-sdk-go/v3 v3.4.9/go.mod h1:ZEplY+kwuIrj/nqw5uSCINNATcH3KdxSN7y+UxYY5fI= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= +github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA= +github.com/lestrrat-go/strftime v1.1.1 h1:zgf8QCsgj27GlKBy3SU9/8MMgegZ8UCzlCyHYrUF0QU= +github.com/lestrrat-go/strftime v1.1.1/go.mod h1:YDrzHJAODYQ+xxvrn5SG01uFIQAeDTzpxNVppCz7Nmw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -180,6 +184,8 @@ github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnY github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= diff --git a/log/app.log b/log/app.log index 023a049..fc15b36 100644 --- a/log/app.log +++ b/log/app.log @@ -47,20 +47,127 @@ [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] POST /api/language/delete --> backend/controller.LanguageDelete (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/24 - 10:26:33 | 401 | 1.5059ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:26:33 | 404 | 0s | ::1 | POST "/api/auth/logout" -[GIN] 2025/11/24 - 10:26:41 | 200 | 170.3997ms | ::1 | POST "/api/auth/login" -[GIN] 2025/11/24 - 10:26:41 | 200 | 0s | ::1 | GET "/api/user/info" -[GIN] 2025/11/24 - 10:26:41 | 200 | 0s | ::1 | GET "/api/auth/Codes" -[GIN] 2025/11/24 - 10:26:42 | 200 | 408.8869ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:26:46 | 200 | 424.6395ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:26:56 | 200 | 311.5028ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:00 | 200 | 441.821ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:07 | 200 | 420.9389ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:22 | 200 | 305.5606ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:26 | 200 | 438.839ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:36 | 200 | 303.5182ms | ::1 | POST "/api/language/list" -[GIN] 2025/11/24 - 10:27:52 | 200 | 306.1256ms | ::1 | POST "/api/language/list" +[GIN] 2025/12/11 - 10:25:13 | 401 | 0s | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 10:25:13 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 10:25:29 | 200 | 253.1365ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 10:25:29 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 10:25:29 | 200 | 397.7438ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 10:25:31 | 200 | 309.585ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 10:25:31 | 200 | 1.1419178s | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 10:27:09 | 200 | 347.354ms | ::1 | POST "/api/server/list" +[GIN] 2025/12/11 - 10:27:09 | 200 | 661.8766ms | ::1 | POST "/api/log/order" +[GIN] 2025/12/11 - 10:27:12 | 200 | 115.9295ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 10:27:13 | 200 | 711.928ms | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 10:30:23 | 200 | 444.7127ms | ::1 | POST "/api/server/list" +[GIN] 2025/12/11 - 10:30:27 | 200 | 2.2220912s | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 10:30:29 | 200 | 5.3690768s | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 10:31:03 | 200 | 886.982ms | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 10:31:09 | 200 | 2.3555516s | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 11:33:28 | 200 | 395.5301ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:33:54 | 200 | 214.9095ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:34:30 | 200 | 305.7429ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:34:57 | 200 | 173.8177ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:35:17 | 200 | 217.7425ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:35:19 | 200 | 187.9784ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 11:35:20 | 200 | 921.4157ms | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 11:37:18 | 200 | 245.3772ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:37:45 | 200 | 517.2912ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:38:04 | 200 | 231.2394ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:38:20 | 200 | 280.0851ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:40:21 | 200 | 371.4347ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:40:23 | 200 | 518.4176ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 11:40:24 | 200 | 1.1721816s | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 11:41:08 | 200 | 132.7881ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:41:41 | 200 | 324.3031ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:43:29 | 200 | 376.0195ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:43:37 | 200 | 182.7374ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:43:48 | 200 | 203.6292ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:44:38 | 200 | 291.4693ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:44:57 | 200 | 234.8371ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:44:58 | 200 | 217.734ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 11:44:59 | 200 | 873.1764ms | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 11:45:45 | 200 | 105.532ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 11:45:47 | 200 | 890.5534ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 11:45:48 | 200 | 1.8967679s | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 11:46:17 | 200 | 253.1924ms | ::1 | POST "/api/server/list" +[GIN] 2025/12/11 - 11:46:17 | 200 | 347.3486ms | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 11:46:57 | 200 | 498.5131ms | ::1 | POST "/api/server/list" +[GIN] 2025/12/11 - 11:46:57 | 200 | 253.5674ms | ::1 | POST "/api/server/serverList" +[GIN] 2025/12/11 - 11:57:22 | 200 | 296.8985ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:00:58 | 200 | 474.8772ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:01:17 | 200 | 209.8177ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:01:43 | 200 | 1.2960524s | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:04:05 | 200 | 1.2864048s | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:04:06 | 200 | 366.8252ms | ::1 | POST "/api/statistics/heat" +[GIN] 2025/12/11 - 12:04:07 | 200 | 1.2401522s | ::1 | POST "/api/statistics/info" +[GIN] 2025/12/11 - 12:30:05 | 200 | 636.1973ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:30:29 | 200 | 232.0374ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 12:30:39 | 200 | 315.6206ms | ::1 | GET "/api/user/info" +2025/12/11 13:04:59 start statistics +2025/12/11 13:05:01 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:01 remain 2025-12-11 success +2025/12/11 13:05:03 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:03 remain 2025-12-10 success +2025/12/11 13:05:05 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:05 remain 2025-12-09 success +2025/12/11 13:05:06 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:06 remain 2025-12-08 success +2025/12/11 13:05:08 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:08 remain 2025-12-07 success +2025/12/11 13:05:10 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:10 remain 2025-12-06 success +2025/12/11 13:05:11 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:11 remain 2025-12-05 success +2025/12/11 13:05:13 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:13 remain 2025-12-04 success +2025/12/11 13:05:14 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:14 remain 2025-12-03 success +2025/12/11 13:05:17 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:17 remain 2025-12-02 success +2025/12/11 13:05:21 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:21 remain 2025-12-01 success +2025/12/11 13:05:24 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:24 remain 2025-11-30 success +2025/12/11 13:05:26 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:26 remain 2025-11-29 success +2025/12/11 13:05:29 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:29 remain 2025-11-28 success +2025/12/11 13:05:31 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:31 remain 2025-11-27 success +2025/12/11 13:05:33 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:33 remain 2025-11-26 success +2025/12/11 13:05:35 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:35 remain 2025-11-25 success +2025/12/11 13:05:37 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:37 remain 2025-11-24 success +2025/12/11 13:05:40 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:40 remain 2025-11-23 success +2025/12/11 13:05:42 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:42 remain 2025-11-22 success +2025/12/11 13:05:44 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:44 remain 2025-11-21 success +2025/12/11 13:05:46 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:46 remain 2025-11-20 success +2025/12/11 13:05:49 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:49 remain 2025-11-19 success +2025/12/11 13:05:51 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:51 remain 2025-11-18 success +2025/12/11 13:05:53 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:53 remain 2025-11-17 success +2025/12/11 13:05:55 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:55 remain 2025-11-16 success +2025/12/11 13:05:57 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:05:57 remain 2025-11-15 success +2025/12/11 13:06:00 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:06:00 remain 2025-11-14 success +2025/12/11 13:06:02 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:06:02 remain 2025-11-13 success +2025/12/11 13:06:04 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:06:04 remain 2025-11-12 success +2025/12/11 13:06:06 failed to insert data: Error 1203 (42000): User root already has more than 'max_user_connections' active connections +2025/12/11 13:06:06 remain 2025-11-11 success +2025/12/11 13:06:06 end statistics diff --git a/log/backend.2025-12-11.log b/log/backend.2025-12-11.log new file mode 100644 index 0000000..812184e --- /dev/null +++ b/log/backend.2025-12-11.log @@ -0,0 +1,591 @@ +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 14:54:03 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 14:54:03 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 14:54:09 | 200 | 259.3216ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 14:54:10 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 14:54:10 | 200 | 227.808ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 14:54:14 | 400 | 1.4234398s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 14:55:10 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 14:55:10 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 14:55:16 | 200 | 288.3883ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 14:55:16 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 14:55:17 | 200 | 310.8601ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 14:55:20 | 400 | 1.5287218s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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-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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:00:25 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:00:25 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:00:40 | 200 | 301.712ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:00:40 | 200 | 1.0159ms | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:00:40 | 200 | 287.9144ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:00:45 | 400 | 1.2076622s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:01:18 | 401 | 511.3µs | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:01:18 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:01:25 | 200 | 274.7293ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:01:25 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:01:26 | 200 | 1.4285956s | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:04:28 | 400 | 1m13s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:05:15 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:05:15 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:05:25 | 200 | 226.7111ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:05:25 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:05:25 | 200 | 311.7222ms | ::1 | GET "/api/user/info" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:08:17 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:08:17 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:08:24 | 200 | 277.7203ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:08:24 | 200 | 533.8µs | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:08:25 | 200 | 248.5945ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:08:36 | 200 | 8.6406657s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:09:48 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:09:48 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:09:56 | 200 | 171.9066ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:09:56 | 200 | 0s | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:09:56 | 200 | 221.5967ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:26:38 | 400 | 16m40s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:26:38 | 400 | 16m28s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:28:21 | 400 | 432.899ms | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:30:41 | 400 | 3.1169586s | ::1 | POST "/api/operation/copyUser" +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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-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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:51:59 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:51:59 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:52:06 | 200 | 272.8968ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:52:06 | 200 | 2.1002ms | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:52:07 | 200 | 248.6532ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:52:16 | 200 | 6.062524s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:52:43 | 200 | 11.5860106s | ::1 | POST "/api/operation/copyUser" diff --git a/log/backend.2025-12-12.log b/log/backend.2025-12-12.log new file mode 100644 index 0000000..2a2e61c --- /dev/null +++ b/log/backend.2025-12-12.log @@ -0,0 +1,33 @@ +2025/12/12 08:04:59 start statistics +2025/12/12 08:05:01 remain 2025-12-12 success +2025/12/12 08:05:01 remain 2025-12-11 success +2025/12/12 08:05:03 remain 2025-12-10 success +2025/12/12 08:05:04 remain 2025-12-09 success +2025/12/12 08:05:05 remain 2025-12-08 success +2025/12/12 08:05:06 remain 2025-12-07 success +2025/12/12 08:05:07 remain 2025-12-06 success +2025/12/12 08:05:08 remain 2025-12-05 success +2025/12/12 08:05:09 remain 2025-12-04 success +2025/12/12 08:05:10 remain 2025-12-03 success +2025/12/12 08:05:11 remain 2025-12-02 success +2025/12/12 08:05:12 remain 2025-12-01 success +2025/12/12 08:05:13 remain 2025-11-30 success +2025/12/12 08:05:14 remain 2025-11-29 success +2025/12/12 08:05:15 remain 2025-11-28 success +2025/12/12 08:05:15 remain 2025-11-27 success +2025/12/12 08:05:17 remain 2025-11-26 success +2025/12/12 08:05:18 remain 2025-11-25 success +2025/12/12 08:05:19 remain 2025-11-24 success +2025/12/12 08:05:20 remain 2025-11-23 success +2025/12/12 08:05:21 remain 2025-11-22 success +2025/12/12 08:05:22 remain 2025-11-21 success +2025/12/12 08:05:22 remain 2025-11-20 success +2025/12/12 08:05:23 remain 2025-11-19 success +2025/12/12 08:05:25 remain 2025-11-18 success +2025/12/12 08:05:26 remain 2025-11-17 success +2025/12/12 08:05:26 remain 2025-11-16 success +2025/12/12 08:05:27 remain 2025-11-15 success +2025/12/12 08:05:28 remain 2025-11-14 success +2025/12/12 08:05:29 remain 2025-11-13 success +2025/12/12 08:05:30 remain 2025-11-12 success +2025/12/12 08:05:30 end statistics diff --git a/log/backend.log b/log/backend.log index e69de29..f59cc3d 100644 --- a/log/backend.log +++ b/log/backend.log @@ -0,0 +1,94 @@ +[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/operation/copyUser --> backend/controller.CopyUser (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] POST /api/language/delete --> backend/controller.LanguageDelete (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/12/11 - 15:51:59 | 401 | 0s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:51:59 | 404 | 0s | ::1 | POST "/api/auth/logout" +[GIN] 2025/12/11 - 15:52:06 | 200 | 272.8968ms | ::1 | POST "/api/auth/login" +[GIN] 2025/12/11 - 15:52:06 | 200 | 2.1002ms | ::1 | GET "/api/auth/Codes" +[GIN] 2025/12/11 - 15:52:07 | 200 | 248.6532ms | ::1 | GET "/api/user/info" +[GIN] 2025/12/11 - 15:52:16 | 200 | 6.062524s | ::1 | POST "/api/operation/copyUser" +[GIN] 2025/12/11 - 15:52:43 | 200 | 11.5860106s | ::1 | POST "/api/operation/copyUser" +2025/12/12 08:04:59 start statistics +2025/12/12 08:05:01 remain 2025-12-12 success +2025/12/12 08:05:01 remain 2025-12-11 success +2025/12/12 08:05:03 remain 2025-12-10 success +2025/12/12 08:05:04 remain 2025-12-09 success +2025/12/12 08:05:05 remain 2025-12-08 success +2025/12/12 08:05:06 remain 2025-12-07 success +2025/12/12 08:05:07 remain 2025-12-06 success +2025/12/12 08:05:08 remain 2025-12-05 success +2025/12/12 08:05:09 remain 2025-12-04 success +2025/12/12 08:05:10 remain 2025-12-03 success +2025/12/12 08:05:11 remain 2025-12-02 success +2025/12/12 08:05:12 remain 2025-12-01 success +2025/12/12 08:05:13 remain 2025-11-30 success +2025/12/12 08:05:14 remain 2025-11-29 success +2025/12/12 08:05:15 remain 2025-11-28 success +2025/12/12 08:05:15 remain 2025-11-27 success +2025/12/12 08:05:17 remain 2025-11-26 success +2025/12/12 08:05:18 remain 2025-11-25 success +2025/12/12 08:05:19 remain 2025-11-24 success +2025/12/12 08:05:20 remain 2025-11-23 success +2025/12/12 08:05:21 remain 2025-11-22 success +2025/12/12 08:05:22 remain 2025-11-21 success +2025/12/12 08:05:22 remain 2025-11-20 success +2025/12/12 08:05:23 remain 2025-11-19 success +2025/12/12 08:05:25 remain 2025-11-18 success +2025/12/12 08:05:26 remain 2025-11-17 success +2025/12/12 08:05:26 remain 2025-11-16 success +2025/12/12 08:05:27 remain 2025-11-15 success +2025/12/12 08:05:28 remain 2025-11-14 success +2025/12/12 08:05:29 remain 2025-11-13 success +2025/12/12 08:05:30 remain 2025-11-12 success +2025/12/12 08:05:30 end statistics diff --git a/main.go b/main.go index c65ce7f..d41eff0 100644 --- a/main.go +++ b/main.go @@ -12,24 +12,55 @@ import ( "io" "log" "os" + "time" "github.com/gin-gonic/gin" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" ) // GOOS=linux GOARCH=amd64 go build -o /data/backend/release/backend main.go +var ( + rl *rotatelogs.RotateLogs + logWriter io.Writer + errWriter io.Writer +) func init() { - // 以追加模式打开或创建日志文件 - file, err := os.OpenFile("./log/app.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - log.Fatalf("failed to open log file: %v", err) + // 确保日志目录存在 + if err := os.MkdirAll("./log", 0755); err != nil { + log.Fatalf("failed to create log dir: %v", err) } - // 将默认日志输出指向文件(Go 标准 log) - log.SetOutput(file) - // 让 gin 的日志也写入文件,并同时输出到控制台 - gin.DefaultWriter = io.MultiWriter(file, os.Stdout) - gin.DefaultErrorWriter = io.MultiWriter(file, os.Stderr) + // 使用按天轮转的日志文件,保留最近 30 个文件 + var err error + rl, err = rotatelogs.New( + "./log/backend.%Y-%m-%d.log", + rotatelogs.WithRotationTime(24*time.Hour), + rotatelogs.WithRotationCount(30), + ) + if err != nil { + log.Fatalf("failed to initialize log rotator: %v", err) + } + + // 打开一个普通的最新日志文件(不使用 symlink),用于提供固定路径的最新日志 + currFile, err := os.OpenFile("./log/backend.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + // 如果打开失败,仍然继续使用轮转器+控制台 + log.Printf("warning: failed to open current log file: %v", err) + logWriter = io.MultiWriter(rl, os.Stdout) + errWriter = io.MultiWriter(rl, os.Stderr) + } else { + // 同时输出到轮转日志、固定最新日志文件和控制台 + logWriter = io.MultiWriter(rl, currFile, os.Stdout) + errWriter = io.MultiWriter(rl, currFile, os.Stderr) + } + + log.SetOutput(logWriter) + + // 保持全局默认 writer(以兼容其他调用) + gin.DefaultWriter = logWriter + gin.DefaultErrorWriter = errWriter + util.InitBBolt() common.Init() common.InitTranlater() @@ -95,12 +126,15 @@ func main() { api.POST("/mail/send", controller.SendMail) api.POST("/mail/list", controller.MailList) api.POST("/mail/delete", controller.MailDelete) + // 运营功能 + api.POST("/operation/copyUser", controller.CopyUser) // 翻译 api.POST("/language/list", controller.Language) api.POST("/language/export", controller.LanguageExport) api.POST("/language/save", controller.LanguageSave) api.POST("language/add", controller.LanguageAdd) + api.POST("language/delete", controller.LanguageDelete) } go util.ScheduleDailyTask() diff --git a/middleware/ginMid.go b/middleware/ginMid.go index 68f0d2b..6bbc9bd 100644 --- a/middleware/ginMid.go +++ b/middleware/ginMid.go @@ -1,6 +1,7 @@ package middleware import ( + "backend/model" "backend/store" "github.com/gin-gonic/gin" @@ -21,8 +22,20 @@ func ValidateToken() gin.HandlerFunc { if tokenInfo != nil { c.Set("admin", tokenInfo.UserName) } - // 这里可以添加逻辑来验证token的有效性 - // 假设验证通过,继续处理请求 + + // 获取请求路径和方法 + path := c.Request.URL.Path + + // 验证用户权限 + if tokenInfo != nil { + hasPermission := model.CheckUserPermission(tokenInfo.UserName, path) + if !hasPermission { + c.JSON(403, gin.H{"error": "Permission denied"}) + c.Abort() + return + } + } + c.Next() } } diff --git a/model/Statistics.go b/model/Statistics.go index 73d6a11..6d7e229 100644 --- a/model/Statistics.go +++ b/model/Statistics.go @@ -129,51 +129,10 @@ func (s *Statistics) StatisticsInfo() (interface{}, error) { } func (s *Statistics) StatisticsHeat() (interface{}, error) { - AppConfig, err := util.GetAppConfig(s.AppId) - if err != nil { - return nil, err - } - LogDb := util.MPool.GetTopicDB(AppConfig.Topic) - defer LogDb.Close() - if LogDb == nil { - return nil, fmt.Errorf("failed to get mysql database") - } - now := util.Now() - value := make([]int, 0, 24) - value2 := make([]int, 0, 24) - key := make([]string, 0, 24) - for i := 0; i < 24; i++ { - key = append(key, fmt.Sprintf("%02d:00", i)) - } - type r struct { - Sum1 int `db:"sum1"` - Sum2 int `db:"sum2"` - } - var result r - for i := 0; i < 24; i++ { - err := LogDb.Get(&result, "select count(*) as sum1, count(distinct Uid) as sum2 from log_event where Timestamp >= ? and Timestamp <= ?", now-int64(i)*3600-3600, now-int64(i)*3600) - if err != nil { - return nil, fmt.Errorf("failed to get heat count: %v", err) - } - - value = append(value, result.Sum1) - value2 = append(value2, result.Sum2) - key[i] = fmt.Sprintf("%02d:00", util.GetHour(now-int64(i)*3600, AppConfig.Tz)) - } - if len(value) < 2 { - return value, nil - } - // 反转key和value - for i, j := 0, len(value)-1; i < j; i, j = i+1, j-1 { - key[i], key[j] = key[j], key[i] - value2[i], value2[j] = value2[j], value2[i] - value[i], value[j] = value[j], value[i] - } - return map[string]interface{}{ - "key": key, - "value": value, - "value2": value2, + "key": nil, + "value": nil, + "value2": nil, }, nil } diff --git a/model/admin.go b/model/admin.go index 1ff457c..851b3eb 100644 --- a/model/admin.go +++ b/model/admin.go @@ -144,6 +144,14 @@ func (a *Admin) CreateToken() error { return nil } +func (a *Admin) GetAdmin(username string) error { + db := util.MPool.GetGameDB() // 假设使用默认的AppConfig和ServerId为0 + if db == nil { + return fmt.Errorf("failed to get database connection") + } + return db.Get(a, "SELECT * FROM admin WHERE username = ?", username) +} + func InitToken() { // 初始化TokenList,可以从数据库中加载现有的令牌 db := util.MPool.GetGameDB() // 假设使用默认的AppConfig和ServerId为0 @@ -175,3 +183,55 @@ func SendPhoneCode(phone string) error { } return nil } + +var PermissionList = map[string][]string{ + "/api/admin/list": {"super", "admin"}, + "/api/admin/add": {"super"}, + "/api/admin/log/list": {"super", "admin"}, + "/api/log/user": {"super", "admin", "user"}, + "/api/log/asset": {"super", "admin", "user"}, + "/api/log/event": {"super", "admin", "user"}, + "/api/log/order": {"super", "admin", "user"}, + "/api/user/list": {"super", "admin", "user"}, + "/api/user/gm": {"super", "admin"}, + "/api/user/ban": {"super", "admin"}, + "/api/server/list": {"super", "admin"}, + "/api/server/serverList": {"super", "admin"}, + "/api/server/addServer": {"super"}, + "/api/server/nodeList": {"super"}, + "/api/server/addNode": {"super"}, + "/api/server/updateApp": {"super", "admin"}, + "/api/server/restart": {"super", "admin"}, + "/api/server/reload": {"super", "admin"}, + "/api/statistics/level": {"super", "admin"}, + "/api/statistics/order": {"super", "admin"}, + "/api/statistics/info": {"super", "admin"}, + "/api/statistics/heat": {"super", "admin"}, + "/api/mail/send": {"super", "admin"}, + "/api/mail/list": {"super", "admin"}, + "/api/mail/delete": {"super", "admin"}, + "/api/language/list": {"super", "admin", "wb_transfer"}, + "/api/language/export": {"super", "admin", "wb_transfer"}, + "/api/language/save": {"super", "admin", "wb_transfer"}, + "/api/language/add": {"super", "admin", "wb_transfer"}, + "/api/language/delete": {"super", "admin"}, +} + +func CheckUserPermission(username, path string) bool { + Admin := &Admin{} + err := Admin.GetAdmin(username) + if err != nil { + return false + } + PermissionRoles, exists := PermissionList[path] + if !exists { + // 如果路径不存在于权限列表中,默认允许访问 + return true + } + for _, role := range PermissionRoles { + if util.GetRole(Admin.Role) == role { + return true + } + } + return false +} diff --git a/model/language.go b/model/language.go index 431bcb8..42d3b07 100644 --- a/model/language.go +++ b/model/language.go @@ -111,7 +111,16 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) { } // 导出为 xlsx 文件 f := excelize.NewFile() - sheet := "Sheet1" + mainSheet := "client" + backendSheet := "backend" + // 创建主表 + if _, err := f.NewSheet(mainSheet); err != nil { + return nil, err + } + // 创建 backend 子表 + if _, err := f.NewSheet(backendSheet); err != nil { + return nil, err + } SaveTime, _ := util.GetLanguageLastUpdate() ExportTime, _ := util.GetLanguageExportLastUpdate() if SaveTime <= ExportTime { @@ -120,38 +129,66 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) { "msg": "No changes since last export", }, nil } - // 写表头 + // 写表头(在主表和 backend 表都写一份) headers := []string{"Id", "key", "en_US", "zh_CN", "pt_BR"} - cols := []string{"A", "B", "C", "D", "E"} for i, h := range headers { - if err := f.SetCellValue(sheet, cols[i]+"1", h); err != nil { + if err := f.SetCellValue(mainSheet, cols[i]+"1", h); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, cols[i]+"1", h); err != nil { return nil, err } } headers2 := []string{"编号", "键", "英文", "简体中文", "葡萄牙语(巴西)"} for i, h := range headers2 { - if err := f.SetCellValue(sheet, cols[i]+"2", h); err != nil { + if err := f.SetCellValue(mainSheet, cols[i]+"2", h); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, cols[i]+"2", h); err != nil { return nil, err } } - // 写数据行 - for i, lang := range languages { - row := fmt.Sprintf("%d", i+3) - if err := f.SetCellValue(sheet, "A"+row, lang.Id); err != nil { - return nil, err - } - if err := f.SetCellValue(sheet, "B"+row, lang.Key); err != nil { - return nil, err - } - if err := f.SetCellValue(sheet, "C"+row, lang.EN_US); err != nil { - return nil, err - } - if err := f.SetCellValue(sheet, "D"+row, lang.ZH_CN); err != nil { - return nil, err - } - if err := f.SetCellValue(sheet, "E"+row, lang.PT_BR); err != nil { - return nil, err + // 写数据行:分别维护主表和 backend 表的行号 + mainRowIndex := 3 + backendRowIndex := 3 + for _, lang := range languages { + if strings.HasPrefix(lang.Key, "backend") { + row := fmt.Sprintf("%d", backendRowIndex) + if err := f.SetCellValue(backendSheet, "A"+row, lang.Id); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, "B"+row, lang.Key); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, "C"+row, lang.EN_US); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, "D"+row, lang.ZH_CN); err != nil { + return nil, err + } + if err := f.SetCellValue(backendSheet, "E"+row, lang.PT_BR); err != nil { + return nil, err + } + backendRowIndex++ + } else { + row := fmt.Sprintf("%d", mainRowIndex) + if err := f.SetCellValue(mainSheet, "A"+row, lang.Id); err != nil { + return nil, err + } + if err := f.SetCellValue(mainSheet, "B"+row, lang.Key); err != nil { + return nil, err + } + if err := f.SetCellValue(mainSheet, "C"+row, lang.EN_US); err != nil { + return nil, err + } + if err := f.SetCellValue(mainSheet, "D"+row, lang.ZH_CN); err != nil { + return nil, err + } + if err := f.SetCellValue(mainSheet, "E"+row, lang.PT_BR); err != nil { + return nil, err + } + mainRowIndex++ } } // 在 /data/docs 仓库中添加并提交该文件 @@ -259,5 +296,26 @@ func (l *LanguageMod) LanguageAdd(langList []Language, admin string) error { return err } } + util.SaveLanguageLastUpdate(util.Now()) + return nil +} + +func (l *LanguageMod) LanguageDelete(key string, admin string) error { + Db := util.MPool.GetGameDB() + defer Db.Close() + var lang Language + err := Db.Get(&lang, "SELECT `Id`, `key`, `en_US`, `zh_CN`, `pt_BR` FROM language WHERE `key` = ?", key) + if err != nil { + return err + } + _, err = Db.Exec("DELETE FROM language WHERE `key` = ?", key) + if err != nil { + return err + } + _, err = Db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`, `Role`) values (?, ?, ?, ?, ?,?,?)", lang.Id, "All", lang.EN_US+"|"+lang.ZH_CN+"|"+lang.PT_BR, "", "Delete", util.Now(), admin) + if err != nil { + return err + } + util.SaveLanguageLastUpdate(util.Now()) return nil } diff --git a/model/mail.go b/model/mail.go index cf6a27c..45b6193 100644 --- a/model/mail.go +++ b/model/mail.go @@ -13,13 +13,19 @@ type Mail struct { PageSize int `json:"PageSize"` CurrentPage int `json:"CurrentPage"` - MailId int `json:"mail_id" db:"mail_id"` - Title string `json:"title" db:"title"` - SubTitle string `json:"subtitle" db:"subTitle"` - Content string `json:"content" db:"content"` - TitleEn string `json:"title_en" db:"title_en"` - SubTitleEn string `json:"subtitle_en" db:"subTitle_en"` - ContentEn string `json:"content_en" db:"content_en"` + MailId int `json:"mail_id" db:"mail_id"` + Title string `json:"title" db:"title"` + SubTitle string `json:"subtitle" db:"subTitle"` + Content string `json:"content" db:"content"` + + TitleEn string `json:"title_en" db:"title_en"` + SubTitleEn string `json:"subtitle_en" db:"subTitle_en"` + ContentEn string `json:"content_en" db:"content_en"` + + TitlePtBr string `json:"title_ptbr" db:"title_ptbr"` + SubTitlePtBr string `json:"subtitle_ptbr" db:"subTitle_ptbr"` + ContentPtBr string `json:"content_ptbr" db:"content_ptbr"` + StartTime int64 `json:"start_time" db:"start_time"` EndTime int64 `json:"end_time" db:"end_time"` Items string `json:"items" db:"items"` @@ -45,7 +51,7 @@ func (m *Mail) MailList() (*Result, error) { Db := util.MPool.GetMysqlDB(AppCfg, m.ServerId) defer Db.Close() var mail []*Mail - err = Db.Select(&mail, "SELECT `mail_id`, `title`, `content`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`,`send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `content_en`, `title_en` FROM system_mail_info") + err = Db.Select(&mail, "SELECT `mail_id`, `title`, `content`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`,`send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `content_en`, `title_en`, `title_ptbr`,`subTitle_ptbr`, `content_ptbr` FROM system_mail_info") if err != nil { return nil, fmt.Errorf("failed to scan rows: %v", err) } @@ -68,7 +74,7 @@ func (m *Mail) SendMail() error { } Db := util.MPool.GetMysqlDB(AppCfg, m.ServerId) defer Db.Close() - _, err = Db.Exec("INSERT INTO system_mail_info (`title`, `content`, `title_en`, `content_en`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`, `send_type`, `to_uids`, `create_time`, `subtitle`, `subtitle_en`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.Title, m.Content, m.TitleEn, m.ContentEn, m.StartTime, m.EndTime, m.Items, m.RegisterTime, m.MailType, m.SendType, m.ToUids, m.CreateTime, m.SubTitle, m.SubTitleEn) + _, err = Db.Exec("INSERT INTO system_mail_info (`title`, `content`, `title_en`, `content_en`, `start_time`, `end_time`, `items`, `register_time`, `mail_type`, `send_type`, `to_uids`, `create_time`, `subTitle`, `subTitle_en`, `title_ptbr`,`content_ptbr`,`subTitle_ptbr`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.Title, m.Content, m.TitleEn, m.ContentEn, m.StartTime, m.EndTime, m.Items, m.RegisterTime, m.MailType, m.SendType, m.ToUids, m.CreateTime, m.SubTitle, m.SubTitleEn, m.TitlePtBr, m.ContentPtBr, m.SubTitlePtBr) if err != nil { return fmt.Errorf("failed to insert mail: %v", err) } diff --git a/model/server.go b/model/server.go index aede378..547c51d 100644 --- a/model/server.go +++ b/model/server.go @@ -182,7 +182,8 @@ func (s *Server) RestartServer() (string, error) { return "", err } defer SshClient.client.Close() - cmd := fmt.Sprintf("%s/tool/tool restart node %d", AppConfig.Path, s.ServerId) + + cmd := fmt.Sprintf("cd %s && ./tool/tool restart node %d", AppConfig.Path, s.ServerId) output, err := SshClient.RunCommand(cmd) if err != nil { return "", err diff --git a/release/backend b/release/backend index 11e0c5b..41d7f5c 100644 Binary files a/release/backend and b/release/backend differ diff --git a/release/login_service/start.sh b/release/login_service/start.sh index 9427cef..db5bc3a 100644 --- a/release/login_service/start.sh +++ b/release/login_service/start.sh @@ -9,17 +9,17 @@ if [ $# -ne 1 ]; then fi if [ "$1" = "start" ]; then - echo "Starting sdk_login..." + echo "Starting login_service..." mkdir -p log - : > log/sdk_login.log - nohup ./sdk_login >> log/sdk_login.log 2>&1 & - echo "sdk_login started." + : > log/login_service.log + nohup ./login_service >> log/login_service.log 2>&1 & + echo "login_service started." elif [ "$1" = "stop" ]; then - echo "Stopping sdk_login..." + echo "Stopping login_service..." # ...existing code... PID=$(ps -ef | grep '[l]ogin_service' | awk '{print $2}') if [ -z "$PID" ]; then - echo "sdk_login is not running." + echo "login_service is not running." exit 1 fi kill "$PID" @@ -35,20 +35,20 @@ elif [ "$1" = "stop" ]; then if ps -p "$PID" > /dev/null 2>&1; then kill -9 "$PID" fi - echo "sdk_login stopped." + echo "login_service stopped." elif [ "$1" = "status" ]; then - echo "sdk_login status:" + echo "login_service status:" PID=$(ps -ef | grep '[l]ogin_service' | awk '{print $2}') if [ -z "$PID" ]; then - echo "sdk_login is not running." + echo "login_service is not running." else - echo "sdk_login is running." + echo "login_service is running." fi elif [ "$1" = "restart" ]; then echo "Restarting login..." PID=$(ps -ef | grep '[l]ogin_service' | awk '{print $2}') if [ -n "$PID" ]; then - echo "sdk_login stopping." + echo "login_service stopping." kill "$PID" fi while :; do @@ -56,11 +56,11 @@ elif [ "$1" = "restart" ]; then [ -z "$PID" ] && break sleep 1 done - echo "sdk_login stopped." + echo "login_service stopped." mkdir -p log - : > log/sdk_login.log - nohup ./sdk_login >> log/sdk_login.log 2>&1 & - echo "sdk_login restarted." + : > log/login_service.log + nohup ./login_service >> log/login_service.log 2>&1 & + echo "login_service restarted." else echo "Usage: $0 [start|stop|status|restart]" exit 1 diff --git a/sdk/login/log/login.2025-11-27.log b/sdk/login/log/login.2025-11-27.log new file mode 100644 index 0000000..8b5320a --- /dev/null +++ b/sdk/login/log/login.2025-11-27.log @@ -0,0 +1,2 @@ +2025/11/27 12:04:33 Login SDK started on port 5240 +2025/11/27 16:39:06 Login SDK started on port 5240 diff --git a/sdk/login/log/login.log b/sdk/login/log/login.log index 01a6301..b597a7f 100644 --- a/sdk/login/log/login.log +++ b/sdk/login/log/login.log @@ -1,12 +1 @@ -[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/tuyou/login --> backend/sdk/login/model/tuyou.Login (3 handlers) -[GIN-debug] POST /api/auth/test/login --> backend/sdk/login/model/test.Login (3 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 :5420 -[GIN] 2025/10/29 - 17:43:33 | 200 | 360.0841ms | ::1 | POST "/api/auth/test/login" +2025/11/27 16:39:06 Login SDK started on port 5240 diff --git a/sdk/login/main.go b/sdk/login/main.go index 19ddff0..f73ef40 100644 --- a/sdk/login/main.go +++ b/sdk/login/main.go @@ -6,24 +6,56 @@ import ( "backend/sdk/login/model/test" "backend/sdk/login/model/tuyou" "fmt" + "io" "log" "os" + "time" "github.com/gin-gonic/gin" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" +) + +var ( + rl *rotatelogs.RotateLogs + logWriter io.Writer + errWriter io.Writer ) func init() { - // 以追加模式打开或创建日志文件 - file, err := os.OpenFile("./log/login.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - log.Fatalf("failed to open log file: %v", err) + // 确保日志目录存在 + if err := os.MkdirAll("./log", 0755); err != nil { + log.Fatalf("failed to create log dir: %v", err) } - // 将默认日志输出指向文件(Go 标准 log) - log.SetOutput(file) - // // 让 gin 的日志也写入文件,并同时输出到控制台 - // gin.DefaultWriter = io.MultiWriter(file, os.Stdout) - // gin.DefaultErrorWriter = io.MultiWriter(file, os.Stderr) + // 使用按天轮转的日志文件,保留最近 30 个文件 + var err error + rl, err = rotatelogs.New( + "./log/login.%Y-%m-%d.log", + rotatelogs.WithRotationTime(24*time.Hour), + rotatelogs.WithRotationCount(30), + ) + if err != nil { + log.Fatalf("failed to initialize log rotator: %v", err) + } + + // 打开一个普通的最新日志文件(不使用 symlink),用于提供固定路径的最新日志 + currFile, err := os.OpenFile("./log/login.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + // 如果打开失败,仍然继续使用轮转器+控制台 + log.Printf("warning: failed to open current log file: %v", err) + logWriter = io.MultiWriter(rl, os.Stdout) + errWriter = io.MultiWriter(rl, os.Stderr) + } else { + // 同时输出到轮转日志、固定最新日志文件和控制台 + logWriter = io.MultiWriter(rl, currFile, os.Stdout) + errWriter = io.MultiWriter(rl, currFile, os.Stderr) + } + + log.SetOutput(logWriter) + + // 保持全局默认 writer(以兼容其他调用) + gin.DefaultWriter = os.Stdout + gin.DefaultErrorWriter = errWriter common.Init() } @@ -35,7 +67,6 @@ func main() { loginApi.GET("/tuyou/login", tuyou.Login) loginApi.GET("/test/login", test.Login) } - log.Printf("server start!") - log.Printf("listen port:%d", logincommon.AppConf.Port) + log.Printf("Login SDK started on port %d", logincommon.AppConf.Port) r.Run(fmt.Sprintf(":%d", logincommon.AppConf.Port)) } diff --git a/sdk/ship/log/charge.2025-11-27.log b/sdk/ship/log/charge.2025-11-27.log new file mode 100644 index 0000000..2ee32a0 --- /dev/null +++ b/sdk/ship/log/charge.2025-11-27.log @@ -0,0 +1,8 @@ +2025/11/27 12:00:31 Ship SDK started on port 5250 +2025/11/27 12:01:03 binding error:Key: 'ChargeRequest.ApiVer' Error:Field validation for 'ApiVer' failed on the 'required' tag +Key: 'ChargeRequest.AppID' Error:Field validation for 'AppID' failed on the 'required' tag +Key: 'ChargeRequest.ClientID' Error:Field validation for 'ClientID' failed on the 'required' tag +Key: 'ChargeRequest.UserID' Error:Field validation for 'UserID' failed on the 'required' tag +Key: 'ChargeRequest.Code' Error:Field validation for 'Code' failed on the 'required' tag +[GIN] 2025/11/27 - 12:01:03 | 400 | 645.7µs | ::1 | POST "/api/tuyou/charge" +2025/11/27 12:02:22 Ship SDK started on port 5250 diff --git a/sdk/ship/log/charge.log b/sdk/ship/log/charge.log index 7bba170..520c737 100644 --- a/sdk/ship/log/charge.log +++ b/sdk/ship/log/charge.log @@ -1,15 +1 @@ -[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/test/charge --> backend/sdk/charge/model/test.Charge (3 handlers) -[GIN-debug] POST /api/tuyou/charge --> backend/sdk/charge/model/test.Charge (3 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 :5420 -[GIN] 2025/11/11 - 10:53:12 | 200 | 551.4594ms | 127.0.0.1 | POST "/api/test/charge" -2025/11/11 10:53:12 charge shipping:orderSn:order_100100002_20250820142941DBLbNB;res:map[Code:0 Msg:player online,triggered sync] -[GIN] 2025/11/11 - 11:04:52 | 200 | 607.4434ms | 127.0.0.1 | POST "/api/test/charge" -2025/11/11 11:04:53 charge shipping:orderSn:order_100100002_20250820142941DBLbNB;res:map[Code:0 Msg:player online,triggered sync] +2025/11/27 12:02:22 Ship SDK started on port 5250 diff --git a/sdk/ship/main.go b/sdk/ship/main.go index c8807d5..7b6aa1e 100644 --- a/sdk/ship/main.go +++ b/sdk/ship/main.go @@ -9,33 +9,70 @@ import ( "io" "log" "os" + "time" "github.com/gin-gonic/gin" + rotatelogs "github.com/lestrrat-go/file-rotatelogs" +) + +var ( + rl *rotatelogs.RotateLogs + logWriter io.Writer + errWriter io.Writer ) func init() { - // 以追加模式打开或创建日志文件 - file, err := os.OpenFile("./log/charge.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - log.Fatalf("failed to open log file: %v", err) + // 确保日志目录存在 + if err := os.MkdirAll("./log", 0755); err != nil { + log.Fatalf("failed to create log dir: %v", err) } - // 将默认日志输出指向文件(Go 标准 log) - log.SetOutput(file) - // 让 gin 的日志也写入文件,并同时输出到控制台 - gin.DefaultWriter = io.MultiWriter(file, os.Stdout) - gin.DefaultErrorWriter = io.MultiWriter(file, os.Stderr) + // 使用按天轮转的日志文件,保留最近 30 个文件 + var err error + rl, err = rotatelogs.New( + "./log/charge.%Y-%m-%d.log", + rotatelogs.WithRotationTime(24*time.Hour), + rotatelogs.WithRotationCount(30), + ) + if err != nil { + log.Fatalf("failed to initialize log rotator: %v", err) + } + + // 打开一个普通的最新日志文件(不使用 symlink),用于提供固定路径的最新日志 + currFile, err := os.OpenFile("./log/charge.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + if err != nil { + // 如果打开失败,仍然继续使用轮转器+控制台 + log.Printf("warning: failed to open current log file: %v", err) + logWriter = io.MultiWriter(rl, os.Stdout) + errWriter = io.MultiWriter(rl, os.Stderr) + } else { + // 同时输出到轮转日志、固定最新日志文件和控制台 + logWriter = io.MultiWriter(rl, currFile, os.Stdout) + errWriter = io.MultiWriter(rl, currFile, os.Stderr) + } + + log.SetOutput(logWriter) + + // 保持全局默认 writer(以兼容其他调用) + gin.DefaultWriter = os.Stdout + gin.DefaultErrorWriter = errWriter + common.Init() } func main() { + // 使用 gin.New 并显式注入写入器,确保中间件把日志写到轮转器 // gin.SetMode(gin.ReleaseMode) - r := gin.Default() + r := gin.New() + r.Use(gin.LoggerWithWriter(logWriter)) + r.Use(gin.RecoveryWithWriter(errWriter)) + ChargeApi := r.Group("/api") { // 充值发货 ChargeApi.POST("test/charge", test.Charge) ChargeApi.POST("tuyou/charge", tuyou.Charge) } + log.Printf("Ship SDK started on port %d", shipcommon.AppConf.Port) r.Run(fmt.Sprintf(":%d", shipcommon.AppConf.Port)) } diff --git a/sdk/ship/model/tuyou/tuyou.go b/sdk/ship/model/tuyou/tuyou.go index 9e18ee2..2df05f7 100644 --- a/sdk/ship/model/tuyou/tuyou.go +++ b/sdk/ship/model/tuyou/tuyou.go @@ -117,7 +117,7 @@ func Charge(c *gin.Context) { c.JSON(400, gin.H{"error": "invalid AppInfo"}) return } - AppInfo.ChannelOrderId = req.OrderID + AppInfo.ChannelOrderId = req.PlatformOrder err := AppInfo.ChangeOrderStatus() if err != nil { FeishuNotify(fmt.Sprintf("change order status error: %v", err)) diff --git a/store/token.go b/store/token.go index 5cfb2ef..e426a3d 100644 --- a/store/token.go +++ b/store/token.go @@ -1,6 +1,8 @@ package store -import "backend/util" +import ( + "backend/util" +) var TokenList = make(map[string]*Token)