Skip to content

Commit a3ed799

Browse files
committed
Update.
1 parent 0a17607 commit a3ed799

File tree

10 files changed

+670
-263
lines changed

10 files changed

+670
-263
lines changed

cmd/dashboard/controller/member_api.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"log"
88
"net/http"
9+
"regexp"
910
"strconv"
1011
"strings"
1112
"sync"
@@ -914,7 +915,9 @@ func (ma *memberAPI) addOrEditAlertRule(c *gin.Context) {
914915
var r model.AlertRule
915916
err := c.ShouldBindJSON(&arf)
916917
if err == nil {
917-
err = utils.Json.Unmarshal([]byte(arf.RulesRaw), &r.Rules)
918+
// 清理 RulesRaw 中的千位分隔符
919+
cleanedRulesRaw := cleanNumbersInJSON(arf.RulesRaw)
920+
err = utils.Json.Unmarshal([]byte(cleanedRulesRaw), &r.Rules)
918921
}
919922
if err == nil {
920923
if len(r.Rules) == 0 {
@@ -1187,3 +1190,24 @@ func onServerDelete(id uint64) {
11871190

11881191
singleton.DB.Unscoped().Delete(&model.Transfer{}, "server_id = ?", id)
11891192
}
1193+
1194+
// cleanNumbersInJSON 清理JSON中带千位分隔符的数字
1195+
func cleanNumbersInJSON(jsonStr string) string {
1196+
// 匹配引号内包含数字和逗号的字符串,更宽松的匹配
1197+
// 这个正则表达式匹配引号内的数字,可能包含逗号(不管格式是否标准)
1198+
re := regexp.MustCompile(`"(\d+(?:,\d+)*(?:\.\d+)?)"`)
1199+
1200+
return re.ReplaceAllStringFunc(jsonStr, func(match string) string {
1201+
// 移除引号
1202+
numStr := match[1 : len(match)-1]
1203+
// 移除所有逗号
1204+
cleanNum := strings.ReplaceAll(numStr, ",", "")
1205+
// 验证清理后的字符串是否为有效数字
1206+
if matched, _ := regexp.MatchString(`^\d+(\.\d+)?$`, cleanNum); matched {
1207+
// 返回清理后的数字(不带引号,因为它应该是数字类型)
1208+
return cleanNum
1209+
}
1210+
// 如果不是有效数字,保持原样
1211+
return match
1212+
})
1213+
}

db/badger.go

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,14 +341,61 @@ func convertDbFieldTypes(data *map[string]interface{}) {
341341
}
342342
}
343343

344+
// 处理时间字段,确保它们是正确的时间格式
345+
timeFields := []string{
346+
"created_at", "updated_at", "deleted_at",
347+
"last_active", "last_online", "last_flow_save_time",
348+
"last_db_update_time", "last_seen", "last_ping",
349+
"CreatedAt", "UpdatedAt", "DeletedAt",
350+
"LastActive", "LastOnline", "LastFlowSaveTime",
351+
"LastDBUpdateTime", "LastSeen", "LastPing",
352+
"token_expired", "TokenExpired",
353+
}
354+
for _, field := range timeFields {
355+
if val, ok := d[field]; ok {
356+
switch v := val.(type) {
357+
case string:
358+
if v == "" || v == "NULL" || v == "0001-01-01T00:00:00Z" {
359+
// 对于空时间或无效时间,设置为当前时间或保持零值
360+
if field == "created_at" || field == "CreatedAt" {
361+
d[field] = time.Now().Format(time.RFC3339)
362+
} else if field == "updated_at" || field == "UpdatedAt" {
363+
d[field] = time.Now().Format(time.RFC3339)
364+
} else {
365+
// 其他时间字段保持零值
366+
d[field] = "0001-01-01T00:00:00Z"
367+
}
368+
} else {
369+
// 尝试解析时间字符串并重新格式化
370+
if parsedTime, err := parseTimeString(v); err == nil {
371+
d[field] = parsedTime.Format(time.RFC3339)
372+
} else {
373+
log.Printf("警告:无法解析时间字段 %s 的值 '%s': %v", field, v, err)
374+
// 如果解析失败,根据字段类型设置默认值
375+
if field == "created_at" || field == "CreatedAt" {
376+
d[field] = time.Now().Format(time.RFC3339)
377+
} else if field == "updated_at" || field == "UpdatedAt" {
378+
d[field] = time.Now().Format(time.RFC3339)
379+
} else {
380+
d[field] = "0001-01-01T00:00:00Z"
381+
}
382+
}
383+
}
384+
case time.Time:
385+
// 如果已经是 time.Time 类型,转换为字符串
386+
d[field] = v.Format(time.RFC3339)
387+
}
388+
}
389+
}
390+
344391
// 处理布尔型字段 (支持多种命名格式)
345392
boolFields := []string{
346393
// Server fields
347394
"is_online", "is_disabled", "hide_for_guest", "show_all", "tasker",
348395
"HideForGuest", "EnableDDNS", "enable_ddns",
349-
// Monitor fields
350-
"notify", "Notify", "enable_trigger_task", "EnableTriggerTask",
351-
"enable_show_in_service", "EnableShowInService",
396+
// Monitor fields
397+
"notify", "Notify", "enable_trigger_task", "EnableTriggerTask",
398+
"enable_show_in_service", "EnableShowInService",
352399
"latency_notify", "LatencyNotify",
353400
// User fields
354401
"hireable", "Hireable", "super_admin", "SuperAdmin",

0 commit comments

Comments
 (0)