一、实验目的
实现学生选课系统
二、实验环境
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模块增加有好的可视化界面。
© 版权声明
THE END
暂无评论内容