玩家数据拷贝

This commit is contained in:
hahwu 2025-12-12 15:31:36 +08:00
parent 599d54dd62
commit fa8430a604
27 changed files with 1276 additions and 170 deletions

View File

@ -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" # 需要翻译的列名
colunm: "key,en_US,pt_BR"

View File

@ -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, "删除成功")
}

70
controller/operation.go Normal file
View File

@ -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
}

Binary file not shown.

3
go.mod
View File

@ -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

6
go.sum
View File

@ -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=

View File

@ -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

591
log/backend.2025-12-11.log Normal file
View File

@ -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"

View File

@ -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

View File

@ -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

52
main.go
View File

@ -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()

View File

@ -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()
}
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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))
}

View File

@ -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

View File

@ -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

View File

@ -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))
}

View File

@ -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))

View File

@ -1,6 +1,8 @@
package store
import "backend/util"
import (
"backend/util"
)
var TokenList = make(map[string]*Token)