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

一、实验目的

实现学生选课系统

二、实验环境

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模块增加有好的可视化界面。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容