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复制与引用用法分析
Apr 08 Python
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python中max函数用于二维列表的实例
Apr 03 Python
如何用python整理附件
May 13 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
python实现KNN分类算法
Oct 16 Python
Python中的整除和取模实例
Jun 03 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
通过实例解析python subprocess模块原理及用法
Oct 10 Python
Python eval函数原理及用法解析
Nov 14 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
Python数组变形的几种实现方法
May 30 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中实现获取随机数组列表的自定义函数
2015/04/02 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
python 爬取微信文章
2016/01/30 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
python实现Dijkstra静态寻路算法
2019/01/17 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
RealTek面试题
2016/06/28 面试题
销售工作人员的自我评价分享
2013/11/10 职场文书
竞聘上岗演讲
2014/05/19 职场文书
党员查摆剖析材料
2014/10/10 职场文书
违章停车检讨书
2014/10/21 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫