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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python实现从ftp服务器下载文件的方法
Apr 30 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
pycharm 对代码做静态检查操作
Jun 09 Python
详解python爬取弹幕与数据分析
Nov 14 Python
python中spy++的使用超详细教程
Jan 29 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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中cookies使用指南
2007/03/16 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
PHP编码转换
2012/11/05 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP中Array相关函数简介
2016/07/03 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
2019/09/30 PHP
jquery 指南/入门基础
2007/11/30 Javascript
javascript面向对象之Javascript 继承
2010/05/04 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[32:36]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第二场 12.12
2020/12/16 DOTA
Python实现Linux的find命令实例分享
2017/06/04 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python实现最大优先队列
2019/08/29 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
pycharm导入源码的具体步骤
2020/08/04 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
澳大利亚在线床零售商:Bedworks
2020/09/01 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
交通事故检查书范文
2014/01/30 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
2017公司年会主持人开幕词
2016/03/04 职场文书