Python实战之实现简易的学生选课系统


Posted in Python onMay 25, 2021

一、实验目的

实现学生选课系统

二、实验环境

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

三、程序结构

Python实战之实现简易的学生选课系统

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

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

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

如:

Python实战之实现简易的学生选课系统``

四、数据库结构

表之间的联系

Python实战之实现简易的学生选课系统

五、各表功能

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 pymysql
import xlrd
def 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 db
def 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:

Python实战之实现简易的学生选课系统

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

Python实战之实现简易的学生选课系统

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

Python实战之实现简易的学生选课系统

接着运行second_run:

Python实战之实现简易的学生选课系统

1.学生登录

Python实战之实现简易的学生选课系统

具体的功能请自行查看。

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

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

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

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

Python 相关文章推荐
python实现简单的计时器功能函数
Mar 14 Python
python实现矩阵乘法的方法
Jun 28 Python
python 多线程实现检测服务器在线情况
Nov 25 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
Aug 02 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 Python
Python实现井字棋小游戏
Mar 09 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
python实现定时发送邮件到指定邮箱
Dec 23 Python
Python的这些库,你知道多少?
Jun 09 Python
python 如何用terminal输入参数
May 25 #Python
python 命令行传参方法总结
May 25 #Python
基于flask实现五子棋小游戏
May 25 #Python
浅谈Python中的函数(def)及参数传递操作
May 25 #Python
Python竟然能剪辑视频
python中的None与NULL用法说明
May 25 #Python
判断Python中的Nonetype类型
May 25 #Python
You might like
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
基于jquery的无刷新分页技术
2011/06/11 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python下的twisted框架入门指引
2015/04/15 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python实现选择排序
2017/06/04 Python
numpy.where() 用法详解
2019/05/27 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python3多线程知识点总结
2019/09/26 Python
如何基于windows实现python定时爬虫
2020/05/01 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
.net面试题
2016/09/17 面试题
大专学生推荐信范文
2013/11/19 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python