update
This commit is contained in:
@@ -169,8 +169,9 @@ func (c *PayController) Prepare() error {
|
|||||||
// actions ...
|
// actions ...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
- controller 文件定义完成后运行 `atomctl gen provider` 来生成 provider
|
||||||
|
|
||||||
- 一个 action 方法的定义
|
- 一个 action 方法的定义, **@Router**不再使用swago的定义方式,替换为下面的定义方式,参数做用@Bind来进行声明,会自动注入,不需要业务内获取参数
|
||||||
```go
|
```go
|
||||||
// Orders show user orders
|
// Orders show user orders
|
||||||
// @swagger definitions
|
// @swagger definitions
|
||||||
@@ -206,6 +207,7 @@ func (c *OrderController) List(ctx fiber.Ctx, claim *jwt.Claims,channel string,
|
|||||||
- 你需要把第二行的 `@swagger definitions` 替换成你的swagger定义
|
- 你需要把第二行的 `@swagger definitions` 替换成你的swagger定义
|
||||||
- @Bind 参数会有几个位置 path/query/body/header/cookie/local/file 会分别从 url/get query/post body/header/cookie/fiber.Local/file/中取出所需要的数据绑定到方法的请求参数中去。
|
- @Bind 参数会有几个位置 path/query/body/header/cookie/local/file 会分别从 url/get query/post body/header/cookie/fiber.Local/file/中取出所需要的数据绑定到方法的请求参数中去。
|
||||||
- controller 只负责数据的接收返回及相关数据装饰,具体的复杂逻辑实现需要在service文件中定义。
|
- controller 只负责数据的接收返回及相关数据装饰,具体的复杂逻辑实现需要在service文件中定义。
|
||||||
|
- action 文件内容完成运行 `atomctl gen route` 来生成路由
|
||||||
|
|
||||||
## service
|
## service
|
||||||
|
|
||||||
@@ -223,11 +225,12 @@ func (svc *Service) Prepare() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
- service 文件定义完成后运行 `atomctl gen provider` 来生成 provider
|
||||||
|
|
||||||
- service 中 model 数据查询的示例,需要注意table需要定义为一个短小的tblXXX以便代码展示简洁
|
- service 中 model 数据查询的示例,需要注意table需要定义为一个短小的tblXXX以便代码展示简洁
|
||||||
```go
|
```go
|
||||||
// GetUserOrderByOrderID
|
// GetUserOrderByOrderID
|
||||||
func (svc *Service) GetUserOrderByOrderID(ctx context.Context, orderID string, userID int64) (*model.Orders, error) {
|
func (svc *Service) Get(ctx context.Context, orderID string, userID int64) (*model.Orders, error) {
|
||||||
_, span := otel.Start(ctx, "users.service.GetUserOrderByOrderID")
|
_, span := otel.Start(ctx, "users.service.GetUserOrderByOrderID")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
span.SetAttributes(
|
span.SetAttributes(
|
||||||
@@ -248,7 +251,7 @@ span.RecordError(err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// UpdateStage
|
// UpdateStage
|
||||||
func (svc *Service) UpdateStage(ctx context.Context, tenantID, userID, postID int64, stage fields.PostStage) error {
|
func (svc *Service) Update(ctx context.Context, tenantID, userID, postID int64, stage fields.PostStage) error {
|
||||||
_, span := otel.Start(ctx, "users.service.UpdateStage")
|
_, span := otel.Start(ctx, "users.service.UpdateStage")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
span.SetAttributes(
|
span.SetAttributes(
|
||||||
@@ -257,14 +260,6 @@ func (svc *Service) UpdateStage(ctx context.Context, tenantID, userID, postID in
|
|||||||
attribute.Int64("post.id", postID),
|
attribute.Int64("post.id", postID),
|
||||||
)
|
)
|
||||||
|
|
||||||
post, err := svc.ForceGetPostByID(ctx, postID)
|
|
||||||
if err != nil {
|
|
||||||
span.RecordError(err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
post.Stage = stage
|
|
||||||
|
|
||||||
tbl := table.Posts
|
tbl := table.Posts
|
||||||
stmt := tbl.
|
stmt := tbl.
|
||||||
UPDATE(tbl.UpdatedAt, tbl.Stage).
|
UPDATE(tbl.UpdatedAt, tbl.Stage).
|
||||||
@@ -290,76 +285,6 @@ func (svc *Service) UpdateStage(ctx context.Context, tenantID, userID, postID in
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
- 一个service_test定义,需要使用goconvey来对不同的case进行区分。如果需要注入其它模型,你需要在 With() 方法中进行添加。
|
|
||||||
```go
|
|
||||||
package auth
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"backend/app/service/testx"
|
|
||||||
|
|
||||||
. "github.com/smartystreets/goconvey/convey"
|
|
||||||
"github.com/stretchr/testify/suite"
|
|
||||||
"go.uber.org/dig"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ServiceInjectParams struct {
|
|
||||||
dig.In
|
|
||||||
Svc *Service
|
|
||||||
}
|
|
||||||
|
|
||||||
type ServiceTestSuite struct {
|
|
||||||
suite.Suite
|
|
||||||
ServiceInjectParams
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_DiscoverMedias(t *testing.T) {
|
|
||||||
providers := testx.Default().With(
|
|
||||||
Provide,
|
|
||||||
)
|
|
||||||
|
|
||||||
testx.Serve(providers, t, func(params ServiceInjectParams) {
|
|
||||||
suite.Run(t, &ServiceTestSuite{ServiceInjectParams: params})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ServiceTestSuite) Test_Service() {
|
|
||||||
Convey("Test Service", s.T(), func() {
|
|
||||||
So(s.Svc, ShouldNotBeNil)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## grpc
|
|
||||||
|
|
||||||
- 一个 handler 的示例
|
|
||||||
```
|
|
||||||
import (
|
|
||||||
userv1 "go.ipao.vip/project/test01/pkg/proto/user/v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
// @provider(grpc) userv1.RegisterUserServiceServer
|
|
||||||
type Users struct {
|
|
||||||
userv1.UnimplementedUserServiceServer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u *Users) ListUsers(ctx context.Context, in *userv1.ListUsersRequest) (*userv1.ListUsersResponse, error) {
|
|
||||||
// userv1.UserServiceServer
|
|
||||||
return &userv1.ListUsersResponse{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetUser implements userv1.UserServiceServer
|
|
||||||
func (u *Users) GetUser(ctx context.Context, in *userv1.GetUserRequest) (*userv1.GetUserResponse, error) {
|
|
||||||
return &userv1.GetUserResponse{
|
|
||||||
User: &userv1.User{
|
|
||||||
Id: in.Id,
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
# 本项目说明
|
# 本项目说明
|
||||||
|
|
||||||
- 设计一个支持多租户的用户系统,一个用户可以同时属于多个租户
|
- 设计一个支持多租户的用户系统,一个用户可以同时属于多个租户
|
||||||
|
|||||||
Reference in New Issue
Block a user