route.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package frame
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. type HandlerFunc = func(permission *Permission, ctx *gin.Context) bool
  7. type IRouter interface {
  8. Builder(*Group)
  9. Name() string
  10. }
  11. type Group struct {
  12. *gin.RouterGroup
  13. permission *Permission
  14. parentPermission *Permission
  15. code string
  16. authCheck HandlerFunc
  17. permissions *[]*TreePermission
  18. }
  19. func (group *Group) GetPermissions() *[]*TreePermission {
  20. return group.permissions
  21. }
  22. func (group *Group) SetAuthCheck(authCheck HandlerFunc) *Group {
  23. group.authCheck = authCheck
  24. return group
  25. }
  26. func (group *Group) Use(middleware ...IMidHandler) *Group {
  27. for _, v := range middleware {
  28. group.RouterGroup.Use(MidFactory(v))
  29. }
  30. return group
  31. }
  32. func (group *Group) Group(name string, handlers ...interface{}) *Group {
  33. handl := []gin.HandlerFunc{}
  34. for _, v := range handlers {
  35. if h := Convert(v); h != nil {
  36. handl = append(handl, h)
  37. }
  38. }
  39. newGroup := &Group{permissions: group.permissions, RouterGroup: group.RouterGroup.Group(name, handl...), permission: nil, parentPermission: group.permission, authCheck: group.authCheck}
  40. return newGroup
  41. }
  42. func (group *Group) Handle(httpMethod, relativePath string, handlers ...interface{}) *Router {
  43. handl := []gin.HandlerFunc{}
  44. for _, v := range handlers {
  45. if h := Convert(v); h != nil {
  46. handl = append(handl, h)
  47. }
  48. }
  49. if group.parentPermission == nil {
  50. group.parentPermission = group.permission
  51. } else {
  52. if group.parentPermission.Cat == 1 {
  53. group.parentPermission = group.permission
  54. }
  55. }
  56. r := &Router{permissions: group.permissions, authCheck: group.authCheck, parentPermission: group.parentPermission}
  57. group.RouterGroup.Handle(httpMethod, relativePath, r.wareFunc(handl)...)
  58. return r
  59. }
  60. // POST is a shortcut for router.Handle("POST", path, handle).
  61. func (group *Group) POST(relativePath string, handlers ...interface{}) *Router {
  62. return group.Handle(http.MethodPost, relativePath, handlers...)
  63. }
  64. // GET is a shortcut for router.Handle("GET", path, handle).
  65. func (group *Group) GET(relativePath string, handlers ...interface{}) *Router {
  66. return group.Handle(http.MethodGet, relativePath, handlers...)
  67. }
  68. type Router struct {
  69. parentPermission *Permission
  70. permission *Permission
  71. authCheck HandlerFunc
  72. permissions *[]*TreePermission
  73. }
  74. // 权限配置使用
  75. func (this *Router) Permission(cat int, code string, label string) {
  76. permission := new(Permission)
  77. permission.add(this.permissions, this.parentPermission, cat, code, label)
  78. this.permission = &Permission{
  79. cat,
  80. code,
  81. label,
  82. }
  83. }
  84. // DELETE is a shortcut for router.Handle("DELETE", path, handle).
  85. func (group *Group) DELETE(relativePath string, handlers ...interface{}) *Router {
  86. return group.Handle(http.MethodDelete, relativePath, handlers...)
  87. }
  88. // PATCH is a shortcut for router.Handle("PATCH", path, handle).
  89. func (group *Group) PATCH(relativePath string, handlers ...interface{}) *Router {
  90. return group.Handle(http.MethodPatch, relativePath, handlers...)
  91. }
  92. func (group *Router) wareFunc(handlers []gin.HandlerFunc) []gin.HandlerFunc {
  93. fns := make([]gin.HandlerFunc, 0)
  94. //这个时候拿到的permission是上一次的
  95. for _, handler := range handlers {
  96. fns = append(fns, group.getFunc(handler))
  97. }
  98. return fns
  99. }
  100. func (group *Group) Permission(cat int, code string, label string) *Group {
  101. permission := new(Permission)
  102. permission.add(group.permissions, group.parentPermission, cat, code, label)
  103. group.code = code
  104. group.permission = &Permission{
  105. cat,
  106. code,
  107. label,
  108. }
  109. return group
  110. }
  111. // PUT is a shortcut for router.Handle("PUT", path, handle).
  112. func (group *Group) PUT(relativePath string, handlers ...interface{}) *Router {
  113. return group.Handle(http.MethodPut, relativePath, handlers...)
  114. }
  115. // OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle).
  116. func (group *Group) OPTIONS(relativePath string, handlers ...interface{}) *Router {
  117. return group.Handle(http.MethodOptions, relativePath, handlers...)
  118. }
  119. // HEAD is a shortcut for router.Handle("HEAD", path, handle).
  120. func (group *Group) HEAD(relativePath string, handlers ...interface{}) *Router {
  121. return group.Handle(http.MethodHead, relativePath, handlers...)
  122. }
  123. // HEAD is a shortcut for router.Handle("HEAD", path, handle).
  124. func (group *Group) Native() *gin.RouterGroup {
  125. return group.RouterGroup
  126. }
  127. // Any registers a route that matches all the HTTP methods.
  128. // GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE.
  129. func (group *Group) Any(relativePath string, handlers ...interface{}) *Group {
  130. group.Handle(http.MethodGet, relativePath, handlers...)
  131. group.Handle(http.MethodPost, relativePath, handlers...)
  132. group.Handle(http.MethodPut, relativePath, handlers...)
  133. group.Handle(http.MethodPatch, relativePath, handlers...)
  134. group.Handle(http.MethodHead, relativePath, handlers...)
  135. group.Handle(http.MethodOptions, relativePath, handlers...)
  136. group.Handle(http.MethodDelete, relativePath, handlers...)
  137. group.Handle(http.MethodConnect, relativePath, handlers...)
  138. group.Handle(http.MethodTrace, relativePath, handlers...)
  139. return group
  140. }
  141. func (group *Router) getFunc(handler gin.HandlerFunc) gin.HandlerFunc {
  142. fn := func(c *gin.Context) {
  143. if group.permission != nil {
  144. if group.authCheck != nil {
  145. if !group.authCheck(group.permission, c) {
  146. return
  147. }
  148. }
  149. c.Set("permission", group.permission)
  150. }
  151. handler(c)
  152. //如果没有处理返回自动返回
  153. body := c.Writer.(*BodyLogWriter).Body
  154. s := Context{
  155. Context: c,
  156. }
  157. cat := c.Writer.Header().Get("Content-Type")
  158. if body.String() == "" && cat != "application/octet-stream" {
  159. s.Ok()
  160. }
  161. }
  162. return fn
  163. }