From 4d5b597380a02c7aec1b52888dbdd0fb32b20407 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 25 May 2025 09:57:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B3=9B=E5=9E=8B=E5=87=BD?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/v3/controllers/book.go | 11 +++++++ book/v3/models/book.go | 20 ++++++------ book/v3/response/response.go | 1 + book/v4/README.md | 20 +++++++++++- book/v4/apps/README.md | 1 + book/v4/apps/book/README.md | 12 +++++++ book/v4/apps/book/interface.go | 53 +++++++++++++++++++++++++++++++ book/v4/apps/book/model.go | 19 +++++++++++ book/v4/arch.drawio | 16 ++++++++++ book/v4/image.png | Bin 0 -> 62701 bytes skills/generate/generate.go | 43 +++++++++++++++++++++++++ skills/generate/generate_test.go | 19 +++++++++++ 12 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 book/v4/apps/README.md create mode 100644 book/v4/apps/book/README.md create mode 100644 book/v4/apps/book/interface.go create mode 100644 book/v4/apps/book/model.go create mode 100644 book/v4/arch.drawio create mode 100644 book/v4/image.png create mode 100644 skills/generate/generate.go create mode 100644 skills/generate/generate_test.go diff --git a/book/v3/controllers/book.go b/book/v3/controllers/book.go index 485e8d8..45a0f79 100644 --- a/book/v3/controllers/book.go +++ b/book/v3/controllers/book.go @@ -67,3 +67,14 @@ func (c *BookController) CreateBook(ctx context.Context, in *models.BookSpec) (* return bookInstance, nil } + +func (c *BookController) UpdateBook() { + // update(obj) + // config.DB().Updates() +} + +func (c *BookController) update(ctx context.Context, obj models.Book) error { + // obj.UpdateTime = now() + // config.DB().Updates() + return nil +} diff --git a/book/v3/models/book.go b/book/v3/models/book.go index 618bd7c..1f31c59 100644 --- a/book/v3/models/book.go +++ b/book/v3/models/book.go @@ -9,6 +9,16 @@ type BookSet struct { Items []*Book `json:"items"` } +type BookSpec struct { + // type 用于要使用gorm 来自动创建和更新表的时候 才需要定义 + Title string `json:"title" gorm:"column:title;type:varchar(200)" validate:"required"` + Author string `json:"author" gorm:"column:author;type:varchar(200);index" validate:"required"` + Price float64 `json:"price" gorm:"column:price" validate:"required"` + // bool false + // nil 是零值, false + IsSale *bool `json:"is_sale" gorm:"column:is_sale"` +} + type Book struct { // 对象Id Id uint `json:"id" gorm:"primaryKey;column:id"` @@ -20,16 +30,6 @@ func (b *Book) String() string { return pretty.ToJSON(b) } -type BookSpec struct { - // type 用于要使用gorm 来自动创建和更新表的时候 才需要定义 - Title string `json:"title" gorm:"column:title;type:varchar(200)" validate:"required"` - Author string `json:"author" gorm:"column:author;type:varchar(200);index" validate:"required"` - Price float64 `json:"price" gorm:"column:price" validate:"required"` - // bool false - // nil 是零值, false - IsSale *bool `json:"is_sale" gorm:"column:is_sale"` -} - // books func (b *Book) TableName() string { return "books" diff --git a/book/v3/response/response.go b/book/v3/response/response.go index 295d6c1..b340c16 100644 --- a/book/v3/response/response.go +++ b/book/v3/response/response.go @@ -10,6 +10,7 @@ import ( // 2. 正常直接返回数据, Restful接口 怎么知道这些请求是成功还是失败喃? 通过HTTP判断 2xx // 如果后面 所有的返回数据 要进过特殊处理,都在这个函数内进行扩展,方便维护,比如 数据脱敏 func OK(ctx *gin.Context, data any) { + // v, ok := data.(Densener) ctx.JSON(200, data) ctx.Abort() } diff --git a/book/v4/README.md b/book/v4/README.md index 8fe5ec5..1eadba3 100644 --- a/book/v4/README.md +++ b/book/v4/README.md @@ -1 +1,19 @@ -# 业务分区架构(基于mcube) \ No newline at end of file +# 业务分区架构(基于mcube) + +mcube 与 Ioc + +![业务分区架构](image.png) + +更新部分: +1. 单元测试 支持通过环境变量注入,优化单元测试配置,共用一套配置 +2. 新增Book Api项目, 从简单的脚本开发->配置分离->mvc模式->ioc业务分区 经历4个版本,讲解如何开发复杂项目。 +3. Vblog项目 新增部署,支持2中部署模式,1.前后端分离部署 与 前后端打包一体的部署。 +4. 优化其他几个项目,支持 可以通过 import的方式,快速使用。 +5. cmdb 云商凭证 支持加密存储 + + +## 业务分区的第一步 定义业务(RPC) + +Book/Comment: 这个业务模块提供的功能 + + diff --git a/book/v4/apps/README.md b/book/v4/apps/README.md new file mode 100644 index 0000000..f9276d2 --- /dev/null +++ b/book/v4/apps/README.md @@ -0,0 +1 @@ +# 业务分区 \ No newline at end of file diff --git a/book/v4/apps/book/README.md b/book/v4/apps/book/README.md new file mode 100644 index 0000000..a327987 --- /dev/null +++ b/book/v4/apps/book/README.md @@ -0,0 +1,12 @@ +# Book 业务分区 + +定义Book业务逻辑 + +业务功能: CRUD +1. 创建书籍(录入) +2. Book列表查询 +3. Book详情查询 +4. Book更新 +5. Book删除 + +通过Go语言的里面的接口 来定义描述业务功能 \ No newline at end of file diff --git a/book/v4/apps/book/interface.go b/book/v4/apps/book/interface.go new file mode 100644 index 0000000..2baa575 --- /dev/null +++ b/book/v4/apps/book/interface.go @@ -0,0 +1,53 @@ +package book + +import ( + "context" + + "github.com/infraboard/mcube/v2/types" +) + +// book.Service, Book的业务定义 +type Service interface { + // 1. 创建书籍(录入) + CreateBook(context.Context, *CreateBookRequest) (*Book, error) + // 2. Book列表查询 + QueryBook(context.Context, *QueryBookRequest) (*types.Set[*Book], error) + // 3. Book详情查询 + // 4. Book更新 + // 5. Book删除 +} + +type BookSet struct { + // 总共多少个 + Total int64 `json:"total"` + // book清单 + Items []*Book `json:"items"` +} + +func (b *BookSet) Add(item *Book) { + b.Items = append(b.Items, item) +} + +// type CommentSet struct { +// // 总共多少个 +// Total int64 `json:"total"` +// // book清单 +// Items []*Comment `json:"items"` +// } + +// func (b *CommentSet) Add(item *Comment) { +// b.Items = append(b.Items, item) +// } + +type CreateBookRequest struct { + // type 用于要使用gorm 来自动创建和更新表的时候 才需要定义 + Title string `json:"title" gorm:"column:title;type:varchar(200)" validate:"required"` + Author string `json:"author" gorm:"column:author;type:varchar(200);index" validate:"required"` + Price float64 `json:"price" gorm:"column:price" validate:"required"` + // bool false + // nil 是零值, false + IsSale *bool `json:"is_sale" gorm:"column:is_sale"` +} + +type QueryBookRequest struct { +} diff --git a/book/v4/apps/book/model.go b/book/v4/apps/book/model.go new file mode 100644 index 0000000..ebae4f2 --- /dev/null +++ b/book/v4/apps/book/model.go @@ -0,0 +1,19 @@ +package book + +import "github.com/infraboard/mcube/v2/tools/pretty" + +type Book struct { + // 对象Id + Id uint `json:"id" gorm:"primaryKey;column:id"` + + CreateBookRequest +} + +func (b *Book) String() string { + return pretty.ToJSON(b) +} + +// books +func (b *Book) TableName() string { + return "books" +} diff --git a/book/v4/arch.drawio b/book/v4/arch.drawio new file mode 100644 index 0000000..3edc32a --- /dev/null +++ b/book/v4/arch.drawio @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/book/v4/image.png b/book/v4/image.png new file mode 100644 index 0000000000000000000000000000000000000000..905208d4e4a76da8c01ff9a9a8c1b9d61a204c61 GIT binary patch literal 62701 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 literal 0 HcmV?d00001 diff --git a/skills/generate/generate.go b/skills/generate/generate.go new file mode 100644 index 0000000..2c5faa6 --- /dev/null +++ b/skills/generate/generate.go @@ -0,0 +1,43 @@ +package generate + +func NewBookSet() *BookSet { + return &BookSet{} +} + +type BookSet struct { + // 总共多少个 + Total int64 `json:"total"` + // book清单 + Items []string `json:"items"` +} + +func (b *BookSet) Add(item string) { + b.Items = append(b.Items, item) +} + +type CommentSet struct { + // 总共多少个 + Total int64 `json:"total"` + // book清单 + Items []int `json:"items"` +} + +func (b *CommentSet) Add(item int) { + b.Items = append(b.Items, item) +} + +func NewSet[T any]() *Set[T] { + return &Set[T]{} +} + +// 使用[]来声明类型参数 +type Set[T any] struct { + // 总共多少个 + Total int64 `json:"total"` + // book清单 + Items []T `json:"items"` +} + +func (b *Set[T]) Add(item T) { + b.Items = append(b.Items, item) +} diff --git a/skills/generate/generate_test.go b/skills/generate/generate_test.go new file mode 100644 index 0000000..d2c3b86 --- /dev/null +++ b/skills/generate/generate_test.go @@ -0,0 +1,19 @@ +package generate_test + +import ( + "testing" + + "122.51.31.227/go-course/go18/skills/generate" +) + +func TestStringSet(t *testing.T) { + set := generate.NewSet[string]() + set.Add("test") + t.Log(set) +} + +func TestIntSet(t *testing.T) { + set := generate.NewSet[int]() + set.Add(10) + t.Log(set) +}