您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Python实战之实现简易的学生选课系统

51自学网 2021-10-30 22:37:44
  python
这篇教程Python实战之实现简易的学生选课系统写得很实用,希望能帮到您。

一、实验目的

实现学生选课系统

二、实验环境

Python3.6
pymysql(Python连接MySQL)
xlrd(操作Excel)

三、程序结构

weimingchao

1.首先运行First_run.py:
功能:创建数据库、表等信息

2.运行seconnd_run.py:
功能: 实现学生选课

3.账号密码.xlsx:
存放学生信息(可以存班级花名册)

如:

在这里插入图片描述``

四、数据库结构

表之间的联系

table

五、各表功能

student_login:存放学生账号信息(直接导入班级花名册,具体看代码)									字段:												s_no:学生学号,												s_name:学生姓名,												s_login:学生账号,												s_pd:学生密码																	course:存放课程信息							字段:										c_id:课程编号										c_name:课程名称											student_class:学生选课表,存放学生选课信息								字段:										s_no:学生学号(设置外键与student_login表s_no连接)										c_id:课程编号(设置外键与course表c_id连接)											admin_login:管理员信息表,存放管理员账号								字段:											a_no:  管理员编号											a_name:  管理员姓名											a_login:  管理员账号											a_pd:  管理员密码

六、代码部分

First_run.py代码如下:

import pymysqlimport xlrddef create_all():    try:        password = input('请输入mysql密码(root用户):')        db = pymysql.connect(host='localhost', user='root', password=password)        cursor = db.cursor()    except pymysql.err.OperationalError:        print('密码输入错误!')    else:        try:            sql = 'create database student charset utf8;'            cursor.execute(sql)        except pymysql.err.ProgrammingError:            print("Can't create database 'student' database exists!")        else:            sql0 = 'use student;'            # 创建课程表            sql1 = "CREATE TABLE course (c_id int(10) PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR ( 30 ) NOT NULL)default charset utf8;"            # 创建学生账号表            sql2 = "create table student_login(s_no char(10), s_name varchar(30), s_login char(20), s_pd char(20) not null, primary key(s_no)) default charset utf8;"            # 创建学生选课表            sql3 = "CREATE TABLE student_class (s_no CHAR(10),c_id INT,CONSTRAINT FOREIGN KEY (s_no) REFERENCES student_login (s_no),CONSTRAINT FOREIGN KEY (c_id) REFERENCES course (c_id),unique(s_no,c_id)) default charset utf8;"  # unique(s_no,c_id))联合唯一,确保选课唯一            # 创建管理员账号表            sql4 = "create table admin_login(a_no char(10), a_name varchar(30), a_login char(10)  unique, a_pd char(10) not null, primary key(a_no)) default charset utf8;"            cursor.execute(sql0)            cursor.execute(sql1)            cursor.execute(sql2)            cursor.execute(sql3)            cursor.execute(sql4)            db.commit()            print('Successful!')def insert_student_login(db):    def open_excel():        try:            book = xlrd.open_workbook("账号密码.xlsx")  # 文件名,把文件与py文件放在同一目录下        except:            print("Open excel file failed!")        else:            try:                sheet = book.sheet_by_name("Sheet1")  # execl里面的sheet1            except:                print('No Sheet1')            else:                print('Yes')                return sheet    def insert_data():        sheet = open_excel()        cursor = db.cursor()        for i in range(1, sheet.nrows):  # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1            s_no = str(sheet.cell(i, 0).value)[0:10]  # 取第i行第0列            s_name = sheet.cell(i, 1).value  # 取第i行第1列,下面依次类推            s_login = str(sheet.cell(i, 2).value)[0:10]            s_pd = str(sheet.cell(i, 3).value)[0:10]            # print(name)            # print(data)            # value = (name,data)            # print(value)            sql = "INSERT INTO student_login VALUES('%s','%s','%s','%s')" % (s_no, s_name, s_login, s_pd)            cursor.execute(sql)  # 执行sql语句            db.commit()    insert_data()    # cursor.close()  # 关闭连接    # db.close()#关闭数据    print("插入成功!")def insert_admin_login(db):    try:        cursor = db.cursor()        sql = 'insert into admin_login values("1","admin","1","1")'        cursor.execute(sql)        db.commit()    except:        print('Insert admin_login Failed!!!')    else:        print('Successful!')def insert_into_course(db):    try:        cursor = db.cursor()        sql = 'insert into course values(1,"高数"),(2,"大学英语");'      # 默认插入两个课程供选择        cursor.execute(sql)        db.commit()    except:        print('Insert course Failed!')    else:        print('Successful!')def main():    create_all()    try:        passwd = input('请输入MySQL密码:')        db = pymysql.connect(host="localhost", user="root", passwd=passwd, db="student", charset='utf8')    except:        print("Could not connect to mysql server!")    else:        insert_student_login(db)        insert_admin_login(db)        insert_into_course(db)if __name__ == '__main__':    main()

second_run.py代码如下:

import pymysql# 创建游标函数def get_db():    try:        passwd = input('请输入MySQL密码:')        db = pymysql.connect('127.0.0.1', 'root', passwd, 'student')    except pymysql.err.OperationalError:        print('密码输入错误!Go Die!')    else:        return dbdef get_cursor(db):    cursor = db.cursor()    return cursor# 选择身份def login(db, cursor):    menu_login()    i = 0    while True:        i += 1  # 设置循环,超过三次退出系统        login_select = input('请输入你的选项:')        if login_select == '1':  # 这里数字为字符串类型,记得要引号!            student_login(db, cursor)  # 跳入学生登录页面        elif login_select == '2':            admin_login(db, cursor)  # 跳入管理员登录页面        else:            print('请输入正确的选项!>>>>>>>>请擦擦眼睛再重选--*--(^_^)--*-- :')            if i >= 3:                print('GoodBye了您啊!')                break# 学生登录认证def student_login(db,cursor):    print('           -----------------****----------^_^|-欢迎进入学生系统-|^_^----------****----------------------------      ')    l = 0    while True:        login = input('请输入你的账号:')        sql = "SELECT * FROM student_login where student_login.s_login='%s'" % login        cursor.execute(sql)        login_id = cursor.fetchall()        if len(login_id) == 0:            l += 1            print('账号不存在,请重新输入:')            if l >= 3:                print()                print('账号不存在,请联系管理员申请账号!')                exit()        else:            p = 0  # 第一次错误:放在了while语句里面,导致超过三次无法退出(每次循环都会将p初始化为0)            while True:                password = input('请输入你的密码:')                sql2 = "SELECT * FROM student_login where student_login.s_login='%s'and student_login.s_pd ='%s'" % (                    login, password)                cursor.execute(sql2)                login_pd = cursor.fetchall()                if len(login_pd) == 0:                    p += 1                    print('密码错误!')                    if p >= 3:                        print('密码输入错误三次,GoodBye了您啊!')                        exit()                elif len(login_pd) != 0:                    sql3 = "SELECT s_name,s_no from student_login where s_login = '%s'; " % login                    # sql4 = "select s_no from student_login where s_login = '%s';" % login                    cursor.execute(sql3)                    # cursor.execute(sql4)                    data = cursor.fetchall()[0]                    s_name = data[0]           # 姓名                    s_no = data[1]             # 学号                    print()                    print("            -------------****----------^_^欢迎--|", s_name,                          "|--进入学生选课系统^_^----------****-----------------")                    # 学生系统模块                    i = 0                    while True:                        student_select_menu()                        student_select = input('请输入你的选项:')                        if student_select == '1':                            show_course(cursor)                        elif student_select == '2':                            select_course(db, cursor, s_name, s_no)                        elif student_select == '3':                            show_class(cursor, s_no)                            # exit()                        elif student_select == '4':                            update_class(db, cursor, s_name, s_no)                        elif student_select == '5':                            print('/n您已退出登录^_^/n')                            select = input('请输入 1 或 2 分别进入学生与管理员系统 or 输入 0 退出系统:')                            if select == '1':                                student_login(db, cursor)                            elif select == '2':                                admin_login(db, cursor)                            elif select == '0':                                exit()                            else:                                print('请输入正确选项!')                        elif i >= 3:                            print('GoodBye了您啊!')                            print()                            break  # 重新登录学生操作,密码锁定                        else:                            i += 1                            print('请输入正确的选项!>>>>>>>>请擦擦眼睛再重选--*--(^_^)--*-- :')# 管理员登录认证def admin_login(db, cursor):    print('      -------------------****----------^_^|-欢迎进入管理员系统-|^_^----------****--------------------------      ')    l = 0    while True:        login = input('请输入你的账号:')        sql = "SELECT * FROM admin_login where admin_login.a_login='%s'" % login        cursor.execute(sql)        login_id = cursor.fetchall()        if len(login_id) == 0:            l += 1            print('账号不存在,请重新输入:')            if l >= 3:                print()                print('账号不存在,请联系站长申请账号!')                exit()        else:            p = 0  # 第一次错误:放在了while语句里面,导致超过三次无法退出(每次循环都会将p初始化为0)            while True:                password = input('请输入你的密码:')                sql2 = "SELECT * FROM admin_login where admin_login.a_login='%s'and admin_login.a_pd ='%s'" % (                    login, password)                cursor.execute(sql2)                login_pd = cursor.fetchall()                if len(login_pd) == 0:                    p += 1                    print('密码错误!')                    if p >= 3:                        print('密码输入错误三次,GoodBye了您啊!')                        exit()                elif len(login_pd) != 0:                    sql3 = "SELECT a_name from admin_login where a_login = '%s'; " % login                    cursor.execute(sql3)                    s_name = cursor.fetchall()[0][0]                    print()                    print("             --------------****----------^_^欢迎--|", s_name, "|--进入管理员系统^_^----------****-----------------")                    # 管理员系统模块                    i = 0                    while True:                        admin_select_menu()                        admin_select = input('请输入你的选项:')                        if admin_select == '1':                            show_course(cursor)                            # exit()                        elif admin_select == '0':                            delete_course(db, cursor)                        elif admin_select == '2':                            add_course(db, cursor)                            # exit()                        elif admin_select == '3':                            show_studentlogin(cursor)                            # exit()                        elif admin_select == '4':                            add_studentlogin(db, cursor)                            # exit()                        elif admin_select == '5':                            show_adminlogin(cursor)                            # exit()                        elif admin_select == '6':                            add_admin_login(db, cursor)                            # exit()                        elif admin_select == '7':                            show_student_class(cursor)                        elif admin_select == '8':                            print('您已退出登录!/n')                            select = input('请输入 1 或 2 分别进入学生与管理员系统 or 输入 0 退出系统:')                            if select == '1':                                student_login(db,cursor)                            elif select == '2':                                admin_login(db, cursor)                            elif select == '0':                                exit()                            else:                                print('请输入正确选项!')                        elif i >= 3:                            print('GoodBye了您啊!')                            print()                            break  # 重新登录管理员系统操作                        else:                            i += 1                            print('请输入正确的选项!>>>>>>>>请擦擦眼睛再重选--*--(^_^)--*-- :')# 登录菜单栏def menu_login():    menu_login1 = '''        -----------------------------****----------(^_^)----------****------------------------------------        |                                  欢迎登录学生选课系统                                           |        |                                      1、学生登录                                                |        |                                      2、管理员登录                                              |        |                  (请在菜单选择你的操作,选择其他无效,超过三次自动退出系统!)                  |        '''    print(menu_login1)# 学生选课菜单栏def student_select_menu():    menu_login = '''            |                                   1、查看当前可选课程                                           |            |                                   2、选择课程                                                   |            |                                   3、查看已选课程                                               |            |                                   4、更改课程                                                   |            |                                   5、退出系统                                                   |            |                  (请在菜单选择你的操作,选择其他无效,超过三次自动退出系统!)                  |            '''    print(menu_login)# 管理员操作菜单def admin_select_menu():    menu_login = '''            |                                  0、删除课程                                                    |            |                                  1、查看所有课程                                                |            |                                  2、添加课程                                                    |            |                                  3、查看所有学生账号信息                                        |            |                                  4、添加学生账号                                                |            |                                  5、查看所有管理员信息                                          |            |                                  6、添加管理员账号                                              |            |                                  7、查看所有学生选课信息                                        |            |                                  8、退出系统                                                    |            |                  (请在菜单选择你的操作,选择其他无效,超过三次自动退出系统!)                  |            '''    print(menu_login)# 学生系统模块# 查看所有课程 完def show_course(cursor):    sql = "select * from course;"    cursor.execute(sql)    data = cursor.fetchall()    # print(type(data))       # 元组类型    item = len(data)    if item == 0:        print('暂无课程信息!')    else:        print()       # 换行        print('         课程如下:')        for i in range(item):            course = data[i]            select = {                "编号": course[0],                "课程": course[1]            }            print('                 ', select)# 选课  完成def select_course(db, cursor, s_name, s_no):    print(s_name)    try:        number = int(input('请输入你的课程编号:'))        sql = "SELECT c_name FROM course where c_id = %s" % number  # 查找课程名字        cursor.execute(sql)        course = cursor.fetchall()[0][0]    except IndexError:        print('没有你要选的课程,请重选!')    except ValueError:        print('请正确输入课程编号!')    else:        print('你选的课程为:', course)        confirm = input('是否继续(Y/N):')        if confirm == 'Y' or confirm == 'y':            try:                sql_insert = "insert into student_class values('%s','%s');" % (s_no, number)     # 插入课程                cursor.execute(sql_insert)                db.commit()            except:                print("课程已存在或选课失败!")            else:                print('Successful!')        else:            print('Failed!!')# 查看已选课def show_class(cursor, s_no):    try:        sql = 'SELECT c_name FROM student_class sc INNER JOIN course c ON sc.c_id = c.c_id INNER JOIN student_login sl ON sc.s_no = sl.s_no where sc.s_no = "%s";' % s_no        cursor.execute(sql)        data = cursor.fetchall()    except IndexError:        print('暂无选课信息!')    else:        print('/n                你选的课程为:')        for i in range(len(data)):            print('                             ', data[i][0], '^_^')# 修改选课def update_class(db, cursor, s_name, s_no):    while True:        try:            course = input('请输入你要修改的课程编号:')            sql0 = "select * from student_class where s_no = '%s' and c_id = '%s'" % (s_no, course)            cursor.execute(sql0)            data0 = cursor.fetchall()            if len(data0) != 0:                re_course = input('请输入你要选的课程编号:')                sql = "select c_name from course where c_id = %s" % re_course  # 查找是否存在课程编号                cursor.execute(sql)                data = cursor.fetchall()      # 课程编号所对应课程            else:                print('你没有选择这个课程!')              # 选课表中学生没有选择该课程                continue            # 终止后面语句,进入下次循环        except IndexError:            print('没有你要选的课程,请重选!')        else:            if len(data) != 0:                print('你重选的课程为:', data[0][0])     # data[0][0] 切片出来课程名称                confirm = input('是否继续(Y/y):')                if confirm == 'Y' or confirm == 'y':                    try:                        sql = "UPDATE `student`.`student_class` SET `c_id` = '%s' WHERE `s_no` = '%s' AND `c_id` = '%s' LIMIT 1" % (                            re_course, s_no, course)  # 更新课程                        cursor.execute(sql)                        db.commit()                    except:                        print("失败")                    else:                        print('Successful!')                        break                    # 修改成功退出循环                else:                    print('Failed!!')            else:                print('没有这个课程!')# 管理员模块# 添加课程def delete_course(db, cursor):    try:        course = input('请输入你要删除的课程编号:')        sql = 'DELETE FROM course WHERE c_id = %s ' % course        cursor.execute(sql)        db.commit()    except:        print('删除失败!')    else:        print('删除成功 ^_^')def add_course(db, cursor):    course = input('请输入你要插入的课程:')    try:        sql = "INSERT INTO course(c_name) VALUES ('%s')" % course        cursor.execute(sql)        db.commit()  # 执行插入语句    except pymysql.err.IntegrityError:        print('课程已经存在,不能重复!')    else:        print('添加成功')# 查看学生账号  (已完成)def show_studentlogin(cursor):    sql = 'select * from student_login;'    cursor.execute(sql)    data = cursor.fetchall()    print('          学生账号如下:/n')    for i in range(len(data)):        item = data[i]        dict = {            'sno': item[0],            's_name': item[1],            's_login': item[2],            's_pd': item[3]        }        print('                ', dict)# 添加学生账号def add_studentlogin(db, cursor):    try:        s_no = input('请输入学生的学号:')        s_name = input('请输入学生的姓名:')        s_login = input('请输入学生的账号:')        s_pd = input('请输入学生的密码:')        cursor.execute('insert into student_login values("%s","%s","%s","%s");'% (s_no, s_name, s_login, s_pd))        db.commit()    except pymysql.err.IntegrityError:        print('添加失败,学号/账号已存在!')    else:        print('添加成功^_^')# 查看管理员账号 完def show_adminlogin(cursor):    sql = 'select * from admin_login;'    cursor.execute(sql)    data = cursor.fetchall()    for i in range(len(data)):        item = data[i]        dict = {            'sno': item[0],            's_name': item[1],            's_login': item[2],            's_pd': item[3]        }        print('                                 ', dict)def add_admin_login(db, cursor):     # 注意,传入参数的时候一定要先传db再传游标    try:        s_no = input('请输入管理员的编号:')        s_name = input('请输入管理员的姓名:')        s_login = input('请输入管理员的账号:')        s_pd = input('请输入管理员的密码:')        sql = 'insert into admin_login values("%s","%s","%s","%s");' % (s_no, s_name, s_login, s_pd)        cursor.execute(sql)        db.commit()    except pymysql.err.IntegrityError:        print('添加失败,编号/账号已存在!')    else:        print('添加成功^_^')# 查看学生选课信息 (完)def show_student_class(cursor):    sql = 'SELECT * FROM student_class sc INNER JOIN course c ON sc.c_id = c.c_id INNER JOIN student_login sl ON sc.s_no = sl.s_no order by s_name;'    cursor.execute(sql)    data = cursor.fetchall()    print('/n')    if len(data) > 1:        for i in range(len(data)):            item = data[i]            # print(item)        # 打印查询结果            dict = {                # 取值                'sc_no': item[0],                'sc_name': item[5],                'sc_course': item[3]            }            print('                        ', dict)    else:        print('没有选课信息')def main():    try:        db = get_db()        cursor = get_cursor(db)    except AttributeError:        print('AttributeError!')    else:        login(db, cursor)        if __name__ == '__main__':    main()

七、效果展示

运行First_run:

在这里插入图片描述

这里因为我已经创建过数据库,try语句直接捕获错误
删除student数据库后重新运行(亦可在SQL语句中加入判断是否存在数据库)

在这里插入图片描述

这时可见我们的数据库及表等信息已经创建完成
可以看下数据库确认一下:

在这里插入图片描述

接着运行second_run:

在这里插入图片描述

1.学生登录

在这里插入图片描述

具体的功能请自行查看。

当然代码有很多不足的地方:

没有封装成类,全部代码均为函数嵌套式的,层次不是特别鲜明

没有可视化的界面,可以添加tkinter模块增加有好的可视化界面。

到此这篇关于Python实战之实现简易的学生选课系统的文章就介绍到这了,更多相关Python学生选课系统内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


pycharm中jupyter的使用图文教程
python基础学习之生成器与文件系统知识总结
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。