Python+Mysql(Pycharm)实现多用户登录学生成绩管理系

1.    实现三种用户的身份登录,且每种用户的用户数量可以是多个
2.    各个用户构造各自的数据库表,包含各自的基本信息
3.    其中的管理员可以进行对其他的表的操控,包括增删改查等等
4.    实现学生,老师的信息录入和学生的选课退课,老师的授课更改,查看学生成绩信息等
5.    实现成绩录入,选课,课程表创建的过程中,添加更改新的数据表作为维护
6.    实现各表之间的一致性和独立性

 使用代码时进行自己的数据库连接,输入自己的密码和数据库名称(更改我的连接即可)

 

import pymysql
import prettytable as pt
def denglu():  # 登录界面
    print('=' * 20)
    print('1.用学生身份登录')
    print('2.用教师身份登录')
    print('3.用管理员身份登录')
    print('0.退出')
    print('=' * 20)
def menu():
    menu_info='''1
    ------------------
    1) 录入课程信息
    2) 录入学生成绩
    3) 录入学生信息
    4) 录入老师信息
    5) 删除学生信息
    6) 删除老师信息
    0) 退出
    ------------------
    '''
    print(menu_info)
#录入成绩
def add_score():
    student_id: str = input("请输入学号:")
    score_number = input("请输入课程号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    value=(student_id,score_number)
    sql: str = """SELECT * from 选课表 where 学号=%s and 课程号=%s"""
    cursor.execute(sql,value)
    print(cursor.rowcount)
    while cursor.rowcount <= 0:
        student_id = input("该学生未选此课,请重新输入学号:")
        score_number = input("请输入课程号:")
        sql: str = """SELECT * from 选课表 where 学号=%s and 课程号=%s"""
        cursor.execute(sql, value)
    score=input("请输入成绩:")
    sql = """INSERT INTO 成绩表(学号,课程号,成绩)
       VALUES (%s,%s,%s)"""
    cursor.execute(sql, (student_id, score_number, score))
    db.commit()
    db.close()
# 添加学生信息
def add_student():
    student_id: str = input("请输入学号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    sql: str = "SELECT * from 学生表 where 学号='%s'" % student_id
    cursor.execute(sql)
    while cursor.rowcount > 0:
        student_id = input("该学号已存在,请重新输入:")
        sql: str = "select * from 学生表 where 学号 = '%s'" % student_id
        cursor.execute(sql)
    name = input("请输入姓名:")
    sex = input("请输入性别:")
    age = input("请输入年龄:")
    student_class: str = input("请输入班级:")
    password = input("请输入密码:")
    sql = """INSERT INTO 学生表(学号,姓名,性别,年龄,班级,密码)
       VALUES (%s,%s,%s,%s,%s,%s)"""
    cursor.execute(sql, (student_id, name, sex, age, student_class, password))
    db.commit()
    db.close()
# 添加老师信息
def add_teacher():
    teacher_id: str = input("请输入工号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    sql: str = "SELECT * from 教师信息表 where 工号='%s'" % teacher_id
    cursor.execute(sql)
    if cursor.rowcount > 0:
        object_name1 = input("该工号已存在,请直接输入课程:")
        teacher_name=input("教师姓名:")
        sql1: str ="""INSERT INTO 教师信息表(工号,姓名,性别,密码,课程名称)VALUES (%s,%s,%s,%s,%s)"""
        cursor.execute(sql1,(teacher_id, teacher_name,'——','——',object_name1))
        db.commit()
    else:
       name = input("请输入姓名:")
       sex = input("请输入性别:")
       password = input("请输入密码:")
       object_name=input("请输入课程名称:")
       sql = """INSERT INTO 教师信息表(工号,姓名,性别,密码,课程名称)VALUES (%s,%s,%s,%s,%s)"""
       cursor.execute(sql, (teacher_id,name,sex,password,object_name))
       db.commit()
       db.close()
# 添加课程信息
def add_course():
    course_id: str = input("请输入课程号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码,',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    sql: str = "SELECT * from 课程表 where 课程号='%s'" % course_id
    cursor.execute(sql)
    while cursor.rowcount > 0:
        course_id = input("该课程已存在,请重新输入:")
        sql: str = "select * from 课程表 where 课程号 = '%s'" % course_id
        cursor.execute(sql)
    course_name = input("请输入课程名称:")
    score = input("请输入学分:")
    teacher = input("请输入任课教师:")
    sql = """INSERT INTO 课程表(课程号,课程名称,学分,任课教师)
        VALUES (%s,%s,%s,%s)"""
    cursor.execute(sql, (course_id, course_name, score, teacher))
    db.commit()
    db.close()
# 学生登录
def menu_s():
    menu_info='''1
    ------------------
    1) 查询本人信息
    2) 修改本人基本信息
    3) 选课
    4) 退课
    0) 退出
    ------------------
    '''
    print(menu_info)
def student_denglu():
    user = input("请输入学生学号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    sql: str = "SELECT * from 学生表 where 学号='%s'" % user
    cursor.execute(sql)
    results = cursor.fetchall()
    if cursor.rowcount > 0:
        print("此帐号为学生,可以根据课程名称、课程号或学号进行查询")
        password: str = input("请输入密码:")
        if password == results[0][5]:
            print("密码正确")
            while True:
                menu_s()
                index = input("请输入选项序号:")
                while not index.isdigit():
                    index = input("输入错误,请重新输入:")
                # 根据课程名称查询
                if int(index) == 1:
                    sql_s:str_s="select * from 学生表 WHERE 学号='%s'" % user
                    cursor.execute(sql_s)
                    rest = cursor.fetchone()
                    print(rest)
                elif int(index) == 2:
                    title = ['姓名', '性别', '年龄', '班级', '密码']
                    # print('姓名', '性别', '年龄', '班级', '密码')
                    field = input("请输入要修改的字段名:") # 控制台输入
                    if field in title:  # 如果输入的字段名在title里面,那么就可以进行查询了.
                        name = input("请输入要修改的内容:")
                        if field == title[0]:
                            sql_select = "update 学生表 set 姓名='{}' where 学号='{}'".format(name,user)
                        elif field == title[1]:
                            sql_select = "update 学生表 set 性别='{}' where 学号='{}'".format(name,user)
                        elif field == title[2]:
                            sql_select= "update 学生表 set 年龄='{}' where 学号='{}'".format(name,user)
                        elif field == title[3]:
                            sql_select = "update 学生表 set 班级='{}' where 学号='{}'".format(name,user)
                        elif field == title[4]:
                            sql_select = "update 学生表 set 密码='{}' where 学号='{}'".format(name,user)
                    else:
                        print("输入有误,没有查询到该字段!")
                    try:
                        cursor.execute(sql_select)
                        db.commit()  # 提交给数据库
                        print("修改成功")
                    except Exception as e:
                        print("修改失败")
                elif int(index) == 3:
                    object_id = input("请输入课程号:")
                    sql = """INSERT INTO 选课表(学号,课程号)VALUES (%s,%s)"""
                    cursor.execute(sql, (user,object_id))
                    db.commit()
                elif int(index) == 4:
                    object_id_=input("请输入退课课程号:")
                    value=(object_id_,user)
                    sql ="""DELETE FROM 成绩表 where 课程号=%s and 学号=%s """
                    sql2="""DELETE FROM 选课表 where 课程号=%s"""
                    cursor.execute(sql, value)
                    cursor.execute(sql2,(object_id_))
                    db.commit()
                elif int(index) == 0:
                    break
                else:
                    print("输入无效")
        else:
            print("密码错误,你没有权限")
# 老师登录
def menu_t():
    menu_info='''1
    ------------------
    1) 修改学生成绩
    2) 查询课程学生成绩信息
    0) 退出
    ------------------
    '''
    print(menu_info)
def teacher_denglu():
    user = input("请输入教师工号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor = db.cursor()
    sql: str = "SELECT * from 教师信息表 where 工号='%s'" % user
    cursor.execute(sql)
    results = cursor.fetchall()
    if cursor.rowcount > 0:
        print("此帐号为教师,可以根据课程名称、课程号或学号进行查询")
        password: str = input("请输入密码:")
        if password == results[0][3]:
            print("密码正确")
            while True:
                menu_t()
                index = input("请输入选项序号:")
                while not index.isdigit():
                    index = input("输入错误,请重新输入:")
                # 修改学生成绩
                if int(index) == 1:
                    sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
                                        from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号  \
                                        INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
                                        INNER JOIN 教师信息表 ON 教师信息表.姓名=课程表.任课教师\
                                        where 教师信息表.工号= '%s'" % user

                    cursor.execute(sql)
                    results = cursor.fetchall()
                    table=pt.PrettyTable()
                    table.field_names=['课程号', '课程名称','学号','姓名','成绩']
                    table.align='l'
                    for row in results:
                        table.add_row(list(row))
                    print("学生成绩结果如下:")
                    print(table)
                    field = input("请输入要修改的学生学号:")
                    field_= input("请输入要修改的学生成绩:")
                    field_a=input("请输入课程号:")
                    value=(field_,field,field_a)
                    sql_update = "update 成绩表 set 成绩=%s where 学号=%s and 课程号=%s"
                    cursor.execute(sql_update,value)
                    db.commit()  # 提交给数据库
                elif int(index) == 2:
                    sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
                                        from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号  \
                                        INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
                                        INNER JOIN 教师信息表 ON 教师信息表.姓名=课程表.任课教师\
                                        where 教师信息表.工号= '%s'" % user
                    cursor.execute(sql)
                    results = cursor.fetchall()
                    table=pt.PrettyTable()
                    table.field_names=['课程号', '课程名称','学号','姓名','成绩']
                    table.align='l'
                    for row in results:
                        table.add_row(list(row))
                    print("查询全部结果如下:")
                    print(table)
                # elif int(index) == 3:
                #     object_name = input("请输入课程名称:")
                #     teacher_name= input("教师姓名:")
                #     sql_update = "update 教师信息表 set 课程名称=%s where 工号=%s "
                #     cursor.execute(sql_update,(object_name, user))
                #     db.commit()  # 提交给数据库
                #     sql_update2 = "update 课程表 set 课程名称=%s where 任课教师=%s "
                #     cursor.execute(sql_update2, (object_name,teacher_name))
                #     db.commit()
                elif int(index) == 0:
                    break
                else:
                    print("输入无效")
        else:
            print("密码错误,你没有权限")
# 成绩查询
def submenu():
    menu_info='''
    ------------------
    1) 课程名称
    2) 课程号
    3) 学号
    4) 全部
    0) 退出
    ------------------
    '''
    print(menu_info)
def delete_num_student():
    student_id: str = input("请输入学号:")
    db = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        password='输入自己的数据库密码',
        db='students_db',
        charset='UTF8MB4'
    )
    cursor=db.cursor()
    sql: str = "SELECT * from 学生表 where 学号='%s'" % student_id
    cursor.execute(sql)
    while cursor.rowcount <= 0:
        student_id = input("该学号不存在,请重新输入:")
        sql: str = "select * from 学生表 where 学号 = '%s'" % student_id
        cursor.execute(sql)
    sql1 = """DELETE FROM 学生表 where 学号=%s"""
    sql2 = """DELETE FROM 选课表 where 学号=%s"""
    sql3 = """DELETE FROM 成绩表 where 学号=%s"""
    cursor.execute(sql1, (student_id ))
    cursor.execute(sql2, (student_id ))
    cursor.execute(sql3, (student_id ))
    db.commit()
# 管理员登录兼主main
def main():
    while True:
        denglu()
        index = input("请输入选项序号:")
        while not index.isdigit():
            index = input("输入错误,请重新输入:")
        if int(index) == 1:
            student_denglu()
        elif int(index) == 2:
            teacher_denglu()
        elif int(index) == 3:#管理员模式
            user: str = input("请输入管理员帐号:")
            db = pymysql.Connect(
                host='localhost',
                port=3306,
                user='root',
                password='输入自己的数据库密码',
                db='students_db',
                charset='UTF8MB4'
            )
            cursor = db.cursor()
            sql: str = "SELECT * from 管理员表 where 账号='%s'" % user
            cursor.execute(sql)
            results = cursor.fetchall()
            if cursor.rowcount > 0:
                print("此帐号为管理员,可以根据课程名称、课程号或学号进行查询")
                password: str = input("请输入密码:")
                if password == results[0][1]:
                    print("密码正确")
                    while True:
                        menu()
                        index = input("请输入选项序号:")
                        while not index.isdigit():
                            index = input("输入错误,请重新输入:")
                        if int(index) == 1:
                            add_course()
                        elif int(index) == 2:
                            add_score()
                        elif int(index) == 3:
                            add_student()
                        elif int(index) == 4:
                            add_teacher()
                        elif int(index) == 5:
                            delete_num_student()
                        elif int(index) == 0:
                            break
                        else:
                            print("输入无效")
            else:
                print("密码错误,你没有权限")
        elif int(index) == 0:
            break
        else:
            print("输入无效")
if __name__ == '__main__':
    main()

建表,本人使用pycharm专业版,可直接在pycharm里面连接数据库,进行建表。同样也可在mysql命令框进行建表,但不方便。如果需要pycharm专业版,网上有很多激活码白拿,照着做即可。

CREATE TABLE `课程表` (
  `课程号` varchar(4) NOT NULL,
  `课程名称` varchar(20) NOT NULL,
  `学分` decimal(4,1) DEFAULT NULL,
  `任课教师` varchar(8) DEFAULT NULL,
  KEY (`课程号`),
  CONSTRAINT `任课教师` FOREIGN KEY (`任课教师`) REFERENCES `教师信息表` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 CREATE TABLE `教师信息表` (
  `工号` varchar(30) DEFAULT NULL,
  `姓名` varchar(8) DEFAULT NULL,
  `性别` varchar(2) DEFAULT NULL,
  `密码` varchar(6) DEFAULT NULL,
  `课程名称` varchar(20) DEFAULT NULL,
  KEY `姓名` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
create table if not exists students_db.成绩表
(
    学号   varchar(30)   not null,
    课程号 varchar(4)    not null,
    成绩   decimal(4, 1) not null,
    constraint 学号
    foreign key (学号) references students_db.学生表 (学号)
);

create table if not exists students_db.学生表
(
    学号 varchar(30) not null
        primary key,
    姓名 varchar(8)  null,
    性别 varchar(2)  null,
    年龄 decimal(4)  null,
    班级 varchar(10) null,
    密码 varchar(6)  null
);

create index 姓名
    on students_db.学生表 (姓名);

create table if not exists students_db.管理员表
(
    账号 varchar(8) not null
        primary key,
    密码 varchar(6) null
);

create table if not exists students_db.选课表
(
    学号   varchar(30) not null,
    课程号 varchar(4)  not null,
    constraint 学号1
        foreign key (学号) references students_db.学生表 (学号)
);

create index 学号
    on students_db.选课表 (学号);

建表可根据自己的需求进行更改,代码也可很容易改写。信息录入时由于有外键约束,eg:录入课程表时自动判断在教师表中有无信息,否则报错。如果不需要外键,删除后在代码里面做关联即可。

欢迎地大  大数据学弟学妹借鉴,不懂评论,私信!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月28日
下一篇 2023年12月28日

相关推荐