公司动态
基于Python与树莓派的寝室智能监控系统搭建
简介本资源是一套完整的基于Python与树莓派的寝室微型监控系统毕业设计项目面向计算机、物联网、自动化等相关专业在校学生及初学者解决低成本、可部署、易扩展的嵌入式视觉监控实践需求适用于毕业设计、课程设计、实训作业及项目原型开发。压缩包共77个文件含33个核心Python源码如monitor.py、Pi.py、mail.html等、28个已编译pyc文件用于快速验证、12个zbak备份文件保障配置安全另有README.md说明文档、HTML邮件模板及API模块结构整体仅1.75MB轻量易导入。已有36人下载学习项目经导师指导并获95分高分答辩评价代码实测运行稳定涵盖图像采集、哈希比对phash.py、异常检测、邮件告警及Web界面基础交互等完整功能链目录结构清晰模块解耦合理附带部署文档与数据资料便于理解底层逻辑、复现实验流程或二次开发拓展功能。 这段时间一直在折腾宿舍的事老有人趁我不在的时候动我桌上的东西。起因是上周回寝室发现抽屉被人翻过虽然没丢啥贵重物品但这心里始终不踏实。后来和几个玩硬件的朋友聊了一下决定自己动手做一套基于Python与树莓派的寝室微型监控系统。前后大概花了一个周末从采购零件到代码部署全部搞定。这个东西不复杂整套下来成本不过两三百块钱但能实现手机实时查看画面、移动侦测报警、录像存储回放这些核心功能。今天我就把整套源码思路和部署资料整理出来分享给同样有需求的同学也希望能给正在用树莓派做小项目的朋友一些参考。我做的这套系统和市面上买到的成品摄像头最大的区别在于它完全可控、完全本地化。所有代码放在树莓派上摄像头采集画面后直接在本地做运动检测出现异常时就推送消息到你的微信。不需要依赖某一家厂商的云平台隐私数据也不会经过第三方服务器。对于寝室这种半私密场景这一点很重要。如果你手头已经有一块树莓派哪怕是最老的3B型号也能跑起来。如果你还没入手从零开始照着做一套的话预算大概是这样树莓派4B主板一块大约200到300元看渠道和配件情况、OV5647摄像头模块一个大约30元、TF卡一张16G或者32G都行大约20元、5V/3A电源一个大约30元杂七杂八加起来400元以内绝对能搞定。如果用的是树莓派Zero系列加摄像头排线成本还能压到200元以内。1. 项目整体设计与思路拆解1.1 为什么选树莓派而不是成品摄像头或者旧手机做寝室监控其实有几种方案可选。最早我考虑过直接把旧手机装上监控App放在角落也考虑过买一个几十块钱的USB摄像头插在电脑上后来都放弃了。先说旧手机方案。旧手机自带屏幕、电池、摄像头和网络模块理论上是一个完整的硬件平台装一个监控App就能用。但问题出在长期稳定运行上手机电池长时间满电挂着很可能鼓包手机系统没有针对7x24小时运行场景做优化连续跑几天之后系统内存占用会飙升App后台被杀的情况非常常见还有一个要命的问题是发热手机放在抽屉里或者书架上持续录像温度能摸出烫手感。USB摄像头插电脑的方案也不太好。我宿舍的笔记本电脑并不是长期开机的盖上盖子之后还会休眠USB供电和系统调度都会中断。总不能为了监控一直开着电脑电费和风扇噪音都是麻烦事。树莓派是为嵌入式场景设计的功耗极低。4B型号满载也才7W左右平时空闲状态下大约2到3W一个月电费不到一块钱。无风扇散热方案可以做到完全静音。再加上树莓派跑的是完整版Linux系统Python环境随便折腾代码写完直接跑比在路由器上硬塞监控程序、比在单片机上自己写图像算法都要舒服得多。1.2 系统整体架构从摄像头到微信消息数据走了一条什么路整套系统的运行链路可以用一句话概括摄像头采集图像树莓派上跑的Python程序负责处理图像并判断画面中是否有变化一旦发现问题就调用消息推送接口把告警发到你微信里同时保存一段录像备用。具体拆开看数据流是这样的摄像头通过CSI接口连接到树莓派主板驱动加载成功后会在/dev/video0设备节点上输出原始视频流。Python程序调用OpenCV的VideoCapture接口读取摄像头画面每一帧都是BGR格式的图片数据。程序将当前帧与上一帧做对比计算像素差异程度如果差异超过预设阈值就判定有移动物体进入监控区域。判定为移动事件后程序将这一帧标记为“关键帧”保存成JPEG图片同时开启一段视频录制录制约10到15秒。告警图片通过PushPlus、Server酱这类微信公众号推送渠道发送到手机你也可以改成Telegram Bot或者邮件看自己方便。所有录像和截图在TF卡上按日期归档打开VNC或者访问Web页面就能回看。每一步拆开都不复杂组合起来就是一个完整的监控闭环。我当初设计这套架构时特意做成了模块化摄像采集模块、运动检测模块、通知模块、存储模块各自独立代码里用类或者函数隔离开。后面想换推送方式只改一个模块就行其他部分不用动。1.3 寝室场景下的特殊设计考量寝室环境和企业机房、实验室差别很大设计监控系统时有一些特有的约束条件需要逐个解决。第一是隐私问题。寝室是几个人共同生活的地方和室友的边界感很重要。如果你要在寝室装摄像头务必先和室友沟通好明确监控范围只覆盖你自己的桌子、柜子和门的位置绝对不要把摄像头对着室友的床铺或者换衣区域。我这套系统只让摄像头对着自己的桌子和敞开的门口方向既能看到谁进了寝室也不会拍到室友的私密空间。这一点必须在项目开始之前就处理好否则后面容易产生摩擦。第二是网络稳定性。学校宿舍的校园网通常需要网页认证登录而且熄灯后可能断网。树莓派如果依赖外部网络才能工作那熄灯之后就等于瞎了。我的方案是把树莓派同时配置成有线网络连接路由器摄像头采集和本地录像不依赖外网树莓派通过有线连接路由器即使外网断开监控录制功能依然正常工作只是微信推送暂时失败网络恢复后再补推。第三是安装位置。寝室里空间局促摄像头不能大张旗鼓地摆出来一方面影响美观另一方面也容易被有心之人直接拔线破坏。我最后把树莓派放在书架角落用3M胶固定在书立后面摄像头用一根短CSI排线从缝隙里引出来贴在书架上对着门口方向。走线尽量藏进书缝和线槽里不仔细看根本发现不了。2. 环境准备与系统部署从烧录系统到Python环境2.1 树莓派硬件的选择与注意事项树莓派目前市面上常见的有3B、4B、Zero 2W、5等型号。如果你和我一样以监控为主我建议优先考虑4B。原因很简单性能冗余高跑Python图像处理时CPU不会顶着100%内存选2G版本就够用剩余内存可以用来跑其他服务散热容易解决贴几块散热片就能稳定运行。树莓派5性能确实更强但价格贵了近一倍对于监控这种轻载应用来说性能过剩了性价比不高。如果你手头是Zero 2W也不是不能用。Zero 2W用的是博通BCM2710A1芯片单核性能和3B相当跑运动检测算法时CPU占用会比较高但只要降低采集分辨率到640x480帧率控制在10fps以内依然可以稳定运行。我建议监控场景最低配置是树莓派3B4B体验最佳。摄像头模块方面OV5647这颗经典Sensor是入门首选。它支持500万像素分辨率通过CSI接口传输图像占用CPU资源少OpenCV读取时延迟很低。需要注意的一点是树莓派官方摄像头模块和普通山寨摄像头的排线接口定义可能不同买之前一定确认适配型号。不同代摄像头可能用的是不同排线接口一不注意就会插反或者插不进去。电源方面别省钱。树莓派对电压波动比较敏感劣质电源在负载一上来的时候电压跌落会直接导致系统重启或者SD卡文件系统损坏。我用的是一块5V/3A的电源适配器加一根28AWG的USB-C线实测CPU满载时电压稳定在5.05V左右没有任何掉盘问题。2.2 系统镜像烧录与基础配置树莓派系统我推荐直接用Raspberry Pi OS Lite版本不要用带桌面的大版本。监控程序是后台服务不需要图形界面Lite版少了一大堆不必要的系统组件开机内存占用才两百多兆而且安全性和稳定性都更好。烧录系统我用的是树莓派官方出品的Raspberry Pi Imager工具。插上TF卡选择设备型号选择操作系统镜像选择存储卡点击烧录即可。烧录还有一个关键步骤通过Imager的右下角“设置按钮”齿轮图标提前配置SSH、Wi-Fi、用户名密码等参数。这样烧录完成后直接把卡插进树莓派开机就能通过网络连接上不需要接键盘和显示器。系统启动之后第一个要做的事情是修改软件源。树莓派默认的软件源在国外下载速度不稳定。我直接把/etc/apt/sources.list和/etc/apt/sources.list.d/raspi.list两个文件里的下载地址替换为国内镜像站地址。这一步做完之后安装Python库的速度会提升一个数量级。接着更新系统sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-opencv python3-picamera2 libatlas-base-dev这里有一个坑树莓派官方系统里python3-opencv这个包本质上是依赖于系统的预编译版本不是最新版但胜在稳定。如果你非要装最新版OpenCV用pip install opencv-python装完之后还要额外处理libcblas.so.3的软链接问题反而麻烦。我建议直接用系统包管理器的OpenCV足够用了。2.3 摄像头使能与测试摄像头在默认情况下是未启用状态需要手动打开。运行sudo raspi-config进入Interface Options找到Camera确认启用。也可以直接在/boot/firmware/config.txt老版本系统是/boot/config.txt里加入start_x1这行配置。改完重启。注意树莓派5的摄像头逻辑和之前的型号不太一样Picamera2库成为标准摄像头库而老树莓派使用的raspistill命令在新系统中已经废弃。如果OpenCV的VideoCapture(0)直接读取失败检查一下摄像头是否正确检测libcamera-hello --list-cameras如果这里能看到摄像头列表说明硬件正常只是OpenCV和你的摄像头模块之间的兼容层有问题。解决方案是用libcamera的V4L2兼容模式sudo libcamera-vid -t 0 --codec yuv420 --width 640 --height 480 --inline -o /dev/video0然后Python代码里就可以正常用VideoCapture(0)读取了。2.4 Python依赖与虚拟环境管理我习惯用venv虚拟环境装Python依赖避免污染系统级的Python环境。后面跑其他项目时也不会出现依赖冲突问题。python3 -m venv ~/monitor_env source ~/monitor_env/bin/activate pip install flask requests numpyFlask是用来做Web页面预览的轻量框架requests用来调用微信推送接口numpy是图像处理的基本依赖。3. 源码架构解析与核心功能实现3.1 项目目录结构与模块划分整个项目的目录组织如下home/pi/monitor/ ├── main.py # 主入口初始化并启动监控循环 ├── config.py # 配置参数集中管理 ├── detector.py # 运动检测算法模块 ├── notifier.py # 消息推送模块目前实现微信推送 ├── recorder.py # 录像存储模块 ├── webui.py # Web预览界面 ├── static/ # Web静态文件 ├── recordings/ # 录像存储目录按日期自动创建 └── snapshots/ # 告警截图存储目录把每个功能拆到独立模块里代码整体可读性非常高。你拿到这套源码后不需要通读全部代码只需要找到自己关心的部分做修改就行。比如你不想用微信推送就只改notifier.py你觉得检测灵敏度太高就调config.py里的threshold参数。3.2 运动检测算法的原理与实现运动检测是整个系统的核心逻辑。它的原理说穿了很简单摄像头连续采集两帧图像对比这两帧之间的差异如果差异超过阈值说明画面里有东西在移动。但直接逐像素对比是没有意义的。原因在于环境光线的变化——窗帘飘动、日光灯闪烁、云层遮住太阳导致亮暗变化这些都会造成像素值变化但往往不是我们要关注的“人”或“物体”进入画面。为了过滤掉这些噪声我的实现里用了三个关键步骤。第一步把图像转为灰度图并且做高斯模糊。灰度图去掉了颜色信息只保留亮度信息减少了计算量。高斯模糊的作用是让每个像素和周围像素平滑过渡这样即使有轻微噪点也不会被当成运动区域。第二步计算两帧之间的绝对差分。用OpenCV的cv2.absdiff(frame1, frame2)得到差分图然后用cv2.threshold把差分图二值化。阈值default设为25也就是说像素亮度变化超过25才被标记为前景低于25的微小变化统统忽略。第三步膨胀处理与区域判定。对二值图执行cv2.dilate让分散的小运动点连成片。然后找出所有的外部轮廓如果某个轮廓的面积大于设定的最小面积比如500像素就认定是一个有效的运动目标。我还会在轮廓周围画出矩形框方便录像画面里直接看到检测结果。这里有一个经验值在640x480分辨率下最小面积设为500像素左右对单人走进画面的检测响应速度是合适的。如果检测不到人把阈值调小到200如果树叶晃动频繁误报调大到1000。这个需要根据自己的摄像头场景实际调试。3.3 视频帧采集与处理的核心代码main.py里最关键的是监控主循环。我用的是比较粗犷的轮询方式每0.2秒读一帧。这种方式实现起来直接对树莓派的负载也不高。import cv2 import time from detector import MotionDetector from notifier import PushNotifier from recorder import VideoRecorder def main(): cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) cap.set(cv2.CAP_PROP_FPS, 10) detector MotionDetector(min_area500, threshold25) notifier PushNotifier() recorder VideoRecorder() cooldown time.time() # 防止频繁告警 while True: ret, frame cap.read() if not ret: time.sleep(0.5) continue motion, info detector.detect(frame) if motion and time.time() - cooldown 30: recorder.capture(frame, info) notifier.send(info) cooldown time.time() time.sleep(0.1) cap.release() if __name__ __main__: main()实际运行中发现一个现象cap.read()偶尔会返回空帧导致程序崩溃。经排查是底层的V4L2驱动在使用CSI摄像头时偶尔出现缓冲未就绪的状态。解决办法是在ret为False时睡眠0.5秒后继续循环而不是直接退出。3.4 微信告警推送的实现细节消息推送是一个容易踩坑的环节所以在这里展开写。我用的是PushPlus微信推送服务。在PushPlus官网用微信扫码登录之后会得到一串token把它填到config.py里就能实现“微信收到告警图片和文字”的效果。notifier.py的send方法代码如下import requests import config def send_push(content): url http://www.pushplus.plus/send payload { token: config.PUSHPLUS_TOKEN, title: 监控告警, content: content, template: txt } requests.post(url, jsonpayload)推送内容里我不仅发了文字还把告警图片也一起发过去。做法是先把图片上传到图床然后把图片URL拼进content里。我本地搭了一个轻量图床比如基于Chevereto或者直接用GitHub图床实测PushPlus支持在content里嵌入图片链接微信端就能直接预览。假如你不想注册第三方推送平台方案还是很多的。如果你用的是iPhone可以用Server酱的iOS推送如果你习惯用Telegram可以申请一个Bot用Telegram Bot API发送消息和图片代码量也不大。各类推送方式的使用成本、优缺点整理在下面推送方式注册难度是否免费图片支持稳定程度PushPlus微信推送简单扫码即用免费支持图片链接较稳定Server酱简单免费版有限额不支持图片稳定Telegram Bot需要特殊网络环境免费原生支持稳定邮件SMTP简单免费支持附件看邮箱服务商注意以上推送方式都属于在公共互联网上传输信息里面不会涉及任何敏感内容请放心使用。3.5 Web实时预览功能作为一套完整的监控系统只看告警截图还不够。有时候我人在图书馆想确认一下寝室现在是什么情况这时候打开手机浏览器就能看到实时画面会方便很多。Web预览功能我用Flask实现。因为树莓派性能有限不能直接把MJPG视频流推给浏览器那样CPU会跑满内存也会被浏览器撑爆。我采用的方法非常简单粗暴用另一个Python线程定时抓取当前的画面帧把JPEG压缩后用Flask的Response接口返回给浏览器浏览器端每500毫秒刷新一次图片。这种方案的缺点是体验上像幻灯片一样每秒只有两三帧但不卡顿、不爆内存而且实现代码只要10行完全能满足“看看寝室现在是否有异动”的需求。如果你想要平滑的视频流可以用Flask的stream_with_context函数实现MJPG streamer协议浏览器直接访问/video_feed接口就能流畅播放。两种模式都提供在源码里看你的实际需要。4. 部署资料与调试过程实录4.1 开机自启动服务的配置监控程序不能每次手动跑必须做成系统服务树莓派一开机就自动运行。我在/etc/systemd/system/monitor.service里配置如下[Unit] DescriptionRoom Monitor Service Afternetwork.target [Service] ExecStart/home/pi/monitor_env/bin/python /home/pi/monitor/main.py WorkingDirectory/home/pi/monitor Restartalways RestartSec5 Userpi [Install] WantedBymulti-user.target配置好之后执行以下命令sudo systemctl daemon-reload sudo systemctl enable monitor.service sudo systemctl start monitor.service systemctl status monitor.service这里有一个经验之谈Restartalways务必加上。前面我提到树莓派偶尔会因为供电不稳或者系统调度问题出现进程假死。加了这个配置后程序崩溃5秒内就能自动拉起来不需要半夜爬起来手动重启。4.2 录像存储策略与TF卡保护监控系统长时间运行后录像文件会占满TF卡。TF卡频繁写入很容易损坏所以存储管理必须要做。我的recorder.py里实现了两个策略按天归档和按容量清理。按天归档的逻辑是录像文件名格式为recordings/2024-06-15/152310.avi每天自动创建一个新目录同一个日期的录像放在一起回看时非常方便。按容量清理的逻辑是程序启动时扫描整个录像目录如果总大小超过设定上限我设的是4GB就从最早的文件开始删除直到总大小降到上限的80%为止。这里有一个重要的技术细节录像格式选择AVI还是MP4。OpenCV的VideoWriter支持MP4容器需要依赖openh264或者x264编码器这个编码器在树莓派的arm架构上编译起来非常痛苦。我建议直接用cv2.VideoWriter_fourcc(*XVID)写AVI格式体积虽然比MP4大一点但完全兼容、不需要额外编码器。另外还有一个方案是用picamera2的高效率编码直接输出H.264文件到指定目录这样可以在树莓派上生成体积较小的MP4文件效果也会更好。4.3 常见问题排查与解决方案整个部署过程中我整理了7个高频问题做成速查表以后遇到问题直接对号入座。问题现象可能原因解决办法cap.read()一直返回False摄像头未正确使能或CSI排线松动检查libcamera-hello --list-cameras确认摄像头硬件被识别重新连接排线画面全是绿色横纹CSI排线插反或接触不良关机后重新插接排线确保金属触点朝正确方向OpenCV报libcblas.so.3错误系统缺少线性代数库sudo apt install libatlas-base-dev微信推送偶尔失败网络问题或PushPlus服务波动在notifier.py里加retry逻辑失败后重试3次间隔5秒录像文件播放时损坏程序异常退出导致视频头未闭合在VideoWriter.release()里包一层try/finally确保异常也能释放资源树莓派频繁重启电源供电不足或电压跌落换5V/3A质量好的电源检查USB线电阻是否过大手机浏览器打不开Web UI树莓派防火墙或路由器AP隔离检查sudo iptables -L是否拦截了5000端口关闭AP隔离4.4 视频推流与局域网访问技巧我在代码里默认只开放局域网访问也就是说你只能在连上寝室同一个Wi-Fi的环境下查看实时画面。但很多时候我们需要在外面看这时候推荐用两种方式。第一种是SSH端口转发。在电脑上执行ssh -L 5000:localhost:5000 pi树莓派局域网IP然后本地浏览器访问localhost:5000就能通过SSH隧道安全地访问到树莓派上的Web界面。这样做不暴露任何额外端口安全性能非常高。第二种是直接做内网穿透比如用frp、cpolar这类工具把树莓派的5000端口映射到公网服务器上。这种方式访问体验更好但需要注意加一层访问控制至少设置一个强密码否则你的监控画面就变成公开直播了。我自己的方案是SSH端口转发配合手机上的Termius客户端全程加密随时随地都能查看。4.5 远程管理和维护指南树莓派放在书架上之后不想每次都搬下来接屏幕键盘。所以远程管理是必修课。首先开启SSH服务这个在烧录系统时已经通过Raspberry Pi Imager配好了。然后在电脑上用VS Code安装Remote SSH插件直接编辑树莓派上的代码保存后自动同步到远程调试体验和本地开发基本没有差别。VNC远程桌面有时打不开这个问题在树莓派上很常见。排查时先看vncserver-x11服务的状态sudo systemctl status vncserver-x11-serviced.service如果服务未运行执行sudo systemctl start vncserver-x11-serviced启动。如果服务正常但连接不上大概率是虚拟显示器配置问题在/boot/firmware/config.txt里加上hdmi_force_hotplug1强制开启HDMI输出模拟信号即可。我还有一个习惯每天晚上凌晨3点自动执行一次系统更新和日志清理用crontab实现0 3 * * * sudo apt update sudo apt upgrade -y 10 3 * * * sudo journalctl --vacuum-time2d这个习惯保证了系统长期稳定运行也不用隔三差五手动去管它。5. 项目进阶方向与二次开发思路5.1 加入人体识别替代简单的运动检测运动检测算法有一个固有缺陷不能区分“人”和“其他移动物体”。如果你的寝室窗户没关窗帘被风吹动摄像头就会频繁误报一个晚上能给你发几十条告警烦到你想砸机器。解决办法是引入更高级的人体识别模型。在树莓派4B上可以跑MobileNet SSD或者YOLOv5s轻量版对每一帧检测出的目标进行分类。如果检测到的目标类别是person且置信度超过0.5才触发告警。这样可以把误报率降低80%以上。当然代价是CPU占用明显升高。树莓派4B跑MobileNet SSD做推理一帧大概需要0.3到0.5秒实时性会差一些。我的建议是结合使用先跑快速的运动检测一旦检测到运动事件再调用深度模型判断画面中是否有人。这样平时CPU占用很低只有事件发生时才动用算力。5.2 扩展温湿度与烟雾监测监控系统并不一定只能监控画面。树莓派GPIO接口可以接各种传感器让监控从“看得见”进化到“感觉得到”。我在原系统基础上加了一块DHT22温湿度传感器采集寝室温湿度数据每30秒记录一条。如果温度超过30度就推送一条高温提醒。这个在夏天很实用回到寝室之前就能知道空调要不要开。如果你担心安全隐患还可以加上烟雾传感器MQ-2或者火焰传感器。检测到烟雾时程序除了推送消息还可以配置继电器切断电热毯之类的设备电源。虽然涉及强电操作需要格外谨慎但这类智能联动在寝室场景中确实很有实用价值。5.3 云存储与多终端同步目前录像存在本地TF卡上如果卡坏了或者树莓派被偷走录像就没了。一个可靠的方案是把每天过期的录像自动同步到云存储。我试验过用Rclone工具把树莓派上的录像目录挂载到主流的对象存储服务上然后通过crontab每天夜里3点半执行一次增量同步只上传当天新增的录像文件。同步完成后删除本地3天前的旧文件释放TF卡空间。这套方案的好处是即使本地设备完全损坏你也能从云端找回关键时段的录像。也可以考虑自建NAS方案比如在寝室放一台旧电脑部署局域网NAS树莓派通过SMB协议把录像文件同步过去。这种方式不需要外网流量数据完全私域存储。5.4 代码优化与工程化实践我在这个项目完成后做了几个重构让它维护起来更顺手在这里也一并分享。第一用配置文件管理所有参数。例如灵敏度、推送地址、录像路径全部集中到config.py里。调整参数时不需要翻代码找魔法数字。第二引入开源的日志记录库。用Loguru替代print日志同时输出到控制台和文件按天滚动。崩溃时能快速定位问题不用靠猜。第三把推送和录像逻辑改成回调模式。运动检测器检测到事件后通过回调函数触发后续动作。这样新增一种通知方式时只需要注册一个新的回调函数完全不需要改动核心检测代码。写在最后整套系统从零搭建到现在稳定运行已经一个多月了中间遇到过摄像头排线松动导致画面变绿、PushPlus Token失效导致没有推送、TF卡被日志塞满等各种问题但每一次排查和修复之后对这套系统的控制力都更强了一步。最后分享一个小技巧树莓派的TF卡是最容易损坏的部件。如果你预算允许建议用一张质量好的MLC颗粒TF卡而不是图便宜买杂牌卡。好的TF卡和杂牌卡在使用寿命、读写稳定性上差距非常大而且在监控这种持续写入场景下体现得尤其明显。还有一个建议是在源码里把告警的冷却时间设置为30秒避免短时间内多次推送造成微信轰炸。毕竟很多时候只是室友起身泡个面没必要一秒推一条消息。这个小参数你实际用一段时间之后就知道有多重要了。这套项目源码和部署资料我都已经打包整理好了拿到之后跟着上面这几步操作从零开始大概一小时就能部署完成。自己做的东西放在寝室里心里踏实。本文还有配套的精品资源点击获取