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

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

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>
相关推荐
魔众11 小时前
ModStartCMS v9.7.0 组件升级优化,模块升级提醒,访问明细导出
php·cms
一人の梅雨14 小时前
京东商品详情深度解析:从接口调用到商业价值挖掘的技术实现
服务器·数据库·php
帅帅梓14 小时前
docker网络
网络·docker·php
吃鱼吃鱼吃不动了16 小时前
什么是负载均衡?
开发语言·php
BingoGo18 小时前
PHP 开发者应该理解的 Linux 入门权限指南
后端·php
苏琢玉19 小时前
再也不用翻一堆日志!一键部署轻量级错误监控系统,帮你统一管理 PHP 报错
go·github·php
JaguarJack21 小时前
PHP 开发者应该理解的 Linux 入门权限指南
后端·php
2301_7931679921 小时前
网络管理部分
linux·运维·服务器·网络·php
李白你好1 天前
一款基于 PHP 的轻量级Webshell管理工具
php
星光一影2 天前
【OA办公系统】神点企业OA办公助手/全开源
mysql·nginx·开源·php·源代码管理