Files
backend_v2/internal/router/router.go
toom1996 9c3403a903 update
2026-08-30 10:45:34 +08:00

77 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package router 负责路由注册。
//
// 所有 URL 的唯一定义处 —— 想知道服务暴露了哪些接口,只看这个文件即可。
package router
import (
"fashionapi/internal/config"
"fashionapi/internal/handler"
"fashionapi/internal/middleware"
"fashionapi/internal/pkg/jwt"
"github.com/gin-gonic/gin"
)
// Options 路由注册所需的全部依赖,由 main 装配后传入。
type Options struct {
Config *config.Config
JWT *jwt.Manager
Article *handler.ArticleHandler
Brand *handler.BrandHandler
StreetSnap *handler.StreetSnapHandler
Auth *handler.AuthHandler
Health *handler.HealthHandler
SSG *handler.SSGHandler
}
// New 构建 Gin 引擎并注册全部对外路由。
//
// 注意:SSG 内部接口(/api/ssg/*)不在这里注册,而是由 NewSSG 挂在独立的内部端口上,
// 二者物理隔离,确保构建期全量数据不会从对外公开端口泄露。
func New(opt Options) *gin.Engine {
r := gin.Default()
r.Use(middleware.CORS(opt.Config.CORS))
// 上传图片的静态服务。
// 接口返回的 cover / image 是相对路径(如 /uploads/2026/08/xx.jpg),
// 前端用 toAbs() 拼上 base 后直接访问,因此这里必须对外提供静态文件。
r.Static(opt.Config.Upload.URLPrefix, opt.Config.Upload.Dir)
api := r.Group("/api/v1")
{
// 健康检查,供容器 / 反向代理探活
api.GET("/health", opt.Health.Check)
// 对外公开接口:只读查询,不暴露任何后台管理字段
public := api.Group("/public")
// ClientSign 仅挂在「列表 / 品牌」两个批量查询接口上:
// 这俩是爬虫批量 dump 的主要目标,要求前端 JS 签名可抬高抓取成本。
public.Use(middleware.ClientSign(opt.Config.ClientSign))
{
// 走秀档案列表(按品牌过滤走 ?brand_id 查询参数)
public.GET("/runway-looks", opt.Article.List)
// 品牌列表(A-Z 索引 / 搜索)
public.GET("/brands", opt.Brand.List)
// 街拍列表(批量接口,受 ClientSign 保护,与 runway-looks/brands 同批)
public.GET("/street-snaps", opt.StreetSnap.List)
}
// 走秀详情:被 SSR 服务端按需渲染(getSsrArticle)直接 fetch 调用,属可信内部取数,
// 不走前端 JS 签名,单独挂载以免破坏服务端渲染。单篇枚举防护由 HashID 承担。
api.GET("/public/runway-looks/:id", opt.Article.Detail)
// 街拍详情:同走秀详情,单条枚举防护由 HashID 承担,不走前端签名。
api.GET("/public/street-snaps/:id", opt.StreetSnap.Detail)
// 账号体系:当前只保留「取当前用户」(JWT 无状态,无服务端登出路由)。
//
// 注册 / 登录接口已从路由移除:前端没有登录注册入口,对外开放即是垃圾账号与撞库入口。
// handler / service / repository / dto 中对应实现一并删除。
// 将来要接入时:补回 POST /auth/register、POST /auth/login,并同步前端 src/lib/api.ts 与登录页。
auth := api.Group("/auth")
{
auth.GET("/me", middleware.Auth(opt.JWT), opt.Auth.Me)
}
}
return r
}