2020年系统综合实践 期末大作业 19组
1、选题简介
疫情期间,各大高校都开始采用类似于今日校园这样的APP让学生进行每日的签到。这样的签到方便快捷,但是我们想到在采用了人脸识别的技术以后可以让签到更加高效,也可以杜绝他人代签的行为。并且,在第七次的实验中,我们进行了人脸识别相关代码的部署,对于人脸识别所需的环境有了基本的了解。基于这个实验,我们组打算对于人脸识别有进一步深入的了解,通过人脸识别实现一个我们力所能及的应用。由此,我们参考了今日校园的部分功能,结合前面所学的微服务的知识,通过前后端分离的方式,实现一个基于人脸识别的签到系统。
2、设计思路
本次项目采用前后端分离的结构,将两台树莓派进行联合应用。其中一台树莓派作为服务器,另外一台树莓派作为前端。流程:
- 注册账号。分为学生端和教师端,学生在注册账号时需要提供头像照片。服务器接收到学生和教师的注册信息,并且保存在数据库。
- 教师登录客户端,填写需要签到的课程以及签到截止时间,服务器接收消息将签到课程名以及截止数据保存进数据库,并且随机生成四位签到码返回给客户端。
- 教师将签到码告知学生。
- 学生登录客户端,选择签到功能,然后输入签到码,此时服务器将对应学生的头像返回给客户端,之后进行人脸识别签到,若签到成功则服务器保存签到信息。
- 学生查看自己签到过的课程。
- 教师查看签到情况。
-
教师端
-
学生端
3、容器&部署
-
使用到的容器
我们使用Python来编写代码,涉及到了数据库的使用,而且需要选取能够在树莓派上运行的容器,因此我们在DockerHub上选取了基于ARM架构的Python容器和mysql容器。
-
安装docker-compose
输入如下命令安装docker-compose,树莓派需重启才会生效。
pip install docker-compose
-
Docker目录结构
-
docker-compose.yml
version: "3"
services:
python:
build: ./python
ports:
- "5000:5000"
volumes:
- ./python/:/usr/src/app/
links:
- "mysql"
mysql:
build: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/mysql_data/:/var/lib/mysql/
-
requirement.txt
flask
pymysql
-
Dockerfile
-
Python
FROM balenalib/rpi-python:3-latest-20200604
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --default-timeout=100 --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
VOLUME /usr/src/app
CMD ["python", "demo.py"]
- mysql
FROM hypriot/rpi-mysql:latest
#作者信息
MAINTAINER ISLAND
copy signingsystem.sql /mysql/signingsystem.sql
#环境变量配置
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
ENV MYSQL_ROOT_PASSWORD 123456
-
启动容器
-
运行容器
4、数据库设计
数据库一共包含有4张表:学生信息表、教师信息表、教师发布的签到信息表、学生签到情况表。
学生信息表
存储学生学号、用户名、密码以及学生的照片信息。
CREATE TABLE `student_info` (
`userID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`passWord` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`userImg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`userID`) USING BTREE
)
教师信息表
存储教师教工号、密码。
CREATE TABLE `teacher_info` (
`userID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`passWord` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`userID`) USING BTREE
)
签到信息表
存储签到码、教师ID、课程名、截止时间。
CREATE TABLE `sign_code` (
`id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`userID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`courseName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`deadLine` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
)
学生签到情况表
存储学生ID、签到码、教师ID、课程名、签到时间。
CREATE TABLE `sign_save` (
`studentID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`signCode` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`teacherID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`courseName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`signTime` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`studentID`, `signCode`) USING BTREE
)
5、运行结果
前端树莓派发送登录、注册、签到等信息给后端树莓派,后端树莓派负责接收请求并返回相应的信息。
-
教师注册
-
教师输入教工号和密码,再次输入确认密码,即可完成注册:
-
注册成功反馈信息:
-
后端数据库新增教师信息:
-
学生注册
-
学生输入学号、密码以及用户名,点击按钮,系统会弹出窗口选择并上传照片,即可完成注册:
-
后端数据库新增学生信息:
-
教师端可选择发布签到或者查看某一门课程学生签到情况
-
发布签到
- 教师输入课程名和截止时间即可发布签到,完成发布后系统反馈给教师一个四位数字的签到码:
-
后端数据库新增签到信息:
-
查看课程签到情况
-
教师输入签到码即可查看学生签到情况:
-
如果签到码错误或者该签到无人签到,系统反馈查看失败:
-
学生端可选择签到或者查看签到记录:
-
学生签到
-
学生输入课程对应的签到码,点击签到,系统会调用摄像头进行人脸识别:
-
如果人脸识别成功,则签到成功:
-
数据库新增学生签到数据:
-
如果未在规定时间内完成人脸识别,则系统反馈识别失败,签到失败:
-
如果签到时间超出Deadline,则签到失败:
-
学生查看签到记录
6、组内分工
学号 | 姓名 | 工作 | 贡献 |
---|---|---|---|
031702242 | 邱健强 | API文档设计、数据库设计、学生签到功能、学生查看签到功能、教师查看签到情况功能、树莓派项目部署 | 20% |
031702244 | 林明镇 | Python与数据库的连接、老师发布签到功能、测试程序 | 14% |
031702540 | 陈锦鸿 | 学生登入注册功能、老师登入注册功能、外网访问局域网内项目、图片的上传和下载功能、博客编写 | 16% |
031702527 | 陈天恒 | 注册登陆界面的制作,人脸识别签到功能的实现,树莓派的操作 | 18% |
031702542 | 林小棠 | 照片的上传下载功能,前后端交互,界面的跳转 | 16% |
031702544 | 钟伟颀 | 原型设计,查看签到情况界面的制作,交互弹窗的制作,PPT汇报 | 16% |
7、个人总结
-
邱健强:在本次期末大作业中,首先在项目的编写当中,我对Python的flask框架运用的更加的熟练,同时在这次作业的过程中也遇到了许许多多的困难,比如说如何上下传图片,如何让外部网络访问局域网内运行的项目等等等,但是通过和队友的交流和讨论,最后都将在实验过程中遇到的困难给一一解决了。然后就是关于把项目部署到树莓派的容器中,在这一步的关键就是如何选取所需要的容器,这个时候就要在dockerHub上寻找一些能再树莓派上运行的容器,最终找到了所需要的Python容器和mysql容器,有了之前几次在虚拟机上对容器操作的经验,因此在本次实验中,在部署容器的过程没有遇到十分难解决的困难。最终通过本次实验,我对微服务便捷性更加的了解,知道了如何运用微服务部署项目。
-
林明镇:通过本次实验,我收获了很多,一方面是知识上的,实验过程中我又重新学习了有所遗忘的SQL语言,学习了Python语言的Flask框架,进一步了解了Python语言在后端开发中的应用。另一方面是团队协作能力上的提高,“众人拾柴火焰高”,在当今社会,团队的重要性不言自明,而其中的团队协作能力更是不可或缺的,恰好我的团队协作能力一直比较欠缺,这次实验给了我很好的提升团队协作能力的机会。实验过程也暴露了我的很多不足,比如说知识水平比较不足,实验参与的能力较弱,仰仗大佬的鼎力相助。转眼间,这学期已接近尾声了,从对这门课程的一无所知,到慢慢的了解越来越多的内容,这门课程带给了我很多的惊喜与收获。
-
陈锦鸿:通过本次大作业实验,我学到了很多,一方面是又开始使用很久没碰的Python和Flask框架,再次深深感受到了Python语言的简洁方便,对于Flask框架的认识更加深刻,特别是在研究如何在前后端之间传送图片时,尝试过很多种方法,最终使用Flask自带的form-data类型完成了图片的传输,这一方面令我印象深刻。而在解决前后端树莓派之间信息的发送和接收时,我和小组内的其他同学共同学习,讨论和研究,最终一起解决了问题,这令我深刻感受到了团队协作所能达到的事半功倍的效果。
-
陈天恒:在这次的作业中,我负责前端中部分UI页面的初步设计制作,以及人脸签到的功能代码,还有前端树莓派的部署操作。在第一周中,我通过队友的UI原型设计来对页面进行初步制作,简单完成各个页面通过按钮跳转的功能,此外,还熟悉了人脸识别的代码。在第二周中,我将人脸识别的功能完善,主要是参考github的代码,在之上改进,并在第二周的前两条完成,接着,在页面制作基本完成以后,我和队友进行屏幕共享等语音操作,将前端内容部署到树莓派上,最后,与后端对接,完善部署。这是我第一次使用pyqt5来制作UI,感觉pyqt5的内容不算太多,但容易踩坑,需要细心和资料的不断查询,才能渐渐上手。这次大作业中,虽然遇到了不少困难,但通过小队众人的互帮互助,总能快速解决,之前一个人做实验时遇到难题,都卡住许久。所以说做项目还是团队互帮互助才是效率最高的,一起debug的时光也不显乏味,很庆幸遇到给力的队友。这次组队的时光让我学到了很多知识,不仅是对于人脸签到和树莓派的部分,更是让我充分理解了团队合作的重要性,希望将来还能遇到这样的机会!
-
林小棠:在本次大作业中,我负责前后端的交互与界面的跳转。在第一周中,通过网上查询资料,完成了照片的上传与下载,主要实现从文件夹选取图片并显示在PyQt5的UI界面,同时采用form-data类型将照片上传到后端数据库中。在第二周中,完成了全部api的调用,实现了前后端的数据交互。接着,在功能基本完成后,我与队友通过QQ屏幕共享一起debug,一起将前端部署到树莓派上。最初的打算是要用网页来写前端界面的,后来因为其他事情比较多,就换成了以前用过的PyQt5来制作界面,虽然说以前用过,但还是学到了挺多新的东西的,比如弹窗的设计、按钮的变色等。在整个大作业的过程中,整组队员通过在线协作的方式一起debug,比一个人苦逼地debug欢乐多了,可以说是“三个臭皮匠赛过诸葛亮”了,哈哈哈哈。对于我自己来说,本次项目是个人最有参与感的一次项目经历,而且在debug的过程中,解决问题的同时也拓展的个人的知识面,希望以后还能有这样的组队机会!
-
钟伟颀:
首先是个人完成工作的总结。在本次的大作业中,我负责的前端部分的制作。在第一周中,我完成了前端页面的流程还有原型设计工作,学生查看签到页面和教师查看签到页面的制作,完成了在两个页面中读取从后端数据插入表格功能的实现,还负责了小组的选题汇报和中期汇报工作。在第二周中,我完成了主要弹窗的制作,以及从服务器上传和下载图片功能的实现。在前端页面的制作基本完成以后,我和前端小组的成员一起通过在线协作的方式一起debug,一起将我们的前端页面部署到了树莓派上。
这次工作中的个人心得。这是我第二次使用pyqt5制作GUI界面(流下不会其他技术的泪水T_T)这次的制作过程中查找了不少资料,排了不少坑 ,比起自己第一次使用pyqt5确实有所进步,最后完成的效果也是挺令人满意的。这次大作业过程中,令我印象最深刻的是我们前端小组的几个人一起在线协作debug的过程,在调试代码和部署代码的过程中我们遇到了许多问题,像缺少依赖,摄像头无法正常开启等等,我们几个人一起查找资料,检查代码,效率真的要比一个人闷头做高太多了,总的来说这次的队友都很给力,是一次令人愉快的合作经历!