@@ -962,44 +719,6 @@
const userName = document.getElementById('user-name');
const userGradeMajor = document.getElementById('user-grade-major');
- // 笔记相关元素
- const categoryFilter = document.getElementById('categoryFilter');
- const newNoteBtn = document.getElementById('newNoteBtn');
- const importNoteBtn = document.getElementById('importNoteBtn');
- const newNoteModal = document.getElementById('newNoteModal');
- const closeNewNoteModal = document.getElementById('closeNewNoteModal');
- const cancelNewNote = document.getElementById('cancelNewNote');
- const newNoteForm = document.getElementById('newNoteForm');
- const noteModalTitle = document.getElementById('noteModalTitle');
- const noteId = document.getElementById('noteId');
- const noteTitle = document.getElementById('noteTitle');
- const noteCategory = document.getElementById('noteCategory');
- const noteContent = document.getElementById('noteContent');
- const noteCover = document.getElementById('noteCover');
- const noteCoverPreview = document.getElementById('noteCoverPreview');
- const coverPlaceholder = document.getElementById('coverPlaceholder');
- const noteSubmitBtnText = document.getElementById('noteSubmitBtnText');
- const notesContainer = document.getElementById('notes-container');
-let currentSelectedCategory = 'all';
-
- // 富文本编辑器元素
- const toolbarButtons = document.querySelectorAll('.toolbar-btn[data-command]');
- const insertImageBtn = document.getElementById('insertImageBtn');
- const insertImageModal = document.getElementById('insertImageModal');
- const closeInsertImageModal = document.getElementById('closeInsertImageModal');
- const cancelInsertImage = document.getElementById('cancelInsertImage');
- const confirmInsertImage = document.getElementById('confirmInsertImage');
- const uploadTabBtn = document.getElementById('uploadTabBtn');
- const urlTabBtn = document.getElementById('urlTabBtn');
- const uploadTab = document.getElementById('uploadTab');
- const urlTab = document.getElementById('urlTab');
- const imageDropArea = document.getElementById('imageDropArea');
- const imageUpload = document.getElementById('imageUpload');
- const imagePreviewContainer = document.getElementById('imagePreviewContainer');
- const imagePreview = document.getElementById('imagePreview');
- const removeImage = document.getElementById('removeImage');
- const imageUrl = document.getElementById('imageUrl');
- const imageResponsive = document.getElementById('imageResponsive');
// 导入相关元素
const importNoteModal = document.getElementById('importNoteModal');
@@ -1261,491 +980,8 @@ document.querySelectorAll('.sidebar-item[data-view]').forEach(item => {
});
});
-// 搜索笔记 + 分类筛选 联合功能
-const noteSearchInput = document.getElementById('noteSearch');
-
-// 搜索框输入事件
-if (noteSearchInput) {
- noteSearchInput.addEventListener('input', function () {
- const searchTerm = this.value.trim().toLowerCase();
- // 调用联合筛选函数(分类+关键词)
- filterNotesByCategoryAndSearch(searchTerm);
- });
-}
-
-// 分类筛选下拉框切换事件(新增)
-if (categoryFilter) {
- categoryFilter.addEventListener('change', function () {
- currentSelectedCategory = this.value; // 更新当前选中分类
- const searchTerm = noteSearchInput.value.trim().toLowerCase();
- // 调用联合筛选函数(分类+关键词)
- filterNotesByCategoryAndSearch(searchTerm);
- });
-}
-// 新增:联合筛选函数(同时处理分类和搜索关键词)
-function filterNotesByCategoryAndSearch(searchTerm) {
- let filteredNotes = notesData;
-
- // 第一步:按分类筛选(非“全部分类”时过滤)
- if (currentSelectedCategory !== 'all') {
- filteredNotes = filteredNotes.filter(note => note.category === currentSelectedCategory);
- }
-
- // 第二步:按关键词筛选(搜索框有内容时过滤)
- if (searchTerm !== '') {
- filteredNotes = filteredNotes.filter(note => {
- const titleMatch = note.title.toLowerCase().includes(searchTerm);
- const contentMatch = stripHtml(note.content).toLowerCase().includes(searchTerm);
- return titleMatch || contentMatch;
- });
- }
-
- // 渲染筛选后的笔记列表
- renderNotes(filteredNotes);
-}
-// 富文本编辑器功能实现
-// 文本格式化按钮
-toolbarButtons.forEach(button => {
- button.addEventListener('click', () => {
- const command = button.getAttribute('data-command');
-
- // 特殊处理链接插入
- if (command === 'createLink') {
- const url = prompt('请输入链接地址:');
- if (url) {
- document.execCommand(command, false, url);
- }
- return;
- }
-
- // 执行命令
- document.execCommand(command, false, null);
-
- // 聚焦回编辑区域
- noteContent.focus();
-
- // 更新按钮状态(如粗体按钮是否激活)
- updateToolbarState();
- });
-});
-
-// 更新工具栏按钮状态
-function updateToolbarState() {
- toolbarButtons.forEach(button => {
- const command = button.getAttribute('data-command');
- if (document.queryCommandState(command)) {
- button.classList.add('active');
- } else {
- button.classList.remove('active');
- }
- });
-}
-
-// 监听编辑区域选择变化,更新工具栏状态
-noteContent.addEventListener('mouseup', updateToolbarState);
-noteContent.addEventListener('keyup', updateToolbarState);
-
-// 插入图片模态框控制
-insertImageBtn.addEventListener('click', () => {
- insertImageModal.classList.remove('hidden');
- setTimeout(() => {
- insertImageModal.querySelector('div').classList.add('scale-100');
- insertImageModal.querySelector('div').classList.remove('scale-95');
- }, 10);
- resetInsertImageForm();
-});
-
-closeInsertImageModal.addEventListener('click', () => {
- closeInsertImageModalHandler();
-});
-
-cancelInsertImage.addEventListener('click', () => {
- closeInsertImageModalHandler();
-});
-
-function closeInsertImageModalHandler() {
- insertImageModal.querySelector('div').classList.add('scale-95');
- insertImageModal.querySelector('div').classList.remove('scale-100');
- setTimeout(() => {
- insertImageModal.classList.add('hidden');
- }, 300);
-}
-
-// 重置插入图片表单
-function resetInsertImageForm() {
- imageUpload.value = '';
- imagePreviewContainer.classList.add('hidden');
- imagePreview.src = '';
- imageUrl.value = '';
- imageResponsive.checked = true;
- showTab('upload');
-}
-
-// 切换上传/URL选项卡
-uploadTabBtn.addEventListener('click', () => {
- showTab('upload');
-});
-
-urlTabBtn.addEventListener('click', () => {
- showTab('url');
-});
-
-function showTab(tabName) {
- if (tabName === 'upload') {
- uploadTab.classList.remove('hidden');
- urlTab.classList.add('hidden');
- uploadTabBtn.classList.add('text-primary', 'border-b-2', 'border-primary');
- uploadTabBtn.classList.remove('text-gray-500');
- urlTabBtn.classList.remove('text-primary', 'border-b-2', 'border-primary');
- urlTabBtn.classList.add('text-gray-500');
- } else {
- uploadTab.classList.add('hidden');
- urlTab.classList.remove('hidden');
- uploadTabBtn.classList.remove('text-primary', 'border-b-2', 'border-primary');
- uploadTabBtn.classList.add('text-gray-500');
- urlTabBtn.classList.add('text-primary', 'border-b-2', 'border-primary');
- urlTabBtn.classList.remove('text-gray-500');
- }
-}
-
-// 图片上传处理
-imageDropArea.addEventListener('click', () => {
- imageUpload.click();
-});
-
-imageUpload.addEventListener('change', (e) => {
- const file = e.target.files[0];
- if (file) {
- handleImageUpload(file);
- }
-});
-
-// 拖拽图片处理
-imageDropArea.addEventListener('dragover', (e) => {
- e.preventDefault();
- imageDropArea.classList.add('border-primary', 'bg-primary/5');
-});
-
-imageDropArea.addEventListener('dragleave', () => {
- imageDropArea.classList.remove('border-primary', 'bg-primary/5');
-});
-
-imageDropArea.addEventListener('drop', (e) => {
- e.preventDefault();
- imageDropArea.classList.remove('border-primary', 'bg-primary/5');
-
- const file = e.dataTransfer.files[0];
- if (file) {
- handleImageUpload(file);
- }
-});
-
-// 处理图片上传
-function handleImageUpload(file) {
- // 检查文件类型
- if (!file.type.startsWith('image/')) {
- alert('请选择图片文件(JPG、PNG格式)');
- return;
- }
-
- // 检查文件大小
- if (file.size > 5 * 1024 * 1024) {
- alert('图片大小不能超过5MB');
- return;
- }
-
- // 预览图片
- const reader = new FileReader();
- reader.onload = (event) => {
- imagePreview.src = event.target.result;
- imagePreviewContainer.classList.remove('hidden');
- };
- reader.readAsDataURL(file);
-}
-
-// 移除已选择的图片
-removeImage.addEventListener('click', () => {
- imageUpload.value = '';
- imagePreviewContainer.classList.add('hidden');
- imagePreview.src = '';
-});
-
-// 确认插入图片
-confirmInsertImage.addEventListener('click', () => {
- let imageSrc = '';
-
- // 检查是上传还是URL
- if (!uploadTab.classList.contains('hidden')) {
- // 上传方式
- if (!imagePreview.src) {
- alert('请先选择图片');
- return;
- }
- imageSrc = imagePreview.src;
- } else {
- // URL方式
- if (!imageUrl.value.trim()) {
- alert('请输入图片URL');
- return;
- }
- imageSrc = imageUrl.value.trim();
- }
-
- // 在编辑器中插入图片
- const isResponsive = imageResponsive.checked;
- const img = document.createElement('img');
- img.src = imageSrc;
- img.alt = '插入的图片';
- if (isResponsive) {
- img.style.maxWidth = '100%';
- img.style.height = 'auto';
- }
-
- // 获取选择对象
- const selection = window.getSelection();
- if (selection.rangeCount > 0) {
- const range = selection.getRangeAt(0);
- range.deleteContents();
- range.insertNode(img);
-
- // 在图片后添加一个空格,方便继续输入
- range.setStartAfter(img);
- range.setEndAfter(img);
- range.insertNode(document.createTextNode(' '));
- selection.removeAllRanges();
- selection.addRange(range);
- } else {
- // 如果没有选择范围,直接添加到末尾
- noteContent.appendChild(img);
- noteContent.appendChild(document.createTextNode(' '));
- }
-
- // 关闭模态框
- closeInsertImageModalHandler();
-
- // 聚焦回编辑区域
- noteContent.focus();
-});
-
-// 新建笔记模态框控制
-newNoteBtn.addEventListener('click', () => {
- // 切换到新建模式
- noteModalTitle.textContent = '新建笔记';
- noteSubmitBtnText.textContent = '保存笔记';
- noteId.value = '';
-
- newNoteModal.classList.remove('hidden');
- setTimeout(() => {
- newNoteModal.querySelector('div').classList.add('scale-100');
- newNoteModal.querySelector('div').classList.remove('scale-95');
- }, 10);
- resetNewNoteForm();
-});
-
-closeNewNoteModal.addEventListener('click', () => {
- closeNewNoteModalHandler();
-});
-
-cancelNewNote.addEventListener('click', () => {
- closeNewNoteModalHandler();
-});
-
-function closeNewNoteModalHandler() {
- newNoteModal.querySelector('div').classList.add('scale-95');
- newNoteModal.querySelector('div').classList.remove('scale-100');
- setTimeout(() => {
- newNoteModal.classList.add('hidden');
- }, 300);
-}
-
-// 重置新建笔记表单
-function resetNewNoteForm() {
- newNoteForm.reset();
- noteTitleError.classList.add('hidden');
- noteCategoryError.classList.add('hidden');
- noteContentError.classList.add('hidden');
- noteContent.innerHTML = '';
- noteCoverPreview.classList.add('hidden');
- coverPlaceholder.classList.remove('hidden');
- noteCover.value = '';
-}
-
-// 笔记封面预览
-noteCover.addEventListener('change', (e) => {
- const file = e.target.files[0];
- if (file) {
- const reader = new FileReader();
- reader.onload = (event) => {
- noteCoverPreview.src = event.target.result;
- noteCoverPreview.classList.remove('hidden');
- coverPlaceholder.classList.add('hidden');
- };
- reader.readAsDataURL(file);
- }
-});
-
-// 编辑笔记功能
-notesContainer.addEventListener('click', (e) => {
- const editBtn = e.target.closest('.edit-note');
- if (editBtn) {
- const noteId = editBtn.getAttribute('data-id');
- openEditNoteModal(noteId);
- }
-});
-
-// 打开编辑笔记模态框
-function openEditNoteModal(id) {
- const note = notesData.find(n => n.id == id);
- if (!note) return;
-
- // 切换到编辑模式
- noteModalTitle.textContent = '编辑笔记';
- noteSubmitBtnText.textContent = '更新笔记';
- noteId.value = note.id;
-
- // 填充表单数据
- noteTitle.value = note.title;
- noteCategory.value = note.category;
- noteContent.innerHTML = note.content;
-
- // 显示封面
- if (note.cover) {
- noteCoverPreview.src = note.cover;
- noteCoverPreview.classList.remove('hidden');
- coverPlaceholder.classList.add('hidden');
- } else {
- noteCoverPreview.classList.add('hidden');
- coverPlaceholder.classList.remove('hidden');
- }
-
- // 显示模态框
- newNoteModal.classList.remove('hidden');
- setTimeout(() => {
- newNoteModal.querySelector('div').classList.add('scale-100');
- newNoteModal.querySelector('div').classList.remove('scale-95');
- }, 10);
-}
-
-// 删除笔记功能
-notesContainer.addEventListener('click', (e) => {
-const deleteBtn = e.target.closest('.delete-note');
-if (deleteBtn) {
- const noteId = deleteBtn.getAttribute('data-id');
- const note = notesData.find(n => n.id == noteId);
-
- if (confirm(`确定要删除“${note.title}”吗?`)) {
- // 从内存中移除笔记
- notesData = notesData.filter(n => n.id != noteId);
- // 同步保存到 LocalStorage
- localStorage.setItem('notesData', JSON.stringify(notesData));
- // 重新渲染笔记列表
- const searchTerm = noteSearchInput.value.trim().toLowerCase();
-filterNotesByCategoryAndSearch(searchTerm);
- }
-}
-});
-
-// 新建/编辑笔记表单提交
-if (newNoteForm) { // 确保表单元素存在
- newNoteForm.addEventListener('submit', (e) => {
- e.preventDefault();
- let isValid = true;
-
- // 验证表单(先检查元素是否存在,避免报错)
- if (noteTitle && noteTitleError) {
- if (!noteTitle.value.trim()) {
- noteTitleError.classList.remove('hidden');
- isValid = false;
- } else {
- noteTitleError.classList.add('hidden');
- }
- }
-
- // 分类验证(假设分类输入框id为"noteCategory",错误提示id为"noteCategoryError")
- if (noteCategory && noteCategoryError) {
- // 允许分类为空时,可改为:if (noteCategory.value.trim() === '')
-// 验证笔记分类
-if (!noteCategory.value) {
- noteCategoryError.classList.remove('hidden');
- isValid = false;
-} else {
- noteCategoryError.classList.add('hidden');
-}
- }
-
- // 内容验证
- if (noteContent && noteContentError) {
- if (!noteContent.innerHTML.trim()) {
- noteContentError.classList.remove('hidden');
- isValid = false;
- } else {
- noteContentError.classList.add('hidden');
- }
- }
-
- if (isValid) {
- const isEditMode = !!noteId?.value; // 安全访问noteId
-
- // 确保notesData是数组(避免未初始化导致的错误)
- if (!Array.isArray(notesData)) {
- notesData = [];
- }
-
- if (isEditMode) {
- // 更新现有笔记
- const index = notesData.findIndex(n => n.id == noteId.value);
- if (index !== -1) {
- notesData[index] = {
- ...notesData[index],
- title: noteTitle.value.trim(),
- category: noteCategory?.value || '', // 安全访问分类值
- content: noteContent.innerHTML,
- date: new Date().toISOString().split('T')[0]
- };
- // 若上传新封面,更新封面
- if (noteCoverPreview && noteCoverPreview.src && !noteCoverPreview.classList.contains('hidden')) {
- notesData[index].cover = noteCoverPreview.src;
- }
- }
- } else {
- // 生成新笔记ID(处理空数组情况)
- const maxId = notesData.length > 0
- ? Math.max(...notesData.map(n => Number(n.id) || 0))
- : 0;
- const newNoteId = maxId + 1;
-
- // 创建新笔记
- const newNote = {
- id: newNoteId,
- title: noteTitle.value.trim(),
- category: noteCategory?.value || '', // 分类为空时用空字符串
- content: noteContent.innerHTML,
- cover: noteCoverPreview?.src || `https://picsum.photos/id/${30 + notesData.length}/400/200`,
- date: new Date().toISOString().split('T')[0],
- type: 'Text',
- views: 0
- };
- notesData.unshift(newNote); // 添加到数组开头(最新的在前面)
- }
-
- // 同步保存到LocalStorage
- localStorage.setItem('notesData', JSON.stringify(notesData));
-
- // 刷新列表(确保搜索框元素存在)
- const searchTerm = noteSearchInput?.value.trim().toLowerCase() || '';
- filterNotesByCategoryAndSearch(searchTerm);
-
- // 关闭模态框 + 提示成功
- closeNewNoteModalHandler();
- alert(isEditMode ? '笔记更新成功!' : '笔记创建成功!');
-
- // 更新分类下拉框
- renderDynamicCategoryFilter();
- }
- });
-}
// 导入笔记模态框控制
importNoteBtn.addEventListener('click', () => {
importNoteModal.classList.remove('hidden');
@@ -2239,8 +1475,7 @@ function fetchNotesFromServer() {
notesData = validNotes;
localStorage.setItem('notesData', JSON.stringify(notesData));
renderNotes();
- // 新增:获取数据后渲染分类下拉框
- renderDynamicCategoryFilter();
+
})
.catch(err => {
console.error('刷新失败:', err);
@@ -2432,19 +1667,7 @@ document.getElementById('documents-container').addEventListener('click', async f
}
-// 填充笔记编辑区域并打开模态框
-function fillNoteWithContent(title, content, type) {
- const noteTitle = document.getElementById('noteTitle');
- const noteContent = document.getElementById('noteContent');
- const noteType = document.getElementById('noteType'); // 假设笔记有“类型”字段(需在HTML中添加隐藏输入)
- noteTitle.value = title;
- noteContent.innerHTML = content;
- if (noteType) noteType.value = type; // 可选:标记笔记类型
-
- // 打开“新建笔记”模态框(模拟点击按钮)
- document.getElementById('newNoteBtn').click();
-}
// 单独渲染PDF文件(用PDF.js)
function openPdfViewer(pdfUrl) {
@@ -2485,100 +1708,8 @@ function openPdfViewer(pdfUrl) {
});
}
-// 动态渲染分类下拉框(根据用户输入的分类自动生成选项)
-function renderDynamicCategoryFilter() {
- const categoryFilter = document.getElementById('categoryFilter');
- if (!categoryFilter) return;
-
- // 清空现有选项
- categoryFilter.innerHTML = '';
-
- // 添加“全部分类”默认选项
- const allOption = document.createElement('option');
- allOption.value = 'all';
- allOption.textContent = '全部分类';
- categoryFilter.appendChild(allOption);
-
- // 提取所有非空分类(去重)
- const categories = new Set();
- if (Array.isArray(notesData)) {
- notesData.forEach(note => {
- if (note.category && note.category.trim() !== '') {
- categories.add(note.category.trim());
- }
- });
- }
-
- // 排序并生成选项
- const sortedCategories = Array.from(categories).sort((a, b) => a.localeCompare(b));
- sortedCategories.forEach(category => {
- const option = document.createElement('option');
- option.value = category;
- option.textContent = category;
- categoryFilter.appendChild(option);
- });
- // 保持当前选中分类
- if (currentSelectedCategory && categoryFilter.querySelector(`option[value="${currentSelectedCategory}"]`)) {
- categoryFilter.value = currentSelectedCategory;
- }
-}
-// 渲染笔记列表(支持传入过滤后的笔记数据)
-function renderNotes(notesToRender = notesData) {
- // 1. 确保能找到笔记容器元素
- const notesContainer = document.getElementById('notes-container');
- if (!notesContainer) {
- console.error('页面中未找到笔记容器元素 #notes-container,请检查DOM结构');
- return;
- }
- // 2. 处理「无数据」或「数据格式错误」的情况
- if (!Array.isArray(notesToRender) || notesToRender.length === 0) {
- notesContainer.innerHTML = `
-
-
-
- `;
- return;
- }
- notesContainer.innerHTML = `
-
- ${notesToRender.map(note => `
-
-
-

-
-
-
- ${note.category}
- ${note.date}
-
-
${note.title}
-
${stripHtml(note.content.substring(0, 100))}...
-
-
-
- ${note.type}
-
-
- ${note.views}
-
-
-
-
-
-
-
-
-
- `).join('')}
-
- `;
-}
// 辅助函数:去除HTML标签
function stripHtml(html) {
@@ -2780,7 +1911,6 @@ document.addEventListener('DOMContentLoaded', () => {
fetchAllDocuments();
document.getElementById('notes-view').classList.remove('hidden');
document.getElementById('qa-view').classList.add('hidden');
- renderDynamicCategoryFilter();
renderGraphCategoryFilter(); // 新增:初始化知识图谱分类选择框
const searchTerm = noteSearchInput.value.trim().toLowerCase();
filterNotesByCategoryAndSearch(searchTerm);