书籍列表接口新增参数
This commit is contained in:
226
internal/logic/book_recommendations/book_recommendations.go
Normal file
226
internal/logic/book_recommendations/book_recommendations.go
Normal file
@ -0,0 +1,226 @@
|
||||
package book_recommendations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"server/internal/dao"
|
||||
"server/internal/model"
|
||||
"server/internal/model/do"
|
||||
"server/internal/service"
|
||||
"server/utility/ecode"
|
||||
"server/utility/oss"
|
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
)
|
||||
|
||||
type sBookRecommendations struct{}
|
||||
|
||||
func New() service.IBookRecommendations {
|
||||
return &sBookRecommendations{}
|
||||
}
|
||||
|
||||
func init() {
|
||||
service.RegisterBookRecommendations(New())
|
||||
}
|
||||
|
||||
// List 获取推荐列表
|
||||
func (s *sBookRecommendations) List(ctx context.Context, in *model.BookRecommendationsListIn) (out *model.BookRecommendationsListOut, err error) {
|
||||
out = &model.BookRecommendationsListOut{}
|
||||
m := dao.BookRecommendations.Ctx(ctx)
|
||||
if in.Type != 0 {
|
||||
m = m.Where(dao.BookRecommendations.Columns().Type, in.Type)
|
||||
}
|
||||
if in.Status != 0 {
|
||||
m = m.Where(dao.BookRecommendations.Columns().Status, in.Status)
|
||||
}
|
||||
if in.BookId != 0 {
|
||||
m = m.Where(dao.BookRecommendations.Columns().BookId, in.BookId)
|
||||
}
|
||||
m = m.Order(dao.BookRecommendations.Columns().SortOrder)
|
||||
if err = m.Page(in.Page, in.Size).WithAll().ScanAndCount(&out.List, &out.Total, false); err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// AppList 获取APP端推荐列表
|
||||
func (s *sBookRecommendations) AppList(ctx context.Context, in *model.BookRecommendationsListIn) (out *model.BookRecommendationsAppListOut, err error) {
|
||||
out = &model.BookRecommendationsAppListOut{}
|
||||
m := dao.BookRecommendations.Ctx(ctx)
|
||||
// 直接筛选状态为1的记录
|
||||
m = m.Where(dao.BookRecommendations.Columns().Status, 1)
|
||||
// 根据排序字段排序
|
||||
m = m.Order(dao.BookRecommendations.Columns().SortOrder)
|
||||
var list []model.RecommendAppItem
|
||||
if err = m.Page(in.Page, in.Size).ScanAndCount(&list, &out.Total, false); err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
out.List = list
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Create 新增推荐
|
||||
func (s *sBookRecommendations) Create(ctx context.Context, in *model.BookRecommendationsCreateIn) (out *model.BookRecommendationsCRUDOut, err error) {
|
||||
// 检查同类型同书籍是否已存在(未软删除)
|
||||
exist, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().BookId, in.BookId).
|
||||
Where(dao.BookRecommendations.Columns().Type, in.Type).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if exist {
|
||||
return nil, ecode.Params.Sub("book_recommendation_exists")
|
||||
}
|
||||
// 插入数据
|
||||
_, err = dao.BookRecommendations.Ctx(ctx).Data(do.BookRecommendations{
|
||||
BookId: in.BookId,
|
||||
Type: in.Type,
|
||||
CoverUrl: in.CoverUrl,
|
||||
SortOrder: in.SortOrder,
|
||||
Status: in.Status,
|
||||
}).Insert()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_create_failed")
|
||||
}
|
||||
return &model.BookRecommendationsCRUDOut{Success: true}, nil
|
||||
}
|
||||
|
||||
// Update 编辑推荐
|
||||
func (s *sBookRecommendations) Update(ctx context.Context, in *model.BookRecommendationsUpdateIn) (out *model.BookRecommendationsCRUDOut, err error) {
|
||||
// 检查是否存在
|
||||
exist, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.NotFound.Sub("book_recommendation_not_found")
|
||||
}
|
||||
// 检查同类型同书籍是否有重复(排除自己)
|
||||
repeat, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().BookId, in.BookId).
|
||||
Where(dao.BookRecommendations.Columns().Type, in.Type).
|
||||
WhereNot(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if repeat {
|
||||
return nil, ecode.Params.Sub("book_recommendation_exists")
|
||||
}
|
||||
_, err = dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Data(do.BookRecommendations{
|
||||
BookId: in.BookId,
|
||||
Type: in.Type,
|
||||
CoverUrl: in.CoverUrl,
|
||||
SortOrder: in.SortOrder,
|
||||
Status: in.Status,
|
||||
}).Update()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_update_failed")
|
||||
}
|
||||
return &model.BookRecommendationsCRUDOut{Success: true}, nil
|
||||
}
|
||||
|
||||
// Delete 删除推荐
|
||||
func (s *sBookRecommendations) Delete(ctx context.Context, in *model.BookRecommendationsDeleteIn) (out *model.BookRecommendationsCRUDOut, err error) {
|
||||
// 检查是否存在
|
||||
exist, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.NotFound.Sub("book_recommendation_not_found")
|
||||
}
|
||||
// 直接调用 Delete
|
||||
_, err = dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Delete()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_delete_failed")
|
||||
}
|
||||
return &model.BookRecommendationsCRUDOut{Success: true}, nil
|
||||
}
|
||||
|
||||
// SetStatus 启用/禁用推荐
|
||||
func (s *sBookRecommendations) SetStatus(ctx context.Context, in *model.BookRecommendationsSetStatusIn) (out *model.BookRecommendationsCRUDOut, err error) {
|
||||
// 检查是否存在
|
||||
exist, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.NotFound.Sub("book_recommendation_not_found")
|
||||
}
|
||||
_, err = dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Data(do.BookRecommendations{
|
||||
Status: in.Status,
|
||||
}).Update()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_update_failed")
|
||||
}
|
||||
return &model.BookRecommendationsCRUDOut{Success: true}, nil
|
||||
}
|
||||
|
||||
// SortOrder 设置排序
|
||||
func (s *sBookRecommendations) SortOrder(ctx context.Context, in *model.BookRecommendationsSortOrderIn) (out *model.BookRecommendationsCRUDOut, err error) {
|
||||
// 检查是否存在
|
||||
exist, err := dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Exist()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_query_failed")
|
||||
}
|
||||
if !exist {
|
||||
return nil, ecode.NotFound.Sub("book_recommendation_not_found")
|
||||
}
|
||||
_, err = dao.BookRecommendations.Ctx(ctx).
|
||||
Where(dao.BookRecommendations.Columns().Id, in.Id).
|
||||
Data(do.BookRecommendations{
|
||||
SortOrder: in.SortOrder,
|
||||
}).Update()
|
||||
if err != nil {
|
||||
return nil, ecode.Fail.Sub("book_recommendation_update_failed")
|
||||
}
|
||||
return &model.BookRecommendationsCRUDOut{Success: true}, nil
|
||||
}
|
||||
|
||||
// UploadCover 上传推荐封面图
|
||||
func (s *sBookRecommendations) UploadCover(ctx context.Context, file *ghttp.UploadFile) (url string, err error) {
|
||||
if file == nil {
|
||||
return "", ecode.Params.Sub("image_file_required")
|
||||
}
|
||||
// 校验文件类型(只允许图片)
|
||||
contentType := file.Header.Get("Content-Type")
|
||||
if contentType == "" || contentType[:6] != "image/" {
|
||||
return "", ecode.Params.Sub("image_type_invalid")
|
||||
}
|
||||
allowedTypes := map[string]bool{
|
||||
"image/jpeg": true,
|
||||
"image/png": true,
|
||||
"image/gif": true,
|
||||
"image/webp": true,
|
||||
}
|
||||
if !allowedTypes[contentType] {
|
||||
return "", ecode.Params.Sub("image_format_invalid")
|
||||
}
|
||||
if file.Size > 1*1024*1024 {
|
||||
return "", ecode.Params.Sub("image_size_exceeded")
|
||||
}
|
||||
client := oss.GetOSSClient("amazon_s3")
|
||||
if client == nil {
|
||||
return "", ecode.Fail.Sub("server_error")
|
||||
}
|
||||
url, err = client.Upload(file, "recommend")
|
||||
if err != nil {
|
||||
return "", ecode.Fail.Sub("image_upload_failed")
|
||||
}
|
||||
return url, nil
|
||||
}
|
||||
Reference in New Issue
Block a user