mirror of
https://github.com/blossom-editor/blossom.git
synced 2026-03-12 17:41:26 +08:00
feat: 批量公开/取消公开
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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 ? '取消公开成功' : '公开成功')
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 收藏/取消收藏
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user