Files

140 lines
4.4 KiB
Go

// Package handler HTTP 请求处理层,负责参数解析、调用 Service、返回 JSON 响应
package handler
import (
"ashare-view-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})
}
// GetDataStats 获取 ashare-data 采集结果的数据量统计
// GET /api/dashboard/data-stats
func (h *DashboardHandler) GetDataStats(c *gin.Context) {
data, err := h.svc.GetDataStats()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetSentimentMap 获取市场情绪导图,支持可选 date 参数查询历史数据
// GET /api/dashboard/sentiment-map?date=2024-01-15
func (h *DashboardHandler) GetSentimentMap(c *gin.Context) {
date := c.Query("date")
data, err := h.svc.GetSentimentMap(date)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}
// GetMinuteAmount 获取全市场分钟成交额,支持可选 date 参数查询历史数据
// GET /api/dashboard/minute-amount?date=2024-01-15
func (h *DashboardHandler) GetMinuteAmount(c *gin.Context) {
date := c.Query("date")
data, err := h.svc.GetMinuteAmount(date)
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&end_date=2024-01-15
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
}
endDate := c.Query("end_date")
data, err := h.svc.GetIndexKline(code, days, endDate)
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&end_date=2024-01-15
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, c.Query("end_date"))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"data": data})
}