补充book的具体实现
This commit is contained in:
parent
4d5b597380
commit
ebfb39bade
@ -1,6 +1,6 @@
|
||||
# Book 业务分区
|
||||
|
||||
定义Book业务逻辑
|
||||
## 定义Book业务逻辑
|
||||
|
||||
业务功能: CRUD
|
||||
1. 创建书籍(录入)
|
||||
@ -9,4 +9,54 @@
|
||||
4. Book更新
|
||||
5. Book删除
|
||||
|
||||
通过Go语言的里面的接口 来定义描述业务功能
|
||||
通过Go语言的里面的接口 来定义描述业务功能
|
||||
|
||||
```go
|
||||
// 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详情查询
|
||||
DescribeBook(context.Context, *DescribeBookRequest) (*Book, error)
|
||||
// 4. Book更新
|
||||
UpdateBook(context.Context, *UpdateBookRequest) (*Book, error)
|
||||
// 5. Book删除
|
||||
DeleteBook(context.Context, *DeleteBookRequest) error
|
||||
}
|
||||
```
|
||||
|
||||
## 业务的具体实现(TDD: Test Drive Develop)
|
||||
|
||||
1. BookServiceImpl
|
||||
|
||||
```go
|
||||
// CreateBook implements book.Service.
|
||||
func (b *BookServiceImpl) CreateBook(context.Context, *book.CreateBookRequest) (*book.Book, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// DeleteBook implements book.Service.
|
||||
func (b *BookServiceImpl) DeleteBook(context.Context, *book.DeleteBookRequest) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// DescribeBook implements book.Service.
|
||||
func (b *BookServiceImpl) DescribeBook(context.Context, *book.DescribeBookRequest) (*book.Book, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// QueryBook implements book.Service.
|
||||
func (b *BookServiceImpl) QueryBook(context.Context, *book.QueryBookRequest) (*types.Set[*book.Book], error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// UpdateBook implements book.Service.
|
||||
func (b *BookServiceImpl) UpdateBook(context.Context, *book.UpdateBookRequest) (*book.Book, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
```
|
||||
|
||||
编写单元测试
|
||||
|
||||
|
3
book/v4/apps/book/impl/README.md
Normal file
3
book/v4/apps/book/impl/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# 业务实现包
|
||||
|
||||
ServiceImpl(book.Service)
|
49
book/v4/apps/book/impl/book.go
Normal file
49
book/v4/apps/book/impl/book.go
Normal file
@ -0,0 +1,49 @@
|
||||
package impl
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"122.51.31.227/go-course/go18/book/v3/config"
|
||||
"122.51.31.227/go-course/go18/book/v4/apps/book"
|
||||
"github.com/infraboard/mcube/v2/exception"
|
||||
"github.com/infraboard/mcube/v2/types"
|
||||
)
|
||||
|
||||
// CreateBook implements book.Service.
|
||||
func (b *BookServiceImpl) CreateBook(ctx context.Context, in *book.CreateBookRequest) (*book.Book, error) {
|
||||
// 自定义异常改造, 放到mcube
|
||||
// 自定义异常, exception 包, 统一放到一个公共库里面, mcube
|
||||
if err := in.Validate(); err != nil {
|
||||
return nil, exception.NewBadRequest("校验Book创建失败, %s", err)
|
||||
}
|
||||
|
||||
bookInstance := &book.Book{CreateBookRequest: *in}
|
||||
|
||||
// config对象改造
|
||||
// 数据入库(Grom), 补充自增Id的值
|
||||
if err := config.DB().Save(bookInstance).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return bookInstance, nil
|
||||
}
|
||||
|
||||
// DeleteBook implements book.Service.
|
||||
func (b *BookServiceImpl) DeleteBook(context.Context, *book.DeleteBookRequest) error {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// DescribeBook implements book.Service.
|
||||
func (b *BookServiceImpl) DescribeBook(context.Context, *book.DescribeBookRequest) (*book.Book, error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// QueryBook implements book.Service.
|
||||
func (b *BookServiceImpl) QueryBook(context.Context, *book.QueryBookRequest) (*types.Set[*book.Book], error) {
|
||||
panic("unimplemented")
|
||||
}
|
||||
|
||||
// UpdateBook implements book.Service.
|
||||
func (b *BookServiceImpl) UpdateBook(context.Context, *book.UpdateBookRequest) (*book.Book, error) {
|
||||
panic("unimplemented")
|
||||
}
|
22
book/v4/apps/book/impl/book_test.go
Normal file
22
book/v4/apps/book/impl/book_test.go
Normal file
@ -0,0 +1,22 @@
|
||||
package impl_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"122.51.31.227/go-course/go18/book/v4/apps/book"
|
||||
)
|
||||
|
||||
//
|
||||
|
||||
func TestCreateBook(t *testing.T) {
|
||||
req := book.NewCreateBookRequest()
|
||||
req.SetIsSale(true)
|
||||
req.Title = "Go语言V4"
|
||||
req.Author = "will"
|
||||
req.Price = 10
|
||||
ins, err := svc.CreateBook(ctx, req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(ins)
|
||||
}
|
18
book/v4/apps/book/impl/impl.go
Normal file
18
book/v4/apps/book/impl/impl.go
Normal file
@ -0,0 +1,18 @@
|
||||
package impl
|
||||
|
||||
import (
|
||||
"122.51.31.227/go-course/go18/book/v4/apps/book"
|
||||
)
|
||||
|
||||
// 怎么知道他有没有实现该业务, 可以通过类型约束
|
||||
// var _ book.Service = &BookServiceImpl{}
|
||||
|
||||
// &BookServiceImpl 的 nil对象
|
||||
//
|
||||
// int64(1) int64 1
|
||||
// *BookServiceImpl(nil)
|
||||
var _ book.Service = (*BookServiceImpl)(nil)
|
||||
|
||||
// Book业务的具体实现
|
||||
type BookServiceImpl struct {
|
||||
}
|
10
book/v4/apps/book/impl/impl_test.go
Normal file
10
book/v4/apps/book/impl/impl_test.go
Normal file
@ -0,0 +1,10 @@
|
||||
package impl_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"122.51.31.227/go-course/go18/book/v4/apps/book/impl"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
var svc = impl.BookServiceImpl{}
|
@ -3,6 +3,8 @@ package book
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/infraboard/mcube/v2/http/request"
|
||||
"github.com/infraboard/mcube/v2/ioc/config/validator"
|
||||
"github.com/infraboard/mcube/v2/types"
|
||||
)
|
||||
|
||||
@ -13,8 +15,24 @@ type Service interface {
|
||||
// 2. Book列表查询
|
||||
QueryBook(context.Context, *QueryBookRequest) (*types.Set[*Book], error)
|
||||
// 3. Book详情查询
|
||||
DescribeBook(context.Context, *DescribeBookRequest) (*Book, error)
|
||||
// 4. Book更新
|
||||
UpdateBook(context.Context, *UpdateBookRequest) (*Book, error)
|
||||
// 5. Book删除
|
||||
DeleteBook(context.Context, *DeleteBookRequest) error
|
||||
}
|
||||
|
||||
type DeleteBookRequest struct {
|
||||
DescribeBookRequest
|
||||
}
|
||||
|
||||
type UpdateBookRequest struct {
|
||||
DescribeBookRequest
|
||||
CreateBookRequest
|
||||
}
|
||||
|
||||
type DescribeBookRequest struct {
|
||||
Id uint
|
||||
}
|
||||
|
||||
type BookSet struct {
|
||||
@ -39,6 +57,10 @@ func (b *BookSet) Add(item *Book) {
|
||||
// b.Items = append(b.Items, item)
|
||||
// }
|
||||
|
||||
func NewCreateBookRequest() *CreateBookRequest {
|
||||
return (&CreateBookRequest{}).SetIsSale(false)
|
||||
}
|
||||
|
||||
type CreateBookRequest struct {
|
||||
// type 用于要使用gorm 来自动创建和更新表的时候 才需要定义
|
||||
Title string `json:"title" gorm:"column:title;type:varchar(200)" validate:"required"`
|
||||
@ -49,5 +71,29 @@ type CreateBookRequest struct {
|
||||
IsSale *bool `json:"is_sale" gorm:"column:is_sale"`
|
||||
}
|
||||
|
||||
type QueryBookRequest struct {
|
||||
// 这个请求对象的教育
|
||||
func (r *CreateBookRequest) Validate() error {
|
||||
// validate := validator.New()
|
||||
// validate.Struct(r)
|
||||
return validator.Validate(r)
|
||||
}
|
||||
|
||||
func (r *CreateBookRequest) SetIsSale(v bool) *CreateBookRequest {
|
||||
r.IsSale = &v
|
||||
return r
|
||||
}
|
||||
|
||||
func NewQueryBookRequest() *QueryBookRequest {
|
||||
return &QueryBookRequest{
|
||||
// PageRequest{PageSize:20, PageNumber: 1}
|
||||
PageRequest: *request.NewDefaultPageRequest(),
|
||||
}
|
||||
}
|
||||
|
||||
type QueryBookRequest struct {
|
||||
// PageSize uint
|
||||
// PageNumber uint
|
||||
request.PageRequest
|
||||
// 关键字参数
|
||||
Keywords string `json:"keywords"`
|
||||
}
|
||||
|
2
go.mod
2
go.mod
@ -14,6 +14,7 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||
github.com/bytedance/sonic v1.13.2 // indirect
|
||||
github.com/bytedance/sonic/loader v0.2.4 // indirect
|
||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||
@ -32,6 +33,7 @@ require (
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||
|
4
go.sum
4
go.sum
@ -1,3 +1,5 @@
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=
|
||||
github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
@ -54,6 +56,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
|
65
skills/mcube/README.md
Normal file
65
skills/mcube/README.md
Normal file
@ -0,0 +1,65 @@
|
||||
# 配置(依赖注入)
|
||||
|
||||
|
||||
## Config大对象
|
||||
|
||||
容易理解, 方便维护, 这个配置就是和项目绑定
|
||||
|
||||
```go
|
||||
// 这歌对象就是程序配置
|
||||
// yaml, toml
|
||||
type Config struct {
|
||||
Application *application `toml:"app" yaml:"app" json:"app"`
|
||||
MySQL *mySQL `toml:"mysql" yaml:"mysql" json:"mysql"`
|
||||
Log *Log `toml:"log" yaml:"log" json:"log"`
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
```yaml
|
||||
app:
|
||||
host: 127.0.0.1
|
||||
port: 8080
|
||||
mysql:
|
||||
host: 127.0.0.1
|
||||
port: 3306
|
||||
database: go18
|
||||
username: "root"
|
||||
password: "123456"
|
||||
debug: true
|
||||
```
|
||||
|
||||
## 依赖注入
|
||||
|
||||
大对象,没法按照项目需求,自由组装
|
||||
|
||||
datasource
|
||||
```toml
|
||||
[datasource]
|
||||
provider = "mysql"
|
||||
host = "127.0.0.1"
|
||||
port = 3306
|
||||
database = ""
|
||||
username = ""
|
||||
password = ""
|
||||
auto_migrate = false
|
||||
debug = false
|
||||
trace = true
|
||||
```
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
// 自动解析配置文件里面, 相应的部分
|
||||
"github.com/infraboard/mcube/v2/ioc/config/datasource"
|
||||
)
|
||||
|
||||
func main() {
|
||||
db := datasource.DB()
|
||||
// 通过db对象进行数据库操作
|
||||
fmt.Println(db)
|
||||
}
|
||||
```
|
3
skills/mcube/config.go
Normal file
3
skills/mcube/config.go
Normal file
@ -0,0 +1,3 @@
|
||||
package mcube
|
||||
|
||||
// 依赖注入
|
Loading…
x
Reference in New Issue
Block a user