首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >“你真的睡着了吗?”一个用浏览器就能判断你是否刷夜的小工具

“你真的睡着了吗?”一个用浏览器就能判断你是否刷夜的小工具

原创
作者头像
连连LL
发布2025-06-05 19:40:04
发布2025-06-05 19:40:04
1600
举报
文章被收录于专栏:技术技术

摘要

很多人晚上明明说“我困了要睡了”,但身体却还在手机上疯狂滑动,时间一晃就是两小时。本篇文章就来聊聊,怎么通过前端技术手段,判断用户是否“真的睡着了”,并设计一个可以实时记录、反馈和干预的睡眠追踪页。核心思路是结合浏览器行为、交互操作和设备状态来模拟“睡眠感知”,最终形成一个完整的小工具页面。

引言

传统的睡眠监测需要硬件设备,比如手环、传感器这些。但很多时候我们只是想知道:我到底几点真正“断电”的?有没有可能用纯软件的方法,基于浏览器,判断用户是否还在“刷”,然后结合睡前情绪、干预建议,形成一个“轻量级的数字睡眠助手”?

我们就试着从这个方向出发,构建一个叫“你真的睡着了吗?”的睡眠追踪页。

核心设计思路

睡眠前行为监测的三个信号源

我们主要结合以下三个维度做判断:

  • 设备亮度(屏幕调光 + 屏保激活)
  • 交互行为(鼠标移动、键盘、触控点击)
  • 浏览器活动(页面焦点变化、长时间空闲)

用这些行为判断用户是不是已经放下手机,进入了非活跃状态。

睡眠追踪页的功能规划

  • 睡前日志记录(写一段当晚的状态)
  • 自动检测“最后交互时间”
  • 进入非活跃状态超过 X 分钟后标记为“可能入睡”
  • 第二天展示可视化报告:入睡时间、活跃时间段、建议等

页面模块拆解

我们用 Vue 3 + Composition API 来实现主要模块,前端即可实现,后续也可以拓展为 PWA 离线小工具。

交互监测核心逻辑

代码语言:html
复制
<template>
  <div>
    <h2>你真的睡着了吗?</h2>
    <textarea v-model="sleepNote" placeholder="睡前想说点啥..." rows="3"></textarea>

    <div class="status">
      <p>最近一次交互时间:{{ lastActiveTimeStr }}</p>
      <p v-if="isSleeping">🛌 检测到你可能已经入睡</p>
      <p v-else>😐 你还醒着呢</p>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const sleepNote = ref('')
const lastActiveTime = ref(new Date())
const isSleeping = ref(false)
const IDLE_THRESHOLD_MINUTES = 5

const updateActivity = () => {
  lastActiveTime.value = new Date()
  isSleeping.value = false
}

const checkSleepStatus = () => {
  const now = new Date()
  const diffMs = now - lastActiveTime.value
  if (diffMs > IDLE_THRESHOLD_MINUTES * 60 * 1000) {
    isSleeping.value = true
  }
}

const lastActiveTimeStr = computed(() =>
  lastActiveTime.value.toLocaleTimeString()
)

onMounted(() => {
  document.addEventListener('mousemove', updateActivity)
  document.addEventListener('keydown', updateActivity)
  document.addEventListener('touchstart', updateActivity)
  window.addEventListener('focus', updateActivity)

  setInterval(checkSleepStatus, 30000) // 每30秒检查一次
})

onUnmounted(() => {
  document.removeEventListener('mousemove', updateActivity)
  document.removeEventListener('keydown', updateActivity)
  document.removeEventListener('touchstart', updateActivity)
  window.removeEventListener('focus', updateActivity)
})
</script>

<style scoped>
.status {
  margin-top: 1rem;
  font-size: 1.1rem;
}
</style>

睡前日志 + 睡眠干预建议

可选组件:睡前引导内容

代码语言:html
复制
<div v-if="!isSleeping">
  <p>睡前放松建议:</p>
  <ul>
    <li>关掉蓝光屏</li>
    <li>听个轻音乐</li>
    <li>避免再刷短视频</li>
  </ul>
</div>

可以配合随机内容推荐或 API 接入冥想/音乐。

可视化反馈设计(次日查看)

我们可以将交互日志记录到 localStorage,次日展示如下数据:

  • 入睡时间(检测到最后活跃 + 阈值)
  • 活跃轨迹(间隔交互图)
  • 睡前情绪总结(来自 textarea)
  • 建议历史(比如连续 3 天延迟入睡)

这部分可以配合图表库(如 Chart.js)扩展,也可以用 canvas 简单渲染。

QA环节:常见开发者问题

Q: 用户只是放下鼠标没动,怎么判断不是看视频?

A: 我们可以增加“页面焦点变化”(window.blur / focus)和“音频播放状态检测”逻辑,例如监听 HTML5 audio/video 标签的 play 状态,辅助判断。

Q: 如果我想拓展为手机端 App 呢?

A: 完全可以,用 Vue + Capacitor 打包成 App;还可以通过 Screen Wake Lock API 判断用户是否主动保持唤醒。

Q: 怎么统计每天入睡时间?

A: 使用 localStorage 存储 lastActiveTime 和 isSleeping 的时间戳,当第二天打开页面时回读并展示。

总结

这个项目其实是一个很贴近日常的小工具,用纯前端技术、结合用户行为,去“模拟判断”一个人的睡眠状态。没有复杂的生理信号采集器,也不需要设备授权,只靠交互+时间线+页面状态就能初步分析是否入睡。

未来展望

  • 增加 AI 情绪识别(基于用户输入判断情绪曲线)
  • 和健康 App 绑定,形成跨端日志
  • 智能推荐“入睡故事”或轻音乐
  • 接入 GPT 推理模型,自动总结你最近的作息习惯

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 引言
  • 核心设计思路
    • 睡眠前行为监测的三个信号源
    • 睡眠追踪页的功能规划
  • 页面模块拆解
    • 交互监测核心逻辑
  • 睡前日志 + 睡眠干预建议
    • 可选组件:睡前引导内容
  • 可视化反馈设计(次日查看)
  • QA环节:常见开发者问题
    • Q: 用户只是放下鼠标没动,怎么判断不是看视频?
    • Q: 如果我想拓展为手机端 App 呢?
    • Q: 怎么统计每天入睡时间?
  • 总结
  • 未来展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档