利用项目管理器组织、设计并连编一个学生成绩管理系统应用程序。系统由数据库、表单、报表、菜单组成。系统中有一个数据库,数据库中包括三个数据表:学生表、课程表、成绩表,学生表中包括4个班,每个班5名学生,课程表中包括4门课程,成绩表至少有20条记录。
(1) 在数据库中建立4张表:
“学生表”表的结构
字段名 | 字段类型 | 字段宽度 | 小数位 | 索引 |
---|---|---|---|---|
学号 | 字符型 | 8 | —— | 主索引 |
姓名 | 字符型 | 8 | —— | 普通索引 |
性别 | 字符型 | 2 | —— | —— |
年龄 | 数值型 | 4 | 0 | —— |
班级 | 字符型 | 10 | —— | —— |
密码 | 字符型 | 6 | —— | —— |
“管理员表”表的结构
字段名 | 字段类型 | 字段宽度 | 小数位 | 索引 |
---|---|---|---|---|
帐号 | 字符型 | 8 | —— | 主索引 |
密码 | 字符型 | 6 | —— | —— |
“课程表”表的结构
字段名 | 字段类型 | 字段宽度 | 小数位 | 索引 |
---|---|---|---|---|
课程号 | 字符型 | 4 | —— | 主索引 |
课程名称 | 字符型 | 20 | —— | 普通索引 |
学分 | 数值型 | 4 | 1 | —— |
任课教师 | 字符型 | 8 | —— | —— |
“成绩表”表的结构
字段名 | 字段类型 | 字段宽度 | 小数位 | 索引 |
---|---|---|---|---|
学号 | 字符型 | 8 | —— | —— |
课程号 | 字符型 | 4 | —— | —— |
成绩 | 数值型 | 4 | 1 | —— |
“成绩表”的主索引名称为“学生”,索引表达式为“学号+课程号+STR(成绩,4,1)”;“成绩表”的普通索引名称为“成绩”,索引表达式为“成绩”。
根据系统需要录入相应的记录数据。
CREATE DATABASE students_db CHARACTER SET utf8mb4;
CREATE TABLE `学生表` (
`学号` varchar(8) NOT NULL,
`姓名` varchar(8) DEFAULT NULL,
`性别` varchar(2) DEFAULT NULL,
`年龄` decimal(4,0) DEFAULT NULL,
`班级` varchar(10) DEFAULT NULL,
`密码` varchar(6) DEFAULT NULL,
PRIMARY KEY (`学号`),
KEY `姓名` (`姓名`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `成绩表` (
`学号` varchar(8) NOT NULL,
`课程号` varchar(4) NOT NULL,
`成绩` decimal(4,1) NOT NULL,
PRIMARY KEY (`学号`,`课程号`,`成绩`),
KEY `成绩` (`成绩`),
KEY `课程号` (`课程号`),
CONSTRAINT `学号` FOREIGN KEY (`学号`) REFERENCES `学生表` (`学号`),
CONSTRAINT `课程号` FOREIGN KEY (`课程号`) REFERENCES `课程表` (`课程号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `管理员表` (
`账号` varchar(8) NOT NULL,
`密码` varchar(6) DEFAULT NULL,
PRIMARY KEY (`账号`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `课程表` (
`课程号` varchar(4) NOT NULL,
`课程名称` varchar(20) DEFAULT NULL,
`学分` decimal(4,1) DEFAULT NULL,
`任课教师` varchar(8) DEFAULT NULL,
PRIMARY KEY (`课程号`),
KEY `课程名称` (`课程名称`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# -*- coding=utf-8 -*-
import pymysql
import prettytable as pt
def menu():
menu_info='''
------------------
1) 录入课程信息
2) 录入学生成绩
3) 查询学生成绩
0) 退出
------------------
'''
print(menu_info)
# 添加学生信息
def add_student():
student_id: str = input("请输入学号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='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_course():
course_id: str = input("请输入课程号:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='lenovofa230',
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 query_score():
user: str = input("请输入管理员帐号或你的姓名:")
db = pymysql.Connect(
host='localhost',
port=3306,
user='root',
password='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:
submenu()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
# 根据课程名称查询
if int(index) == 1:
course_name=input("请输入课程名称:")
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
where 课程名称= '%s'" % course_name
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) == 2:
course_id = input("请输入课程号:")
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
where 成绩表.课程号= '%s'" % course_id
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:
student_id = input("请输入学号:")
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号 \
where 学生表.学号= '%s'" % student_id
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) == 4:
sql = "select 课程表.课程号,课程表.课程名称,学生表.学号,学生表.姓名,成绩表.成绩 \
from 课程表 INNER JOIN 成绩表 ON 课程表.课程号=成绩表.课程号 \
INNER JOIN 学生表 ON 成绩表.学号=学生表.学号"
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) == 0:
break
else:
print("输入无效")
else:
print("密码错误,你没有权限")
else:
print("此帐号非管理员,只能查询自己的所有课程成绩")
sql: str = "SELECT * FROM 成绩表 where 姓名= '%s'" % user
cursor.execute(sql)
results=cursor.fetchall()
for row in results:
student_id=row[0]
course_id=row[1]
score=row[3]
print("学号=%s,课程号=%s,成绩=%s" % (student_id,course_id,score))
db.close()
def submenu():
menu_info='''
------------------
1) 课程名称
2) 课程号
3) 学号
4) 全部
0) 退出
------------------
'''
print(menu_info)
def main():
while True:
menu()
index = input("请输入选项序号:")
while not index.isdigit():
index = input("输入错误,请重新输入:")
if int(index) == 1:
add_course()
elif int(index) == 2:
add_student()
elif int(index) == 3:
query_score()
elif int(index) == 0:
break
else:
print("输入无效")
if __name__ == '__main__':
main()