feat: 批量公开/取消公开

This commit is contained in:
xiaozzzi
2024-04-06 19:16:03 +08:00
parent 737bdc9e42
commit c54b467201
5 changed files with 191 additions and 23 deletions

View File

@@ -13,10 +13,7 @@ import com.blossom.backend.config.BlConstants;
import com.blossom.backend.server.article.draft.ArticleService;
import com.blossom.backend.server.article.draft.pojo.ArticleEntity;
import com.blossom.backend.server.article.draft.pojo.ArticleInfoRes;
import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity;
import com.blossom.backend.server.article.open.pojo.ArticleOpenReq;
import com.blossom.backend.server.article.open.pojo.ArticleOpenRes;
import com.blossom.backend.server.article.open.pojo.ArticleOpenSyncReq;
import com.blossom.backend.server.article.open.pojo.*;
import com.blossom.backend.server.doc.DocTypeEnum;
import com.blossom.backend.server.utils.DocUtil;
import com.blossom.common.base.exception.XzException404;
@@ -90,7 +87,19 @@ public class ArticleOpenController {
@PostMapping
public R<Long> open(@Validated @RequestBody ArticleOpenReq req) {
req.setUserId(AuthContext.getUserId());
return R.ok(openService.open(req));
return R.ok(openService.openSingle(req));
}
/**
* 批量公开文章
*
* @param req 文章对象
*/
@PostMapping("/batch")
public R<?> open(@Validated @RequestBody ArticleBatchOpenReq req) {
req.setUserId(AuthContext.getUserId());
openService.openBatch(req);
return R.ok();
}
/**

View File

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.blossom.backend.server.article.TagEnum;
import com.blossom.backend.server.article.draft.ArticleService;
import com.blossom.backend.server.article.draft.pojo.ArticleEntity;
import com.blossom.backend.server.article.draft.pojo.ArticleQueryReq;
import com.blossom.backend.server.article.open.pojo.ArticleBatchOpenReq;
import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity;
import com.blossom.backend.server.article.open.pojo.ArticleOpenReq;
import com.blossom.common.base.enums.YesNo;
@@ -58,28 +60,92 @@ public class ArticleOpenService extends ServiceImpl<ArticleOpenMapper, ArticleOp
* 公开或关闭公开访问
*/
@Transactional(rollbackFor = Exception.class)
public Long open(ArticleOpenReq req) {
public Long openSingle(ArticleOpenReq req) {
ArticleEntity article = articleService.getById(req.getId());
ArticleEntity entity = req.to(ArticleEntity.class);
open(req, article);
// ArticleEntity upd = new ArticleEntity();
// upd.setId(req.getId());
// upd.setUserId(req.getUserId());
// upd.setOpenStatus(req.getOpenStatus());
// /*
// * 公开文章 将 article 表插入到 article_open 表
// */
// if (YesNo.YES.getValue().equals(req.getOpenStatus())) {
// XzException400.throwBy(article.getOpenStatus().equals(YesNo.YES.getValue()), "文章已[" + req.getId() + "]已允许公开访问, 若要同步最新文章内容, 请使用同步");
// upd.setOpenVersion(article.getVersion());
// baseMapper.open(req.getId());
// }
// /*
// * 取消公开 删除 article_open 表数据
// */
// else if (YesNo.NO.getValue().equals(req.getOpenStatus())) {
// upd.setOpenVersion(0);
// XzException400.throwBy(article.getOpenStatus().equals(YesNo.NO.getValue()), "文章[" + req.getId() + "]未公开, 无法取消公开访问");
// baseMapper.delById(req.getId());
// }
//
// // 修改文章的公开状态
// articleService.update(upd);
return req.getId();
}
/**
* 批量公开
*
* @param req
* @since 1.14.0
*/
@Transactional(rollbackFor = Exception.class)
public void openBatch(ArticleBatchOpenReq req) {
ArticleQueryReq where = new ArticleQueryReq();
where.setPids(CollUtil.newArrayList(req.getPid()));
List<ArticleEntity> articles = articleService.listAll(where);
for (ArticleEntity article : articles) {
ArticleOpenReq open = new ArticleOpenReq();
open.setId(article.getId());
open.setOpenStatus(req.getOpenStatus());
open.setUserId(req.getUserId());
open(open, article);
}
}
/**
* 公开状态
*
* @param req 本次公开请求
* @param article 文章
*/
@Transactional(rollbackFor = Exception.class)
public void open(ArticleOpenReq req, ArticleEntity article) {
ArticleEntity upd = new ArticleEntity();
upd.setId(req.getId());
upd.setUserId(req.getUserId());
upd.setOpenStatus(req.getOpenStatus());
/*
* 公开文章 将 article 表插入到 article_open 表
*/
if (YesNo.YES.getValue().equals(req.getOpenStatus())) {
XzException400.throwBy(article.getOpenStatus().equals(YesNo.YES.getValue()), "文章已[" + req.getId() + "]已允许公开访问, 若要同步最新文章内容, 请使用同步");
entity.setOpenVersion(article.getVersion());
if (YesNo.YES.getValue().equals(article.getOpenStatus())) {
return;
}
// XzException400.throwBy(article.getOpenStatus().equals(YesNo.YES.getValue()), "文章已[" + req.getId() + "]已允许公开访问, 若要同步最新文章内容, 请使用同步");
upd.setOpenVersion(article.getVersion());
baseMapper.open(req.getId());
}
/*
* 取消公开 删除 article_open 表数据
*/
else if (YesNo.NO.getValue().equals(req.getOpenStatus())) {
entity.setOpenVersion(0);
XzException400.throwBy(article.getOpenStatus().equals(YesNo.NO.getValue()), "文章[" + req.getId() + "]未公开, 无法取消公开访问");
if (YesNo.NO.getValue().equals(article.getOpenStatus())) {
return;
}
// XzException400.throwBy(article.getOpenStatus().equals(YesNo.NO.getValue()), "文章[" + req.getId() + "]未公开, 无法取消公开访问");
upd.setOpenVersion(0);
baseMapper.delById(req.getId());
}
articleService.update(entity);
return req.getId();
// 修改文章的公开状态
articleService.update(upd);
}
/**

View File

@@ -0,0 +1,44 @@
package com.blossom.backend.server.article.open.pojo;
import com.blossom.common.base.enums.YesNo;
import com.blossom.common.base.pojo.AbstractPOJO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* 文件夹下的文章全部公开
*
* @author xzzz
* @since 1.14.0
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ArticleBatchOpenReq extends AbstractPOJO {
/**
* 文章ID
*/
@Min(value = 0, message = "[文件夹ID] 不能小于0")
@NotNull(message = "[文件夹ID] 为必填项")
private Long pid;
/**
* 公开状态 {@link YesNo}
*
* @see YesNo
*/
@Min(value = 0, message = "[open 状态] 不能小于0")
@Max(value = 1, message = "[open 状态] 不能大于1")
@NotNull(message = "[open 状态] 为必填项")
private Integer openStatus;
/**
* 用户ID
*/
private Long userId;
}

View File

@@ -96,8 +96,8 @@ export const docTreeApi = (params?: object): Promise<R<any>> => {
/**
* 修改文档的排序
* @param data
* @returns
* @param data
* @returns
*/
export const docUpdSortApi = (data: object): Promise<R<any>> => {
return rq.post<R<any>>('/doc/upd/sort', data)
@@ -382,6 +382,15 @@ export const articleOpenApi = (data?: object): Promise<R<any>> => {
return rq.post<R<any>>('/article/open', data)
}
/**
* 文章公开或取消公开
* @param data
* @returns
*/
export const articleOpenBatchApi = (data?: object): Promise<R<any>> => {
return rq.post<R<any>>('/article/open/batch', data)
}
/**
* 文章同步
* @param data

View File

@@ -10,10 +10,10 @@
<div class="iconbl bl-a-leftdirection-line" @click="handleShowSort"></div>
</el-tooltip>
<el-tooltip effect="light" popper-class="is-small" placement="top" :offset="4" :hide-after="0" content="根目录下新建文章">
<div class="iconbl bl-a-texteditorhighlightcolor-line" @click="addArticleToRoot()"></div>
<div class="iconbl bl-fileadd-line" @click="addArticleToRoot()"></div>
</el-tooltip>
<el-tooltip effect="light" popper-class="is-small" placement="top" :offset="4" :hide-after="0" content="根目录下新建文件夹">
<div class="iconbl bl-a-folderon-line" @click="addFolderToRoot()"></div>
<div class="iconbl bl-folderadd-line" @click="addFolderToRoot()"></div>
</el-tooltip>
<el-tooltip effect="light" popper-class="is-small" placement="top" :offset="4" :hide-after="0" :show-after="1000" content="搜索">
<div class="iconbl bl-search-line" @click="showTreeFilter()"></div>
@@ -111,8 +111,8 @@
<div @click="rename"><span class="iconbl bl-pen"></span>重命名</div>
<div @click="handleShowDocInfoDialog('upd')"><span class="iconbl bl-a-fileedit-line"></span>编辑详情</div>
<div v-if="curDoc.ty === 3" @click="syncDoc()"><span class="iconbl bl-a-cloudrefresh-line"></span>同步文章</div>
<div v-if="curDoc.ty !== 3" @click="addFolderToDoc()"><span class="iconbl bl-a-fileadd-line"></span>新增文件夹</div>
<div v-if="curDoc.ty !== 3" @click="addArticleToDoc()"><span class="iconbl bl-a-fileadd-fill"></span>新增笔记</div>
<div v-if="curDoc.ty !== 3" @click="addFolderToDoc()"><span class="iconbl bl-folderadd-line"></span>新增文件夹</div>
<div v-if="curDoc.ty !== 3" @click="addArticleToDoc()"><span class="iconbl bl-fileadd-line"></span>新增笔记</div>
<div v-if="curDoc.ty === 3" @click="createUrl('link')"><span class="iconbl bl-correlation-line"></span>复制双链引用</div>
<div v-if="curDoc.ty !== 3" @click="handleShowArticleImportDialog()"><span class="iconbl bl-file-upload-line"></span>导入文章</div>
@@ -120,10 +120,18 @@
<span class="iconbl bl-a-rightsmallline-line"></span>
<span class="iconbl bl-apps-line"></span>更多
<div class="tree-menu-level2" :style="rMenuLevel2">
<div v-if="curDoc.o === 0" @click="open(1)"><span class="iconbl bl-a-cloudupload-line"></span>公开</div>
<div v-if="curDoc.o === 1" @click="open(0)"><span class="iconbl bl-a-clouddownload-line"></span>取消公开</div>
<div v-if="curDoc.star === 0" @click="star(1)"><span class="iconbl bl-star-fill"></span>收藏</div>
<div v-if="curDoc.star === 1" @click="star(0)"><span class="iconbl bl-star-line"></span>取消收藏</div>
<div v-if="curDoc.o === 0" @click="open(1)">
<span class="iconbl bl-a-cloudupload-line"></span>公开{{ curDoc.ty === 3 ? '文章' : '文件夹' }}
</div>
<div v-if="curDoc.o === 1" @click="open(0)">
<span class="iconbl bl-a-clouddownload-line"></span>取消{{ curDoc.ty === 3 ? '文章' : '文件夹' }}公开
</div>
<div v-if="curDoc.star === 0" @click="star(1)">
<span class="iconbl bl-star-fill"></span>收藏{{ curDoc.ty === 3 ? '文章' : '文件夹' }}
</div>
<div v-if="curDoc.star === 1" @click="star(0)">
<span class="iconbl bl-star-line"></span>取消收藏{{ curDoc.ty === 3 ? '文章' : '文件夹' }}
</div>
<div v-if="curDoc.ty === 3 && !curDoc.t.includes('toc')" @click="addArticleTag('toc')">
<span class="iconbl bl-list-ordered"></span>设为专题目录
</div>
@@ -137,6 +145,9 @@
<div v-if="curDoc.ty !== 3 && curDoc.t.includes('subject')" @click="addFolderTag('subject')">
<span class="iconbl bl-a-lowerrightpage-line"></span>取消专题
</div>
<div v-if="curDoc.ty === 1" class="menu-item-divider"></div>
<div v-if="curDoc.ty === 1" @click="openBactch(1)"><span class="iconbl bl-a-cloudupload-line"></span>所有文章公开</div>
<div v-if="curDoc.ty === 1" @click="openBactch(0)"><span class="iconbl bl-a-clouddownload-line"></span>所有文章取消公开</div>
</div>
</div>
@@ -269,6 +280,7 @@ import {
articleUpdTagApi,
articleDownloadHtmlApi,
articleOpenApi,
articleOpenBatchApi,
articleStarApi,
folderStarApi,
folderAddApi,
@@ -925,6 +937,34 @@ const open = (openStatus: 0 | 1) => {
}
}
/**
* 公开/取消公开
*/
const openBactch = (openStatus: 0 | 1) => {
const callback = () => {
const parent: Node = DocTreeRef.value.getNode(curDoc.value.i)
if (parent && !isEmpty(parent.childNodes)) {
for (const doc of parent.childNodes) {
if (doc.data.ty === 3) {
doc.data.o = openStatus
}
}
}
}
if (curDoc.value.ty === 1) {
articleOpenBatchApi({ pid: curDoc.value.i, openStatus: openStatus }).then((_) => {
callback()
Notify.success(openStatus === 0 ? '取消公开成功' : '公开成功')
})
} else {
articleOpenBatchApi({ pid: curDoc.value.i, openStatus: openStatus }).then((_) => {
callback()
Notify.success(openStatus === 0 ? '取消公开成功' : '公开成功')
})
}
}
/**
* 收藏/取消收藏
*/