补充Querylog

This commit is contained in:
yumaojun03 2024-12-08 14:46:15 +08:00
parent 0f1c51f1b2
commit e0e7ff5b7c
5 changed files with 139 additions and 13 deletions

View File

@ -2,7 +2,9 @@ package impl
import ( import (
"context" "context"
"fmt"
"github.com/infraboard/mcube/v2/ioc/config/datasource"
"gitlab.com/go-course-project/go17/vblog/apps/blog" "gitlab.com/go-course-project/go17/vblog/apps/blog"
) )
@ -14,8 +16,51 @@ type BlogServiceImpl struct {
} }
// CreateBlog implements blog.Service. // CreateBlog implements blog.Service.
func (b *BlogServiceImpl) CreateBlog(context.Context, *blog.CreateBlogRequest) (*blog.Blog, error) { func (b *BlogServiceImpl) CreateBlog(ctx context.Context, in *blog.CreateBlogRequest) (*blog.Blog, error) {
panic("unimplemented") ins, err := blog.NewBook(in)
if err != nil {
return nil, err
}
err = datasource.DBFromCtx(ctx).Create(ins).Error
if err != nil {
return nil, err
}
return ins, nil
}
// QueryBlog implements blog.Service.
func (b *BlogServiceImpl) QueryBlog(ctx context.Context, in *blog.QueryBlogRequest) (*blog.BlogSet, error) {
query := datasource.DBFromCtx(ctx).Model(&blog.Blog{})
if in.Keywords != "" {
query = query.Where("title LIKE ?", "%"+in.Keywords+"%")
}
if in.Stage != nil {
query = query.Where("stage = ?", in.Stage)
}
if in.CreateBy != "" {
query = query.Where("create_by = ?", in.CreateBy)
}
if in.Category != "" {
query = query.Where("category = ?", in.Category)
}
for k, v := range in.Tags {
query = query.Where(fmt.Sprintf("tags->>'$.%s' = '?'", k), v)
}
set := blog.NewBlogSet()
// COUNT
if err := query.Count(&set.Total).Error; err != nil {
return nil, err
}
// 处理分页
err := query.Order("created_at DESC").Offset(int(in.Offset())).Limit(int(in.PageSize)).Find(&set.Items).Error
if err != nil {
return nil, err
}
return set, nil
} }
// DeleteBlog implements blog.Service. // DeleteBlog implements blog.Service.
@ -33,11 +78,6 @@ func (b *BlogServiceImpl) PublishBlog(context.Context, *blog.PublishBlogRequest)
panic("unimplemented") panic("unimplemented")
} }
// QueryBlog implements blog.Service.
func (b *BlogServiceImpl) QueryBlog(context.Context, *blog.QueryBlogRequest) (*blog.BlogSet, error) {
panic("unimplemented")
}
// UpdateBlog implements blog.Service. // UpdateBlog implements blog.Service.
func (b *BlogServiceImpl) UpdateBlog(context.Context, *blog.UpdateBlogRequest) (*blog.Blog, error) { func (b *BlogServiceImpl) UpdateBlog(context.Context, *blog.UpdateBlogRequest) (*blog.Blog, error) {
panic("unimplemented") panic("unimplemented")

View File

@ -0,0 +1,38 @@
package blog_test
import (
"context"
"testing"
"gitlab.com/go-course-project/go17/vblog/apps/blog"
"gitlab.com/go-course-project/go17/vblog/apps/blog/impl"
)
var (
ctx = context.Background()
)
// Required("admin")
func TestCreateBlog(t *testing.T) {
req := &blog.CreateBlogRequest{
Title: "Go项目课",
Summary: "全栈项目",
Content: "GORM + GIN",
Category: "软件开发",
}
ins, err := impl.BlogService.CreateBlog(ctx, req)
if err != nil {
t.Fatal(err)
}
t.Log(ins)
}
// SELECT * FROM `blogs` ORDER BY created_at DESC LIMIT 20
func TestQueryBlog(t *testing.T) {
req := blog.NewQueryBlogRequest()
ins, err := impl.BlogService.QueryBlog(ctx, req)
if err != nil {
t.Fatal(err)
}
t.Log(ins)
}

View File

@ -39,6 +39,13 @@ type DescribeBlogRequest struct {
utils.GetRequest utils.GetRequest
} }
func NewQueryBlogRequest() *QueryBlogRequest {
return &QueryBlogRequest{
PageRequest: *utils.NewPageRequest(),
Tags: map[string]string{},
}
}
type QueryBlogRequest struct { type QueryBlogRequest struct {
// 分页参数 // 分页参数
utils.PageRequest utils.PageRequest
@ -47,9 +54,12 @@ type QueryBlogRequest struct {
// 状态过滤参数, 作者nil, 访客: STAGE_PUBLISHED // 状态过滤参数, 作者nil, 访客: STAGE_PUBLISHED
Stage *STAGE `json:"stage"` Stage *STAGE `json:"stage"`
// 查询某个用户具体的文章: 给作者用的 // 查询某个用户具体的文章: 给作者用的
Username string `json:"username"` CreateBy string `json:"createBy"`
// 分类 // 分类
Category string `json:"category"` Category string `json:"category"`
// 查询Tag相关的文章 // 查询Tag相关的文章
// SELECT *
// FROM my_table
// WHERE data->>'$.name' = '某个名字';
Tags map[string]string `json:"tag"` Tags map[string]string `json:"tag"`
} }

View File

@ -3,14 +3,33 @@ package blog
import ( import (
"time" "time"
"github.com/infraboard/mcube/v2/exception"
"github.com/infraboard/mcube/v2/ioc/config/validator"
"github.com/infraboard/mcube/v2/tools/pretty"
"gitlab.com/go-course-project/go17/vblog/utils" "gitlab.com/go-course-project/go17/vblog/utils"
) )
func NewBlogSet() *BlogSet {
return &BlogSet{
Items: []*Blog{},
}
}
type BlogSet struct { type BlogSet struct {
Total int32 `json:"total"` Total int64 `json:"total"`
Items []*Blog `json:"items"` Items []*Blog `json:"items"`
} }
func NewBook(in *CreateBlogRequest) (*Blog, error) {
if err := in.Validate(); err != nil {
return nil, exception.NewBadRequest("参数异常: %s", err)
}
return &Blog{
ResourceMeta: *utils.NewResourceMeta(),
CreateBlogRequest: *in,
}, nil
}
type Blog struct { type Blog struct {
// 存放到数据里的对象的远数据信息 // 存放到数据里的对象的远数据信息
utils.ResourceMeta utils.ResourceMeta
@ -20,23 +39,31 @@ type Blog struct {
Status Status
} }
func (t *Blog) String() string {
return pretty.ToJSON(t)
}
func (t *Blog) TableName() string { func (t *Blog) TableName() string {
return "blogs" return "blogs"
} }
type CreateBlogRequest struct { type CreateBlogRequest struct {
// 标题 // 标题
Title string `json:"title" gorm:"column:title;type:varchar(200)"` Title string `json:"title" gorm:"column:title;type:varchar(200)" validate:"required"`
// 摘要 // 摘要
Summary string `json:"summary" gorm:"column:summary;type:text"` Summary string `json:"summary" gorm:"column:summary;type:text" validate:"required"`
// 内容 // 内容
Content string `json:"content" gorm:"column:content;type:text"` Content string `json:"content" gorm:"column:content;type:text" validate:"required"`
// 分类 // 分类
Category string `json:"category" gorm:"column:category;type:varchar(200);index"` Category string `json:"category" gorm:"column:category;type:varchar(200);index" validate:"required"`
// 标签 // 标签
Tags map[string]string `json:"tags" gorm:"column:tags;serializer:json"` Tags map[string]string `json:"tags" gorm:"column:tags;serializer:json"`
} }
func (r *CreateBlogRequest) Validate() error {
return validator.Validate(r)
}
type Status struct { type Status struct {
StatusSpec StatusSpec
// 状态变化的时间, 拿发布时间 // 状态变化的时间, 拿发布时间

View File

@ -1,8 +1,19 @@
package utils package utils
func NewPageRequest() *PageRequest {
return &PageRequest{
PageSize: 20,
PageNumber: 1,
}
}
type PageRequest struct { type PageRequest struct {
// 分页大小 // 分页大小
PageSize uint `json:"page_size"` PageSize uint `json:"page_size"`
// 当前是多少页面 // 当前是多少页面
PageNumber uint `json:"page_number"` PageNumber uint `json:"page_number"`
} }
func (r *PageRequest) Offset() uint {
return ((r.PageNumber) - 1) * (r.PageSize)
}