From 92e766dfa87ccc234349e602de4b1cbda6aa521a Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 7 Aug 2026 22:21:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=81=8A=E5=A4=A9=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E4=B8=8D=E6=98=BE=E7=A4=BA=E6=9C=80=E6=96=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=9A=E6=89=80=E6=9C=89=E5=88=97=E8=A1=A8=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=92=E5=BA=8F=E4=BB=8E=20created=5Fat=20DESC=20?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=20id=20DESC=EF=BC=8C=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=87=BD=E6=95=B0=E6=98=BE=E5=BC=8F=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=20CreatedAt=EF=BC=8C=E5=90=8E=E7=AB=AF=20v1.2.1=20/?= =?UTF-8?q?=20=E5=89=8D=E7=AB=AF=20v0.3.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/bot/bot_service.go | 3 ++- internal/store/bot_direct_message_store.go | 3 +-- internal/store/bot_store.go | 1 - internal/store/db.go | 2 ++ internal/store/discard_store.go | 2 ++ internal/store/llm_store.go | 3 ++- internal/store/login_log_store.go | 7 ++++++- internal/store/store_query.go | 3 +-- internal/web/web.go | 2 +- meshmap_frontend/src/App.vue | 3 +-- meshmap_frontend/src/version.ts | 2 +- 11 files changed, 19 insertions(+), 12 deletions(-) diff --git a/internal/bot/bot_service.go b/internal/bot/bot_service.go index dec08cd..c4f3eea 100644 --- a/internal/bot/bot_service.go +++ b/internal/bot/bot_service.go @@ -416,8 +416,9 @@ func (s *Service) recordOutboundDirectMessage(bot *storepkg.BotNodeRecord, msg * BotMessageID: botMessageID, CreatedBy: createdByPtr, PublishedAt: msg.PublishedAt, - // 出向消息从产生那一刻起就视为“已读”,未读计数只关心 inbound。 + // 出向消息从产生那一刻起就视为"已读",未读计数只关心 inbound。 ReadAt: &now, + CreatedAt: now, } if err := s.store.InsertBotDirectMessage(dm); err != nil { printJSON(map[string]any{ diff --git a/internal/store/bot_direct_message_store.go b/internal/store/bot_direct_message_store.go index 0696cdc..91a9399 100644 --- a/internal/store/bot_direct_message_store.go +++ b/internal/store/bot_direct_message_store.go @@ -69,7 +69,6 @@ func (s *Store) ListBotDirectMessagesByConversation(opts BotDirectMessageListOpt var rows []BotDirectMessageRecord q := s.db.Model(&BotDirectMessageRecord{}). Where("bot_id = ? AND peer_node_num = ?", opts.BotID, opts.PeerNodeNum). - Order("created_at DESC"). Order("id DESC"). Limit(opts.Limit). Offset(opts.Offset) @@ -159,7 +158,6 @@ func (s *Store) ListBotDirectConversations(botID uint64, opts ListOptions) ([]Bo q := s.db.Table("(?) AS agg", subLast). Select("agg.bot_id AS bot_id, agg.peer_node_id AS peer_node_id, agg.peer_node_num AS peer_node_num, m.created_at AS last_message_at, m.text AS last_text, m.direction AS last_direction, agg.unread_count AS unread_count, agg.total_count AS total_count"). Joins("JOIN bot_direct_messages m ON m.id = agg.last_id"). - Order("m.created_at DESC"). Order("m.id DESC"). Limit(opts.Limit). Offset(opts.Offset) @@ -284,6 +282,7 @@ func insertInboundBotDirectMessage(s *Store, record map[string]any, clientInfo M Status: BotMessageStatusPublished, ReceivedAt: &now, ContentJSON: contentPtr, + CreatedAt: now, } if err := s.InsertBotDirectMessage(dm); err != nil { return fmt.Errorf("insert bot direct message from %s: %w", peerNodeID, err) diff --git a/internal/store/bot_store.go b/internal/store/bot_store.go index 06a9ea7..d314367 100644 --- a/internal/store/bot_store.go +++ b/internal/store/bot_store.go @@ -211,7 +211,6 @@ func (s *Store) ListBotMessages(opts BotMessageListOptions) ([]BotMessageRecord, opts.ListOptions = NormalizeListOptions(opts.ListOptions) var rows []BotMessageRecord q := applyBotMessageFilters(s.db.Model(&BotMessageRecord{}), opts). - Order("created_at DESC"). Order("id DESC"). Limit(opts.Limit). Offset(opts.Offset) diff --git a/internal/store/db.go b/internal/store/db.go index f7d87c4..ec7c5e1 100644 --- a/internal/store/db.go +++ b/internal/store/db.go @@ -1291,6 +1291,7 @@ func textMessageFromRecord(record map[string]any, clientInfo MQTTClientInfo) (*T MQTTRemoteHost: clientFields.MQTTRemoteHost, MQTTRemotePort: clientFields.MQTTRemotePort, ContentJSON: common.ContentJSON, + CreatedAt: time.Now(), }, nil } @@ -1401,6 +1402,7 @@ func AppendPacketFieldsFromRecord(record map[string]any, wantType string, client DecryptSuccess: nullableBool(record["decrypt_success"]), DecryptStatus: NullableString(record["decrypt_status"]), ContentJSON: string(contentJSON), + CreatedAt: time.Now(), }, MQTTClientRecordFields{ MQTTClientID: NullableString(clientInfo.ClientID), MQTTUsername: NullableString(clientInfo.Username), diff --git a/internal/store/discard_store.go b/internal/store/discard_store.go index e364c4e..5d64402 100644 --- a/internal/store/discard_store.go +++ b/internal/store/discard_store.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "encoding/json" "fmt" + "time" ) func (s *Store) InsertDiscardDetails(record map[string]any, raw []byte, clientInfo MQTTClientInfo) error { @@ -34,6 +35,7 @@ func discardDetailsFromRecord(record map[string]any, raw []byte, clientInfo MQTT MQTTRemoteAddr: NullableStringValue(clientInfo.RemoteAddr), MQTTRemoteHost: NullableStringValue(clientInfo.RemoteHost), MQTTRemotePort: NullableStringValue(clientInfo.RemotePort), + CreatedAt: time.Now(), }, nil } diff --git a/internal/store/llm_store.go b/internal/store/llm_store.go index 98a1a47..fa6f34b 100644 --- a/internal/store/llm_store.go +++ b/internal/store/llm_store.go @@ -369,6 +369,7 @@ func (s *Store) EnqueueLLMMessage(input LLMMessageQueueInput) (*LLMMessageQueueR Status: LLMMessageStatusPending, ReceivedAt: now, ContentJSON: input.ContentJSON, + CreatedAt: now, } if err := s.db.Create(record).Error; err != nil { @@ -396,7 +397,7 @@ func (s *Store) ListLLMMessages(opts ListOptions, botID uint64, includeDeleted b } // 排序和分页 - query = query.Order("created_at DESC") + query = query.Order("id DESC") if opts.Limit > 0 { query = query.Limit(opts.Limit) } diff --git a/internal/store/login_log_store.go b/internal/store/login_log_store.go index 395aecb..abb3288 100644 --- a/internal/store/login_log_store.go +++ b/internal/store/login_log_store.go @@ -1,13 +1,18 @@ package store +import "time" + func (s *Store) InsertLoginLog(log LoginLogRecord) error { + if log.CreatedAt.IsZero() { + log.CreatedAt = time.Now() + } return s.db.Create(&log).Error } func (s *Store) ListLoginLogs(opts ListOptions) ([]LoginLogRecord, error) { opts = NormalizeListOptions(opts) var rows []LoginLogRecord - q := s.db.Order("created_at DESC").Order("id DESC").Limit(opts.Limit).Offset(opts.Offset) + q := s.db.Order("id DESC").Limit(opts.Limit).Offset(opts.Offset) if opts.Since != nil { q = q.Where("created_at >= ?", *opts.Since) } diff --git a/internal/store/store_query.go b/internal/store/store_query.go index c02f8b3..806190d 100644 --- a/internal/store/store_query.go +++ b/internal/store/store_query.go @@ -316,7 +316,6 @@ func (s *Store) ListDiscardDetails(opts ListOptions) ([]DiscardDetailsRecord, er opts = NormalizeListOptions(opts) var rows []DiscardDetailsRecord q := applyDiscardDetailsFilters(s.db.Model(&DiscardDetailsRecord{}), opts). - Order("created_at DESC"). Order("id DESC"). Limit(opts.Limit). Offset(opts.Offset) @@ -385,7 +384,7 @@ func (s *Store) ListTraceroute(opts ListOptions) ([]TracerouteRecord, error) { func (s *Store) listAppendRows(opts ListOptions, dest any) *gorm.DB { opts = NormalizeListOptions(opts) - q := s.db.Order("created_at DESC").Order("id DESC").Limit(opts.Limit).Offset(opts.Offset) + q := s.db.Order("id DESC").Limit(opts.Limit).Offset(opts.Offset) if opts.NodeID != "" { q = q.Where("from_id = ?", opts.NodeID) } diff --git a/internal/web/web.go b/internal/web/web.go index 300966a..70c9c81 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -84,7 +84,7 @@ func NewRouter(cfg configpkg.WebConfig, consoleLog bool, store *storepkg.Store, return r } -const BackendVersion = "1.2.0" +const BackendVersion = "1.2.1" var CommitVersion = "dev" diff --git a/meshmap_frontend/src/App.vue b/meshmap_frontend/src/App.vue index 9588441..349773e 100644 --- a/meshmap_frontend/src/App.vue +++ b/meshmap_frontend/src/App.vue @@ -257,8 +257,7 @@ function toChronological(items: TextMessage[]): TextMessage[] { } function compareMessages(a: TextMessage, b: TextMessage): number { - const timeDiff = Date.parse(a.created_at) - Date.parse(b.created_at) - return timeDiff !== 0 ? timeDiff : a.id - b.id + return a.id - b.id } function mergeMessages(existing: TextMessage[], incoming: TextMessage[]): TextMessage[] { diff --git a/meshmap_frontend/src/version.ts b/meshmap_frontend/src/version.ts index 8c81056..521c931 100644 --- a/meshmap_frontend/src/version.ts +++ b/meshmap_frontend/src/version.ts @@ -1 +1 @@ -export const FRONTEND_VERSION = '0.3.0' +export const FRONTEND_VERSION = '0.3.1'