学生成绩查询系统设计与实现

学生成绩查询系统设计与实现

在这里插入图片描述

1. 系统概述

学生成绩查询系统是一个基于PHP和SQL的Web应用程序,旨在为学校提供一个高效的学生成绩管理和查询平台。该系统可以帮助教师录入成绩、学生查询成绩、管理员管理用户和成绩数据,提高教育管理的效率和透明度。

2. 技术栈
  • 前端:HTML5, CSS3, JavaScript, jQuery, Bootstrap
  • 后端:PHP
  • 数据库:MySQL
  • 服务器:Apache
3. 系统功能模块
  1. 用户管理

    • 用户注册与登录
    • 用户信息管理
    • 角色权限管理(学生、教师、管理员)
  2. 成绩管理

    • 成绩录入
    • 成绩查询
    • 成绩修改
    • 成绩删除
  3. 学生管理

    • 学生信息录入
    • 学生信息查询
    • 学生信息修改
    • 学生信息删除
  4. 课程管理

    • 课程信息录入
    • 课程信息查询
    • 课程信息修改
    • 课程信息删除
  5. 系统设置

    • 数据备份与恢复
    • 系统日志管理
    • 参数配置
4. 数据库设计
4.1 数据库表结构
  1. 用户表(users)

    • id (INT, 主键)
    • username (VARCHAR, 用户名)
    • password (VARCHAR, 密码)
    • role (VARCHAR, 角色)
    • created_at (DATETIME, 创建时间)
    • updated_at (DATETIME, 更新时间)
  2. 学生表(students)

    • id (INT, 主键)
    • name (VARCHAR, 姓名)
    • student_id (VARCHAR, 学号)
    • class (VARCHAR, 班级)
    • created_at (DATETIME, 创建时间)
    • updated_at (DATETIME, 更新时间)
  3. 课程表(courses)

    • id (INT, 主键)
    • name (VARCHAR, 课程名称)
    • teacher (VARCHAR, 授课教师)
    • created_at (DATETIME, 创建时间)
    • updated_at (DATETIME, 更新时间)
  4. 成绩表(grades)

    • id (INT, 主键)
    • student_id (INT, 外键,关联学生表)
    • course_id (INT, 外键,关联课程表)
    • score (DECIMAL, 分数)
    • created_at (DATETIME, 创建时间)
    • updated_at (DATETIME, 更新时间)
5. 系统架构设计
5.1 层次结构
  1. 表现层(Presentation Layer)

    • 负责接收用户的请求,并返回处理结果。
    • 使用PHP和HTML/CSS/JavaScript实现。
  2. 业务逻辑层(Business Logic Layer)

    • 负责处理具体的业务逻辑。
    • 使用PHP实现。
  3. 数据访问层(Data Access Layer)

    • 负责与数据库交互,执行增删改查操作。
    • 使用PHP的PDO扩展实现。
5.2 控制器(Controller)

控制器负责处理用户的请求,并调用相应的模型方法。示例如下:

<?php
session_start();

// 连接数据库
$host = 'localhost';
$db = 'school_db';
$user = 'root';
$pass = '';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Could not connect to the database $db :" . $e->getMessage());
}

// 用户登录
if (isset($_POST['login'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];

    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
    $stmt->execute(['username' => $username, 'password' => $password]);
    $user = $stmt->fetch();

    if ($user) {
        $_SESSION['user'] = $user;
        header('Location: dashboard.php');
    } else {
        echo "Invalid username or password.";
    }
}
?>
5.3 模型(Model)

模型负责处理数据的存取操作。示例如下:

<?php
class Student {
    private $pdo;

    public function __construct($pdo) {
        $this->pdo = $pdo;
    }

    public function getAllStudents() {
        $stmt = $this->pdo->query("SELECT * FROM students");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function addStudent($name, $student_id, $class) {
        $stmt = $this->pdo->prepare("INSERT INTO students (name, student_id, class) VALUES (:name, :student_id, :class)");
        $stmt->execute(['name' => $name, 'student_id' => $student_id, 'class' => $class]);
    }
}
?>
5.4 视图(View)

视图负责显示数据。示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生列表</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1>学生列表</h1>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>学号</th>
                    <th>班级</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($students as $student): ?>
                    <tr>
                        <td><?php echo $student['name']; ?></td>
                        <td><?php echo $student['student_id']; ?></td>
                        <td><?php echo $student['class']; ?></td>
                        <td>
                            <a href="edit-student.php?id=<?php echo $student['id']; ?>" class="btn btn-primary">编辑</a>
                            <a href="delete-student.php?id=<?php echo $student['id']; ?>" class="btn btn-danger">删除</a>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <a href="add-student.php" class="btn btn-success">添加学生</a>
    </div>
</body>
</html>
6. 功能实现
6.1 用户登录
  • 登录页面(login.php)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1>登录</h1>
        <form action="login.php" method="post">
            <div class="form-group">
                <label for="username">用户名</label>
                <input type="text" class="form-control" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input type="password" class="form-control" id="password" name="password" required>
            </div>
            <button type="submit" name="login" class="btn btn-primary">登录</button>
        </form>
    </div>
</body>
</html>
6.2 学生成绩查询
  • 成绩查询页面(student_grades.php)
<?php
session_start();

if (!isset($_SESSION['user'])) {
    header('Location: login.php');
    exit;
}

$student_id = $_GET['student_id'];
$stmt = $pdo->prepare("SELECT g.*, c.name AS course_name FROM grades g JOIN courses c ON g.course_id = c.id WHERE g.student_id = :student_id");
$stmt->execute(['student_id' => $student_id]);
$grades = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生成绩</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1>学生成绩</h1>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>课程名称</th>
                    <th>分数</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($grades as $grade): ?>
                    <tr>
                        <td><?php echo $grade['course_name']; ?></td>
                        <td><?php echo $grade['score']; ?></td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <a href="dashboard.php" class="btn btn-secondary">返回</a>
    </div>
</body>
</html>
7. 安全性设计

为了保证系统的安全性,需要实现以下功能:

  • 用户认证:使用PHP会话管理进行用户认证和授权。
  • 数据校验:在控制器层进行输入参数的校验,防止SQL注入等攻击。
  • 日志记录:记录关键操作的日志,便于审计和故障排查。
8. 测试与部署
  • 单元测试:使用PHPUnit进行单元测试,确保各个模块的功能正确。
  • 集成测试:进行集成测试,确保各个模块之间的协同工作正常。
  • 部署:将应用程序部署到Apache服务器上,确保在生产环境中运行稳定。
9. 源代码

由于篇幅限制,无法完整展示所有源代码。以下是部分核心代码示例:

9.1 学生成绩实体类(Grade.php)
<?php
class Grade {
    private $pdo;

    public function __construct($pdo) {
        $this->pdo = $pdo;
    }

    public function getGradesByStudentId($student_id) {
        $stmt = $this->pdo->prepare("SELECT g.*, c.name AS course_name FROM grades g JOIN courses c ON g.course_id = c.id WHERE g.student_id = :student_id");
        $stmt->execute(['student_id' => $student_id]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    public function addGrade($student_id, $course_id, $score) {
        $stmt = $this->pdo->prepare("INSERT INTO grades (student_id, course_id, score) VALUES (:student_id, :course_id, :score)");
        $stmt->execute(['student_id' => $student_id, 'course_id' => $course_id, 'score' => $score]);
    }
}
?>
9.2 学生成绩查询控制器(StudentGradeController.php)
<?php
session_start();

if (!isset($_SESSION['user'])) {
    header('Location: login.php');
    exit;
}

$student_id = $_GET['student_id'];
$pdo = new PDO("mysql:host=localhost;dbname=school_db;charset=utf8", "root", "");
$grade = new Grade($pdo);
$grades = $grade->getGradesByStudentId($student_id);
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生成绩</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1>学生成绩</h1>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>课程名称</th>
                    <th>分数</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($grades as $grade): ?>
                    <tr>
                        <td><?php echo $grade['course_name']; ?></td>
                        <td><?php echo $grade['score']; ?></td>
                    </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <a href="dashboard.php" class="btn btn-secondary">返回</a>
    </div>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust 力扣 - 2653. 滑动子数组的美丽值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的的窗口 因为数据范围比较小&#xff0c;所以我们可以通过计数排序找到窗口中第k小的数 如果小于0&#xff0c;则该窗口的美丽值为第k小的数如果大于等于0&#xff0c;则该窗口的美丽值为0 题…

VisualStudio远程编译调试linux_c++程序(二)

前章讲述了gdb相关&#xff0c;这章主要讲述用VisualStudio调试编译linux_c程序 1&#xff1a;环境 win10 VisualStudio 2022 Community ubuntu22.04 2:安装 1>vs安装时&#xff0c;勾选 使用c进行linux 和嵌入式开发 (这里以vs2022为例) OR VS安装好了&#xff0c; 选择工…

音视频听译:助力多维度沟通与发展的大门

在全球经济一体化的大背景下&#xff0c;企业之间的跨国合作愈发频繁。在商务会议、谈判和产品演示等活动中&#xff0c;语言的多样性成为了一大挑战。而音视频听译服务能够将不同语言的音频准确转换为目标语言文字&#xff0c;确保信息的精准传达&#xff0c;避免因语言障碍引…

基于MATLAB人脸检测的汽车疲劳驾驶检测

课题介绍 疲劳驾驶导致汽车交通事故逐年增加&#xff0c;为了提升驾车的安全性&#xff0c;需对驾驶员疲劳状态实时监测并及时提醒. 为了提高疲劳驾驶判断效率及准确率&#xff0c;本文运用Viola-Jones 框架特征矩阵进行人脸预判断&#xff1b;预判断过程中为了减少Haar 值计算…

论文阅读(三十二):EGNet: Edge Guidance Network for Salient Object Detection

文章目录 1.Introduction2.Related Works3.Salient Edge Guidance Network3.1Complementary information modeling3.1.1Progressive salient object features extraction3.1.2Non-local salient edge features extraction 3.2One-to-one guidance module 4.Experiments4.1Imple…

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10&#xff1a; 这个语句的意思是&#xff0c;从查询结果中跳过前100000条记录&#xff0c;然后返回接下来的10条记录。这通常用于分页查询中&#xff0c;当你需要跳过大量的记录以获取后续的记录时。例如&#xff0c;如果你…

源码侦探:理解 numpy 中的 tile 方法

文章目录 pre &#xff1a;先来一张源码的切片1. 参数和基本定义&#xff1a;2. 将 reps 转换为元组&#xff1a;3. 提升数组维度&#xff1a;4. 特殊情况检查&#xff1a;5. 处理数组维度的不同情况&#xff1a;6. 计算输出数组的形状&#xff1a;7. 通过重复构造数组&#xf…

单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构

目录 一、合并两个有序链表 二、链表分割 三、链表的回文结构 u解题的总体思路&#xff1a; 合并两个有序链表&#xff1a;首先创建新链表的头节点&#xff08;哨兵位&#xff1a;本质上是占位子&#xff09;&#xff0c;为了减少一些判断情况&#xff0c;简化操作。然后我们…

Qt6 CMake 中引入 Qt Linguist 翻译功能

qt cmake 使用自带翻译工具配置步骤 创建Qt CMake 程序配置项目 CMake 及 代码使用流程最终CMake 如下最终工程链接为&#xff1a;参考 创建Qt CMake 程序 配置项目 CMake 及 代码 在CMake 中添加如下代码, 导入相关的翻译库 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPON…

Android IPC机制(一)多进程模式

1. 什么是进程&#xff1f; 进程是操作系统分配资源&#xff08;如 CPU、内存等&#xff09;的基本单位。简单来说&#xff0c;进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据&#xff0c;用于跟踪进程的执行状态。在 Android 中&#xff…

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

《JVM第3课》运行时数据区

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 运行时数据区结构图如下&#xff1a; 可分为 5 个区域&#xff0c;分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用&#xff0c;会在后面的文章展开讲。 类加载子系统会把类信息…

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件 可视区域没超过当前屏幕高度时候只显示三个菜单效果 可视区域超过当前屏幕高度时,显示可回到顶部菜单的,当然这个菜单显示条件可以自定义,根据需求设置 然后将这个整体功能创建为一个全局组件 代…

苏州金龙新V系客车创新引领旅游出行未来

10月25日&#xff0c;为期三天的“2024第六届旅游出行大会”在风景秀丽的云南省丽江市落下帷幕。本次大会由中国旅游车船协会主办&#xff0c;全面展示了中国旅游出行行业最新发展动态和发展成就&#xff0c;为旅游行业带来全新发展动力。 在大会期间&#xff0c;备受瞩目的展车…

看门狗电路原理与应用

看门狗的原理与应用 看门狗基本原理 看门狗&#xff0c;英文简称为“Watchdog Timer ”或者“Watchdog”&#xff1b; 本质上就是一个定时器的作用&#xff0c;简单理解就是 MCU发出一个周期性的信号&#xff0c;这个信号是满足看门狗芯片内部计时器的时间限制&#xff0c;则…

Caché/IRIS file2Xml 一个将文件转换成Studio导出的xml格式的工具

file2Xml 一个将文件转换成Studio导出的xml格式的工具 通过此工具可以将本地文件转换成xml格式文件&#xff0c;然后通过Studio导入到服务器中&#xff0c;而不再需要其他工具将文件传至服务器。 下面以为ensemble2016自带的一个示例界面增加背景图为例。 http://localhos…

java项目之教师工作量管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教师工作量管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 教师工作量管理系统的…

外贸平台开发多语言处理的三种方式

随着全球贸易的不断增长&#xff0c;外贸平台的多语言处理已成为提升用户体验和市场竞争力的重要因素。在开发外贸平台时&#xff0c;有多种方法可以实现多语言支持。本文将探讨三种主要的多语言处理方式&#xff1a;数据库级多语言支持、前端国际化框架以及内容管理系统&#…

《Python网络安全项目实战》项目2 Python基础练习_总复习(1)

《Python网络安全项目实战》项目2 Python基础练习 总复习&#xff08;1&#xff09; 班级&#xff1a; 姓名&#xff1a; 实训成绩&#xff1a; 任务单成绩 &#xff1a; 输入用户名密码并将其输出打印。 userName _____________________ passWord ______________________ #输…