基于Python的学生考勤签到管理系统

目 录
引言…………………………………………………………………………………………1
1.系统需求分析…………………………………………………………………………1
1.1系统功能简介 ………………………………………………………………………1
1.2软件环境与开发工具 ………………………………………………………………2
2.数据库设计 ……………………………………………………………………………3
2.1 概要结构设计 ……………………………………………………………………3
2.1.1数据表结构分析………………………………………………………………5
2.2 逻辑结构设计 ……………………………………………………………………7
3.系统设计与实现 ………………………………………………………………………8
4.结论及尚存在问题 …………………………………………………………………15
参考文献 ……………………………………………………………………………16
个人总结 …………………………………………………………………………………17

1.系统需求分析
1.1 系统功能简介
(1)用户登录、注册、找回密码以及修改密码功能。本系统用户共有三种用户身份,分别是管理员(admin)、教师(teacher)、学生或普通用户(normal),用户注册后默认身份为普通用户(normal),教师身份和管理员身份只能由管理员进行设置。
(2)用户注册账号后可进入系统,此时用户需要完成信息认证才可使用系统的签到和签到管理功能,否则系统将会显示警告信息和限制使用系统部分功能,提示该用户进行认证后可使用。认证的信息由管理员预先导入,学生或教师输入学号或工号后,如系统数据库中已导入该信息并且该信息未被认证过,即可认证通过。
(3)系统管理员可管理用户使用本签到系统的所有功能,当然也需要进行认证才能使用相关签到功能,这样管理员也可在该条件下以教师的身份使用签到管理功能。管理员主要是进行学生和教师数据的导入和对系统的所有数据进行管理(增删改查以及导出到文件)。
(4)完成认证信息后,学生进入系统后如有课程正在签到,将会显示当前正在签到的课程信息,点击课程并输入正确的验证码后,即可完成当前课程的签到;学生也可查看自己的所有签到记录,并可按条件查询相关课程的签到记录。
(5)完成认证信息后,教师进入系统后,可添加需要使用签到的课程信息,对签到进行管理,教师选择一门课程开启签到后,会随机生成一个4位签到码,属于该班级的学生输入该签到码后即可完成签到。

本系统的功能模块大致框图如下图1-1 所示。
图1-1 学生签到管理系统功能模块图
在这里插入图片描述

# -*- coding: utf-8 -*-
"""
Created on Tue Jun  8 10:33:22 2021

@author: cxyqm
"""

import sqlite3
import time
class SysDao:
    def __init__(self):
        self.cn=sqlite3.connect("SignInSystem.db")
    
    def executeQuery(self,sql,params=None):
        cn=sqlite3.connect("SignInSystem.db")
        cur = cn.cursor()
        try:
            if params==None:
                cur.execute(sql)
            else:
                cur.execute(sql,params)
            rs=cur.fetchall()
        except:
            print('查询出错')
        finally:
            cur.close()#关闭游标
            cn.close()#关闭连接
        return rs
    
    def executeUpdate(self,sql,params=None):
        cn=sqlite3.connect("SignInSystem.db")
        cur = cn.cursor()
        try:
            cur.execute(sql,params)
            cn.commit()
        except:
            cn.rollback()
        finally:
            cur.close()#关闭游标
            cn.close()#关闭连接
        return cur.rowcount
    
    def executemanyUpdate(self,sql,params):
        cn=sqlite3.connect("SignInSystem.db")
        cur = cn.cursor()
        try:
            cur.executemany(sql,params)
            cn.commit()
        except:
            cn.rollback()
        finally:
            cur.close()#关闭游标
            cn.close()#关闭连接
        return cur.rowcount
    
    def initTables(self):
        cn=sqlite3.connect("SignInSystem.db")
        cur = cn.cursor()
        try:
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "userinfo"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists userinfo(
                    usrid varchar(30) primary key,
                    usrname varchar(40) not null,
                    pword varchar(30) not null,
                    tel varchar(20),
                    identity varchar(20) default 'normal',
                    statu int default 0 ,
                    registtime varchar(30));""")
                registtime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                userdata=[('admin000','大白','12345678','13025468631','admin',1,registtime),
                 ('teacher000','杨老师','12345678','12035413553','teacher',1,registtime),
                  ('student000','陈辰','12345678','13652048631','normal',1,registtime),
                  ('student001','李桓','12345678','13642568631','normal',0,registtime)]
                cur.executemany("insert into userinfo values(?,?,?,?,?,?,?)",userdata)
                cn. commit()
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "studentinfo"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists studentinfo(
                    stuno varchar(30) primary key,
                    stuname varchar(40) not null,
                    academe varchar(60) not null,
                    specialty varchar(60) not null,
                    classname varchar(60) not null,
                    sex char(2) default '男' check(sex in ('男','女')));""")
                studata=[('20190060101','小白','数学学院','大数据技术','19大数据','男'),
                 ('20190060102','小新','环化学院','环境工程','19环境工程','女'),
                  ('20190060103','陈辰','数学学院','数学师范','19师范','男')]
                cur.executemany("insert into studentinfo values(?,?,?,?,?,?)",studata)
                cn. commit()
                 
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "teacherinfo"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists teacherinfo(
                    techno varchar(30) primary key,
                    techname varchar(40) not null,
                    prodession varchar(60) not null,
                    sex char(2) default '男' check(sex in ('男','女')));""")
                teacherdata=[('88888888','大白','系统管理员','男'),('20192019','杨宇','教授','男')]
                cur.executemany("insert into teacherinfo values(?,?,?,?)",teacherdata)
                cn. commit()
                
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "tccinfo"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists tccinfo(
                    tccid integer ,
                    techno varchar(30) not null,
                    classname varchar(60) not null,
                    coursename varchar(60) not null,
                    term varchar(60) not null,
                    classnum int,
                    primary key(tccid),
                    foreign key(techno) references teacherinfo(techno) on delete cascade on update cascade);""")
                tccdata=[(None,'88888888','19大数据','Python','2020-2021学年第二学期','35'),(None,'20192019','19师范','高等代数','2020-2021学年第二学期','52')]
                cur.executemany("insert into tccinfo values(?,?,?,?,?,?)",tccdata)
                cn. commit()
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "startsign"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists startsign(
                    signid integer,
                    tccid integer not null,
                    signcode varchar(30) not null,
                    signstatus int default 0,
                    starttime text not null,
                    endtime  text,
                    primary key(signid),
                    foreign key(tccid) references tccinfo(tccid) on delete cascade on update cascade);""")
                cn. commit()
            
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "signrecord"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists signrecord(
                    id integer,
                    signid integer not null,
                    stuno varchar(30) not null,
                    signstatus int default 0,
                    signtime text not null,
                    primary key(id),
                    foreign key(signid) references startsign(signid) on delete cascade on update cascade,
                    foreign key(stuno) references studentinfo(stuno) on delete cascade on update cascade);""")
                cn. commit()
                
            cur.execute('SELECT count(*) FROM sqlite_master WHERE type="table" AND name = "authentication"')
            flag=cur.fetchall()
            if flag[0][0]==0:
                cur.execute("""create table if not exists authentication(
                    usrid varchar(30) primary key,
                    no varchar(30) not null,
                    foreign key(usrid) references userinfo(usrid) on delete cascade on update cascade);""")
                authdata=[('admin000','88888888'),('teacher000','20192019'),('student000','20190060103')]
                cur.executemany("insert into authentication values(?,?)",authdata)
                cn. commit()
            return True
        except:
            cn.rollback()
            return False
        finally:
            cur.close()#关闭游标
            cn.close()#关闭连接

    def dropTables(self,tablename):
        cn=sqlite3.connect("SignInSystem.db")
        cur = cn.cursor()
        try:
            cur.execute('DROP TABLE IF EXISTS %s'%tablename)
            cn.commit()
        except:
            cn.rollback()
        finally:
            cur.close()#关闭游标
            cn.close()#关闭连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下是一个简单的 Python 学生考勤管理系统的示例代码: ```python class Student: def __init__(self, name, id): self.name = name self.id = id self.attendance = [] def add_attendance(self, status): self.attendance.append(status) class Attendance: def __init__(self, date, status): self.date = date self.status = status class AttendanceSheet: def __init__(self): self.attendance_list = [] def add_attendance(self, date, status): attendance = Attendance(date, status) self.attendance_list.append(attendance) def get_attendance(self, student): return [attendance.status for attendance in self.attendance_list if student.id == attendance.student_id] class AttendanceManager: def __init__(self): self.student_list = [] self.attendance_sheet = AttendanceSheet() def add_student(self, name, id): student = Student(name, id) self.student_list.append(student) def get_student(self, id): for student in self.student_list: if student.id == id: return student return None def mark_attendance(self, date, id, status): student = self.get_student(id) if student: student.add_attendance(status) self.attendance_sheet.add_attendance(date, status) def get_attendance_report(self, id): student = self.get_student(id) attendance = self.attendance_sheet.get_attendance(student) return attendance attendance_manager = AttendanceManager() attendance_manager.add_student("Alice", 1) attendance_manager.add_student("Bob", 2) attendance_manager.mark_attendance("2021-01-01", 1, "present") attendance_manager.mark_attendance("2021-01-01", 2, "absent") attendance_manager.mark_attendance("2021-01-02", 1, "absent") attendance_manager.mark_attendance("2021-01-02", 2, "present") print(attendance_manager.get_attendance_report(1)) print(attendance_manager.get_attendance_report(2)) ``` 在这个示例中,我们定义了三个类:`Student`、`Attendance` 和 `AttendanceSheet`。`Student` 类表示学生,包含学生的姓名、学号和考勤记录。`Attendance` 类表示一次考勤记录,包含日期和出勤状态。`AttendanceSheet` 类表示整个考勤表,包含所有学生的所有考勤记录。 我们还定义了一个 `AttendanceManager` 类,用于管理学生考勤记录。在 `AttendanceManager` 类中,我们可以添加学生、标记考勤、获取学生考勤记录等。 在最后的测试代码中,我们添加了两个学生并标记了四次考勤。然后我们获取了学生考勤记录并打印出来。输出结果如下: ``` ['present', 'absent'] ['absent', 'present'] ``` 这表明学生 1 在第一次考勤中出勤,第二次考勤缺勤;学生 2 在第一次考勤缺勤,第二次考勤出勤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值