1. 实现三种用户的身份登录,且每种用户的用户数量可以是多个
2. 各个用户构造各自的数据库表,包含各自的基本信息
3. 其中的管理员可以进行对其他的表的操控,包括增删改查等等
4. 实现学生,老师的信息录入和学生的选课退课,老师的授课更改,查看学生成绩信息等
5. 实现成绩录入,选课,课程表创建的过程中,添加更改新的数据表作为维护
6. 实现各表之间的一致性和独立性
使用代码时进行自己的数据库连接,输入自己的密码和数据库名称(更改我的连接即可)
import pymysql
import prettytable as pt
def denglu(): # 登录界面
print('=' * 20)
print('1.用学生身份登录')
print('2.用教师身份登录')
print('3.用管理员身份登录')
print('0.退出')
print('=' * 20)
def menu():
menu_info='''1
------------------
1) 录入课程信息
2) 录入学生成绩
3) 录入学生信息
4) 录入老师信息
5) 删除学生信息
6) 删除老师信息
0) 退出
------------------
'''
print(menu_info)
#录入成绩
def add_score():
student_id: str = input("请输入学号:")
score_number = input("请输入课程号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
value=(student_id,score_number)
sql: str = """SELECT * from 选课表 where 学号=%s and 课程号=%s"""
cursor.execute(sql,value)
print(cursor.rowcount)
while cursor.rowcount <= 0:
student_id = input("该学生未选此课,请重新输入学号:")
score_number = input("请输入课程号:")
sql: str = """SELECT * from 选课表 where 学号=%s and 课程号=%s"""
cursor.execute(sql, value)
score=input("请输入成绩:")
sql = """INSERT INTO 成绩表(学号,课程号,成绩)
VALUES (%s,%s,%s)"""
cursor.execute(sql, (student_id, score_number, score))
db.commit()
db.close()
# 添加学生信息
def add_student():
student_id: str = input("请输入学号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
sql: str = "SELECT * from 学生表 where 学号='%s'" % student_id
cursor.execute(sql)
while cursor.rowcount > 0:
student_id = input("该学号已存在,请重新输入:")
sql: str = "select * from 学生表 where 学号 = '%s'" % student_id
cursor.execute(sql)
name = input("请输入姓名:")
sex = input("请输入性别:")
age = input("请输入年龄:")
student_class: str = input("请输入班级:")
password = input("请输入密码:")
sql = """INSERT INTO 学生表(学号,姓名,性别,年龄,班级,密码)
VALUES (%s,%s,%s,%s,%s,%s)"""
cursor.execute(sql, (student_id, name, sex, age, student_class, password))
db.commit()
db.close()
# 添加老师信息
def add_teacher():
teacher_id: str = input("请输入工号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
sql: str = "SELECT * from 教师信息表 where 工号='%s'" % teacher_id
cursor.execute(sql)
if cursor.rowcount > 0:
object_name1 = input("该工号已存在,请直接输入课程:")
teacher_name=input("教师姓名:")
sql1: str ="""INSERT INTO 教师信息表(工号,姓名,性别,密码,课程名称)VALUES (%s,%s,%s,%s,%s)"""
cursor.execute(sql1,(teacher_id, teacher_name,'——','——',object_name1))
db.commit()
else:
name = input("请输入姓名:")
sex = input("请输入性别:")
password = input("请输入密码:")
object_name=input("请输入课程名称:")
sql = """INSERT INTO 教师信息表(工号,姓名,性别,密码,课程名称)VALUES (%s,%s,%s,%s,%s)"""
cursor.execute(sql, (teacher_id,name,sex,password,object_name))
db.commit()
db.close()
# 添加课程信息
def add_course():
course_id: str = input("请输入课程号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码,',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
sql: str = "SELECT * from 课程表 where 课程号='%s'" % course_id
cursor.execute(sql)
while cursor.rowcount > 0:
course_id = input("该课程已存在,请重新输入:")
sql: str = "select * from 课程表 where 课程号 = '%s'" % course_id
cursor.execute(sql)
course_name = input("请输入课程名称:")
score = input("请输入学分:")
teacher = input("请输入任课教师:")
sql = """INSERT INTO 课程表(课程号,课程名称,学分,任课教师)
VALUES (%s,%s,%s,%s)"""
cursor.execute(sql, (course_id, course_name, score, teacher))
db.commit()
db.close()
# 学生登录
def menu_s():
menu_info='''1
------------------
1) 查询本人信息
2) 修改本人基本信息
3) 选课
4) 退课
0) 退出
------------------
'''
print(menu_info)
def student_denglu():
user = input("请输入学生学号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
sql: str = "SELECT * from 学生表 where 学号='%s'" % user
cursor.execute(sql)
results = cursor.fetchall()
if cursor.rowcount > 0:
print("此帐号为学生,可以根据课程名称、课程号或学号进行查询")
password: str = input("请输入密码:")
if password == results[0][5]:
print("密码正确")
while True:
menu_s()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
# 根据课程名称查询
if int(index) == 1:
sql_s:str_s="select * from 学生表 WHERE 学号='%s'" % user
cursor.execute(sql_s)
rest = cursor.fetchone()
print(rest)
elif int(index) == 2:
title = ['姓名', '性别', '年龄', '班级', '密码']
# print('姓名', '性别', '年龄', '班级', '密码')
field = input("请输入要修改的字段名:") # 控制台输入
if field in title: # 如果输入的字段名在title里面,那么就可以进行查询了.
name = input("请输入要修改的内容:")
if field == title[0]:
sql_select = "update 学生表 set 姓名='{}' where 学号='{}'".format(name,user)
elif field == title[1]:
sql_select = "update 学生表 set 性别='{}' where 学号='{}'".format(name,user)
elif field == title[2]:
sql_select= "update 学生表 set 年龄='{}' where 学号='{}'".format(name,user)
elif field == title[3]:
sql_select = "update 学生表 set 班级='{}' where 学号='{}'".format(name,user)
elif field == title[4]:
sql_select = "update 学生表 set 密码='{}' where 学号='{}'".format(name,user)
else:
print("输入有误,没有查询到该字段!")
try:
cursor.execute(sql_select)
db.commit() # 提交给数据库
print("修改成功")
except Exception as e:
print("修改失败")
elif int(index) == 3:
object_id = input("请输入课程号:")
sql = """INSERT INTO 选课表(学号,课程号)VALUES (%s,%s)"""
cursor.execute(sql, (user,object_id))
db.commit()
elif int(index) == 4:
object_id_=input("请输入退课课程号:")
value=(object_id_,user)
sql ="""DELETE FROM 成绩表 where 课程号=%s and 学号=%s """
sql2="""DELETE FROM 选课表 where 课程号=%s"""
cursor.execute(sql, value)
cursor.execute(sql2,(object_id_))
db.commit()
elif int(index) == 0:
break
else:
print("输入无效")
else:
print("密码错误,你没有权限")
# 老师登录
def menu_t():
menu_info='''1
------------------
1) 修改学生成绩
2) 查询课程学生成绩信息
0) 退出
------------------
'''
print(menu_info)
def teacher_denglu():
user = input("请输入教师工号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor = db.cursor()
sql: str = "SELECT * from 教师信息表 where 工号='%s'" % user
cursor.execute(sql)
results = cursor.fetchall()
if cursor.rowcount > 0:
print("此帐号为教师,可以根据课程名称、课程号或学号进行查询")
password: str = input("请输入密码:")
if password == results[0][3]:
print("密码正确")
while True:
menu_t()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
# 修改学生成绩
if int(index) == 1:
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
INNER JOIN 教师信息表 ON 教师信息表.姓名=课程表.任课教师\
where 教师信息表.工号= '%s'" % user
cursor.execute(sql)
results = cursor.fetchall()
table=pt.PrettyTable()
table.field_names=['课程号', '课程名称','学号','姓名','成绩']
table.align='l'
for row in results:
table.add_row(list(row))
print("学生成绩结果如下:")
print(table)
field = input("请输入要修改的学生学号:")
field_= input("请输入要修改的学生成绩:")
field_a=input("请输入课程号:")
value=(field_,field,field_a)
sql_update = "update 成绩表 set 成绩=%s where 学号=%s and 课程号=%s"
cursor.execute(sql_update,value)
db.commit() # 提交给数据库
elif int(index) == 2:
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
INNER JOIN 教师信息表 ON 教师信息表.姓名=课程表.任课教师\
where 教师信息表.工号= '%s'" % user
cursor.execute(sql)
results = cursor.fetchall()
table=pt.PrettyTable()
table.field_names=['课程号', '课程名称','学号','姓名','成绩']
table.align='l'
for row in results:
table.add_row(list(row))
print("查询全部结果如下:")
print(table)
# elif int(index) == 3:
# object_name = input("请输入课程名称:")
# teacher_name= input("教师姓名:")
# sql_update = "update 教师信息表 set 课程名称=%s where 工号=%s "
# cursor.execute(sql_update,(object_name, user))
# db.commit() # 提交给数据库
# sql_update2 = "update 课程表 set 课程名称=%s where 任课教师=%s "
# cursor.execute(sql_update2, (object_name,teacher_name))
# db.commit()
elif int(index) == 0:
break
else:
print("输入无效")
else:
print("密码错误,你没有权限")
# 成绩查询
def submenu():
menu_info='''
------------------
1) 课程名称
2) 课程号
3) 学号
4) 全部
0) 退出
------------------
'''
print(menu_info)
def delete_num_student():
student_id: str = input("请输入学号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor=db.cursor()
sql: str = "SELECT * from 学生表 where 学号='%s'" % student_id
cursor.execute(sql)
while cursor.rowcount <= 0:
student_id = input("该学号不存在,请重新输入:")
sql: str = "select * from 学生表 where 学号 = '%s'" % student_id
cursor.execute(sql)
sql1 = """DELETE FROM 学生表 where 学号=%s"""
sql2 = """DELETE FROM 选课表 where 学号=%s"""
sql3 = """DELETE FROM 成绩表 where 学号=%s"""
cursor.execute(sql1, (student_id ))
cursor.execute(sql2, (student_id ))
cursor.execute(sql3, (student_id ))
db.commit()
# 管理员登录兼主main
def main():
while True:
denglu()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
if int(index) == 1:
student_denglu()
elif int(index) == 2:
teacher_denglu()
elif int(index) == 3:#管理员模式
user: str = input("请输入管理员帐号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='输入自己的数据库密码',
db='students_db',
charset='UTF8MB4'
)
cursor = db.cursor()
sql: str = "SELECT * from 管理员表 where 账号='%s'" % user
cursor.execute(sql)
results = cursor.fetchall()
if cursor.rowcount > 0:
print("此帐号为管理员,可以根据课程名称、课程号或学号进行查询")
password: str = input("请输入密码:")
if password == results[0][1]:
print("密码正确")
while True:
menu()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
if int(index) == 1:
add_course()
elif int(index) == 2:
add_score()
elif int(index) == 3:
add_student()
elif int(index) == 4:
add_teacher()
elif int(index) == 5:
delete_num_student()
elif int(index) == 0:
break
else:
print("输入无效")
else:
print("密码错误,你没有权限")
elif int(index) == 0:
break
else:
print("输入无效")
if __name__ == '__main__':
main()
建表,本人使用pycharm专业版,可直接在pycharm里面连接数据库,进行建表。同样也可在mysql命令框进行建表,但不方便。如果需要pycharm专业版,网上有很多激活码白拿,照着做即可。
CREATE TABLE `课程表` (
`课程号` varchar(4) NOT NULL,
`课程名称` varchar(20) NOT NULL,
`学分` decimal(4,1) DEFAULT NULL,
`任课教师` varchar(8) DEFAULT NULL,
KEY (`课程号`),
CONSTRAINT `任课教师` FOREIGN KEY (`任课教师`) REFERENCES `教师信息表` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `教师信息表` (
`工号` varchar(30) DEFAULT NULL,
`姓名` varchar(8) DEFAULT NULL,
`性别` varchar(2) DEFAULT NULL,
`密码` varchar(6) DEFAULT NULL,
`课程名称` varchar(20) DEFAULT NULL,
KEY `姓名` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
create table if not exists students_db.成绩表
(
学号 varchar(30) not null,
课程号 varchar(4) not null,
成绩 decimal(4, 1) not null,
constraint 学号
foreign key (学号) references students_db.学生表 (学号)
);
create table if not exists students_db.学生表
(
学号 varchar(30) not null
primary key,
姓名 varchar(8) null,
性别 varchar(2) null,
年龄 decimal(4) null,
班级 varchar(10) null,
密码 varchar(6) null
);
create index 姓名
on students_db.学生表 (姓名);
create table if not exists students_db.管理员表
(
账号 varchar(8) not null
primary key,
密码 varchar(6) null
);
create table if not exists students_db.选课表
(
学号 varchar(30) not null,
课程号 varchar(4) not null,
constraint 学号1
foreign key (学号) references students_db.学生表 (学号)
);
create index 学号
on students_db.选课表 (学号);
建表可根据自己的需求进行更改,代码也可很容易改写。信息录入时由于有外键约束,eg:录入课程表时自动判断在教师表中有无信息,否则报错。如果不需要外键,删除后在代码里面做关联即可。
欢迎地大 大数据学弟学妹借鉴,不懂评论,私信!