POST /api/web/seopush/indexnow/bulk?limit=10
- 组装主页 "/" 和前 N-1 个专题(playlet_theme 按 Rank 降序)URL
- 调用 pub/seo/indexnow.BatchIndexNowSubmitter 提交到 api.indexnow.org
- 返回提交的 URL 列表 + IndexNow 回执(含各引擎 HTTP 状态码)
- Admin 鉴权(走 /api/web/* 的 auth 中间件)
部署前提:
- web.yaml 配置 indexNow.key
- Web 根目录可访问 /{key}.txt(内容为 key 本身)作为 IndexNow 域名验证
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package router
|
|
|
|
import (
|
|
"hkdj-web-server/pub/common/errors"
|
|
"hkdj-web-server/pub/common/useragent"
|
|
"hkdj-web-server/web/middleware/auth"
|
|
"hkdj-web-server/web/middleware/cors"
|
|
"hkdj-web-server/web/middleware/ipblacklist"
|
|
"hkdj-web-server/web/middleware/limitHandler"
|
|
"hkdj-web-server/web/webg"
|
|
"net/http"
|
|
|
|
"github.com/DeanThompson/ginpprof"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func Init() (engine *gin.Engine) {
|
|
|
|
// 设置启动模式
|
|
switch webg.Conf.RunMod {
|
|
case "dev":
|
|
gin.SetMode(gin.DebugMode)
|
|
case "test":
|
|
gin.SetMode(gin.TestMode)
|
|
case "prod":
|
|
gin.SetMode(gin.ReleaseMode)
|
|
default:
|
|
gin.SetMode(gin.DebugMode)
|
|
}
|
|
|
|
// 初始化gin引擎
|
|
engine = gin.Default()
|
|
engine.HandleMethodNotAllowed = true
|
|
engine.MaxMultipartMemory = 60 << 20
|
|
|
|
engine.NoMethod(noMethod)
|
|
engine.NoRoute(noRoute)
|
|
|
|
// 注册中间件
|
|
registeMiddleware(engine)
|
|
wbVideoDataRouter(engine)
|
|
registerRouter(engine)
|
|
|
|
// 是否开启监控服务
|
|
if webg.Conf.Pprof {
|
|
ginpprof.Wrap(engine)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func noMethod(c *gin.Context) {
|
|
c.JSON(http.StatusMethodNotAllowed, errors.MakeWithMsg(errors.MethodNotFound, "MethodNotFound"))
|
|
}
|
|
|
|
func noRoute(c *gin.Context) {
|
|
c.JSON(http.StatusNotFound, errors.MakeWithMsg(errors.ApiNotFound, "ApiNotFound"))
|
|
}
|
|
|
|
func registeMiddleware(engine *gin.Engine) {
|
|
engine.Use(gin.Recovery())
|
|
engine.Use(cors.Cors(&cors.Options{
|
|
Origin: nil, // "*"
|
|
Methods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodHead, http.MethodDelete},
|
|
AllowedHeaders: []string{"Content-Length", "Content-Type", "Authorization", "X-User-Agent", useragent.SDKCommonHeader},
|
|
ExposedHeaders: []string{"Content-Disposition", "Refresh-Authorization"},
|
|
OptionsSuccessStatus: http.StatusOK,
|
|
}))
|
|
engine.Use(ipblacklist.IpBlackListMiddleware)
|
|
engine.Use(auth.Auth)
|
|
engine.Use(limitHandler.LoginLimit)
|
|
engine.Use(auth.OperateLog)
|
|
}
|
|
|
|
func registerRouter(router *gin.Engine) {
|
|
rootRouter := router.Group("/api/web")
|
|
{
|
|
MainWebRouter(rootRouter)
|
|
syscfgRouter(rootRouter)
|
|
fileRouter(rootRouter)
|
|
videoRouter(rootRouter)
|
|
richTextContent(rootRouter)
|
|
commentRouter(rootRouter)
|
|
ipBlackRouter(rootRouter)
|
|
detailNavRouter(rootRouter)
|
|
announcementRouter(rootRouter)
|
|
cardRouter(rootRouter)
|
|
coinRouter(rootRouter)
|
|
rechargePackageRouter(rootRouter)
|
|
userRouter(rootRouter)
|
|
translationRouter(rootRouter)
|
|
mediaResourceRouter(rootRouter)
|
|
playletRouter(rootRouter)
|
|
homeBannerRouter(rootRouter)
|
|
homeConfigRouter(rootRouter)
|
|
feedbackRouter(rootRouter)
|
|
contactUsRouter(rootRouter)
|
|
seopushRouter(rootRouter)
|
|
}
|
|
// 第三方回调路由(免鉴权,挂在 engine 上而非 /api/web 分组)
|
|
thirdRouter(router)
|
|
}
|