From c537d965e611f9153711522589fc38beb0ef723c Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 8 Dec 2024 17:31:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=B8=AD=E9=97=B4=E4=BB=B6Do?= =?UTF-8?q?c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vblog/README.md | 61 ++++++++++++++++++++++++++++++++++- vblog/apps/blog/api/api.go | 2 +- vblog/apps/token/api/api.go | 6 ++-- vblog/docs/middleware.drawio | 47 +++++++++++++++++++++++++++ vblog/docs/middleware.png | Bin 0 -> 37779 bytes 5 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 vblog/docs/middleware.drawio create mode 100644 vblog/docs/middleware.png diff --git a/vblog/README.md b/vblog/README.md index a2a101c..0d7b90e 100644 --- a/vblog/README.md +++ b/vblog/README.md @@ -244,13 +244,72 @@ func (h *TokenApiHandler) RevolkToken(ctx *gin.Context) { } ``` -### 组装程序 +### 组装程序(v1) 怎么做开发显得专业 +```go +package main + +import ( + "log" + + "github.com/gin-gonic/gin" + "github.com/infraboard/mcube/v2/ioc/config/http" + blogApi "gitlab.com/go-course-project/go17/vblog/apps/blog/api" + tokenApi "gitlab.com/go-course-project/go17/vblog/apps/token/api" + "gitlab.com/go-course-project/go17/vblog/config" +) + +func main() { + config.LoadConfig() + + // gin Engine, 它包装了http server + server := gin.Default() + + // 注册业务模块的路有 + tokenApi.NewTokenApiHandler().Registry(server) + blogApi.NewBlogApiHandler().Registry(server) + + // 服务器启动 + if err := server.Run(http.Get().Addr()); err != nil { + log.Println(err) + } +} +``` + +功能分层架构(MVC): Book Api +业务分区架构(DDD): Vblog + +### 测试验证 + +```sh +curl --location 'http://127.0.0.1:8080/vblog/api/v1/blogs' \ +--header 'Content-Type: application/json' \ +--data '{ + "title": "POSTMAN测试01", + "author": "will", + "content": "post man 测试", + "summary": "Go全栈项目", + "category": "软件开发" +}' +``` + +```sh +curl --location 'http://127.0.0.1:8080/vblog/api/v1/tokens' \ +--header 'Content-Type: application/json' \ +--data '{ + "username": "admin", + "password": "123456" +}' +``` ### 中间件鉴权 +![](./docs/middleware.png) + +开发一个认证中间件: 用于根据用户携带的Token信息,判断用户身份,并把用户身份信息方到上下文中,传递给后面HandleFunc中使用 + ### ioc优化 diff --git a/vblog/apps/blog/api/api.go b/vblog/apps/blog/api/api.go index 908c2f3..3350ccf 100644 --- a/vblog/apps/blog/api/api.go +++ b/vblog/apps/blog/api/api.go @@ -20,7 +20,7 @@ type BlogApiHandler struct { // 提供注册功能, 提供一个Group // book := server.Group("/api/tokens") func (h *BlogApiHandler) Registry(r *gin.Engine) { - router := r.Group("/api/blogs") + router := r.Group("/vblog/api/v1/blogs") router.POST("", h.CreateBlog) router.GET("", h.QueryBlog) } diff --git a/vblog/apps/token/api/api.go b/vblog/apps/token/api/api.go index 3fde6fc..670a340 100644 --- a/vblog/apps/token/api/api.go +++ b/vblog/apps/token/api/api.go @@ -21,9 +21,9 @@ type TokenApiHandler struct { // 提供注册功能, 提供一个Group // book := server.Group("/api/tokens") func (h *TokenApiHandler) Registry(r *gin.Engine) { - router := r.Group("/api/tokens") - router.POST("/issue", h.IssueToken) - router.POST("/revolk", h.RevolkToken) + router := r.Group("/vblog/api/v1/tokens") + router.POST("", h.IssueToken) + router.DELETE("", h.RevolkToken) } func (h *TokenApiHandler) IssueToken(ctx *gin.Context) { diff --git a/vblog/docs/middleware.drawio b/vblog/docs/middleware.drawio new file mode 100644 index 0000000..e87bf44 --- /dev/null +++ b/vblog/docs/middleware.drawio @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vblog/docs/middleware.png b/vblog/docs/middleware.png new file mode 100644 index 0000000000000000000000000000000000000000..831c9c995492062a08abf12a3ea2704afc89344a GIT binary patch literal 37779 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 euiA8P6=`|7UWmttv