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脚本使得web页面上的代码高亮显示
Apr 24 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
python生成二维码的实例详解
Oct 29 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python后台开发Django会话控制的实现
Apr 15 Python
python移位运算的实现
Jul 15 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Python操作注册表详细步骤介绍
Feb 05 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
python plt.plot bar 如何设置绘图尺寸大小
Jun 01 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
php表单转换textarea换行符的方法
2010/09/10 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
python在windows下创建隐藏窗口子进程的方法
2015/06/04 Python
Python文件及目录操作实例详解
2015/06/04 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
python实现excel读写数据
2021/03/02 Python
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
出国英文推荐信
2014/05/10 职场文书
物流管理专业求职信
2014/05/29 职场文书
供电工程专业求职信
2014/08/09 职场文书
自我查摆剖析材料
2014/10/11 职场文书
给客户的检讨书
2014/12/21 职场文书
教师自荐信范文
2015/03/06 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
监护人证明
2015/06/19 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
Android Flutter实现3D动画效果示例详解
2022/04/07 Java/Android