资讯动态

睡眠检测小程序源码拆解:从微信小程序到ECharts图表

发布时间:2026/10/22 13:46:19 来源:尧图企业网站定制
简介面向小程序毕业设计与课程设计场景的睡眠检测系统完整源码包适合需要快速搭建前后端项目、撰写论文的专科及本科学生。项目基于 JDK1.8、MySQL5.7 及以上环境前端采用 uniapp/原生小程序框架覆盖助眠音乐、睡眠记录与线性图、问答知识、个人信息管理等模块同时附带数据库脚本、开发文档、开题报告和演示视频。压缩包共 110 个文件以 PNG 界面截图、JS 逻辑、JSON 配置、WXSS/WXML 页面文件为主辅以 DOC/DOCX 文档与 MP4 视频整体大小约 14.63MB目录结构清晰便于按模块检索和对照实现。资源内还提供微信开发者工具/HBuilder X 中的运行配置说明支持按日期筛选历史睡眠数据可帮助理解数据可视化与小程序的交互实现。当前已有 170 人学习下载可作为毕业设计选题参照、功能扩展基线或课程实训完整示例帮助使用者省去从零搭建环境、梳理业务表结构和整理文档的重复工作。1. 睡眠检测小程序源码毕业设计从零到交付最值得先拆的是这套做毕业设计最怕的不是代码写不出来而是代码写出来了论文、数据库、图表、演示四个环节还在互相打架。这套睡眠检测小程序源码是那种把“前端页面 MySQL 说明文档”一起打包的资源核心解决的就是睡眠数据记录、助眠音乐播放和睡眠知识问答三个功能。它的价值在于你不需要先学会 ECharts 在小程序里怎么画线性图也不用纠结开题报告怎么写压缩包里都有底稿。适合拿它做毕设或课设的学生、想快速搭睡眠健康类小程序做验证的开发者以及想搞懂小程序图表、计时、数据联动这套组合的初学者。2. 拆压缩包先过结构前端三模块、文件分工与 echarts 图表落点拿到这类毕业设计源码我习惯先看文件清单再决定“哪些要改、哪些别动”。这个资源包的目录不算复杂但里面有两个index.js一个在主页面目录下一个在 ec-canvas 组件里第一次拆的人很容易改错文件。先分清角色后面才不会稀里糊涂地乱改。2.1 压缩包里哪些文件要改、哪些别动先列一张文件分工表按“角色 / 要不要动”来归类比你从头到尾读一遍源码高效得多。文件路径 / 文件角色通常要不要改说明文档.doc / .docx论文、开题报告底稿按你学校模板改loading.gif加载动画可替换成自己的素材data.js前端静态数据与配置几乎必改index.js主页面逻辑对应首页熟悉后小改detail.js详情页逻辑小改ec-canvas.js / echarts.jsECharts 小程序组件与图表库不要动数据库初始化脚本建表与初始数据根据 MySQL 版本微调这里有个容易被忽略的细节data.js既是前端预览用的假数据也是后端返回 JSON 的数据格式模板。很多学生直接改页面样式不动数据层最后接后端接口时才发现字段名对不上白白多花一个晚上定位。我的建议是第一步先打开data.js把里面每个对象的字段名抄一遍再去对 SQL 脚本里的列名。两边的命名一致了后面联调基本不会翻车。2.2 三个核心模块的页面数据流这个资源的功能模块在摘要里写得很明确助眠音乐、数据记录、问答、个人信息。对应到前端页面主页面负责音乐播放和睡眠数据填写详情页负责线性图和知识展示个人中心负责性别、年龄、工作信息的录入与修改。下面是data.js里典型的数据结构音乐列表和睡眠记录直接复用这套形状// data.js前端静态数据同时也是后端 JSON 返回的格式模板 const musicList [ { id: 1, name: 雨声白噪音, duration: 900, src: /audio/rain.mp3, mood: anxious }, { id: 2, name: 钢琴轻音乐, duration: 600, src: /audio/piano.mp3, mood: calm } ]; const sleepRecords [ { date: 2024-05-20, duration: 480, times: 1, quality: 4 }, { date: 2024-05-21, duration: 420, times: 2, quality: 3 } ]; module.exports { musicList, sleepRecords };逻辑说明musicList里的mood字段对应心情选择用户在前端选“焦虑”“平静”等心情时页面按这个字段过滤音乐列表sleepRecords里的quality是睡眠质量打分1 到 5提交表单时和后端字段一一对应。module.exports是为了在小程序模块化机制里被require引用实际项目里这层数据会被后端接口的返回值替代但字段名不要改。参数说明duration单位是分钟600 表示 10 分钟。这个单位在图表里直接作为 y 轴数据如果后端返回的是秒数前端记得除以 60否则图表曲线会高得离谱。2.3 线性图不是原生画的ec-canvas 的用法与参数睡眠时长线性图是这个项目的核心可视化亮点。小程序原生没有好用的图表组件所以资源包里集成了 ec-canvas也就是 ECharts 的小程序版封装。它的初始化方式和网页版不同画布要靠组件实例来接管。// pages/index/index.js 中 echarts 初始化使用 ec-canvas 组件 import * as echarts from ../../ec-canvas/echarts; function initChart(canvas, width, height, dpr) { const chart echarts.init(canvas, null, { width: width, height: height, devicePixelRatio: dpr }); canvas.setChart(chart); const option { grid: { left: 10, right: 10, top: 30, bottom: 20 }, xAxis: { type: category, data: [05-20, 05-21, 05-22] }, yAxis: { type: value, name: 分钟 }, series: [ { name: 睡眠时长, type: line, data: [480, 420, 390], smooth: true } ] }; chart.setOption(option); return chart; }逻辑说明echarts.init接收的canvas不是 DOM 节点而是小程序 canvas 组件通过 ec-canvas 传递过来的对象必须调用canvas.setChart(chart)完成绑定否则图表画不出来。devicePixelRatio适配高清屏传dpr是为了让图表在真机上不模糊。参数说明grid控制绘图区域边距left: 10表示离画布左边 10 像素避免坐标轴文字被裁掉。smooth: true让折线变成平滑曲线视觉上更符合睡眠报告的气质。x 轴日期在这里写死是为了先跑通流程接后端后用接口返回的数据替换data和xAxis.data。注意ec-canvas.js 和 echarts.js 这两个文件体积不小动它们之前先备份。真出问题优先检查版本匹配不要盲目升级 echarts.js新版在小程序部分版本上会有兼容性差异。3. 后端与 MySQL 的设计睡眠记录、音乐、问答四张表怎么撑起三个功能很多学生拿到这类资源后把注意力全放在前端页面上觉得能跑就行。但毕业设计答辩时老师一定会问数据库设计以及“你的接口是怎么调的”。所以这一章把后端接口和数据表拆开讲。这套资源里后端部分以接口描述和数据库脚本为核心你下载后根据文档把服务端重建起来前端请求就能闭环。3.1 从页面倒推接口六个接口覆盖三个模块我不喜欢先看后端代码再猜前端需求而是从页面操作倒推接口。从功能描述反推这套小程序最少需要六个接口接口方法参数用途/api/user/loginPOSTwx code微信登录换 session/api/music/listGETmood按心情取助眠音乐列表/api/sleep/recordPOSTdate, duration, times, quality保存一条睡眠记录/api/sleep/statsGETdays取近 N 天睡眠数据供图表使用/api/quiz/listGETtype按图文/视频类型取知识问答/api/user/profilePOSTgender, age, job录入或修改个人信息接口返回建议统一包一层{ code: 0, data: ..., msg: ok }。前端拿到后先判断code再渲染data这样的好处是后端报错时前端不会把错误数据直接画进图表。下面是最小可用的接口写法用 Spring Boot 风格PHP 版本改成数组输出同样成立RestController RequestMapping(/api/sleep) public class SleepController { // 近 N 天睡眠统计供 echarts 线性图使用 GetMapping(/stats) public MapString, Object stats(RequestParam int days) { ListMapString, Object rows sleepMapper.selectStatsByDays(days); MapString, Object result new HashMap(); result.put(code, 0); result.put(data, rows); result.put(msg, ok); return result; } }逻辑说明selectStatsByDays(days)是 Mapper 层方法SQL 在下文 3.3 节给出。RequestParam int days对应前端请求/api/sleep/stats?days7如果参数没传后端直接 400前端需要补默认值。Map返回值是为了保证 JSON 结构稳定实际项目里建议用实体类毕设答辩时也能多说一句“我用了统一返回结构”。3.2 四张表与建表 SQL用户、睡眠记录、音乐、知识数据库设计符合第三范式即可不用过度设计。核心是四张表用户表user、睡眠记录表sleep_record、助眠音乐表music、知识问答表quiz。其中sleep_record是业务核心和外键关联最多建表 SQL 也最值得细看CREATE TABLE sleep_record ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL COMMENT 用户ID, record_date DATE NOT NULL COMMENT 记录日期, sleep_times INT DEFAULT 1 COMMENT 当日入睡次数, duration_min INT DEFAULT 0 COMMENT 睡眠时长单位分钟, quality TINYINT DEFAULT 3 COMMENT 睡眠质量1-5, mood VARCHAR(20) DEFAULT calm COMMENT 睡前心情, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, KEY idx_user_date (user_id, record_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;参数说明quality用TINYINT就能装下 1 到 5没必要用INT浪费空间。mood字段存的是「anxious / calm / tired」这类枚举字符串前端音乐列表按它过滤。KEY idx_user_date是联合索引sleep/stats 接口经常按user_id record_date查询没有这个索引数据量上去后聚合查询会慢。其余三张表的字段不展开写 SQL列出来做建表参考userid、openid、nickname、gender1 男 2 女、age、job、create_timemusicid、name、file_url、cover_url、duration单位秒、mood_type、sortquizid、title、content_typetext / image / video、content、cover_url、video_url、read_count个人信息模块的性别、年龄、工作字段都在user表里修改就是常规的 UPDATE前端表单提交时把这三个字段一起传过来即可。3.3 睡眠时长线性图的数据聚合SQL 按天算前端只管画echarts 只负责把数据画出来真正算“近 7 天每天睡眠多久”的是 SQL。很多人直接把所有睡眠记录丢给前端让前端循环累加这样做在小数据量时看不出问题答辩时一旦被问“如果一天睡了三次图表怎么只显示一条线”就答不上来了。正确做法是在后端把数据聚合成按天的记录。SELECT record_date, SUM(duration_min) AS total_min, COUNT(*) AS sleep_times FROM sleep_record WHERE user_id #{userId} AND record_date DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY record_date ORDER BY record_date;逻辑说明SUM(duration_min)把一天里多次睡眠的时长加起来COUNT(*)统计当天入睡次数也就是睡眠次数。这样前端拿到的每一行已经是“日期 总时长 次数”图表直接取total_min画线性图就可以了。参数说明INTERVAL 7 DAY是近 7 天窗口如果你画的是近 30 天趋势图改成INTERVAL 30 DAY。#{userId}是 MyBatis 的参数占位符换成 PHP PDO 预处理参数也是一样的思路。这里有一个涉及业务定义的点值得和导师提前对齐你再决定要不要改如果用户午休 30 分钟也算一次睡眠COUNT(*)没问题如果只统计夜间长睡眠就要在加个条件duration_min 60。4. 部署与调试避坑从白屏、接口不通到图表不显示的四个高频问题这部分是我自己拆这类毕设资源时踩过的坑挑四个最常见、也最有代表性的写出来。每条按“现象 → 原因 → 解决”排列你可以按顺序排查也可以直接跳到当前遇到的问题。4.1 数据库连不上版本、字符集与账号优先级现象Navicat 导入 SQL 脚本时报语法错误或者程序启动后报Access denied for user。原因环境要求 MySQL 5.7 及以上但很多新机器装的是 MySQL 8.x。MySQL 8 默认加密插件是caching_sha2_password老版本 JDBC 驱动不认于是报权限错误另外 SQL 脚本里如果有中文字段注释字符集不是 utf8mb4导入也会失败。解决数据库安装完成后先执行下面这句话把加密方式改掉ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;然后再用 Navicat 重新连接设置数据库字符集为utf8mb4最后导入 SQL 脚本。如果还报错看脚本开头有没有CREATE DATABASE IF NOT EXISTS没有的话你先手动建一个同名数据库再导入。4.2 echarts 图表白屏ec-canvas 初始化时机不是随意的现象页面其他内容都正常唯独线性图区域是空白控制台也不报错。原因这类问题属于“图表玄学”范畴十次里有八次是 ec-canvas 的初始化时机和布局尺寸不对。小程序里 canvas 在页面onReady之前拿不到正确宽度初始化早了画布宽度为 0ECharts 画了个寂寞。还有人的ec-canvas组件包在一个display:none的容器里图表自然渲染不出来。解决初始化代码放到onReady生命周期里执行并且保证包裹图表的节点可见。检查ec-canvas组件的canvas-id属性是否唯一页面里有多个图表时id 重复会让组件互相覆盖。最后在json文件里确认引用了ec-canvas组件路径引用漏了同样白屏。4.3 真机预览接口不通域名校验与 http/https 对齐现象开发者工具里一切正常一扫码在真机上接口就请求失败。原因开发者工具默认勾选了“不校验合法域名”所以你在工具里能调通局域网后端。真机上微信要求所有请求域名必须是 HTTPS并且要在小程序后台配置到合法域名列表里纯 HTTP 的局域网 IP 直接会被拦截。解决调试阶段有两个办法。一是后端监听0.0.0.0手机和电脑连同一个局域网前端request地址写http://192.168.x.x:8080同时在开发者工具里继续勾选“不校验合法域名”。二是做正式预览把后端部署到有 HTTPS 证书的服务器在小程序后台添加 request 合法域名。注意iOS 对自签名证书比安卓严格调试阶段尽量用工具内置的真机调试别急着搞证书。4.4 定时关闭音乐失效小程序后台与 setTimeout 的取舍现象助眠音乐功能里设置了“30 分钟后自动停止”锁屏或者切到后台后音乐还在放或者定时器根本没触发。原因小程序一旦进入后台JS 计时器可能被系统挂起setTimeout不保证按预期时间执行。音乐组件本身是原生播放器它和 JS 计时器是两套机制前台能定时关闭后台就失灵了。解决不要依赖setTimeout去停音乐。改用音频实例的onTimeUpdate记录播放进度配合剩余时长判断到点就stop()。如果一定要用定时器在前端onHide时记下剩余时间onShow回来时重新计算。这类资源包里的代码一般是前台可用的简化版答辩演示时尽量别锁屏后台计时可以作为“后期优化点”在答辩里主动提。5. 把源码变成答辩演示数据怎么填、流程怎么走、截图怎么对拆完源码、跑通接口、画好图表最后要解决的是“毕业设计验收”这个具体问题。我一般习惯先准备一套演示数据把三个模块串成一条完整流程再用固定的话术走一遍不要现场瞎点。5.1 用一组演示数据把三个模块串起来演示顺序建议登录 → 填写睡眠记录 → 查看线性图 → 播放助眠音乐 → 浏览问答 → 修改个人资料。这六步正好覆盖全部功能点。演示数据可以提前准备直接通过前端表单录入也可以自己写 SQL 插入INSERT INTO sleep_record (user_id, record_date, sleep_times, duration_min, quality, mood) VALUES (1, CURDATE() - INTERVAL 6 DAY, 1, 420, 4, calm), (1, CURDATE() - INTERVAL 5 DAY, 2, 510, 5, calm), (1, CURDATE() - INTERVAL 4 DAY, 1, 360, 3, anxious), (1, CURDATE() - INTERVAL 3 DAY, 1, 480, 4, calm), (1, CURDATE() - INTERVAL 2 DAY, 1, 450, 4, calm), (1, CURDATE() - INTERVAL 1 DAY, 2, 540, 5, joy), (1, CURDATE(), 1, 390, 3, tired);逻辑说明这组数据故意加入波动第 4 天和第 5 天时长明显下降图表上会出现一条先降后升的曲线演示时你可以说“从趋势图能看出使用者最近睡眠质量有所恢复”比一条笔直的线更有讲解空间。数据录入完成后去数据库里查一下SELECT * FROM sleep_record确保每个字段都没有乱码真机上如果时间格式不对多半是时区没对齐。5.2 答辩前照着这里走一遍基本不会卡壳我在答辩前一周会做一次完整演练按“前端页面 → 后端接口 → 数据库存储 → 论文截图”四层验证一遍。前端看页面跳转和图表渲染后端看控制台日志有没有报错数据库看数据是否真的写入论文看截图是否和当前代码一致。这套源码里有一份说明文档和开题报告正式打印前把截图重新跑一遍再替换因为代码版本微调后旧截图对不上老师翻起来会很尴尬。从前做另一个模拟项目的时候我在 ec-canvas 的初始化上卡了整整一个晚上最后发现只是onReady里少加了一个判断。从那以后我每次拿到这类毕设源码都会强制自己先按“数据填入 → 页面走通 → 图表渲染 → 接口落库”走一遍完整流程再动任何代码。希望这篇拆解能帮你少走同样的弯路这套睡眠检测小程序的源码值得下下来跑一遍跑顺了再做自己的二次开发。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑