feat: sheet preview

pull/176/head
1379 2 years ago
parent 77bcbe5932
commit b3588e90f8

@ -248,7 +248,7 @@ func (p *PostHandler) UpdatePostDraft(ctx *gin.Context) (interface{}, error) {
if err != nil {
return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("content param error")
}
post, err := p.PostService.UpdateDraftContent(ctx, postID, postContentParam.Content)
post, err := p.PostService.UpdateDraftContent(ctx, postID, postContentParam.Content, postContentParam.OriginalContent)
if err != nil {
return nil, err
}

@ -2,6 +2,7 @@ package admin
import (
"errors"
"net/http"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
@ -130,7 +131,7 @@ func (s *SheetHandler) UpdateSheetStatus(ctx *gin.Context) (interface{}, error)
}
func (s *SheetHandler) UpdateSheetDraft(ctx *gin.Context) (interface{}, error) {
sheetID, err := util.MustGetQueryInt32(ctx, "sheetID")
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
}
@ -139,7 +140,7 @@ func (s *SheetHandler) UpdateSheetDraft(ctx *gin.Context) (interface{}, error) {
if err != nil {
return nil, xerr.WithStatus(err, xerr.StatusBadRequest).WithMsg("content param error")
}
post, err := s.SheetService.UpdateDraftContent(ctx, sheetID, postContentParam.Content)
post, err := s.SheetService.UpdateDraftContent(ctx, sheetID, postContentParam.Content, postContentParam.OriginalContent)
if err != nil {
return nil, err
}
@ -154,10 +155,19 @@ func (s *SheetHandler) DeleteSheet(ctx *gin.Context) (interface{}, error) {
return nil, s.SheetService.Delete(ctx, sheetID)
}
func (s *SheetHandler) PreviewSheet(ctx *gin.Context) (interface{}, error) {
func (s *SheetHandler) PreviewSheet(ctx *gin.Context) {
sheetID, err := util.ParamInt32(ctx, "sheetID")
if err != nil {
return nil, err
ctx.Status(http.StatusInternalServerError)
_ = ctx.Error(err)
return
}
previewPath, err := s.SheetService.Preview(ctx, sheetID)
if err != nil {
ctx.Status(http.StatusInternalServerError)
_ = ctx.Error(err)
return
}
return s.PostService.Preview(ctx, sheetID)
ctx.String(http.StatusOK, previewPath)
}

@ -126,5 +126,5 @@ func (a *ArchiveHandler) AdminArchivesBySlug(ctx *gin.Context, model template.Mo
return "", err
}
}
return a.PostModel.AdminPreview(ctx, post, "", model)
return a.PostModel.AdminPreview(ctx, post, model)
}

@ -215,7 +215,7 @@ func (p *PostModel) Archives(ctx context.Context, page int, model template.Model
return p.ThemeService.Render(ctx, "archives")
}
func (p *PostModel) AdminPreview(ctx context.Context, post *entity.Post, token string, model template.Model) (string, error) {
func (p *PostModel) AdminPreview(ctx context.Context, post *entity.Post, model template.Model) (string, error) {
if post == nil {
return "", xerr.WithStatus(nil, int(xerr.StatusBadRequest)).WithMsg("查询不到文章信息")
}

@ -105,3 +105,50 @@ func (s *SheetModel) Content(ctx context.Context, sheet *entity.Post, token stri
return s.ThemeService.Render(ctx, "sheet")
}
func (s *SheetModel) AdminPreviewContent(ctx context.Context, sheet *entity.Post, model template.Model) (string, error) {
if sheet == nil {
return "", xerr.WithStatus(nil, int(xerr.StatusBadRequest)).WithMsg("查询不到文章信息")
}
sheetVO, err := s.SheetAssembler.ConvertToDetailVO(ctx, sheet)
if err != nil {
return "", err
}
model["target"] = sheetVO
model["type"] = "sheet"
model["post"] = sheetVO
model["sheet"] = sheetVO
model["is_sheet"] = true
metas, err := s.MetaService.GetPostMeta(ctx, sheet.ID)
if err != nil {
return "", err
}
model["metas"] = s.MetaService.ConvertToMetaDTOs(metas)
tags, err := s.PostTagService.ListTagByPostID(ctx, sheet.ID)
if err != nil {
return "", err
}
model["tags"], _ = s.TagService.ConvertToDTOs(ctx, tags)
if sheet.MetaDescription != "" {
model["meta_description"] = sheet.MetaDescription
} else {
model["meta_description"] = sheet.Summary
}
if sheet.MetaKeywords != "" {
model["meta_keywords"] = sheet.MetaKeywords
} else if len(tags) > 0 {
metaKeywords := strings.Builder{}
metaKeywords.Write([]byte(tags[0].Name))
for _, tag := range tags[1:] {
metaKeywords.Write([]byte(","))
metaKeywords.Write([]byte(tag.Name))
}
model["meta_keywords"] = metaKeywords.String()
}
return s.ThemeService.Render(ctx, "sheet")
}

@ -3,27 +3,32 @@ package content
import (
"github.com/gin-gonic/gin"
"github.com/go-sonic/sonic/cache"
"github.com/go-sonic/sonic/handler/content/model"
"github.com/go-sonic/sonic/service"
"github.com/go-sonic/sonic/template"
"github.com/go-sonic/sonic/util"
"github.com/go-sonic/sonic/util/xerr"
)
type SheetHandler struct {
OptionService service.OptionService
SheetService service.SheetService
SheetModel *model.SheetModel
Cache cache.Cache
}
func NewSheetHandler(
optionService service.OptionService,
sheetService service.SheetService,
sheetModel *model.SheetModel,
cache cache.Cache,
) *SheetHandler {
return &SheetHandler{
OptionService: optionService,
SheetService: sheetService,
SheetModel: sheetModel,
Cache: cache,
}
}
@ -39,3 +44,29 @@ func (s *SheetHandler) SheetBySlug(ctx *gin.Context, model template.Model) (stri
token, _ := ctx.Cookie("authentication")
return s.SheetModel.Content(ctx, sheet, token, model)
}
func (s *SheetHandler) AdminSheetBySlug(ctx *gin.Context, model template.Model) (string, error) {
slug, err := util.ParamString(ctx, "slug")
if err != nil {
return "", err
}
token, err := util.MustGetQueryString(ctx, "token")
if err != nil {
return "", err
}
if token == "" {
return "", nil
}
_, ok := s.Cache.Get(token)
if !ok {
return "", xerr.WithStatus(nil, xerr.StatusBadRequest).WithMsg("token已过期或者不存在")
}
sheet, err := s.SheetService.GetBySlug(ctx, slug)
if err != nil {
return "", err
}
return s.SheetModel.AdminPreviewContent(ctx, sheet, model)
}

@ -153,7 +153,7 @@ func (s *Server) RegisterRouters() {
sheetRouter.PUT("/:sheetID/:status", s.wrapHandler(s.SheetHandler.UpdateSheetStatus))
sheetRouter.PUT("/:sheetID/status/draft/content", s.wrapHandler(s.SheetHandler.UpdateSheetDraft))
sheetRouter.DELETE("/:sheetID", s.wrapHandler(s.SheetHandler.DeleteSheet))
sheetRouter.GET("/preview/:sheetID", s.wrapHandler(s.SheetHandler.PreviewSheet))
sheetRouter.GET("/preview/:sheetID", s.SheetHandler.PreviewSheet)
sheetRouter.GET("/independent", s.wrapHandler(s.SheetHandler.IndependentSheets))
{
sheetCommentRouter := sheetRouter.Group("/comments")
@ -412,5 +412,6 @@ func (s *Server) registerDynamicRouters(contentRouter *gin.RouterGroup) error {
} else {
contentRouter.GET(sheetPath+"/:slug", s.wrapHTMLHandler(s.ContentSheetHandler.SheetBySlug))
}
contentRouter.GET("admin_preview/"+sheetPath+"/:slug", s.wrapHTMLHandler(s.ContentSheetHandler.AdminSheetBySlug))
return nil
}

@ -26,7 +26,8 @@ type Post struct {
}
type PostContent struct {
Content string `json:"content" form:"content"`
Content string `json:"content" form:"content"`
OriginalContent string `json:"originalContent" form:"orginalContent"`
}
type PostQuery struct {

@ -17,7 +17,7 @@ type BasePostService interface {
BuildFullPath(ctx context.Context, post *entity.Post) (string, error)
Delete(ctx context.Context, postID int32) error
DeleteBatch(ctx context.Context, postIDs []int32) error
UpdateDraftContent(ctx context.Context, postID int32, content string) (*entity.Post, error)
UpdateDraftContent(ctx context.Context, postID int32, content, originalContent string) (*entity.Post, error)
UpdateStatus(ctx context.Context, postID int32, status consts.PostStatus) (*entity.Post, error)
UpdateStatusBatch(ctx context.Context, status consts.PostStatus, postIDs []int32) ([]*entity.Post, error)
CreateOrUpdate(ctx context.Context, post *entity.Post, categoryIDs, tagIDs []int32, metas []param.Meta) (*entity.Post, error)

@ -486,14 +486,14 @@ func (b basePostServiceImpl) UpdateStatusBatch(ctx context.Context, status const
return posts, nil
}
func (b basePostServiceImpl) UpdateDraftContent(ctx context.Context, postID int32, content string) (*entity.Post, error) {
func (b basePostServiceImpl) UpdateDraftContent(ctx context.Context, postID int32, content, originalContent string) (*entity.Post, error) {
postDAL := dal.GetQueryByCtx(ctx).Post
post, err := postDAL.WithContext(ctx).Where(postDAL.ID.Eq(postID)).First()
if err != nil {
return nil, WrapDBErr(err)
}
if post.OriginalContent != content {
updateResult, err := postDAL.WithContext(ctx).Where(postDAL.ID.Eq(postID)).UpdateColumnSimple(postDAL.OriginalContent.Value(content))
updateResult, err := postDAL.WithContext(ctx).Where(postDAL.ID.Eq(postID)).UpdateColumnSimple(postDAL.OriginalContent.Value(originalContent), postDAL.FormatContent.Value(content))
if err != nil {
return nil, WrapDBErr(err)
}

@ -166,7 +166,7 @@ func (s sheetServiceImpl) Preview(ctx context.Context, sheetID int32) (string, e
if err != nil {
return "", err
}
previewURL.WriteString("/")
previewURL.WriteString("/admin_preview")
previewURL.WriteString(fullPath)
previewURL.WriteString("?token=")
previewURL.WriteString(token)

Loading…
Cancel
Save