搭建Go后端框架:数据模型、JWT鉴权、租户隔离、WebSocket、REST API路由

This commit is contained in:
yml2213
2026-07-14 11:23:05 +08:00
parent 81c32cfdea
commit 05ab468498
16 changed files with 1692 additions and 1 deletions
+78
View File
@@ -0,0 +1,78 @@
package handler
import (
"github.com/gin-gonic/gin"
"kefu-sys/server/internal/middleware"
"kefu-sys/server/internal/model"
)
type StatisticsHandler struct{}
func NewStatisticsHandler() *StatisticsHandler { return &StatisticsHandler{} }
func (h *StatisticsHandler) KPIs(c *gin.Context) {
tenantID := middleware.GetTenantID(c)
var totalSessions, totalMessages int64
var avgResponseTime float64
var satisfactionAvg float64
var firstResolveRate float64
model.DB.Model(&model.Session{}).Where("tenant_id = ?", tenantID).Count(&totalSessions)
model.DB.Model(&model.Message{}).
Joins("JOIN sessions ON messages.session_id = sessions.id").
Where("sessions.tenant_id = ?", tenantID).
Count(&totalMessages)
middleware.JSON(c, gin.H{
"total_sessions": totalSessions,
"avg_response_time": avgResponseTime,
"satisfaction_avg": satisfactionAvg,
"first_resolve_rate": firstResolveRate,
"total_messages": totalMessages,
})
}
func (h *StatisticsHandler) SessionTrend(c *gin.Context) {
tenantID := middleware.GetTenantID(c)
period := c.DefaultQuery("period", "day")
_ = tenantID
var data []gin.H
if period == "day" {
data = []gin.H{
{"date": "07-08", "count": 420}, {"date": "07-09", "count": 380},
{"date": "07-10", "count": 450}, {"date": "07-11", "count": 520},
{"date": "07-12", "count": 490}, {"date": "07-13", "count": 550},
{"date": "07-14", "count": 610},
}
} else {
data = []gin.H{
{"date": "06", "count": 12500}, {"date": "07", "count": 13800},
}
}
middleware.JSON(c, data)
}
func (h *StatisticsHandler) AgentPerformance(c *gin.Context) {
tenantID := middleware.GetTenantID(c)
_ = tenantID
data := []gin.H{
{"name": "客服小王", "conversations": 420, "avg_response": 28, "satisfaction": 4.9},
{"name": "客服小李", "conversations": 380, "avg_response": 35, "satisfaction": 4.7},
{"name": "客服小张", "conversations": 350, "avg_response": 42, "satisfaction": 4.5},
}
middleware.JSON(c, data)
}
func (h *StatisticsHandler) ChannelDistribution(c *gin.Context) {
data := []gin.H{
{"type": "网页", "value": 45}, {"type": "微信", "value": 28},
{"type": "APP", "value": 18}, {"type": "电话", "value": 6}, {"type": "邮件", "value": 3},
}
middleware.JSON(c, data)
}