From 34f2c34f682abf37ba5ed7a28d390cb9b55ccee0 Mon Sep 17 00:00:00 2001 From: li-guohao Date: Thu, 4 Apr 2024 10:51:23 +0800 Subject: [PATCH] feat: article subject list by star. --- .../server/folder/FolderController.java | 21 +++++++++-- .../backend/server/folder/FolderService.java | 14 +++++-- .../server/folder/pojo/FolderEntity.java | 4 ++ .../server/folder/pojo/FolderQueryReq.java | 4 ++ .../backend/server/folder/pojo/FolderRes.java | 4 ++ .../server/folder/pojo/FolderStarReq.java | 37 +++++++++++++++++++ .../server/folder/pojo/FolderUpdReq.java | 4 ++ .../main/resources/mapper/FolderMapper.xml | 3 ++ .../src/main/resources/schema-mysql.sql | 1 + .../src/renderer/src/api/blossom.ts | 9 +++++ .../src/views/article/ArticleInfo.vue | 9 ++++- .../src/views/home/ArticleSubjects.vue | 2 +- blossom-web/src/views/index/HomeSubject.vue | 2 +- 13 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java index f4f778e..ac7c6f0 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java @@ -5,6 +5,8 @@ import cn.hutool.core.util.ObjUtil; import com.blossom.backend.base.auth.AuthContext; import com.blossom.backend.base.auth.annotation.AuthIgnore; import com.blossom.backend.config.BlConstants; +import com.blossom.backend.server.article.draft.pojo.ArticleEntity; +import com.blossom.backend.server.article.draft.pojo.ArticleStarReq; import com.blossom.backend.server.article.draft.pojo.ArticleUpdTagReq; import com.blossom.backend.server.doc.DocService; import com.blossom.backend.server.folder.pojo.*; @@ -44,15 +46,27 @@ public class FolderController { if (userId == null) { return R.ok(new ArrayList<>()); } - return R.ok(baseService.subjects(userId)); + return R.ok(baseService.subjects(userId, null)); } /** * 查询专题列表 */ @GetMapping("/subjects") - public R> listSubject() { - return R.ok(baseService.subjects(AuthContext.getUserId())); + public R> listSubject(@RequestParam("starStatus") Integer starStatus) { + return R.ok(baseService.subjects(AuthContext.getUserId(), starStatus)); + } + + /** + * 星标目录 + * + * @param req 目录对象 + */ + @PostMapping("/star") + public R star(@Validated @RequestBody FolderStarReq req) { + FolderEntity folder = req.to(FolderEntity.class); + folder.setUserId(AuthContext.getUserId()); + return R.ok(baseService.update(folder)); } /** @@ -68,6 +82,7 @@ public class FolderController { FolderRes res = entity.to(FolderRes.class); res.setTags(DocUtil.toTagList(entity.getTags())); res.setType(entity.getType()); + res.setStarStatus(entity.getStarStatus()); return R.ok(res); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java index 3ebed3a..193063a 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java @@ -23,11 +23,13 @@ import com.blossom.common.base.util.DateUtils; import com.blossom.common.base.util.PrimaryKeyUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,6 +53,8 @@ public class FolderService extends ServiceImpl { this.pictureService = pictureService; } + + /** * 专题列表 *

1. 查询全部公开专题 @@ -60,12 +64,14 @@ public class FolderService extends ServiceImpl { *

5. 通过文件夹ID获取到专题下的所有文章, 从而统计文章的总字数, 修改时间, 创建时间等. *

6. 如果文章包含 TOC 标签, 则该文章为专题的目录, 专题的默认跳转会跳转至该目录 */ - public List subjects(Long userId) { - // 1. 查询所有公开的专题 + public List subjects(Long userId, @Nullable Integer starStatus) { + // 1. 查询所有专题 FolderEntity where = new FolderEntity(); where.setTags(TagEnum.subject.name()); - where.setOpenStatus(YesNo.YES.getValue()); where.setUserId(userId); + if (Objects.nonNull(starStatus) && + (starStatus.equals(1) || starStatus.equals(0))) { where.setStarStatus(starStatus); } + else {where.setStarStatus(0);} List allOpenSubject = baseMapper.listAll(where); if (CollUtil.isEmpty(allOpenSubject)) { return new ArrayList<>(); @@ -196,6 +202,7 @@ public class FolderService extends ServiceImpl { public Long update(FolderEntity folder) { XzException404.throwBy(folder.getId() == null, "ID不得为空"); XzException400.throwBy(folder.getId().equals(folder.getPid()), "上级文件夹不能是自己"); + if (Objects.isNull(folder.getStarStatus())) {folder.setStarStatus(0);} // 如果 if (StrUtil.isNotBlank(folder.getStorePath())) { final FolderEntity oldFolder = selectById(folder.getId()); @@ -214,6 +221,7 @@ public class FolderService extends ServiceImpl { } } folder.setStorePath(formatStorePath(folder.getStorePath())); + if (Objects.isNull(folder.getStarStatus())) { folder.setStarStatus(0);} baseMapper.updById(folder); return folder.getId(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java index 479e5b6..218a8b5 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java @@ -44,6 +44,10 @@ public class FolderEntity extends AbstractPOJO implements Serializable { * 标签 */ private String tags; + /** + * star状态 + */ + private Integer starStatus; /** * 开放状态 */ diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java index 8008767..1515845 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java @@ -16,6 +16,10 @@ import java.io.Serializable; public class FolderQueryReq extends PageReq implements Serializable { private static final long serialVersionUID = 1L; + /** + * star状态 + */ + private Integer starStatus; private String tags; diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java index f1b3dc7..ec9df7a 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java @@ -39,6 +39,10 @@ public class FolderRes extends AbstractPOJO implements Serializable { * 标签 */ private List tags; + /** + * star状态 + */ + private Integer starStatus; /** * 是否公开文件夹 [0:未公开,1:公开] */ diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java new file mode 100644 index 0000000..b82b4de --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java @@ -0,0 +1,37 @@ +package com.blossom.backend.server.folder.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; + +/** + * 文章 star + * + * @author xzzz + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class FolderStarReq extends AbstractPOJO { + + /** + * 目录ID + */ + @Min(value = 0, message = "[目录ID] 不能小于0") + @NotNull(message = "[目录ID] 为必填项") + private Long id; + + /** + * star 状态 {@link YesNo} + * @see YesNo + */ + @Min(value = 0, message = "[star 状态] 不能小于0") + @Max(value = 1, message = "[star 状态] 不能大于1") + @NotNull(message = "[star 状态] 为必填项") + private Integer starStatus; +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java index d2efd64..0b4d41e 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java @@ -33,6 +33,10 @@ public class FolderUpdReq extends AbstractPOJO implements Serializable { private String name; /** 图标 */ private String icon; + /** + * star状态 + */ + private Integer starStatus; /** 标签 */ private List tags; /** 排序 */ diff --git a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml index a7ff377..b4be2a9 100644 --- a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml @@ -9,6 +9,7 @@ `name`, icon, tags, + star_status, open_status, sort, cover, @@ -21,6 +22,7 @@ cre_time from blossom_folder + and star_status = #{starStatus} and open_status = #{openStatus} and type = #{type} and tags like concat('%',#{tags},'%') @@ -62,6 +64,7 @@ `name` = #{name}, icon = #{icon}, tags = #{tags}, + star_status = #{starStatus}, sort = #{sort}, cover = #{cover}, color = #{color}, diff --git a/blossom-backend/backend/src/main/resources/schema-mysql.sql b/blossom-backend/backend/src/main/resources/schema-mysql.sql index 61c6f06..b291bcf 100644 --- a/blossom-backend/backend/src/main/resources/schema-mysql.sql +++ b/blossom-backend/backend/src/main/resources/schema-mysql.sql @@ -435,6 +435,7 @@ CREATE TABLE IF NOT EXISTS `blossom_folder` `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '文件夹名称', `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '图标', `tags` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '标签', + `star_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是', `open_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '开放状态', `sort` int UNSIGNED NOT NULL DEFAULT 1 COMMENT '排序', `cover` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '封面图片', diff --git a/blossom-editor/src/renderer/src/api/blossom.ts b/blossom-editor/src/renderer/src/api/blossom.ts index 35166d0..2d70999 100644 --- a/blossom-editor/src/renderer/src/api/blossom.ts +++ b/blossom-editor/src/renderer/src/api/blossom.ts @@ -274,6 +274,15 @@ export const articleStarApi = (data?: object): Promise> => { return rq.post>('/article/star', data) } +/** + * star 或取消 star + * @param data + * @returns + */ +export const folderStarApi = (data?: object): Promise> => { + return rq.post>('/folder/star', data) +} + /** * 下载文章 markdown * @param params diff --git a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue index 65088f3..b54e597 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue @@ -69,7 +69,7 @@

-
+
@@ -239,6 +239,7 @@ import { import { isNotBlank, isNull } from '@renderer/assets/utils/obj' import { openExtenal, openNewIconWindow } from '@renderer/assets/utils/electron' import Notify from '@renderer/scripts/notify' +import {folderStarApi} from "../../api/blossom"; //#region --------------------------------------------------< 基本信息 >-------------------------------------------------- const userStore = useUserStore() @@ -484,6 +485,12 @@ const star = (changeStarStatus: number) => { Notify.success(docForm.value.starStatus === 0 ? '取消 Star 成功' : 'Star 成功') }) } + if (curIsFolder.value) { + docForm.value.starStatus = changeStarStatus + folderStarApi({ id: docForm.value.id, starStatus: docForm.value.starStatus }).then(() => { + Notify.success(docForm.value.starStatus === 0 ? '取消 Star 成功' : 'Star 成功') + }) + } } //#endregion diff --git a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue index 7a3d741..5883eab 100644 --- a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue +++ b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue @@ -56,7 +56,7 @@ let maxWords = 0 const subjects = ref([]) const getSubjects = () => { - subjectsApi().then((resp) => { + subjectsApi({ starStatus: 1 }).then((resp) => { subjects.value = resp.data if (!isEmpty(resp.data)) { maxWords = resp.data diff --git a/blossom-web/src/views/index/HomeSubject.vue b/blossom-web/src/views/index/HomeSubject.vue index 2fc1bfd..9570817 100644 --- a/blossom-web/src/views/index/HomeSubject.vue +++ b/blossom-web/src/views/index/HomeSubject.vue @@ -26,7 +26,7 @@ import { subjectsApi } from '@/api/blossom' onMounted(() => { subjects.value = [] - subjectsApi().then((resp) => { + subjectsApi({ starStatus: 1 }).then((resp) => { subjects.value = resp.data }) })