后台增加翻译功能
This commit is contained in:
parent
c0f7bfdb75
commit
cf70e75d99
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,4 +2,6 @@
|
||||
release/*.tar
|
||||
.vscode/
|
||||
release/backend
|
||||
release/logs
|
||||
release/logs
|
||||
log/app.log
|
||||
release/backend
|
||||
|
||||
@ -38,7 +38,8 @@ func LanguageSave(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
langMod := model.LanguageMod{}
|
||||
err = langMod.LanguageSave(request.Data)
|
||||
admin := c.GetString("admin")
|
||||
err = langMod.LanguageSave(request.Data, admin)
|
||||
if err != nil {
|
||||
failed(c, err.Error())
|
||||
return
|
||||
@ -55,8 +56,9 @@ func LanguageAdd(c *gin.Context) {
|
||||
failed(c, err.Error())
|
||||
return
|
||||
}
|
||||
admin := c.GetString("admin")
|
||||
langMod := &model.LanguageMod{}
|
||||
err = langMod.LanguageAdd(request.Data)
|
||||
err = langMod.LanguageAdd(request.Data, admin)
|
||||
if err != nil {
|
||||
failed(c, err.Error())
|
||||
return
|
||||
|
||||
@ -12,6 +12,10 @@ import (
|
||||
func UserInfo(c *gin.Context) {
|
||||
Token := util.GetToken(c)
|
||||
Info, _ := store.GetTokenInfo(Token)
|
||||
homePath := "/dashboard"
|
||||
if Info.Role == "wb_transfer" {
|
||||
homePath = "/language"
|
||||
}
|
||||
c.JSON(200, gin.H{
|
||||
"code": 0,
|
||||
"data": map[string]interface{}{
|
||||
@ -19,6 +23,7 @@ func UserInfo(c *gin.Context) {
|
||||
"realName": Info.UserName,
|
||||
"roles": []string{Info.Role},
|
||||
"username": Info.UserName,
|
||||
"homePath": homePath,
|
||||
},
|
||||
"message": "Hello, world!",
|
||||
})
|
||||
|
||||
18
go.mod
18
go.mod
@ -1,6 +1,8 @@
|
||||
module backend
|
||||
|
||||
go 1.23.1
|
||||
go 1.24.0
|
||||
|
||||
toolchain go1.24.4
|
||||
|
||||
require (
|
||||
github.com/Ullaakut/nmap v2.0.2+incompatible
|
||||
@ -17,8 +19,8 @@ require (
|
||||
github.com/jmoiron/sqlx v1.4.0
|
||||
github.com/larksuite/oapi-sdk-go/v3 v3.4.9
|
||||
github.com/robfig/cron/v3 v3.0.1
|
||||
golang.org/x/crypto v0.24.0
|
||||
golang.org/x/net v0.26.0
|
||||
golang.org/x/crypto v0.43.0
|
||||
golang.org/x/net v0.46.0
|
||||
google.golang.org/protobuf v1.34.1
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
)
|
||||
@ -55,12 +57,18 @@ require (
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // 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
|
||||
github.com/tjfoc/gmsm v1.4.1 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||
github.com/xuri/efp v0.0.1 // indirect
|
||||
github.com/xuri/excelize/v2 v2.10.0 // indirect
|
||||
github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect
|
||||
golang.org/x/arch v0.8.0 // indirect
|
||||
golang.org/x/sys v0.21.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
golang.org/x/sys v0.37.0 // indirect
|
||||
golang.org/x/text v0.30.0 // indirect
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
|
||||
23
go.sum
23
go.sum
@ -179,6 +179,11 @@ github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h
|
||||
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=
|
||||
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
|
||||
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
|
||||
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
|
||||
github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00=
|
||||
github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
|
||||
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
|
||||
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
|
||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||
@ -198,6 +203,9 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/tiendc/go-deepcopy v1.7.1 h1:LnubftI6nYaaMOcaz0LphzwraqN8jiWTwm416sitff4=
|
||||
github.com/tiendc/go-deepcopy v1.7.1/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ=
|
||||
github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
|
||||
github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
|
||||
github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
|
||||
@ -205,6 +213,12 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8=
|
||||
github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
|
||||
github.com/xuri/excelize/v2 v2.10.0 h1:8aKsP7JD39iKLc6dH5Tw3dgV3sPRh8uRVXu/fMstfW4=
|
||||
github.com/xuri/excelize/v2 v2.10.0/go.mod h1:SC5TzhQkaOsTWpANfm+7bJCldzcnU/jrhqkTi/iBHBU=
|
||||
github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 h1:+C0TIdyyYmzadGaL/HBLbf3WdLgC29pgyhTjAT/0nuE=
|
||||
github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
@ -227,6 +241,8 @@ golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOM
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
|
||||
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
|
||||
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
|
||||
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
@ -261,6 +277,8 @@ golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
|
||||
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
|
||||
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@ -294,6 +312,8 @@ golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
|
||||
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
@ -307,6 +327,7 @@ golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
|
||||
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
|
||||
golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
@ -318,6 +339,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
|
||||
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI=
|
||||
golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
||||
102
log/app.log
102
log/app.log
@ -0,0 +1,102 @@
|
||||
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
|
||||
|
||||
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
|
||||
- using env: export GIN_MODE=release
|
||||
- using code: gin.SetMode(gin.ReleaseMode)
|
||||
|
||||
[GIN-debug] POST /api/auth/login --> backend/controller.Login (3 handlers)
|
||||
[GIN-debug] GET /api/auth/Codes --> backend/controller.Codes (3 handlers)
|
||||
[GIN-debug] POST /api/auth/phoneCode --> backend/controller.PhoneCode (3 handlers)
|
||||
[GIN-debug] POST /api/auth/phoneLogin --> backend/controller.LoginCode (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/sendInfo --> backend/controller.FeishuSendInfo (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/sendInfo2 --> backend/controller.FeishuSendInfo2 (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/sendWeekInfo --> backend/controller.FeishuSendWeekInfo (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/updateApp --> backend/controller.FeishuUpdateApp (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/serverInfo --> backend/controller.FeishuServerInfo (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/notify --> backend/controller.FeishuNotify (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/notify/client --> backend/controller.FeishuNotifyClient (3 handlers)
|
||||
[GIN-debug] POST /api/feishu/notify/order --> backend/controller.FeishuNotifyOrder (3 handlers)
|
||||
[GIN-debug] POST /api/admin/list --> backend/controller.AdminList (4 handlers)
|
||||
[GIN-debug] POST /api/admin/add --> backend/controller.AdminAdd (4 handlers)
|
||||
[GIN-debug] POST /api/admin/log/list --> backend/controller.AdminLogList (4 handlers)
|
||||
[GIN-debug] POST /api/log/user --> backend/controller.UserDetail (4 handlers)
|
||||
[GIN-debug] POST /api/log/asset --> backend/controller.Asset (4 handlers)
|
||||
[GIN-debug] POST /api/log/event --> backend/controller.Event (4 handlers)
|
||||
[GIN-debug] POST /api/log/order --> backend/controller.Order (4 handlers)
|
||||
[GIN-debug] POST /api/user/list --> backend/controller.UserList (4 handlers)
|
||||
[GIN-debug] GET /api/user/info --> backend/controller.UserInfo (4 handlers)
|
||||
[GIN-debug] POST /api/user/gm --> backend/controller.UserGM (4 handlers)
|
||||
[GIN-debug] POST /api/user/ban --> backend/controller.UserBan (4 handlers)
|
||||
[GIN-debug] POST /api/server/list --> backend/controller.AppList (4 handlers)
|
||||
[GIN-debug] POST /api/server/serverList --> backend/controller.ServerList (4 handlers)
|
||||
[GIN-debug] POST /api/server/addServer --> backend/controller.AddServer (4 handlers)
|
||||
[GIN-debug] POST /api/server/nodeList --> backend/controller.NodeList (4 handlers)
|
||||
[GIN-debug] POST /api/server/addNode --> backend/controller.AddNode (4 handlers)
|
||||
[GIN-debug] POST /api/server/updateApp --> backend/controller.UpdateApp (4 handlers)
|
||||
[GIN-debug] POST /api/server/updateAppFeishu --> backend/controller.UpdateAppFeishu (4 handlers)
|
||||
[GIN-debug] POST /api/server/restart --> backend/controller.RestartServer (4 handlers)
|
||||
[GIN-debug] POST /api/server/reload --> backend/controller.ReloadServer (4 handlers)
|
||||
[GIN-debug] POST /api/statistics/level --> backend/controller.StatisticsLevel (4 handlers)
|
||||
[GIN-debug] POST /api/statistics/order --> backend/controller.StatisticsOrder (4 handlers)
|
||||
[GIN-debug] POST /api/statistics/info --> backend/controller.StatisticsInfo (4 handlers)
|
||||
[GIN-debug] POST /api/statistics/heat --> backend/controller.StatisticsHeat (4 handlers)
|
||||
[GIN-debug] POST /api/mail/send --> backend/controller.SendMail (4 handlers)
|
||||
[GIN-debug] POST /api/mail/list --> backend/controller.MailList (4 handlers)
|
||||
[GIN-debug] POST /api/mail/delete --> backend/controller.MailDelete (4 handlers)
|
||||
[GIN-debug] POST /api/language/list --> backend/controller.Language (4 handlers)
|
||||
[GIN-debug] POST /api/language/export --> backend/controller.LanguageExport (4 handlers)
|
||||
[GIN-debug] POST /api/language/save --> backend/controller.LanguageSave (4 handlers)
|
||||
[GIN-debug] POST /api/language/add --> backend/controller.LanguageAdd (4 handlers)
|
||||
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
|
||||
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
|
||||
[GIN-debug] Listening and serving HTTP on :5320
|
||||
[GIN] 2025/10/28 - 11:51:54 | 401 | 0s | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:51:54 | 404 | 0s | ::1 | POST "/api/auth/logout"
|
||||
[GIN] 2025/10/28 - 11:52:01 | 200 | 153.1686ms | ::1 | POST "/api/auth/login"
|
||||
[GIN] 2025/10/28 - 11:52:01 | 200 | 0s | ::1 | GET "/api/user/info"
|
||||
[GIN] 2025/10/28 - 11:52:01 | 200 | 0s | ::1 | GET "/api/auth/Codes"
|
||||
[GIN] 2025/10/28 - 11:52:02 | 200 | 212.0046ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:52:02 | 200 | 209.97ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:52:05 | 200 | 153.0165ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:52:08 | 200 | 150.751ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:52:20 | 200 | 148.9322ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:52:22 | 200 | 167.888ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:53:05 | 200 | 156.1126ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 11:53:17 | 200 | 171.8824ms | ::1 | POST "/api/language/list"
|
||||
2025/10/28 12:04:59 start statistics
|
||||
2025/10/28 12:05:00 remain 2025-10-28 success
|
||||
2025/10/28 12:05:01 remain 2025-10-27 success
|
||||
2025/10/28 12:05:02 remain 2025-10-26 success
|
||||
2025/10/28 12:05:04 remain 2025-10-25 success
|
||||
2025/10/28 12:05:05 remain 2025-10-24 success
|
||||
2025/10/28 12:05:06 remain 2025-10-23 success
|
||||
2025/10/28 12:05:07 remain 2025-10-22 success
|
||||
2025/10/28 12:05:08 remain 2025-10-21 success
|
||||
2025/10/28 12:05:09 remain 2025-10-20 success
|
||||
2025/10/28 12:05:10 remain 2025-10-19 success
|
||||
2025/10/28 12:05:11 remain 2025-10-18 success
|
||||
2025/10/28 12:05:12 remain 2025-10-17 success
|
||||
2025/10/28 12:05:14 remain 2025-10-16 success
|
||||
2025/10/28 12:05:15 remain 2025-10-15 success
|
||||
2025/10/28 12:05:16 remain 2025-10-14 success
|
||||
2025/10/28 12:05:17 remain 2025-10-13 success
|
||||
2025/10/28 12:05:18 remain 2025-10-12 success
|
||||
2025/10/28 12:05:19 remain 2025-10-11 success
|
||||
2025/10/28 12:05:20 remain 2025-10-10 success
|
||||
2025/10/28 12:05:21 remain 2025-10-09 success
|
||||
2025/10/28 12:05:22 remain 2025-10-08 success
|
||||
2025/10/28 12:05:24 remain 2025-10-07 success
|
||||
2025/10/28 12:05:25 remain 2025-10-06 success
|
||||
2025/10/28 12:05:26 remain 2025-10-05 success
|
||||
2025/10/28 12:05:27 remain 2025-10-04 success
|
||||
2025/10/28 12:05:28 remain 2025-10-03 success
|
||||
2025/10/28 12:05:29 remain 2025-10-02 success
|
||||
2025/10/28 12:05:30 remain 2025-10-01 success
|
||||
2025/10/28 12:05:31 remain 2025-09-30 success
|
||||
2025/10/28 12:05:32 remain 2025-09-29 success
|
||||
2025/10/28 12:05:33 remain 2025-09-28 success
|
||||
2025/10/28 12:05:33 end statistics
|
||||
[GIN] 2025/10/28 - 14:17:41 | 200 | 253.7739ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 14:17:45 | 200 | 0s | ::1 | GET "/api/user/info"
|
||||
[GIN] 2025/10/28 - 14:17:46 | 200 | 404.4864ms | ::1 | POST "/api/language/list"
|
||||
[GIN] 2025/10/28 - 14:17:46 | 200 | 251.0952ms | ::1 | POST "/api/language/list"
|
||||
8
main.go
8
main.go
@ -8,6 +8,7 @@ import (
|
||||
"backend/model"
|
||||
"backend/util"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
@ -22,8 +23,13 @@ func init() {
|
||||
if err != nil {
|
||||
log.Fatalf("failed to open log file: %v", err)
|
||||
}
|
||||
// 将默认日志输出指向文件
|
||||
// 将默认日志输出指向文件(Go 标准 log)
|
||||
log.SetOutput(file)
|
||||
|
||||
// 让 gin 的日志也写入文件,并同时输出到控制台
|
||||
gin.DefaultWriter = io.MultiWriter(file, os.Stdout)
|
||||
gin.DefaultErrorWriter = io.MultiWriter(file, os.Stderr)
|
||||
|
||||
common.Init()
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,14 @@ package model
|
||||
|
||||
import (
|
||||
"backend/util"
|
||||
"fmt"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
type Language struct {
|
||||
@ -19,30 +27,38 @@ type LanguageOp struct {
|
||||
OldValue string `json:"OldValue" db:"OldValue"`
|
||||
NewValue string `json:"NewValue" db:"NewValue"`
|
||||
Type string `json:"Type" db:"Type"`
|
||||
Update int `json:"Update" db:"Update"`
|
||||
}
|
||||
|
||||
type LanguageMod struct {
|
||||
PageSize int `json:"PageSize"`
|
||||
CurrentPage int `json:"CurrentPage"`
|
||||
StartTime int `json:"StartTime"`
|
||||
EndTime int `json:"EndTime"`
|
||||
PageSize int `json:"PageSize"`
|
||||
CurrentPage int `json:"CurrentPage"`
|
||||
StartTime int `json:"StartTime"`
|
||||
EndTime int `json:"EndTime"`
|
||||
SearchField string `json:"SearchField"`
|
||||
SearchValue string `json:"SearchValue"`
|
||||
}
|
||||
|
||||
func (l *LanguageMod) LanguageList() (map[string]interface{}, error) {
|
||||
Db := util.MPool.GetGameDB()
|
||||
defer Db.Close()
|
||||
var languages []*Language
|
||||
err := Db.Select(&languages, "SELECT `Id`, `key`, `English`, `ChineseSimplified`, `Portuguese` FROM language LIMIT ?, ?", (l.CurrentPage-1)*l.PageSize, l.PageSize)
|
||||
SearchSQL := ""
|
||||
if l.SearchField != "" && l.SearchValue != "" {
|
||||
SearchSQL = " where `" + l.SearchField + "` like '%" + l.SearchValue + "%' "
|
||||
}
|
||||
|
||||
err := Db.Select(&languages, fmt.Sprintf("SELECT `Id`, `key`, `English`, `ChineseSimplified`, `Portuguese` FROM language %s LIMIT ?, ?", SearchSQL), (l.CurrentPage-1)*l.PageSize, l.PageSize)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var languageOp []*LanguageOp
|
||||
err = Db.Select(&languageOp, "SELECT `Id`, `LanguageId`, `Field`, `OldValue`, `NewValue`, `Type` FROM language_op where `Update` >= ? and `Update` <= ? ", l.StartTime, l.EndTime)
|
||||
err = Db.Select(&languageOp, "SELECT `Id`, `LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update` FROM language_op where `Update` >= ? and `Update` <= ? ", l.StartTime, l.EndTime)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var total int
|
||||
err = Db.QueryRow("SELECT COUNT(*) FROM language").Scan(&total)
|
||||
err = Db.QueryRow(fmt.Sprintf("SELECT COUNT(*) FROM language %s", SearchSQL)).Scan(&total)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -66,13 +82,96 @@ func (l *LanguageMod) LanguageListAll() (map[string]interface{}, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 导出为 xlsx 文件
|
||||
f := excelize.NewFile()
|
||||
sheet := "Sheet1"
|
||||
|
||||
// 写表头
|
||||
headers := []string{"Id", "key", "English", "ChineseSimplified", "Portuguese"}
|
||||
|
||||
cols := []string{"A", "B", "C", "D", "E"}
|
||||
for i, h := range headers {
|
||||
if err := f.SetCellValue(sheet, 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 {
|
||||
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.English); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := f.SetCellValue(sheet, "D"+row, lang.ChineseSimplified); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := f.SetCellValue(sheet, "E"+row, lang.Portuguese); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// 保存到临时文件
|
||||
// 保存到指定目录
|
||||
pathDir := "/data/docs/config"
|
||||
if err := os.MkdirAll(pathDir, 0755); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
path := filepath.Join(pathDir, "AllLanguage.xlsx")
|
||||
if err := f.SaveAs(path); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 在 /data/docs 仓库中添加并提交该文件
|
||||
repoDir := "/data/docs"
|
||||
cmd := exec.Command("git", "pull")
|
||||
cmd.Dir = repoDir
|
||||
if out, err := cmd.CombinedOutput(); err != nil {
|
||||
return nil, fmt.Errorf("git pull failed: %v: %s", err, string(out))
|
||||
}
|
||||
relPath, err := filepath.Rel(repoDir, path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cmd = exec.Command("git", "add", relPath)
|
||||
cmd.Dir = repoDir
|
||||
if out, err := cmd.CombinedOutput(); err != nil {
|
||||
return nil, fmt.Errorf("git add failed: %v: %s", err, string(out))
|
||||
}
|
||||
|
||||
commitMsg := fmt.Sprintf("Export AllLanguage.xlsx at %s", time.Now().Format(time.RFC3339))
|
||||
cmd = exec.Command("git", "commit", "-m", commitMsg)
|
||||
cmd.Dir = repoDir
|
||||
if out, err := cmd.CombinedOutput(); err != nil {
|
||||
// 忽略 "nothing to commit" 情形
|
||||
if !strings.Contains(string(out), "nothing to commit") {
|
||||
return nil, fmt.Errorf("git commit failed: %v: %s", err, string(out))
|
||||
}
|
||||
}
|
||||
cmd = exec.Command("git", "push", "origin", "main")
|
||||
cmd.Dir = repoDir
|
||||
if out, err := cmd.CombinedOutput(); err != nil {
|
||||
return nil, fmt.Errorf("git push failed: %v: %s", err, string(out))
|
||||
}
|
||||
// 将文件路径返回到调用方
|
||||
return map[string]interface{}{
|
||||
"data": languages,
|
||||
"total": total,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (l *LanguageMod) LanguageSave(langList []LanguageOp) error {
|
||||
func (l *LanguageMod) LanguageSave(langList []LanguageOp, admin string) error {
|
||||
Db := util.MPool.GetGameDB()
|
||||
defer Db.Close()
|
||||
for _, lang := range langList {
|
||||
@ -80,7 +179,7 @@ func (l *LanguageMod) LanguageSave(langList []LanguageOp) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = Db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`) values (?, ?, ?, ?, ?,?)", lang.Id, lang.Field, lang.OldValue, lang.NewValue, lang.Type, util.Now())
|
||||
_, err = Db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`, `Role`) values (?, ?, ?, ?, ?,?,?)", lang.LanguageId, lang.Field, lang.OldValue, lang.NewValue, lang.Type, util.Now(), admin)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -88,7 +187,7 @@ func (l *LanguageMod) LanguageSave(langList []LanguageOp) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LanguageMod) LanguageAdd(langList []Language) error {
|
||||
func (l *LanguageMod) LanguageAdd(langList []Language, admin string) error {
|
||||
Db := util.MPool.GetGameDB()
|
||||
defer Db.Close()
|
||||
for _, lang := range langList {
|
||||
@ -101,7 +200,7 @@ func (l *LanguageMod) LanguageAdd(langList []Language) error {
|
||||
return err
|
||||
}
|
||||
lang.Id = int(lastId)
|
||||
_, err = Db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`) values (?, ?, ?, ?, ?,?)", lang.Id, "All", "", lang.English+"|"+lang.ChineseSimplified+"|"+lang.Portuguese, "Add", util.Now())
|
||||
_, err = Db.Exec("insert into language_op (`LanguageId`, `Field`, `OldValue`, `NewValue`, `Type`, `Update`, `Role`) values (?, ?, ?, ?, ?,?,?)", lang.Id, "All", "", lang.English+"|"+lang.ChineseSimplified+"|"+lang.Portuguese, "Add", util.Now(), admin)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
BIN
release/backend
BIN
release/backend
Binary file not shown.
Loading…
Reference in New Issue
Block a user