python+mysql 实现学生成绩管理系统

题目:学生成绩管理系统的设计与实现

利用项目管理器组织、设计并连编一个学生成绩管理系统应用程序。系统由数据库、表单、报表、菜单组成。系统中有一个数据库,数据库中包括三个数据表:学生表、课程表、成绩表,学生表中包括4个班,每个班5名学生,课程表中包括4门课程,成绩表至少有20条记录。

1.建立数据库和基本表,并建立合理的约束

(1) 在数据库中建立4张表:
“学生表”表的结构

字段名 字段类型 字段宽度 小数位 索引
学号 字符型 8 —— 主索引
姓名 字符型 8 —— 普通索引
性别 字符型 2 —— ——
年龄 数值型 4 0 ——
班级 字符型 10 —— ——
密码 字符型 6 —— ——

“管理员表”表的结构

字段名 字段类型 字段宽度 小数位 索引
帐号 字符型 8 —— 主索引
密码 字符型 6 —— ——

“课程表”表的结构

字段名 字段类型 字段宽度 小数位 索引
课程号 字符型 4 —— 主索引
课程名称 字符型 20 —— 普通索引
学分 数值型 4 1 ——
任课教师 字符型 8 —— ——

“成绩表”表的结构

字段名 字段类型 字段宽度 小数位 索引
学号 字符型 8 —— ——
课程号 字符型 4 —— ——
成绩 数值型 4 1 ——

“成绩表”的主索引名称为“学生”,索引表达式为“学号+课程号+STR(成绩,4,1)”;“成绩表”的普通索引名称为“成绩”,索引表达式为“成绩”。

2.数据的录入

根据系统需要录入相应的记录数据。

3. 模块设计

  • 成绩管理模块
    – 课程信息录入模块:录入课程信息并保存;
    – 学生成绩录入模块:录入学生的成绩信息并保存;
  • 成绩查询模块:管理员能够根据课程名称、课程号或学号进行查询;学生只能查询自己的所有课程成绩。

创建数据库和表

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;

main.py

# -*- 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()

你可能感兴趣的:(mysql,python)