diff --git a/README.md b/README.md index 29a1723..bd68f71 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ ## 平台简介 -* 基于全新Go Frame 2+Vue3+Naive UI+UinApp开发的全栖框架,为二次开发而生,适合中小型完整应用开发。 -* 前端采用Naive-Ui-Admin、Vue、Naive UI、UinApp。 +* 基于全新Go Frame 2+Vue3+Naive UI+uniapp开发的全栖框架,为二次开发而生,适合中小型完整应用开发。 +* 前端采用Naive-Ui-Admin、Vue、Naive UI、uniapp。 ## 演示地址 - [https://hotgo.facms.cn/admin](https://hotgo.facms.cn/admin) diff --git a/docs/guide-zh-CN/images/sys-middleware-com-response.png b/docs/guide-zh-CN/images/sys-middleware-com-response.png new file mode 100644 index 0000000..86e86d0 Binary files /dev/null and b/docs/guide-zh-CN/images/sys-middleware-com-response.png differ diff --git a/docs/guide-zh-CN/sys-catalog.md b/docs/guide-zh-CN/sys-catalog.md index 7a0cd44..e61d0a5 100644 --- a/docs/guide-zh-CN/sys-catalog.md +++ b/docs/guide-zh-CN/sys-catalog.md @@ -4,7 +4,7 @@ - 服务端 - web前端 -- uinapp端(待开放) +- uniapp端(待开放) #### 服务端 @@ -169,7 +169,7 @@ ``` -#### uinapp端 +#### uniapp端 ``` // 待开放 ``` \ No newline at end of file diff --git a/docs/guide-zh-CN/sys-middleware.md b/docs/guide-zh-CN/sys-middleware.md index fa8f7a8..01deb94 100644 --- a/docs/guide-zh-CN/sys-middleware.md +++ b/docs/guide-zh-CN/sys-middleware.md @@ -73,9 +73,50 @@ func main() { - 文件路径:server/internal/logic/middleware/response.go +#### 常用响应类型 + +- hotgo为一些常用的响应类型做了统一格式封装,例如:`application/json`、`text/xml`、`text/html`、`text/event-stream`等,默认使用`application/json`。 +- 下面我们以`text/xml`为例简单演示几种使用方法: + +1. 当你使用规范化路由时,可直接在XxxRes结构体的`g.Meta`中声明响应类型: +```go +type HelloReq struct { + g.Meta `path:"/hello" tags:"Hello" method:"get" summary:"You first hello api"` + Name string `json:"name" d:"hotgo" dc:"名字"` +} + +type HelloRes struct { + g.Meta `mime:"text/xml" type:"string"` + Tips string `json:"tips"` +} +``` + +2. 在响应前设置响应头: +```go +var ( + Hello = cHello{} +) + +type cHello struct{} + +func (c *cHello) Hello(ctx context.Context, req *user.HelloReq) (res *user.HelloRes, err error) { + r := ghttp.RequestFromCtx(ctx) + r.Response.Header().Set("Content-Type", "text/xml") + + res = &user.HelloRes{ + Tips: fmt.Sprintf("hello %v, this is the api for %v applications.", req.Name, simple.AppName(ctx)), + } + return +} +``` + +- 浏览器中访问响应内容如下: + ![./images/sys-middleware-com-response.png](./images/sys-middleware-com-response.png) + + #### 自定义响应 -- 由于响应中间件是全局的,并且是统一使用json格式进行响应的,但是在实际的开发中可能存在一些需要使用非json格式的响应,所以你需要进行单独的处理。 -- 推荐以下几种处理方式,可做参考: +- 在实际开发中,可能需要使用自定义的响应类型,由于响应中间件是全局的,因此您需要对其进行单独处理。 +- 推荐以下几种处理方案,可做参考: 1. 使用`ghttp.ExitAll()`,需要注意的是此方法会终止后续所有的http处理 ```go @@ -102,6 +143,7 @@ func main() { 2. 在`server/internal/logic/middleware/response.go`中根据请求的独有特征进行单独的处理,兼容后续http处理。 + #### 重写响应错误提示 - 在实际开发中,我们可能想要隐藏一些敏感错误,返回给客户端友好的错误提示,但开发者同时又想需要看到真实的敏感错误。对此hotgo已经进行了过滤处理,下面是一个简单的例子: diff --git a/server/api/api/pay/notify.go b/server/api/api/pay/notify.go index dd82e68..005a0c3 100644 --- a/server/api/api/pay/notify.go +++ b/server/api/api/pay/notify.go @@ -28,6 +28,6 @@ type NotifyQQPayReq struct { } type NotifyQQPayRes struct { - g.Meta `mime:"text/xml" type:"string" example:""` + g.Meta `mime:"text/xml" type:"string"` payin.PayNotifyModel } diff --git a/server/internal/library/response/response.go b/server/internal/library/response/response.go index 1071c21..f1b33ea 100644 --- a/server/internal/library/response/response.go +++ b/server/internal/library/response/response.go @@ -10,9 +10,9 @@ import ( "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gctx" "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/library/contexts" "hotgo/internal/model" - "time" ) // JsonExit 返回JSON数据并退出当前HTTP执行函数 @@ -21,6 +21,36 @@ func JsonExit(r *ghttp.Request, code int, message string, data ...interface{}) { r.Exit() } +// RXml xml +func RXml(r *ghttp.Request, code int, message string, data ...interface{}) { + responseData := interface{}(nil) + if len(data) > 0 { + responseData = data[0] + } + res := &model.Response{ + Code: code, + Message: message, + Timestamp: gtime.Timestamp(), + TraceID: gctx.CtxId(r.Context()), + } + + // 如果不是正常的返回,则将data转为error + if gcode.CodeOK.Code() == code { + res.Data = responseData + } else { + res.Error = responseData + } + + // 清空响应 + r.Response.ClearBuffer() + + // 写入响应 + r.Response.WriteXml(gconv.Map(res)) + + // 加入到上下文 + contexts.SetResponse(r.Context(), res) +} + // RJson 标准返回结果数据结构封装 func RJson(r *ghttp.Request, code int, message string, data ...interface{}) { responseData := interface{}(nil) @@ -30,7 +60,7 @@ func RJson(r *ghttp.Request, code int, message string, data ...interface{}) { res := &model.Response{ Code: code, Message: message, - Timestamp: time.Now().Unix(), + Timestamp: gtime.Timestamp(), TraceID: gctx.CtxId(r.Context()), } diff --git a/server/internal/logic/middleware/response.go b/server/internal/logic/middleware/response.go index 3bf2a4b..3388061 100644 --- a/server/internal/logic/middleware/response.go +++ b/server/internal/logic/middleware/response.go @@ -36,7 +36,6 @@ func (s *sMiddleware) ResponseHandler(r *ghttp.Request) { s.responseXml(r) return case consts.HTTPContentTypeStream: - // ... default: responseJson(r) } @@ -56,16 +55,8 @@ func (s *sMiddleware) responseHtml(r *ghttp.Request) { // responseXml xml响应 func (s *sMiddleware) responseXml(r *ghttp.Request) { - code, message, resp := parseResponse(r) - r.Response.ClearBuffer() - r.Response.Write(``) - - switch code { - case gcode.CodeOK.Code(): - r.Response.WriteXml(g.Map{"code": code, "message": message, "data": resp}) - default: - r.Response.WriteXml(g.Map{"code": code, "message": message, "error": resp}) - } + code, message, data := parseResponse(r) + response.RXml(r, code, message, data) return } diff --git a/server/manifest/config/config.example.yaml b/server/manifest/config/config.example.yaml index 52ac4fa..7d0ea14 100644 --- a/server/manifest/config/config.example.yaml +++ b/server/manifest/config/config.example.yaml @@ -127,7 +127,7 @@ viewer: setting: title: "HotGo" keywords: "中后台解决方案,gf框架,vue3" - description: "hotgo 是一个基于 goframe2,vue3,vite2,TypeScript,uinapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。" + description: "hotgo 是一个基于 goframe2,vue3,vite2,TypeScript,uniapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。" # 路由配置 diff --git a/web/src/views/about/index.vue b/web/src/views/about/index.vue index d6733b5..77fd041 100644 --- a/web/src/views/about/index.vue +++ b/web/src/views/about/index.vue @@ -2,7 +2,7 @@
- {{ name }} 是一个基于 goframe2,vue3,vite2,TypeScript,uinapp + {{ name }} 是一个基于 goframe2,vue3,vite2,TypeScript,uniapp 的中后台解决方案,它可以帮助你快速搭建企业级中后台项目,相信不管是从新技术使用还是其他方面,都能帮助到你,持续更新中。