周一早上,林晨比平时早到半小时。他先整理技术方案:
-
组件架构设计
-
数据接口定义
-
技术选型说明
-
开发计划和时间安排
苏雨来了,看到林晨在工作,有些意外。
“这么早?在写什么?”
“技术方案,确保需求理解正确。”林晨说。
苏雨坐下,开始讨论交互细节。林晨详细讲解从组件结构到状态管理、性能优化到用户体验。苏雨认真听,偶尔提出问题。
“进度保存,是实时还是定时?”
“定时保存,滚动时每1秒保存一次,切换章节立即保存。”
“突然关闭页面会丢失吗?”
“不会,我们会在beforeunload事件里保存一次。”
“夜间模式切换即时生效吗?”
“是的,用computed属性,设置改变立即更新样式。”
苏雨满意地点头,“很好。设置面板我想做成侧边栏,用户调整时还能看到内容变化。”
林晨提醒移动端适配问题,最终决定桌面端用侧边栏,移动端用弹窗。
中午,苏雨主动和林晨一起吃饭,提出一些亮点功能:
-
阅读统计(暂时需后端支持)
-
书签功能(可存在localStorage)
-
字体自定义(暂时不做)
两人聊得投机,了解彼此工作思路和职业规划。
下午,林晨实现核心功能,完成主组件框架和阅读设置功能,使用computed属性实时响应样式变化。章节切换用nextTick处理滚动,throttle处理进度保存。
const readingStyles = computed(() => {
const bgColor = readingSettings.value.isNightMode
? '#1a1a1a'
: readingSettings.value.backgroundColor
const textColor = readingSettings.value.isNightMode
? '#e0e0e0'
: readingSettings.value.textColor
return {
fontSize: `${readingSettings.value.fontSize}px`,
lineHeight: readingSettings.value.lineHeight,
backgroundColor: bgColor,
color: textColor,
fontFamily: readingSettings.value.fontFamily
}
})
const goToChapter = (index) => {
if (index >= 0 && index < novelData.value.chapters?.length) {
currentChapterIndex.value = index
currentScrollPosition.value = 0
saveProgress()
nextTick(() => scrollToTop())
}
}
const saveProgress = throttle(() => {
try {
const progress = {
novelId: novelData.value.id,
chapterIndex: currentChapterIndex.value,
scrollPosition: currentScrollPosition.value,
lastReadTime: new Date().toISOString()
}
localStorage.setItem(PROGRESS_STORAGE_KEY, JSON.stringify(progress))
readingProgress.value = progress
} catch (error) {
console.error('Failed to save reading progress:', error)
}
}, 1000)
晚上,林晨提交当天代码,回家前抬头看天空,月亮圆亮,星星闪烁。他深吸一口气,感到心情很好。这个项目虽然挑战大,但过程令人享受,而且和苏雨合作顺畅,让他学到很多。