优化 P0 工作台与访客 Widget,对齐设计稿 UI

- 工作台改为设计稿三栏:320 会话列表 + 聊天区 + 320 客户信息
- 会话列表展示头像色条、最后消息预览、相对时间与未读角标
- 消息方向对齐设计(访客左、客服右)并补系统会话条
- 访客 Widget 还原欢迎语、快捷问题、输入状态动画与实色顶栏
- 会话列表 API 返回 last_message 供列表预览
This commit is contained in:
yml2213
2026-07-15 11:01:38 +08:00
parent b424dfb9a0
commit 3ffa9ddc89
8 changed files with 930 additions and 226 deletions
+17 -1
View File
@@ -24,7 +24,9 @@ type SendMessageReq struct {
type SessionListItem struct {
model.Session
UnreadCount int `json:"unread_count"`
UnreadCount int `json:"unread_count"`
LastMessage string `json:"last_message"`
LastMessageAt *time.Time `json:"last_message_at,omitempty"`
}
type CreateNoteReq struct {
@@ -194,6 +196,20 @@ func (h *SessionHandler) List(c *gin.Context) {
if middleware.GetRole(c) == "agent" && session.AgentID != nil && *session.AgentID == middleware.GetUserID(c) {
item.UnreadCount = unreadCount(session)
}
var lastMsg model.Message
if err := model.DB.Where("session_id = ?", session.ID).Order("seq desc").First(&lastMsg).Error; err == nil {
if lastMsg.Type == "image" {
item.LastMessage = "[图片]"
} else {
item.LastMessage = lastMsg.Content
if utf8.RuneCountInString(item.LastMessage) > 40 {
runes := []rune(item.LastMessage)
item.LastMessage = string(runes[:40]) + "…"
}
}
t := lastMsg.SentAt
item.LastMessageAt = &t
}
items = append(items, item)
}