diff --git a/biji-houdaun/src/main/resources/application-dev.yml b/biji-houdaun/src/main/resources/application-dev.yml index 4a77b1d..f5807b5 100644 --- a/biji-houdaun/src/main/resources/application-dev.yml +++ b/biji-houdaun/src/main/resources/application-dev.yml @@ -14,14 +14,16 @@ spring: maximum-pool-size: 20 # 连接空闲超时时间(毫秒) idle-timeout: 300000 - # 连接最大存活时间(毫秒) - max-lifetime: 1200000 + # 连接最大存活时间(毫秒)- 设置为小于MySQL的wait_timeout(默认8小时) + max-lifetime: 600000 # 连接超时时间(毫秒) connection-timeout: 20000 # 测试连接是否可用的SQL connection-test-query: SELECT 1 # 自动提交 auto-commit: true + # 连接测试间隔 + keepalive-time: 300000 jpa: hibernate: ddl-auto: update diff --git a/biji-houdaun/src/main/resources/application-prod.yml b/biji-houdaun/src/main/resources/application-prod.yml index a9d02f3..edf2612 100644 --- a/biji-houdaun/src/main/resources/application-prod.yml +++ b/biji-houdaun/src/main/resources/application-prod.yml @@ -14,14 +14,16 @@ spring: maximum-pool-size: 50 # 连接空闲超时时间(毫秒) idle-timeout: 600000 - # 连接最大存活时间(毫秒) - max-lifetime: 1800000 + # 连接最大存活时间(毫秒)- 设置为小于MySQL的wait_timeout(默认8小时) + max-lifetime: 600000 # 连接超时时间(毫秒) connection-timeout: 30000 # 测试连接是否可用的SQL connection-test-query: SELECT 1 # 自动提交 auto-commit: true + # 连接测试间隔 + keepalive-time: 300000 jpa: hibernate: ddl-auto: update diff --git a/biji-qianduan/src/components/HomePage.vue b/biji-qianduan/src/components/HomePage.vue index 5e88ec4..8151c04 100644 --- a/biji-qianduan/src/components/HomePage.vue +++ b/biji-qianduan/src/components/HomePage.vue @@ -366,10 +366,17 @@ const previewFile = async (file) => { selectedFile.value = null; return; } + // 先立即显示预览页(加载状态),让用户感知到响应 + selectedFile.value = { ...file, content: '', isLoading: true }; + showEditor.value = false; + + // 异步加载内容 try { const content = await Preview(file.id) || ''; - selectedFile.value = { ...file, content }; - showEditor.value = false; + // 内容加载完成后更新 + if (selectedFile.value && selectedFile.value.id === file.id) { + selectedFile.value = { ...file, content, isLoading: false }; + } } catch (error) { ElMessage.error('获取笔记内容失败: ' + error.message); selectedFile.value = null; @@ -552,29 +559,27 @@ const handleResize = () => { } }; -// 使用防抖优化 Vditor 渲染 -let renderTimeout = null; -let lastRenderedId = null; +// Vditor 渲染优化 +let lastRenderedKey = null; watch([selectedFile, showEditor], ([newFile, newShowEditor]) => { if (newFile && !newShowEditor) { - // 如果同一个文件已经渲染过,跳过 - if (lastRenderedId === newFile.id) return; + // 使用文件ID+内容长度作为渲染标识,内容变化时重新渲染 + const renderKey = `${newFile.id}-${newFile.content?.length || 0}`; + if (lastRenderedKey === renderKey) return; - clearTimeout(renderTimeout); - renderTimeout = setTimeout(() => { - nextTick(() => { - const previewElement = document.querySelector('.markdown-preview'); - if (previewElement) { - const contentToRender = (newFile.isPrivate === 1 && !userStore.isLoggedIn) ? privateNoteContent : newFile.content; - Vditor.preview(previewElement, contentToRender || '', { - mode: 'light', - hljs: { enable: true, style: 'github' } - }); - lastRenderedId = newFile.id; - } - }); - }, 50); // 50ms 防抖 + // 使用 requestAnimationFrame 确保流畅渲染 + requestAnimationFrame(() => { + const previewElement = document.querySelector('.markdown-preview'); + if (previewElement) { + const contentToRender = (newFile.isPrivate === 1 && !userStore.isLoggedIn) ? privateNoteContent : newFile.content; + Vditor.preview(previewElement, contentToRender || '', { + mode: 'light', + hljs: { enable: true, style: 'github' } + }); + lastRenderedKey = renderKey; + } + }); } }, { deep: true }); diff --git a/biji-qianduan/src/components/home/NotePreview.vue b/biji-qianduan/src/components/home/NotePreview.vue index 6440b07..37aad2b 100644 --- a/biji-qianduan/src/components/home/NotePreview.vue +++ b/biji-qianduan/src/components/home/NotePreview.vue @@ -41,11 +41,16 @@