2023-03-03 16:52:18 +08:00
|
|
|
// Package router ...
|
|
|
|
//
|
|
|
|
// Description : 注册路由
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 2021-03-26 2:13 下午
|
|
|
|
package router
|
|
|
|
|
|
|
|
import (
|
|
|
|
"log"
|
|
|
|
"reflect"
|
|
|
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// DebugLogEnable 默认打开debug日志
|
|
|
|
DebugLogEnable = true
|
|
|
|
)
|
|
|
|
|
|
|
|
// DisableDebugLog 禁用debug日志
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 2:17 下午 2021/3/26
|
|
|
|
func DisableDebugLog() {
|
|
|
|
DebugLogEnable = false
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterRouter 注册一个路由
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 2:14 下午 2021/3/26
|
2024-07-19 22:31:18 +08:00
|
|
|
func RegisterRouter(router *gin.Engine, apiInstanceList ...any) error {
|
2023-03-03 16:52:18 +08:00
|
|
|
for _, apiInstance := range apiInstanceList {
|
|
|
|
if nil == apiInstance {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
val := reflect.ValueOf(apiInstance)
|
|
|
|
switch val.Kind() {
|
|
|
|
case reflect.Struct:
|
|
|
|
fallthrough
|
|
|
|
case reflect.Ptr:
|
|
|
|
api, ok := apiInstance.(IApi)
|
|
|
|
if ok {
|
|
|
|
if err := HandleRegisterRouter(router, api.GetMethod(), api.GetURI(), api.GetHandler(), api.GetMiddleWareList()); nil != err {
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
routerLog(val.String() + "结构体或者结构体指针, 自动识别函数是否包含RouterFunc")
|
|
|
|
// 不是IApi接口,自动识别函数列表 RouterFunc 函数自动注册
|
|
|
|
methodCnt := val.NumMethod()
|
|
|
|
for i := 0; i < methodCnt; i++ {
|
|
|
|
// TODO : 识别函数本身是不是 RouterFunc
|
|
|
|
af, o := val.Method(i).Interface().(func() (string, string, gin.HandlerFunc, []gin.HandlerFunc))
|
|
|
|
if o {
|
|
|
|
method, uri, handler, middlewareList := af()
|
|
|
|
if err := HandleRegisterRouter(router, method, uri, handler, middlewareList); nil != err {
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
apiFuncList := val.Method(i).Call(nil)
|
|
|
|
for _, apiFuncVal := range apiFuncList {
|
2024-07-19 22:31:18 +08:00
|
|
|
apiFunc, ok := apiFuncVal.Interface().(RegisterFunc)
|
2023-03-03 16:52:18 +08:00
|
|
|
if !ok {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
method, uri, handler, middlewareList := apiFunc()
|
|
|
|
if err := HandleRegisterRouter(router, method, uri, handler, middlewareList); nil != err {
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
case reflect.Func:
|
2024-07-19 22:31:18 +08:00
|
|
|
api, ok := apiInstance.(RegisterFunc)
|
2023-03-03 16:52:18 +08:00
|
|
|
if !ok {
|
|
|
|
err := errors.New("函数方式注册路由必须是 RouterFunc")
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
method, uri, handler, middlewareList := api()
|
|
|
|
if err := HandleRegisterRouter(router, method, uri, handler, middlewareList); nil != err {
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
err := errors.New("注册的路由必须是 IApi 或者 RouterFunc 或者 包含 RouterFunc 的结构体")
|
|
|
|
routerLog(err.Error())
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// routerLog 记录日志
|
|
|
|
//
|
|
|
|
// Author : go_developer@163.com<白茶清欢>
|
|
|
|
//
|
|
|
|
// Date : 2:28 下午 2021/3/26
|
|
|
|
func routerLog(msg string) {
|
|
|
|
if !DebugLogEnable || len(msg) == 0 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
log.Print(msg)
|
|
|
|
}
|