一、实验目的
实现学生选课系统
二、实验环境
Python3.6
pymysql(Python连接MySQL)
xlrd(操作Excel)
三、程序结构
1.首先运行First_run.py:
功能:创建数据库、表等信息
2.运行seconnd_run.py:
功能: 实现学生选课
3.账号密码.xlsx:
存放学生信息(可以存班级花名册)
如:
``
四、数据库结构
表之间的联系
五、各表功能
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:
这里因为我已经创建过数据库,try语句直接捕获错误
删除student数据库后重新运行(亦可在SQL语句中加入判断是否存在数据库)
这时可见我们的数据库及表等信息已经创建完成
可以看下数据库确认一下:
接着运行second_run:
1.学生登录
具体的功能请自行查看。
当然代码有很多不足的地方:
没有封装成类,全部代码均为函数嵌套式的,层次不是特别鲜明
没有可视化的界面,可以添加tkinter模块增加有好的可视化界面。
到此这篇关于Python实战之实现简易的学生选课系统的文章就介绍到这了,更多相关Python学生选课系统内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!