feat(widget): 优化访客在线轨迹、GeoIP与多站点渠道
CI / Frontend (typecheck + lint + build) (push) Successful in 2m5s
CI / Backend (go vet + test) (push) Failing after 5m20s

This commit is contained in:
yml2213
2026-11-06 18:21:30 +08:00
parent 24fac1bcf1
commit 38d6fc1684
37 changed files with 1071 additions and 123 deletions
+7 -8
View File
@@ -36,6 +36,7 @@ type WidgetPageViewReq struct {
type WidgetHeartbeatReq struct {
SessionID uint `json:"session_id" binding:"required"`
VisitorToken string `json:"visitor_token"`
State string `json:"state"`
}
type WidgetMessageReq struct {
@@ -91,7 +92,7 @@ func (h *WidgetHandler) Init(c *gin.Context) {
referrer = service.SanitizePageURL(c.Query("referrer"))
}
ip, region, userAgent, _ := captureVisitorMeta(c)
meta := captureVisitorMeta(c)
resp, err := service.WidgetInit(service.WidgetInitInput{
ChannelKey: req.ChannelKey,
VisitorName: req.VisitorName,
@@ -99,11 +100,7 @@ func (h *WidgetHandler) Init(c *gin.Context) {
PageURL: pageURL,
PageTitle: pageTitle,
Referrer: referrer,
Meta: service.VisitorMeta{
IP: ip,
Region: region,
UserAgent: userAgent,
},
Meta: meta,
})
if err != nil {
respondServiceError(c, err)
@@ -144,7 +141,7 @@ func (h *WidgetHandler) Heartbeat(c *gin.Context) {
respondServiceError(c, err)
return
}
ended, lastSeen, err := service.WidgetHeartbeat(session)
ended, lastSeen, online, err := service.WidgetHeartbeat(session, req.State)
if err != nil {
respondServiceError(c, err)
return
@@ -153,7 +150,9 @@ func (h *WidgetHandler) Heartbeat(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"code": 0, "data": gin.H{"ok": true, "ended": true}})
return
}
c.JSON(http.StatusOK, gin.H{"code": 0, "data": gin.H{"ok": true, "last_seen_at": lastSeen}})
c.JSON(http.StatusOK, gin.H{"code": 0, "data": gin.H{
"ok": true, "last_seen_at": lastSeen, "visitor_online": online,
}})
}
func visitorTokenFromRequest(c *gin.Context, bodyToken string) string {