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

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

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 复制代码
<?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 复制代码
<?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)

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

html 复制代码
<!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)
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 复制代码
<?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 复制代码
<?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 复制代码
<?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>
相关推荐
JaguarJack14 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo15 小时前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack2 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo2 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack2 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay3 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954483 天前
CTF 伪协议
php
BingoGo6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo7 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php