基于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()#关闭连接

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

猜你喜欢

转载自blog.csdn.net/sheziqiong/article/details/130880667