diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java index e5a81b3..eb464e7 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/entity/Grouping.java @@ -13,7 +13,7 @@ import lombok.Data; @TableName("grouping") public class Grouping { @Schema(description = "分组id",implementation = Long.class) - @TableId(type = IdType.AUTO) + @TableId(type = IdType.ASSIGN_ID) @JsonFormat(shape = JsonFormat.Shape.STRING) // 仅作用于此字段 private Long id; diff --git a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java index c0d43c0..1b7b9e1 100644 --- a/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java +++ b/biji-houdaun/src/main/java/com/test/bijihoudaun/service/impl/GroupingServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.test.bijihoudaun.entity.Grouping; import com.test.bijihoudaun.mapper.GroupingMapper; import com.test.bijihoudaun.service.GroupingService; +import com.test.bijihoudaun.util.SnowflakeIdGenerator; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -17,10 +18,14 @@ public class GroupingServiceImpl @Resource private GroupingMapper groupingMapper; + @Resource + private SnowflakeIdGenerator snowflakeIdGenerator; @Override public Grouping createGrouping(Grouping grouping) { + long id = snowflakeIdGenerator.nextId(); + grouping.setId(id); this.save(grouping); return grouping; } diff --git a/biji-qianduan/src/api/CommonApi.js b/biji-qianduan/src/api/CommonApi.js index 415b8bc..ef7d1c5 100644 --- a/biji-qianduan/src/api/CommonApi.js +++ b/biji-qianduan/src/api/CommonApi.js @@ -77,6 +77,9 @@ export const updateGroupingName = (id, newName) => { return axiosApi.put(`/api/groupings/${id}`, { grouping: newName }); } +// 删除分组 +export const deleteGrouping = (id) => axiosApi.delete(`/api/groupings/${id}`); + // 更新Markdown文件标题 export const updateMarkdownTitle = (id, newTitle) => { return axiosApi.put(`/api/markdown/${id}/title`, newTitle, { diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index dc91813..7250528 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -208,9 +208,10 @@ import { updateMarkdown, uploadImage, searchMarkdown, updateGroupingName, - updateMarkdownTitle + updateMarkdownTitle, + deleteGrouping as apiDeleteGrouping } from '@/api/CommonApi.js' -import { Plus, Fold, Expand, Folder, Document, Search, Edit } from "@element-plus/icons-vue"; +import { Plus, Fold, Expand, Folder, Document, Search, Edit, Delete } from "@element-plus/icons-vue"; import { useUserStore } from '../stores/user'; import { useRouter } from 'vue-router'; @@ -431,7 +432,8 @@ const renderMenu = (item) => { title: () => h('div', { class: 'menu-item-title', onClick: () => selectFile(item) }, [ h(ElIcon, () => h(Folder)), h('span', null, item.grouping), - h(ElIcon, { class: 'edit-icon', onClick: (e) => { e.stopPropagation(); openRenameDialog(item, 'group'); } }, () => h(Edit)) + h(ElIcon, { class: 'edit-icon', onClick: (e) => { e.stopPropagation(); openRenameDialog(item, 'group'); } }, () => h(Edit)), + h(ElIcon, { class: 'delete-icon', onClick: (e) => { e.stopPropagation(); handleDeleteGroup(item); } }, () => h(Delete)) ]), default: () => item.children.map(child => renderMenu(child)) }); @@ -440,7 +442,8 @@ const renderMenu = (item) => { default: () => h('div', { class: 'menu-item-title' }, [ h(ElIcon, () => h(Folder)), h('span', null, item.grouping), - h(ElIcon, { class: 'edit-icon', onClick: (e) => { e.stopPropagation(); openRenameDialog(item, 'group'); } }, () => h(Edit)) + h(ElIcon, { class: 'edit-icon', onClick: (e) => { e.stopPropagation(); openRenameDialog(item, 'group'); } }, () => h(Edit)), + h(ElIcon, { class: 'delete-icon', onClick: (e) => { e.stopPropagation(); handleDeleteGroup(item); } }, () => h(Delete)) ]) }); }; @@ -757,6 +760,41 @@ const handleMoveNote = async () => { ElMessage.error('移动失败: ' + error.message); } }; + +const handleDeleteGroup = async (group) => { + try { + await ElMessageBox.confirm( + '确定要删除这个分类吗?分类下的所有笔记将被移动到“未分类”。', + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + } + ); + + const unclassifiedGroup = categoryTree.value.find(g => g.grouping === '未分类'); + if (!unclassifiedGroup) { + ElMessage.error('未找到“未分类”目录,无法移动笔记。'); + return; + } + + const notesToMove = await markdownList(group.id); + if (notesToMove.data && notesToMove.data.length > 0) { + for (const note of notesToMove.data) { + await updateMarkdown({ ...note, groupingId: unclassifiedGroup.id }); + } + } + + await apiDeleteGrouping(group.id); + ElMessage.success('分类删除成功'); + await fetchGroupings(); + } catch (error) { + if (error !== 'cancel') { + ElMessage.error('删除失败: ' + (error.message || '')); + } + } +};