SHA256
104 lines
3.1 KiB
Go
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})
|
|
}
|