You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

156 lines
4.0 KiB

package routers
import (
"fmt"
"log"
"mime"
"net/http"
"path/filepath"
"github.com/penggy/EasyGoLib/db"
"github.com/gin-contrib/pprof"
"github.com/gin-contrib/static"
"github.com/gin-gonic/gin"
"github.com/penggy/EasyGoLib/utils"
"github.com/penggy/cors"
"github.com/penggy/sessions"
validator "gopkg.in/go-playground/validator.v8"
)
/**
* @apiDefine simpleSuccess
* @apiSuccessExample 成功
* HTTP/1.1 200 OK
*/
/**
* @apiDefine authError
* @apiErrorExample 认证失败
* HTTP/1.1 401 access denied
*/
/**
* @apiDefine pageParam
* @apiParam {Number} start 分页开始,从零开始
* @apiParam {Number} limit 分页大小
* @apiParam {String} [sort] 排序字段
* @apiParam {String=ascending,descending} [order] 排序顺序
* @apiParam {String} [q] 查询参数
*/
/**
* @apiDefine pageSuccess
* @apiSuccess (200) {Number} total 总数
* @apiSuccess (200) {Array} rows 分页数据
*/
/**
* @apiDefine timeInfo
* @apiSuccess (200) {String} rows.createAt 创建时间, YYYY-MM-DD HH:mm:ss
* @apiSuccess (200) {String} rows.updateAt 结束时间, YYYY-MM-DD HH:mm:ss
*/
var Router *gin.Engine
func init() {
mime.AddExtensionType(".svg", "image/svg+xml")
mime.AddExtensionType(".m3u8", "application/vnd.apple.mpegurl")
// mime.AddExtensionType(".m3u8", "application/x-mpegurl")
mime.AddExtensionType(".ts", "video/mp2t")
// prevent on Windows with Dreamware installed, modified registry .css -> application/x-css
// see https://stackoverflow.com/questions/22839278/python-built-in-server-not-loading-css
mime.AddExtensionType(".css", "text/css; charset=utf-8")
gin.DisableConsoleColor()
gin.SetMode(gin.ReleaseMode)
gin.DefaultWriter = utils.GetLogWriter()
}
func Errors() gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
for _, err := range c.Errors {
switch err.Type {
case gin.ErrorTypeBind:
switch err.Err.(type) {
case validator.ValidationErrors:
errs := err.Err.(validator.ValidationErrors)
for _, err := range errs {
sec := utils.Conf().Section("localize")
field := sec.Key(err.Field).MustString(err.Field)
tag := sec.Key(err.Tag).MustString(err.Tag)
c.AbortWithStatusJSON(http.StatusBadRequest, fmt.Sprintf("%s %s", field, tag))
return
}
default:
log.Println(err.Err.Error())
c.AbortWithStatusJSON(http.StatusBadRequest, "Inner Error")
return
}
}
}
}
}
func NeedLogin() gin.HandlerFunc {
return func(c *gin.Context) {
if sessions.Default(c).Get("uid") == nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, "Unauthorized")
return
}
c.Next()
}
}
func Init() (err error) {
Router = gin.New()
pprof.Register(Router)
// Router.Use(gin.Logger())
Router.Use(gin.Recovery())
Router.Use(Errors())
Router.Use(cors.Default())
store := sessions.NewGormStoreWithOptions(db.SQLite, sessions.GormStoreOptions{
TableName: "t_sessions",
}, []byte("EasyDarwin@2018"))
tokenTimeout := utils.Conf().Section("http").Key("token_timeout").MustInt(7 * 86400)
store.Options(sessions.Options{HttpOnly: true, MaxAge: tokenTimeout, Path: "/"})
sessionHandle := sessions.Sessions("token", store)
{
wwwDir := filepath.Join(utils.DataDir(), "www")
Router.Use(static.Serve("/", static.LocalFile(wwwDir, true)))
}
{
api := Router.Group("/api/v1").Use(sessionHandle)
api.GET("/login", API.Login)
api.GET("/userinfo", API.UserInfo)
api.GET("/logout", API.Logout)
api.GET("/defaultlogininfo", API.DefaultLoginInfo)
api.GET("/modifypassword", NeedLogin(), API.ModifyPassword)
api.GET("/serverinfo", API.GetServerInfo)
api.GET("/restart", API.Restart)
api.GET("/pushers", API.Pushers)
api.GET("/players", API.Players)
api.GET("/stream/start", API.StreamStart)
api.GET("/stream/stop", API.StreamStop)
api.GET("/record/folders", API.RecordFolders)
api.GET("/record/files", API.RecordFiles)
}
{
mp4Path := utils.Conf().Section("rtsp").Key("m3u8_dir_path").MustString("")
if len(mp4Path) != 0 {
Router.Use(static.Serve("/record", static.LocalFile(mp4Path, true)))
}
}
return
}