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

作者:余生羁绊 时间:2023-10-07 02:49:37 

一、实验目的

实现学生选课系统

二、实验环境

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

来源:https://blog.csdn.net/m0_46202060/article/details/110634699

标签:Python,学生选课,系统
0
投稿

猜你喜欢

  • vue中使用vue-qriously插件生成二维码

    2024-04-27 16:01:31
  • python根据京东商品url获取产品价格

    2022-01-26 12:14:31
  • python 剪切移动文件的实现代码

    2023-06-10 05:21:14
  • go time.After优化后性能提升34%内存减少67%

    2024-05-05 09:33:34
  • VMware中linux环境下oracle安装图文教程(二)ORACLE 10.2.05版本的升级补丁安装

    2023-07-22 11:37:11
  • python函数运行内存时间等性能检测工具

    2021-04-08 02:24:00
  • 深入理解JavaScript系列(28):设计模式之工厂模式详解

    2024-05-06 10:08:17
  • Python基于Tkinter开发一个爬取B站直播弹幕的工具

    2023-06-21 21:53:12
  • 如何用CocosCreator制作微信小游戏

    2023-08-23 16:00:02
  • python 对象真假值的实例(哪些视为False)

    2021-11-18 02:50:49
  • php结合js实现点击超链接执行删除确认操作

    2023-11-15 03:30:51
  • selenium+python截图不成功的解决方法

    2021-06-02 23:25:06
  • 判断浏览器是否接受 Cookie

    2009-07-28 17:52:00
  • aws 通过boto3 python脚本打pach的实现方法

    2021-09-14 23:33:19
  • Python实战之自动发送邮件的实现

    2023-10-18 15:09:43
  • Vue express鉴权零基础入门

    2024-05-13 09:11:29
  • pandas计数 value_counts()的使用

    2023-05-02 02:06:13
  • vue学习笔记之动态组件和v-once指令简单示例

    2024-01-01 07:50:52
  • python实现机械分词之逆向最大匹配算法代码示例

    2022-01-02 08:16:27
  • python导包的几种方法(自定义包的生成以及导入详解)

    2021-11-19 21:33:41
  • asp之家 网络编程 m.aspxhome.com