package web import ( "embed" "fmt" "github.com/gin-contrib/gzip" "github.com/gin-gonic/gin" "io/fs" "net/http" "strconv" "trojan/core" "trojan/util" "trojan/web/controller" ) //go:embed templates/* var f embed.FS func userRouter(router *gin.Engine) { user := router.Group("/trojan/user") { user.GET("", func(c *gin.Context) { requestUser := RequestUsername(c) c.JSON(200, controller.UserList(requestUser)) }) user.GET("/page", func(c *gin.Context) { curPageStr := c.DefaultQuery("curPage", "1") pageSizeStr := c.DefaultQuery("pageSize", "10") curPage, _ := strconv.Atoi(curPageStr) pageSize, _ := strconv.Atoi(pageSizeStr) c.JSON(200, controller.PageUserList(curPage, pageSize)) }) user.POST("", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") c.JSON(200, controller.CreateUser(username, password)) }) user.POST("/update", func(c *gin.Context) { sid := c.PostForm("id") username := c.PostForm("username") password := c.PostForm("password") id, _ := strconv.Atoi(sid) c.JSON(200, controller.UpdateUser(uint(id), username, password)) }) user.POST("/expire", func(c *gin.Context) { sid := c.PostForm("id") sDays := c.PostForm("useDays") id, _ := strconv.Atoi(sid) useDays, _ := strconv.Atoi(sDays) c.JSON(200, controller.SetExpire(uint(id), uint(useDays))) }) user.DELETE("/expire", func(c *gin.Context) { sid := c.Query("id") id, _ := strconv.Atoi(sid) c.JSON(200, controller.CancelExpire(uint(id))) }) user.DELETE("", func(c *gin.Context) { stringId := c.Query("id") id, _ := strconv.Atoi(stringId) c.JSON(200, controller.DelUser(uint(id))) }) } } func trojanRouter(router *gin.Engine) { router.POST("/trojan/start", func(c *gin.Context) { c.JSON(200, controller.Start()) }) router.POST("/trojan/stop", func(c *gin.Context) { c.JSON(200, controller.Stop()) }) router.POST("/trojan/restart", func(c *gin.Context) { c.JSON(200, controller.Restart()) }) router.GET("/trojan/loglevel", func(c *gin.Context) { c.JSON(200, controller.GetLogLevel()) }) router.GET("/trojan/export", func(c *gin.Context) { result := controller.ExportCsv(c) if result != nil { c.JSON(200, result) } }) router.POST("/trojan/import", func(c *gin.Context) { c.JSON(200, controller.ImportCsv(c)) }) router.POST("/trojan/update", func(c *gin.Context) { c.JSON(200, controller.Update()) }) router.POST("/trojan/switch", func(c *gin.Context) { tType := c.DefaultPostForm("type", "trojan") c.JSON(200, controller.SetTrojanType(tType)) }) router.POST("/trojan/loglevel", func(c *gin.Context) { slevel := c.DefaultPostForm("level", "1") level, _ := strconv.Atoi(slevel) c.JSON(200, controller.SetLogLevel(level)) }) router.POST("/trojan/domain", func(c *gin.Context) { c.JSON(200, controller.SetDomain(c.PostForm("domain"))) }) router.GET("/trojan/log", func(c *gin.Context) { controller.Log(c) }) } func dataRouter(router *gin.Engine) { data := router.Group("/trojan/data") { data.POST("", func(c *gin.Context) { sID := c.PostForm("id") sQuota := c.PostForm("quota") id, _ := strconv.Atoi(sID) quota, _ := strconv.Atoi(sQuota) c.JSON(200, controller.SetData(uint(id), quota)) }) data.DELETE("", func(c *gin.Context) { sID := c.Query("id") id, _ := strconv.Atoi(sID) c.JSON(200, controller.CleanData(uint(id))) }) data.POST("/resetDay", func(c *gin.Context) { dayStr := c.DefaultPostForm("day", "1") day, _ := strconv.Atoi(dayStr) c.JSON(200, controller.UpdateResetDay(uint(day))) }) data.GET("/resetDay", func(c *gin.Context) { c.JSON(200, controller.GetResetDay()) }) } } func commonRouter(router *gin.Engine) { common := router.Group("/common") { common.GET("/version", func(c *gin.Context) { c.JSON(200, controller.Version()) }) common.GET("/serverInfo", func(c *gin.Context) { c.JSON(200, controller.ServerInfo()) }) common.GET("/clashRules", func(c *gin.Context) { c.JSON(200, controller.GetClashRules()) }) common.POST("/clashRules", func(c *gin.Context) { rules := c.PostForm("rules") c.JSON(200, controller.SetClashRules(rules)) }) common.DELETE("/clashRules", func(c *gin.Context) { c.JSON(200, controller.ResetClashRules()) }) common.POST("/loginInfo", func(c *gin.Context) { c.JSON(200, controller.SetLoginInfo(c.PostForm("title"))) }) } } func staticRouter(router *gin.Engine) { staticFs, _ := fs.Sub(f, "templates/static") router.StaticFS("/static", http.FS(staticFs)) router.GET("/", func(c *gin.Context) { indexHTML, _ := f.ReadFile("templates/" + "index.html") c.Writer.Write(indexHTML) }) } func noTokenRouter(router *gin.Engine) { router.GET("/trojan/user/subscribe", func(c *gin.Context) { controller.ClashSubInfo(c) }) } // Start web启动入口 func Start(host string, port, timeout int, isSSL bool) { router := gin.Default() router.SetTrustedProxies(nil) router.Use(gzip.Gzip(gzip.DefaultCompression)) staticRouter(router) noTokenRouter(router) router.Use(Auth(router, timeout).MiddlewareFunc()) trojanRouter(router) userRouter(router) dataRouter(router) commonRouter(router) controller.ScheduleTask() controller.CollectTask() util.OpenPort(port) if isSSL { config := core.GetConfig() ssl := &config.SSl router.RunTLS(fmt.Sprintf("%s:%d", host, port), ssl.Cert, ssl.Key) } else { router.Run(fmt.Sprintf("%s:%d", host, port)) } }