Files
曾志威 4a5ae4cd6c
continuous-integration/drone Build is failing
增加功能
2026-05-12 00:02:27 +08:00

104 lines
3.1 KiB
Go

// Package handler HTTP 请求处理层,负责参数解析、调用 Service、返回 JSON 响应
package handler
import (
"ashareview-server/service"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
)
// DashboardHandler 市场概览相关的 HTTP handler
type DashboardHandler struct {
svc *service.DashboardService
}
func NewDashboardHandler(svc *service.DashboardService) *DashboardHandler {
return &DashboardHandler{svc: svc}
}
// GetSummary 获取市场概览数据,支持可选 date 参数查询历史数据
// GET /api/dashboard/summary?date=2024-01-15
func (h *DashboardHandler) GetSummary(c *gin.Context) {
date := c.Query("date") // 空字符串表示查最新交易日
summary, err := h.svc.GetSummary(date)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": summary})
}
// GetDailySummary 获取近 N 天的每日市场统计数据,支持可选 end_date 参数
// GET /api/dashboard/daily?days=30&end_date=2024-01-15
func (h *DashboardHandler) GetDailySummary(c *gin.Context) {
days, _ := strconv.Atoi(c.DefaultQuery("days", "30"))
if days <= 0 || days > 365 {
days = 30
}
endDate := c.Query("end_date")
data, err := h.svc.GetDailySummary(days, endDate)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetConsecutiveLimits 获取连板股票统计,支持可选 date 参数查询历史数据
// GET /api/dashboard/consecutive?date=2024-01-15
func (h *DashboardHandler) GetConsecutiveLimits(c *gin.Context) {
date := c.Query("date")
data, err := h.svc.GetConsecutiveLimits(date)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetHigh100 获取百日新高股票列表,支持可选 date 参数查询历史数据
// GET /api/dashboard/high100?date=2024-01-15
func (h *DashboardHandler) GetHigh100(c *gin.Context) {
date := c.Query("date")
data, err := h.svc.GetHigh100(date)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetIndexKline 获取指数 K 线数据
// GET /api/dashboard/index-kline?code=000001&days=60
func (h *DashboardHandler) GetIndexKline(c *gin.Context) {
code := c.DefaultQuery("code", "000001")
days, _ := strconv.Atoi(c.DefaultQuery("days", "60"))
if days <= 0 || days > 365 {
days = 60
}
data, err := h.svc.GetIndexKline(code, days)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetStockKline 获取个股 K 线数据(全部历史)
// GET /api/dashboard/stock-kline?code=600498
func (h *DashboardHandler) GetStockKline(c *gin.Context) {
code := c.Query("code")
if code == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "code is required"})
return
}
data, err := h.svc.GetStockKline(code)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}