第二章:第一次合作

38 阅读2分钟

周一早上,林晨比平时早到半小时。他先整理技术方案:

  1. 组件架构设计

  2. 数据接口定义

  3. 技术选型说明

  4. 开发计划和时间安排

苏雨来了,看到林晨在工作,有些意外。

“这么早?在写什么?”

“技术方案,确保需求理解正确。”林晨说。

苏雨坐下,开始讨论交互细节。林晨详细讲解从组件结构到状态管理、性能优化到用户体验。苏雨认真听,偶尔提出问题。

“进度保存,是实时还是定时?”

“定时保存,滚动时每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)

晚上,林晨提交当天代码,回家前抬头看天空,月亮圆亮,星星闪烁。他深吸一口气,感到心情很好。这个项目虽然挑战大,但过程令人享受,而且和苏雨合作顺畅,让他学到很多。