增加后台日志

This commit is contained in:
hahwu 2025-07-31 15:39:08 +08:00
parent 9a3bb4a157
commit f1d34ff4b4
18 changed files with 11829 additions and 5523 deletions

View File

@ -2,6 +2,7 @@ package controller
import (
"backend/model"
"backend/util"
"github.com/gin-gonic/gin"
)
@ -34,5 +35,27 @@ func AdminAdd(c *gin.Context) {
failed(c, "Failed to add admin: "+err.Error())
return
}
// 记录管理员操作日志
util.AddAdminLog(c, "添加管理员", admin)
success(c, result)
}
func AdminLogList(c *gin.Context) {
// 处理管理员日志列表请求
List := []*model.AdminLog{}
db := util.MPool.GetGameDB()
if db == nil {
failed(c, "Failed to get database connection")
return
}
err := db.Select(&List, "SELECT * FROM admin_log ORDER BY createTime DESC")
if err != nil {
failed(c, "Failed to retrieve admin logs: "+err.Error())
return
}
success(c, &model.Result{
Data: List,
Result: 0,
})
}

View File

@ -36,10 +36,8 @@ func Login(c *gin.Context) {
func Codes(c *gin.Context) {
c.JSON(200, gin.H{
"code": 0,
"data": map[string]interface{}{
"codes": []string{"AC_100100", "AC_100110", "AC_100120", "AC_100010"},
},
"code": 0,
"data": []string{"AC_100100", "AC_100110", "AC_100120", "AC_100010"},
"message": "Success",
})
}

View File

@ -1,6 +1,13 @@
package controller
import "github.com/gin-gonic/gin"
import (
"backend/common"
"backend/feishu"
"fmt"
"github.com/gin-gonic/gin"
"github.com/robfig/cron/v3"
)
func success(c *gin.Context, data interface{}) {
c.JSON(200, gin.H{
@ -16,3 +23,17 @@ func failed(c *gin.Context, message string) {
"message": message,
})
}
func USSendInfo() {
c := cron.New()
// 每天12:10触发
_, err := c.AddFunc("10 12 * * *", func() {
feishu.SendOperationMsg2(common.US_APP_ID)
// 这里添加你的业务逻辑
})
if err != nil {
fmt.Println("Failed to schedule SendInfo:", err)
return
}
c.Start()
}

View File

@ -2,6 +2,7 @@ package controller
import (
"backend/model"
"backend/util"
"github.com/gin-gonic/gin"
)
@ -14,6 +15,8 @@ func SendMail(c *gin.Context) {
failed(c, err.Error())
return
}
// 记录管理员操作日志
util.AddAdminLog(c, "发送邮件", Mail)
success(c, nil)
}
@ -36,5 +39,7 @@ func MailDelete(c *gin.Context) {
failed(c, err.Error())
return
}
// 记录管理员操作日志
util.AddAdminLog(c, "删除邮件", Mail)
success(c, "删除成功")
}

View File

@ -45,6 +45,7 @@ func AddNode(c *gin.Context) {
failed(c, err.Error())
return
}
util.AddAdminLog(c, "添加节点", Node)
success(c, nil)
}
@ -67,6 +68,7 @@ func AddServer(c *gin.Context) {
failed(c, err.Error())
return
}
util.AddAdminLog(c, "添加服务器", Server)
success(c, nil)
}
@ -78,6 +80,7 @@ func UpdateApp(c *gin.Context) {
failed(c, err.Error())
return
}
util.AddAdminLog(c, "更新应用", Server)
success(c, map[string]string{"msg": msg})
}
@ -96,6 +99,7 @@ func RestartServer(c *gin.Context) {
failed(c, err.Error())
return
}
util.AddAdminLog(c, "重启服务器", Server)
success(c, map[string]string{"msg": msg})
}

View File

@ -120,3 +120,28 @@ func UserGM(c *gin.Context) {
success(c, r)
}
func UserBan(c *gin.Context) {
var request struct {
AppId int `json:"AppId"`
ServerId int `json:"ServerId"`
Uid int `json:"Uid"`
Day int `json:"Day"`
Reason string `json:"Reason"`
}
err := c.BindJSON(&request)
if err != nil {
fmt.Print(err)
failed(c, err.Error())
return
}
r, err := model.UserBan(request.AppId, request.ServerId, request.Uid, request.Day, request.Reason)
if err != nil {
fmt.Print(err)
failed(c, err.Error())
return
}
success(c, r)
}

View File

@ -78,4 +78,14 @@ CREATE TABLE `admin` (
`updateTime` int DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `user_unique` (`username`)
) ENGINE = InnoDB AUTO_INCREMENT = 16 DEFAULT CHARSET = utf8mb4;
CREATE TABLE `admin_log` (
`id` int NOT NULL AUTO_INCREMENT,
`admin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '管理员',
`action` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '操作',
`params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '参数',
`ip` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'IP地址',
`createTime` int DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 16 DEFAULT CHARSET = utf8mb4;

1
go.mod
View File

@ -16,6 +16,7 @@ require (
github.com/google/uuid v1.6.0
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
google.golang.org/protobuf v1.34.1

2
go.sum
View File

@ -179,6 +179,8 @@ 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/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=
github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=

View File

@ -0,0 +1,64 @@
2025/07/31 12:05:59 start statistics
2025/07/31 12:06:00 map[100321:85878]
2025/07/31 12:06:00 remain 2025-07-31 success
2025/07/31 12:06:01 map[100002:134 100007:2080 100008:8411 100009:29799 100010:289 100012:1501 100013:1467 100016:1878 100064:438 100072:100 100079:72 100114:669 100119:1443 100133:1664 100135:3502 100142:1253 100148:4291 100167:178 100172:1090 100187:7368 100189:171 100200:629 100241:2192 100248:458 100256:4308 100257:841 100258:2544 100261:254 100262:2489 100269:5575 100270:1032 100271:2073 100272:3285 100277:1048 100278:54 100279:2789 100280:294 100281:477 100282:374 100283:486 100284:2895 100285:935 100286:2833 100287:4580 100288:1384 100289:2008 100290:269 100291:14865 100292:1356 100293:2607 100294:235 100295:1723 100296:9153 100297:1229 100298:3085 100299:5750 100300:1672 100301:7762 100302:1415 100303:382 100304:2108 100305:1791 100306:750 100307:4437 100308:2396 100309:768 100310:2000 100311:3012 100312:1506 100313:606 100314:4586 100315:5338 100316:475 100317:240 100318:3088 100319:2680 100320:478 100321:241 100322:2211 100323:1717 100324:119 100325:3628 100326:3373 100327:739 100328:286 100329:1664 100330:957 100331:107 100332:1069 100333:55 100334:-211]
2025/07/31 12:06:01 remain 2025-07-30 success
2025/07/31 12:06:02 map[100005:23371 100007:757 100009:16810 100012:1291 100013:630 100016:6962 100048:5774 100055:1260 100061:87 100063:336 100064:132 100079:1136 100080:2878 100086:1166 100112:909 100128:456 100133:241 100135:4882 100141:359 100142:3622 100148:6129 100151:492 100162:2194 100166:175 100167:984 100169:132 100170:47 100173:2012 100174:1942 100200:1448 100208:52 100209:302 100233:37 100235:90 100237:854 100238:1659 100239:2432 100240:171 100241:1572 100242:1515 100243:670 100244:1779 100245:2710 100246:4026 100247:1948 100248:561 100249:344 100250:266 100251:6198 100252:1465 100253:4022 100254:4531 100255:2844 100256:6950 100257:1135 100258:4744 100259:234 100260:4633 100261:3415 100262:185 100263:154 100264:4286 100265:1625 100266:2253 100267:380 100268:1098 100269:4495 100270:4125 100271:7255 100272:1370 100273:4480 100274:2314 100275:766 100276:2388 100277:2908 100278:556 100279:2015]
2025/07/31 12:06:02 remain 2025-07-29 success
2025/07/31 12:06:03 map[100002:68 100005:52 100007:2076 100008:62 100009:23899 100012:1331 100013:3073 100016:1378 100023:1637 100034:1660 100048:456 100055:428 100069:85 100079:1889 100081:4045 100088:1627 100114:1500 100118:4029 100119:2418 100133:2599 100135:5213 100142:42518 100148:4124 100151:1551 100155:1067 100156:311 100162:564 100166:467 100167:433 100170:832 100180:98 100181:1505 100182:429 100183:1495 100184:944 100185:1213 100186:625 100187:726 100188:502 100189:128 100190:656 100191:1151 100192:1004 100193:186 100194:378 100195:165 100196:2314 100197:965 100198:602 100199:1134 100200:5193 100201:731 100202:481 100203:1734 100204:958 100205:622 100206:232 100207:587 100208:451 100209:2660 100210:232 100211:536 100212:789 100213:517 100214:1046 100215:960 100216:469 100217:519 100218:632 100219:43 100220:928 100221:683 100222:1009 100223:709 100224:538 100225:215 100226:571 100227:453 100228:156 100229:683 100230:241 100231:566 100232:1218 100233:373 100234:1470 100235:480 100236:412 100237:512 100238:1390]
2025/07/31 12:06:03 remain 2025-07-28 success
2025/07/31 12:06:03 map[100007:918 100009:82702 100012:710 100013:1330 100023:603 100070:458 100079:6387 100081:7548 100083:674 100088:1969 100097:2026 100106:1552 100114:2015 100118:7346 100119:3918 100123:2047 100133:1793 100135:14339 100139:947 100140:875 100141:274 100142:4799 100144:174 100145:140 100146:628 100147:9061 100148:8778 100149:1603 100150:3127 100151:5921 100152:169 100153:2570 100154:1252 100155:4022 100156:3673 100157:40 100158:1903 100159:1932 100160:1133 100161:3188 100162:2823 100163:1855 100164:1808 100165:87 100166:898 100167:263 100168:150 100169:205 100170:2256 100171:6223 100172:1250 100173:262 100174:935 100175:304 100176:633 100177:156 100178:678 100179:349 100180:94]
2025/07/31 12:06:04 remain 2025-07-27 success
2025/07/31 12:06:04 map[100007:3837 100012:1075 100013:551 100016:667 100031:195 100033:31 100034:3589 100064:781 100068:816 100072:55 100077:222 100079:5723 100090:3792 100095:598 100097:5093 100101:102 100104:11 100106:2184 100107:3129 100108:168 100109:47 100110:14452 100111:1446 100112:1165 100113:34 100114:5370 100115:1256 100116:68 100117:7878 100118:24324 100119:3229 100120:615 100121:1085 100122:371 100123:3824 100124:404 100125:78 100126:229 100127:212 100128:2161 100129:3964 100130:5893 100131:982 100132:2561 100133:1609 100134:992 100135:12417 100136:3965 100137:1160 100138:370 100139:3958 100140:-151 100141:417 100142:2525 100143:404]
2025/07/31 12:06:05 remain 2025-07-26 success
2025/07/31 12:06:05 map[100002:236 100007:714 100009:74535 100016:4977 100029:388 100048:2261 100062:980 100063:-62 100068:746 100069:2343 100071:955 100073:30970 100074:-256 100076:1660 100077:9201 100078:393 100079:4277 100080:4485 100081:3214 100082:59 100083:1592 100084:1466 100085:5692 100086:3696 100087:706 100088:4320 100089:178 100090:6498 100091:170 100092:1138 100093:36 100094:4067 100095:2585 100096:418 100097:3962 100098:2799 100099:446 100100:63 100101:143 100102:123 100103:1761 100104:376 100105:194 100106:361 100107:2160 100108:1406 100109:-185]
2025/07/31 12:06:06 remain 2025-07-25 success
2025/07/31 12:06:06 map[100007:3787 100009:16632 100012:567 100013:555 100016:4266 100023:859 100059:3363 100060:166 100061:436 100062:553 100063:92 100064:1221 100065:2403 100066:866 100067:431 100068:1834 100069:1146 100070:2917 100071:3554 100072:3484 100073:8754 100074:3446 100075:475 100076:819]
2025/07/31 12:06:07 remain 2025-07-24 success
2025/07/31 12:06:07 map[100002:2846 100005:755 100007:1024 100008:1488 100009:29205 100010:1428 100012:823 100016:3332 100023:405 100030:43557 100034:1884 100048:981 100049:533 100058:1810 100059:315]
2025/07/31 12:06:08 remain 2025-07-23 success
2025/07/31 12:06:08 map[100007:1429 100009:27647 100012:411 100016:1300 100022:227 100034:1417 100035:1818 100048:2808 100052:74 100053:707 100054:791 100055:1623 100056:178 100057:2612]
2025/07/31 12:06:08 remain 2025-07-22 success
2025/07/31 12:06:09 map[100007:787 100009:24828 100012:1423 100013:1208 100035:1110 100044:2894 100045:802 100046:2605 100047:4018 100048:3149 100049:12347 100050:129 100051:1061]
2025/07/31 12:06:09 remain 2025-07-21 success
2025/07/31 12:06:10 map[100007:1679 100008:945 100009:7656 100012:376 100014:195 100016:8373 100020:425 100032:98 100034:7653 100039:837 100040:4310 100041:2145 100042:3133 100043:148]
2025/07/31 12:06:10 remain 2025-07-20 success
2025/07/31 12:06:11 map[100007:2300 100012:1727 100013:911 100016:6326 100020:610 100029:3351 100032:142 100034:2207 100038:666]
2025/07/31 12:06:11 remain 2025-07-19 success
2025/07/31 12:06:12 map[100007:2808 100008:4362 100009:17490 100012:1464 100017:1785 100020:682 100023:88 100029:1377 100034:9328 100035:1665 100036:143 100037:188]
2025/07/31 12:06:12 remain 2025-07-18 success
2025/07/31 12:06:13 map[100003:633 100007:2937 100009:18600 100010:1400 100012:1195 100015:2119 100016:3886 100017:3332 100018:91 100023:665 100028:3253 100029:82 100030:43499 100031:6189 100032:332 100033:452]
2025/07/31 12:06:13 remain 2025-07-17 success
2025/07/31 12:06:14 map[100002:2680 100007:2152 100009:17238 100012:589 100013:691 100014:320 100016:7845 100017:4495 100018:3389 100019:4017 100020:1754 100021:64 100022:803 100023:3637 100024:148 100025:946 100026:180 100027:178]
2025/07/31 12:06:14 remain 2025-07-16 success
2025/07/31 12:06:15 map[100005:3257 100007:1965 100009:15917 100011:3911 100012:2074 100013:1996 100014:109 100015:1810 100016:569 100017:3066]
2025/07/31 12:06:15 remain 2025-07-15 success
2025/07/31 12:06:15 map[100001:607 100002:12471 100003:259 100004:10511 100005:9086 100006:962 100007:1042 100008:5939 100009:7828 100010:378 100011:12]
2025/07/31 12:06:16 remain 2025-07-14 success
2025/07/31 12:06:16 map[100002:570 100003:1839 100004:2498 100005:1210 100006:200 100007:13]
2025/07/31 12:06:17 remain 2025-07-13 success
2025/07/31 12:06:17 map[100002:648 100003:180]
2025/07/31 12:06:18 remain 2025-07-12 success
2025/07/31 12:06:18 map[100001:5079 100002:3377 100003:4609 100004:4105 100005:14 100006:589 100007:2753 100010:3297 100011:205 100398:-42 101187:2015 101302:787 101354:9159 101416:582 101418:148 101427:2070 101428:1214 101429:944 101430:1874]
2025/07/31 12:06:19 remain 2025-07-11 success
2025/07/31 12:06:19 map[100020:2853 100032:1997 100861:757 101137:2491 101139:2406 101187:1210 101302:1376 101337:978 101354:11482 101359:580 101401:5295 101409:1109 101413:1117 101416:1160 101417:1883 101418:2441 101419:2989 101420:3772 101421:4565 101422:1418 101423:5556 101424:173 101425:3748 101426:2171]
2025/07/31 12:06:19 remain 2025-07-10 success
2025/07/31 12:06:20 map[100020:780 100032:968 100861:1199 101139:1839 101187:586 101301:1088 101302:634 101335:990 101354:10230 101359:568 101401:14814 101405:1179 101408:861 101409:4290 101410:2850 101411:809 101412:9189 101413:2975 101414:5935 101415:154]
2025/07/31 12:06:20 remain 2025-07-09 success
2025/07/31 12:06:21 map[100020:1628 100032:1941 100500:1270 100861:650 101119:2218 101187:2832 101225:1892 101354:7253 101401:483 101403:1446 101404:1894 101405:852 101406:69 101407:248 101408:490 101409:1318]
2025/07/31 12:06:21 remain 2025-07-08 success
2025/07/31 12:06:22 map[100020:400 100032:2377 100861:1256 101119:1752 101187:1343 101302:2603 101316:448 101337:529 101345:323 101354:6630 101359:701 101401:390]
2025/07/31 12:06:22 remain 2025-07-07 success
2025/07/31 12:06:23 map[100020:1594 100032:643 100417:8393 100861:4278 101187:7948 101192:407 101301:965 101302:372 101354:3058 101359:1134 101397:435 101398:278 101401:3524 101402:4897]
2025/07/31 12:06:23 remain 2025-07-06 success
2025/07/31 12:06:24 map[100020:841 100032:3537 100687:613 100725:241 100861:1902 100906:270 101139:1779 101187:9209 101302:1138 101335:6032 101391:98 101392:635 101397:1859 101398:3219 101399:2840 101400:795]
2025/07/31 12:06:24 remain 2025-07-05 success
2025/07/31 12:06:24 map[100020:6291 100032:3486 100861:1211 101002:423 101187:6718 101200:1561 101316:481 101336:1712 101354:6240 101359:1588 101382:106 101385:1407 101389:1184 101390:1254 101392:1217 101393:2609 101394:15082 101395:810 101396:344 101397:946]
2025/07/31 12:06:25 remain 2025-07-04 success
2025/07/31 12:06:25 map[100020:1733 100032:2699 100725:253 100861:1295 101139:762 101187:5307 101309:2902 101316:1024 101336:1127 101337:4064 101354:6760 101359:536 101382:1738 101385:2565 101386:2976 101387:413 101388:1869 101389:1182 101390:877 101391:1279]
2025/07/31 12:06:26 remain 2025-07-03 success
2025/07/31 12:06:26 map[100020:1303 100032:443 100861:997 101187:8019 101264:1321 101276:52 101316:793 101336:2246 101337:1871 101354:10582 101359:846 101378:353 101381:568 101382:3691 101383:1247 101384:1687]
2025/07/31 12:06:27 remain 2025-07-02 success
2025/07/31 12:06:27 map[100020:557 100032:313 100668:3296 100725:1470 100861:1379 101139:482 101187:8049 101244:16 101264:1104 101316:503 101336:1488 101337:7136 101340:675 101345:1497 101354:9056 101360:74 101364:872 101375:325 101377:66 101378:2497 101379:1032 101380:806]
2025/07/31 12:06:28 remain 2025-07-01 success
2025/07/31 12:06:28 end statistics

View File

@ -43,6 +43,7 @@ func main() {
// 账号管理
api.POST("/admin/list", controller.AdminList)
api.POST("/admin/add", controller.AdminAdd)
api.POST("/admin/log/list", controller.AdminLogList)
// 玩家日志
api.POST("/log/user", controller.UserDetail)
api.POST("/log/asset", controller.Asset)
@ -53,6 +54,7 @@ func main() {
api.POST("/user/list", controller.UserList)
api.GET("/user/info", controller.UserInfo)
api.POST("/user/gm", controller.UserGM)
api.POST("/user/ban", controller.UserBan)
api.POST("/server/list", controller.AppList)
api.POST("/server/serverList", controller.ServerList)
@ -85,7 +87,8 @@ func main() {
}
go util.ScheduleDailyTask()
go server.Server()
go model.InitToken() // 初始化 Token 列表
go model.InitToken() // 初始化 Token 列表
go controller.USSendInfo() // 启动定时任务发送信息
defer func() {
if err := recover(); err != nil {
log.Printf("Recovered from panic: %v", err)

View File

@ -17,7 +17,10 @@ func ValidateToken() gin.HandlerFunc {
c.Abort()
return
}
tokenInfo, _ := store.GetTokenInfo(token)
if tokenInfo != nil {
c.Set("admin", tokenInfo.UserName)
}
// 这里可以添加逻辑来验证token的有效性
// 假设验证通过,继续处理请求
c.Next()

View File

@ -77,3 +77,25 @@ func UserGM(AppId, ServerId, Uid int, Command string) (interface{}, error) {
}
return r, nil
}
func UserBan(AppId, ServerId, Uid int, Day int, Reason string) (interface{}, error) {
Now := util.Now()
req := &msg.ReqAdminBan{
Uid: int64(Uid),
Time: Now + int64(Day*24*3600),
Reason: Reason,
}
AppId, ServerId = util.ParseUid(Uid)
ws, err := util.GetWebsocket(AppId, ServerId)
if err != nil {
return nil, fmt.Errorf("failed to get websocket: %v", err)
}
defer ws.Close()
r, err := util.SendAdminMsg(ws, req)
if err != nil {
return nil, fmt.Errorf("failed to send admin message: %v", err)
}
return r, nil
}

View File

@ -21,6 +21,15 @@ type Admin struct {
UpdateTime int `json:"updateTime" db:"updateTime"`
}
type AdminLog struct {
ID int `json:"id" db:"id"`
Admin string `json:"admin" db:"admin"`
Action string `json:"action" db:"action"`
Params string `json:"params" db:"params"`
IP string `json:"ip" db:"ip"`
CreateTime int `json:"createTime" db:"createTime"`
}
func (a *Admin) List() (*Result, error) {
// 这里可以添加数据库查询逻辑来获取管理员列表
// 假设我们从数据库中查询到数据并返回

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,7 +1,7 @@
package main
import (
"backend/Type"
"backend/common"
"backend/controller"
"backend/feishu"
"backend/util"
@ -10,15 +10,7 @@ import (
)
func TestXxx1(t *testing.T) {
d := Type.NotifyClientData{
Log: "测试",
DeviceModel: "测试",
StackTrace: "测试",
OperatingSystem: "测试",
DeviceUniqueIdentifier: "测试",
AlarmTime: "测试",
}
feishu.SendNotifyClientMsg(&d)
feishu.SendOperationMsg2(common.US_APP_ID)
}
func TestXxx(t *testing.T) {
controller.FeishuSendInfo2(nil)

View File

@ -302,3 +302,24 @@ func GetRole(code int) string {
return "guest"
}
}
func ToJson(v interface{}) string {
data, err := json.Marshal(v)
if err != nil {
log.Printf("failed to marshal to JSON: %v", err)
return ""
}
return string(data)
}
func AddAdminLog(c *gin.Context, action string, params interface{}) {
admin := c.GetString("admin")
ip := c.ClientIP()
db := MPool.GetGameDB()
_, err := db.Exec("INSERT INTO admin_log (admin, action, params, ip, createTime) VALUES (?, ?, ?, ?, ?)",
admin, action, ToJson(params), ip, Now())
if err != nil {
fmt.Printf("failed to insert admin log: %v", err)
return
}
}