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 0000000..905208d Binary files /dev/null and b/book/v4/image.png differ 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) +}