163 lines
3.6 KiB
Go
163 lines
3.6 KiB
Go
package lightCore
|
||
|
||
import (
|
||
"code.zhecent.com/gopkg/light-core/pkg/myAes"
|
||
"github.com/gin-gonic/gin"
|
||
"google.golang.org/protobuf/proto"
|
||
"net/http"
|
||
"reflect"
|
||
)
|
||
|
||
var RespondList []Responder
|
||
|
||
func init() {
|
||
RespondList = []Responder{
|
||
new(EmptyResponder),
|
||
new(StringResponder),
|
||
new(ModelResponder),
|
||
new(SuccessResponder),
|
||
new(JsonErrorResponder),
|
||
new(ViewResponder),
|
||
new(ProtobufResponder),
|
||
new(ProtobufAesResponder),
|
||
new(RedirectResponder),
|
||
}
|
||
}
|
||
|
||
type Responder interface {
|
||
RespondTo() gin.HandlerFunc
|
||
}
|
||
|
||
func Convert(handler interface{}) gin.HandlerFunc {
|
||
hRef := reflect.ValueOf(handler)
|
||
for _, r := range RespondList {
|
||
rRef := reflect.ValueOf(r).Elem()
|
||
if hRef.Type().ConvertibleTo(rRef.Type()) {
|
||
rRef.Set(hRef)
|
||
return rRef.Interface().(Responder).RespondTo()
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
type StringResponder func(*gin.Context) string
|
||
|
||
func (t StringResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.String(http.StatusOK, t(context))
|
||
}
|
||
}
|
||
|
||
type ModelResponder func(*gin.Context) Model
|
||
|
||
func (t ModelResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.JSON(http.StatusOK, gin.H{
|
||
"code": 200,
|
||
"msg": "",
|
||
"data": t(context),
|
||
})
|
||
}
|
||
}
|
||
|
||
type JsonSuccess string
|
||
|
||
type SuccessResponder func(*gin.Context) JsonSuccess
|
||
|
||
func (t SuccessResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.JSON(http.StatusOK, gin.H{
|
||
"code": 200,
|
||
"msg": string(t(context)),
|
||
"data": []int{},
|
||
})
|
||
}
|
||
}
|
||
|
||
type JsonError error
|
||
|
||
type JsonErrorResponder func(*gin.Context) JsonError
|
||
|
||
func (t JsonErrorResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
err := t(context)
|
||
if err != nil {
|
||
context.JSON(http.StatusOK, gin.H{
|
||
"code": 400,
|
||
"msg": err.Error(),
|
||
"data": []int{},
|
||
})
|
||
} else {
|
||
context.JSON(http.StatusOK, gin.H{
|
||
"code": 200,
|
||
"msg": "success",
|
||
"data": []int{},
|
||
})
|
||
}
|
||
}
|
||
}
|
||
|
||
type EmptyResponder func(*gin.Context)
|
||
|
||
func (t EmptyResponder) RespondTo() gin.HandlerFunc {
|
||
//func(c *gin.Context)其实就是reply
|
||
//t,提示就是方法本身,其实就是reply
|
||
return func(context *gin.Context) {
|
||
//context是gin给的,全新的,没有任何资料的
|
||
//t(context)其实就是运行reply
|
||
t(context)
|
||
//fmt.Println("========================")
|
||
//fmt.Println(context.Writer)
|
||
//fmt.Println("========================")
|
||
}
|
||
|
||
}
|
||
|
||
type View string
|
||
|
||
type ViewResponder func(*gin.Context) View
|
||
|
||
func (t ViewResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.HTML(http.StatusOK, string(t(context))+".html", context.Keys)
|
||
}
|
||
}
|
||
|
||
type Protobuf proto.Message
|
||
type ProtobufResponder func(*gin.Context) Protobuf
|
||
|
||
func (t ProtobufResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.ProtoBuf(http.StatusOK, t(context))
|
||
}
|
||
}
|
||
|
||
type ProtobufAes proto.Message
|
||
type ProtobufAesResponder func(*gin.Context) ProtobufAes
|
||
|
||
func (t ProtobufAesResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
str, err := proto.Marshal(t(context))
|
||
if err != nil {
|
||
context.String(http.StatusBadRequest, err.Error())
|
||
} else {
|
||
decrypt, err := myAes.AesTool(context.GetString("LightAppKey"), context.GetString("LightAppIv")).Encrypt(string(str))
|
||
if err != nil {
|
||
context.String(http.StatusBadRequest, err.Error())
|
||
} else {
|
||
context.String(http.StatusOK, string(decrypt))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
type Redirect string
|
||
|
||
type RedirectResponder func(*gin.Context) Redirect
|
||
|
||
func (t RedirectResponder) RespondTo() gin.HandlerFunc {
|
||
return func(context *gin.Context) {
|
||
context.Redirect(http.StatusFound, string(t(context)))
|
||
}
|
||
}
|