2020年系统综合实践 期末大作业 19组

1、选题简介


疫情期间,各大高校都开始采用类似于今日校园这样的APP让学生进行每日的签到。这样的签到方便快捷,但是我们想到在采用了人脸识别的技术以后可以让签到更加高效,也可以杜绝他人代签的行为。并且,在第七次的实验中,我们进行了人脸识别相关代码的部署,对于人脸识别所需的环境有了基本的了解。基于这个实验,我们组打算对于人脸识别有进一步深入的了解,通过人脸识别实现一个我们力所能及的应用。由此,我们参考了今日校园的部分功能,结合前面所学的微服务的知识,通过前后端分离的方式,实现一个基于人脸识别的签到系统。

2、设计思路


本次项目采用前后端分离的结构,将两台树莓派进行联合应用。其中一台树莓派作为服务器,另外一台树莓派作为前端。流程:

  1. 注册账号。分为学生端和教师端,学生在注册账号时需要提供头像照片。服务器接收到学生和教师的注册信息,并且保存在数据库。
  2. 教师登录客户端,填写需要签到的课程以及签到截止时间,服务器接收消息将签到课程名以及截止数据保存进数据库,并且随机生成四位签到码返回给客户端。
  3. 教师将签到码告知学生。
  4. 学生登录客户端,选择签到功能,然后输入签到码,此时服务器将对应学生的头像返回给客户端,之后进行人脸识别签到,若签到成功则服务器保存签到信息。
  5. 学生查看自己签到过的课程。
  6. 教师查看签到情况。
  • 教师端

  • 学生端

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的过程,在调试代码和部署代码的过程中我们遇到了许多问题,像缺少依赖,摄像头无法正常开启等等,我们几个人一起查找资料,检查代码,效率真的要比一个人闷头做高太多了,总的来说这次的队友都很给力,是一次令人愉快的合作经历!

posted @ 2020-06-27 21:05  lokk  阅读(467)  评论(2编辑  收藏  举报