- 新增 advitise v2: info/location/bind/click-stat/day-click-stat 模型与 对应的 service、api、router、proto 定义 - models/index.go 注册 5 个新模型的索引初始化 - 鉴权白名单: /rsdownload/ 改为 /download/,放行 advitise v2 的 get/click 接口 - statg/config: proxyUrl 增加 fileRes1 - common/genId: lid 生成逻辑补充 - 新增 91fans / huangguo 的 mobileconfig 描述文件 - 新增 deploy/nginx/cpcdownload.mfcg.me.conf 网关配置 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
117 lines
3.2 KiB
Go
117 lines
3.2 KiB
Go
package router
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"stat/api/versionApi"
|
|
"stat/common/enum/consts"
|
|
"stat/middleware/auth"
|
|
"stat/middleware/cors"
|
|
"stat/statg"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
_ "stat/docs"
|
|
|
|
swaggerFiles "github.com/swaggo/files"
|
|
ginSwagger "github.com/swaggo/gin-swagger"
|
|
)
|
|
|
|
var (
|
|
modMap = map[consts.RunMod]string{
|
|
consts.RunModeDev: gin.DebugMode,
|
|
consts.RunModeTest: gin.TestMode,
|
|
consts.RunModRelease: gin.ReleaseMode,
|
|
}
|
|
)
|
|
|
|
var (
|
|
apiNot = errors.New("ApiNotFound")
|
|
methodNot = errors.New("MethodNotFound")
|
|
)
|
|
|
|
// SetupGin 初始化gin router
|
|
func SetupGin() *gin.Engine {
|
|
ginMod()
|
|
router := ginEngine()
|
|
registerMiddleware(router)
|
|
registerRouter(router)
|
|
if statg.Conf.RunMod != consts.RunModRelease {
|
|
setGinSwagger(router)
|
|
}
|
|
return router
|
|
}
|
|
|
|
func ginMod() {
|
|
mod := modMap[statg.Conf.RunMod]
|
|
if mod == "" {
|
|
mod = "debug"
|
|
}
|
|
gin.SetMode(mod)
|
|
}
|
|
|
|
func ginEngine() *gin.Engine {
|
|
router := gin.Default()
|
|
router.HandleMethodNotAllowed = true
|
|
router.MaxMultipartMemory = 60 << 20
|
|
|
|
//pprof.Register(router, "/1D35BBAB35F3/pprof")
|
|
|
|
router.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", "User-Agent"},
|
|
ExposedHeaders: []string{"Content-Disposition", "Refresh-Authorization", "Cur-Ver"},
|
|
OptionsSuccessStatus: http.StatusOK,
|
|
}))
|
|
|
|
router.NoMethod(func(c *gin.Context) {
|
|
c.JSON(http.StatusMethodNotAllowed, methodNot)
|
|
})
|
|
|
|
router.NoRoute(func(c *gin.Context) {
|
|
c.JSON(http.StatusNotFound, apiNot)
|
|
})
|
|
|
|
return router
|
|
}
|
|
|
|
func registerMiddleware(router *gin.Engine) {
|
|
// router.Use(limit.Limit())
|
|
router.Use(auth.Auth)
|
|
}
|
|
|
|
func registerRouter(router *gin.Engine) {
|
|
rootRouter := router.Group("/api/stat")
|
|
{
|
|
adminRouter(rootRouter) // 管理员管理及登陆
|
|
authorityRouter(rootRouter) // 角色权限管理
|
|
appInfoRouter(rootRouter) // App及落地页管理
|
|
channelRouter(rootRouter) // 渠道扣量结算等管理及统计
|
|
agentRouter(rootRouter) // 代理管理及统计模块
|
|
statRouter(rootRouter) // 数据统计
|
|
fileRouter(rootRouter) // 文件上传
|
|
opLogRouter(rootRouter) // 操作日志管理
|
|
adsRouter(rootRouter) // 广告管理
|
|
versionRouter(rootRouter) // 版本落地页
|
|
announceRouter(rootRouter) // 公告管理
|
|
activityRouter(rootRouter) // 活动抽奖
|
|
statadvertiseRouter(rootRouter) // 广告统计
|
|
innerRouter(rootRouter) // 服务器同步
|
|
applicationRouter(rootRouter) // 配置app应用
|
|
appcategoryRouter(rootRouter) // app分类
|
|
userInviteRouter(rootRouter) // 兼容
|
|
advitiseV2Router(rootRouter) // 广告管理V2(素材/位置/绑定)
|
|
}
|
|
|
|
// 双端下载落地页(无需登陆鉴权)
|
|
router.GET("/download/:appId/:channel", versionApi.CpcDownload)
|
|
}
|
|
|
|
func setGinSwagger(router *gin.Engine) {
|
|
url := ginSwagger.URL(fmt.Sprintf("http://%s:%s/swagger/doc.json", statg.Conf.Host, strconv.Itoa(statg.Conf.Port)))
|
|
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
|
|
}
|