mirror of
https://github.com/lzh-1625/go_process_manager.git
synced 2025-09-26 20:11:20 +08:00
初次提交
This commit is contained in:
26
route/middle/panic.go
Normal file
26
route/middle/panic.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package middle
|
||||
|
||||
import (
|
||||
"msm/consts/ctxflag"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func PanicMiddle() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
defer func() {
|
||||
if err := recover(); err == 0 {
|
||||
if err, ok := c.Get(ctxflag.ERR); ok {
|
||||
rErr(c, -1, err.(error).Error(), err.(error))
|
||||
} else {
|
||||
rErr(c, -1, "内部错误", nil)
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
c.Next()
|
||||
}
|
||||
}
|
44
route/middle/permission.go
Normal file
44
route/middle/permission.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package middle
|
||||
|
||||
import (
|
||||
"msm/consts/ctxflag"
|
||||
"msm/consts/permission"
|
||||
"msm/consts/role"
|
||||
"msm/dao"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func RolePermission(needPermission role.Role) func(ctx *gin.Context) {
|
||||
return func(ctx *gin.Context) {
|
||||
if r := ctx.GetInt(ctxflag.ROLE); r > int(needPermission) {
|
||||
rErr(ctx, -1, "角色权限不足", nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
||||
|
||||
func OprPermission(op permission.OprPermission) func(ctx *gin.Context) {
|
||||
return func(ctx *gin.Context) {
|
||||
uuid, err := strconv.Atoi(ctx.Query("uuid"))
|
||||
if err != nil {
|
||||
rErr(ctx, -1, "参数有误", nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
if ctx.GetInt(ctxflag.ROLE) < int(role.USER) {
|
||||
ctx.Next()
|
||||
return
|
||||
}
|
||||
if !reflect.ValueOf(dao.PermissionDao.GetPermission(ctx.GetString(ctxflag.USER_NAME), uuid)).FieldByName(string(op)).Bool() {
|
||||
rErr(ctx, -1, "操作权限不足", nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
73
route/middle/token.go
Normal file
73
route/middle/token.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package middle
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"msm/consts/ctxflag"
|
||||
"msm/dao"
|
||||
"msm/log"
|
||||
"msm/utils"
|
||||
"slices"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// code -1为失败,-2为token失效
|
||||
func rErr(ctx *gin.Context, code int, message string, err error) {
|
||||
var statusCode int
|
||||
switch code {
|
||||
case -1:
|
||||
statusCode = 500
|
||||
case -2:
|
||||
statusCode = 401
|
||||
default:
|
||||
statusCode = 200
|
||||
}
|
||||
log.Logger.Warn(err)
|
||||
ctx.JSON(statusCode, map[string]any{
|
||||
"code": code,
|
||||
"msg": message,
|
||||
})
|
||||
ctx.Abort()
|
||||
}
|
||||
|
||||
func CheckToken() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
whiteList := []string{
|
||||
"/api/user/login",
|
||||
"/api/user/register/admin",
|
||||
}
|
||||
if !slices.Contains(whiteList, c.Request.URL.Path) {
|
||||
var token string
|
||||
if c.Request.Header.Get("token") != "" {
|
||||
token = c.Request.Header.Get("token")
|
||||
} else {
|
||||
token = c.Query("token")
|
||||
}
|
||||
if _, err := utils.ParseToken(token); err != nil {
|
||||
rErr(c, -2, "token校验失败", err)
|
||||
return
|
||||
}
|
||||
if username, err := getUser(c); err != nil {
|
||||
rErr(c, -1, "无法获取user信息", err)
|
||||
} else {
|
||||
c.Set(ctxflag.USER_NAME, username)
|
||||
c.Set(ctxflag.ROLE, dao.UserDao.GetUserByName(username).Role)
|
||||
}
|
||||
}
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
func getUser(ctx *gin.Context) (string, error) {
|
||||
var token string
|
||||
if ctx.Request.Header.Get("token") != "" {
|
||||
token = ctx.Request.Header.Get("token")
|
||||
} else {
|
||||
token = ctx.Query("token")
|
||||
}
|
||||
if mc, err := utils.ParseToken(token); err == nil && mc != nil {
|
||||
return mc.UserName, nil
|
||||
} else {
|
||||
return "", errors.Join(errors.New("用户信息获取失败"), err)
|
||||
}
|
||||
}
|
111
route/route.go
Normal file
111
route/route.go
Normal file
@@ -0,0 +1,111 @@
|
||||
package route
|
||||
|
||||
import (
|
||||
"io"
|
||||
"msm/api"
|
||||
"msm/config"
|
||||
"msm/consts/permission"
|
||||
"msm/consts/role"
|
||||
"msm/log"
|
||||
"msm/route/middle"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-contrib/pprof"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func Route() {
|
||||
r := gin.Default()
|
||||
gin.DefaultWriter = io.Discard
|
||||
gin.SetMode(gin.DebugMode)
|
||||
routePathInit(r)
|
||||
staticInit(r)
|
||||
pprofInit(r)
|
||||
r.Run(config.CF.Listen)
|
||||
}
|
||||
|
||||
func staticInit(r *gin.Engine) {
|
||||
r.NoRoute(func(c *gin.Context) {
|
||||
c.HTML(http.StatusOK, "index.html", gin.H{})
|
||||
})
|
||||
r.Static("/js", "templates/js")
|
||||
r.Static("/css", "templates/css")
|
||||
r.Static("/media", "templates/media")
|
||||
r.Static("/fonts", "templates/fonts")
|
||||
r.LoadHTMLFiles("templates/index.html")
|
||||
}
|
||||
|
||||
func pprofInit(r *gin.Engine) {
|
||||
if config.CF.PprofEnable {
|
||||
pprof.Register(r)
|
||||
log.Logger.Info("启用 pprof")
|
||||
}
|
||||
}
|
||||
|
||||
func routePathInit(r *gin.Engine) {
|
||||
apiGroup := r.Group("/api")
|
||||
apiGroup.Use(middle.CheckToken())
|
||||
apiGroup.Use(middle.PanicMiddle())
|
||||
{
|
||||
apiGroup.GET("/ws", middle.OprPermission(permission.TERMINAL_OPERATION), api.WsApi.WebsocketHandle)
|
||||
|
||||
processGroup := apiGroup.Group("/process")
|
||||
{
|
||||
processGroup.DELETE("", middle.OprPermission(permission.STOP_OPERATION), api.ProcApi.KillProcess)
|
||||
processGroup.GET("", api.ProcApi.GetProcessList)
|
||||
processGroup.PUT("", middle.OprPermission(permission.START_OPERATION), api.ProcApi.StartProcess)
|
||||
processGroup.GET("/control", middle.RolePermission(role.ADMIN), api.ProcApi.ProcessControl)
|
||||
|
||||
proConfigGroup := processGroup.Group("/config")
|
||||
{
|
||||
proConfigGroup.POST("", middle.RolePermission(role.ROOT), api.ProcApi.CreateNewProcess)
|
||||
proConfigGroup.DELETE("", middle.RolePermission(role.ROOT), api.ProcApi.DeleteNewProcess)
|
||||
proConfigGroup.PUT("", middle.RolePermission(role.ROOT), api.ProcApi.UpdateProcessConfig)
|
||||
proConfigGroup.GET("", middle.RolePermission(role.ADMIN), api.ProcApi.GetProcessConfig)
|
||||
}
|
||||
}
|
||||
|
||||
userGroup := apiGroup.Group("/user")
|
||||
{
|
||||
userGroup.POST("/login", api.UserApi.LoginHandler)
|
||||
userGroup.POST("", middle.RolePermission(role.ROOT), api.UserApi.CreateUser)
|
||||
userGroup.PUT("/password", middle.RolePermission(role.USER), api.UserApi.ChangePassword)
|
||||
userGroup.DELETE("", middle.RolePermission(role.ROOT), api.UserApi.DeleteUser)
|
||||
userGroup.GET("", middle.RolePermission(role.ROOT), api.UserApi.GetUserList)
|
||||
}
|
||||
|
||||
pushGroup := apiGroup.Group("/push").Use(middle.RolePermission(role.ADMIN))
|
||||
{
|
||||
pushGroup.GET("/list", api.PushApi.GetPushList)
|
||||
pushGroup.GET("", api.PushApi.GetPushById)
|
||||
pushGroup.POST("", api.PushApi.AddPushConfig)
|
||||
pushGroup.PUT("", api.PushApi.UpdatePushConfig)
|
||||
pushGroup.DELETE("", api.PushApi.DeletePushConfig)
|
||||
}
|
||||
|
||||
fileGroup := apiGroup.Group("/file").Use(middle.RolePermission(role.ADMIN))
|
||||
{
|
||||
fileGroup.GET("/list", api.FileApi.FilePathHandler)
|
||||
fileGroup.PUT("", api.FileApi.FileWriteHandler)
|
||||
fileGroup.GET("", api.FileApi.FileReadHandler)
|
||||
}
|
||||
|
||||
permissionGroup := apiGroup.Group("/permission").Use(middle.RolePermission(role.ROOT))
|
||||
{
|
||||
permissionGroup.GET("/list", api.PermissionApi.GetPermissionList)
|
||||
permissionGroup.PUT("", api.PermissionApi.EditPermssion)
|
||||
}
|
||||
|
||||
logGroup := apiGroup.Group("/log").Use(middle.RolePermission(role.ADMIN))
|
||||
{
|
||||
logGroup.POST("", api.LogApi.GetLog)
|
||||
}
|
||||
|
||||
configGroup := apiGroup.Group("/config").Use(middle.RolePermission(role.ROOT))
|
||||
{
|
||||
configGroup.GET("", api.ConfigApi.GetSystemConfiguration)
|
||||
configGroup.PUT("", api.ConfigApi.SetSystemConfiguration)
|
||||
configGroup.PUT("/es", api.ConfigApi.EsConfigReload)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user