
简介班级同学录网站是一套面向计算机专业学生的毕业设计参考项目覆盖班级信息管理、同学信息录入、活动发布和在线互动等模块。项目基于JSP、Servlet与Java EE构建前端使用HTML、CSS和JavaScript展示了典型Web应用的完整分层与开发流程。压缩包共1261个文件、28.52MB主要包含后端Java类、JSP页面、前端CSS与JS脚本、SQL建库脚本及开发文档其中JSP和Java文件合计超200个确保功能模块覆盖完整。目前已有24人下载学习。结合源码、开发说明文档与演示文稿用户可快速理解前后端交互、还原数据库结构并梳理系统设计思路对毕业论文写作、答辩演示和二次开发都有实用价值。1. 班级同学录网站是什么课程设计背后的完整技术栈每年到了课程设计节点总有人拿着份“班级同学录网站”的压缩包来问这玩意儿到底能不能跑起来别急着解压后到处找教程——这个题目本身就是把 PHP 源码、MySQL 建表脚本和一份说明文档打包在一起的完整小项目能解决课程设计没题目、没源码、不会讲答辩的三大尴尬。它定位很明确登录注册、同学信息展示、留言板再加一个后台维护入口覆盖了一个 Web 应用从数据库到前端页面的完整闭环。适合在校生用来交作业适合初级开发者用来理解原生 PHP 怎么处理表单和会话也适合想拿一套现成源码做班级官网、社团通讯录底子的人。2. 环境搭建把班级同学录网站的文档和源码变成能点的页面2.1 先解压再读文档zip 里的文件各自负责什么拿到压缩包以后不要急着一键双击 index.php先解压然后把目录结构从头到尾看一遍。文档放在哪个位置、叫什么名字决定了后面省多少时间。通常这类课程设计包的说明文档是 .doc/.docx/.pdf 或 .md里面至少会写三件事运行环境要求、数据库导入步骤、默认管理员账号。源码文件则一般直接躺在根目录下index.php 是唯一入口剩下的 login.php、register.php、message.php、list.php 按功能命名一眼就能对上。我习惯先把文档里“环境要求”那段复制出来对照本机现有环境打个勾。PHP 版本要求、MySQL 版本要求是重点如果文档写明 PHP 5.6 且用了 mysql_connect 这类老函数那用 PHP 8 跑会直接报致命错误。文档里找不到版本要求时就去源码里搜函数名出现 mysqli_ 或 PDO 就说明支持新版本出现 mysql_query 这种不带 i 的函数就得准备切 PHP 5.6 了。这一步花不了五分钟却能避开后面最折磨人的兼容性问题。# 解压到 Web 根目录Windows 上一般是 phpstudy_pro/WWW/classmates unzip 班级同学录网站\(文档源码\)_kaic.zip -d /path/to/phpstudy_pro/WWW/ # 确认 PHP 命令行版本phpStudy 里把 PHP 目录加入 PATH 后可用 php -v把解压命令拆开看-d 指定的是目标目录这里我故意写成了 phpstudy_pro/WWW 下的路径因为这是 Windows 上最常见的集成环境目录php -v 是为了提前确认你将要使用的 PHP 主版本。如果 php -v 输出版本比你预期的高且源码里出现 mysql_ 函数就改成用 phpStudy 面板切换 PHP 5.6这是最省事的处理方式。2.2 用 phpStudy 起本地网站PHP 版本和扩展怎么选Windows 下做 PHP 课程设计phpStudy 几乎是标准答案因为 Apache、MySQL、phpMyAdmin 都是图形化开关不需要手工改配置。启动顺序有讲究先启动 Apache再启动 MySQL两个指示灯都变绿后再访问站点。如果 Apace 起不来八成是 80 端口或 443 端口被占用phpStudy 面板上直接能看到端口占用提示把端口改成 8080 再访问 http://localhost:8080/classmates/ 即可。PHP 版本的选择上原则是“新源码用新版本老源码用老版本”。原生写法的同学录只要用的是 mysqli 扩展PHP 7.4 或 8.x 基本没问题如果源码里有 each()、list() 的旧式用法PHP 8 会报 Warning但一般不至于白屏。拿不准就先用 PHP 7.4兼容性最好。另外确认 phpStudy 的 PHP 扩展里开了 mysqli 和 pdo_mysql在面板“PHP 扩展”页面勾选后重启 Apache避免出现“Call to undefined function mysqli_connect()”。cd /path/to/classmates php -S localhost:8000这段是 PHP 内置开发服务器的启动命令属于绕过 Apache 的快速调试手段。当 Apache 怎么都起不来但你又想先看代码能不能跑时用它最直接。参数 localhost:8000 表示监听本机的 8000 端口浏览器访问 http://localhost:8000/ 就能打开项目。注意内置服务器是单进程模型只适合本地调试不适合当作正式环境。2.3 导入数据库SQL 脚本和 config.php 的对应关系数据库是整个网站的心脏。打开 phpMyAdmin本地地址通常是 http://localhost/phpmyadmin新建一个数据库名字建议保持和源码里一致比如 classmates_db。然后选择这个库点击“导入”把 zip 里那个 .sql 文件选进去点执行。如果导入时报错先看错误信息大多数情况是 SQL 文件里已经有 CREATE DATABASE 语句而你又手动建了一次库这时删掉手动建的库直接导入即可。导入完成后打开源码里的 config.php 或 db.php把数据库连接参数改成你本机的实际值。这里是最容易翻车的地方phpMyAdmin 里设置过密码的填对应密码没设置过的保持 root 空密码端口不是默认 3306 的把 DB_PORT 一并改掉。?php // config.php —— 数据库连接配置 define(DB_HOST, 127.0.0.1); define(DB_USER, root); // 默认 root改成本机实际用户 define(DB_PASS, root); // 本机 MySQL 密码没密码就留空字符串 define(DB_NAME, classmates_db); // 与新建的数据库名保持一致 // 统一字符集解决中文乱码 $conn mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if (!$conn) { die(数据库连接失败 . mysqli_connect_error()); } mysqli_set_charset($conn, utf8mb4); ?这段代码解释了“连接参数”的本质DB_HOST 是数据库所在机器地址本地写 127.0.0.1 比 localhost 更稳因为有些环境里 localhost 会走 IPv6 导致连接被拒DB_PASS 是大多数新手卡住的第一道坎忘了密码就新建一个或者在 phpMyAdmin 里重置DB_NAME 错了会直接报“Unknown database”。mysqli_set_charset 那一行是为了让客户端、连接、服务端三端字符集统一为 utf8mb4可以少掉一半的中文乱码问题。2.4 第一轮登录验证从浏览器到数据库的完整闭环环境搭好、数据库导好、config 改好后访问 http://localhost/classmates/理论上能看见首页。如果首页是目录列表而不是页面内容说明 Apache 没把 index.php 设为默认索引去 phpStudy 的站点设置里确认默认文档包含 index.php。看到页面后先注册一个普通账号注册完别急着登录回 phpMyAdmin 里打开 user 表确认记录真的写进去了。这一步是验证“前端表单 → PHP 处理 → MySQL 存储”整条链路是否走通。curl -I http://localhost/classmates/index.phpcurl 只发送 HEAD 请求用来快速判断 HTTP 状态。返回 200 说明 PHP 正常执行返回 302 可能是被重定向到了登录页也是正常行为返回 500 则说明 PHP 代码有致命错误去 phpStudy 的 Apache 日志里看详细报错。本地环境最烦的是“页面一片空白”这通常是 PHP 报错被 display_errors 关掉了在 php.ini 里临时改成 display_errors On 再重启 Apache错误就会直接显示在浏览器里排查效率高得多。3. 核心功能拆解登录注册、同学信息表和留言板的实现3.1 用户表和同学信息表三类表怎么设计一个班级同学录网站通常离不开三张核心表用户表、同学信息表、留言表。用户表负责登录认证同学信息表是门面展示每个同学的姓名、学号、联系方式、班级职务、头像等留言表是互动模块。课程设计阶段不要求复杂的范式设计但字段类型和默认值值得认真对待。CREATE DATABASE IF NOT EXISTS classmates_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE classmates_db; CREATE TABLE user ( id INT(11) NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 登录用户名, password VARCHAR(255) NOT NULL COMMENT 密码哈希值, role TINYINT(1) NOT NULL DEFAULT 0 COMMENT 0普通成员 1管理员, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; CREATE TABLE student ( id INT(11) NOT NULL AUTO_INCREMENT, uid INT(11) NOT NULL COMMENT 关联user.id, name VARCHAR(50) NOT NULL COMMENT 姓名, student_no VARCHAR(20) DEFAULT NULL COMMENT 学号, phone VARCHAR(20) DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, avatar VARCHAR(255) DEFAULT NULL COMMENT 头像图片路径, note TEXT COMMENT 个人简介, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT同学信息表; CREATE TABLE message ( id INT(11) NOT NULL AUTO_INCREMENT, uid INT(11) NOT NULL COMMENT 留言用户, content TEXT NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT留言表;三张表的关联关系很清晰user.id 与 student.uid 一一对应user.id 又与 message.uid 对应。我特意没用物理外键约束因为课程设计阶段用逻辑外键更灵活删除用户时不会因为外键约束报错但查询时一定要通过 WHERE 条件手动关联例如查同学列表时需要 JOIN user 表获取登录名。password 字段用 VARCHAR(255) 而不是 VARCHAR(32)是为了兼容 password_hash() 生成的 60 位哈希串而传统 md5 只有 32 位。如果你拿到的是 md5 存储的老源码建议改成 password_hash否则字典攻击几分钟就能破一批弱口令。3.2 登录会话与权限控制session 和角色字段登录功能的原理是用户提交用户名密码PHP 查询数据库比对比对成功后把用户唯一标识写进 session后续页面只要检查 session 就能确认“当前登录者是谁”。原生 PHP 的登录代码结构基本一致核心是三个步骤开启会话、处理 POST、写 session。?php session_start(); require_once config.php; if ($_SERVER[REQUEST_METHOD] POST) { $username trim($_POST[username]); $password trim($_POST[password]); // 预处理语句查询用户避免 SQL 注入 $stmt mysqli_prepare($conn, SELECT * FROM user WHERE username ? LIMIT 1); mysqli_stmt_bind_param($stmt, s, $username); mysqli_stmt_execute($stmt); $result mysqli_stmt_get_result($stmt); $row mysqli_fetch_assoc($result); // password_verify 兼容 password_hash 生成的密码 if ($row password_verify($password, $row[password])) { $_SESSION[uid] $row[id]; $_SESSION[username] $row[username]; $_SESSION[role] $row[role]; header(Location: index.php); exit; } else { $error 用户名或密码不正确; } } ?这段代码有几个值得注意的参数和行为。mysqli_prepare 用的是占位符 ?而不是直接把 $username 拼进 SQL这是防止 SQL 注入的标准做法传参时通过 mysqli_stmt_bind_param 的 s 指定类型为字符串。password_verify 则是与 password_hash 配套的校验函数如果原项目用的是 md5这里要改成 md5($password) $row[password]但这是不安全的旧方案。登录成功后必须 exit否则脚本继续往下走可能出现重复跳转或逻辑漏洞。每次在需要保护的页面开头都要检查 session。?php session_start(); if (!isset($_SESSION[uid])) { header(Location: login.php); exit; } ?这段权限检查代码一般是单独存成 auth.php然后在 index.php、message.php、student_list.php 等页面用 require_once auth.php 引入。原理上的关键点是$_SESSION[uid] 是可信的服务端状态不能拿 cookie 里的值来判断登录状态因为 cookie 可以被篡改。role 字段在登录时写进 session管理员页面判断 $_SESSION[role] 1 才放行否则跳回首页。3.3 同学信息管理的增删改查一个分页列表的写法同学信息展示页是网站内容最重的部分通常用列表 分页呈现。分页的核心不是前端 JS而是 SQL 层的 LIMIT 语法LIMIT 偏移量, 每页条数。偏移量 (当前页码 - 1) × 每页条数。这里最容易中的坑是直接把 $_GET[page] 拼进 SQL如果传的是 page1 OR 11整个查询条件就会被改写。所以必须先 intval 强转。?php require_once config.php; // 当前页码空值或非法值回退到 1 $page isset($_GET[page]) ? max(1, intval($_GET[page])) : 1; $pagesize 12; // 第一段查询统计总条数决定总页数 $total_result mysqli_query($conn, SELECT COUNT(*) AS cnt FROM student); $total mysqli_fetch_assoc($total_result)[cnt]; $total_pages max(1, ceil($total / $pagesize)); // 第二段查询取当前页数据 $offset ($page - 1) * $pagesize; $sql SELECT * FROM student ORDER BY id DESC LIMIT $offset, $pagesize; $result mysqli_query($conn, $sql); ?intval 的作用是让 $page 成为“受信任的整数”max(1, ...) 是防止负数页码把偏移量变成负数。$pagesize 是你可以自由调整的参数课程设计答辩时考官常问“每页为什么是 12”答案很简单一页三行四列视觉整齐。ORDER BY id DESC 让新注册的同学排最前展示效果比默认递增更符合“最新成员”的直觉。前端翻页链接的写法一般是 :pagination.php?page。这里没有用预处理因为 $offset 和 $pagesize 都已强转为整数不会出现注入窗口。增删改查的另外三个操作里删除和编辑尤其要留心。删除一般通过 URL 传 id例如 delete.php?id7后端接到 id 后先 intval 再执行 DELETE编辑先 SELECT 出来回填表单提交时再 UPDATE。这些操作都要用预处理绑定参数不要直接拼接字符串。3.4 留言板只是 insertselect别被“功能多”吓住留言板看起来是个独立模块拆穿了就是一个带用户关联的 insert 加 select。表单 POST 过来PHP 把留言内容写进 message 表列表页再把所有留言按时间倒序查出来展示。真正需要动脑子的地方是“重复提交”也就是用户狂点提交按钮后出现多条一模一样的留言。这个问题不在数据库而在 HTTP 语义表单提交后页面没有跳转刷新时浏览器默认重新提交上一个请求。?php session_start(); require_once config.php; if ($_SERVER[REQUEST_METHOD] POST) { $content trim($_POST[content]); $uid $_SESSION[uid]; // 预处理插入留言 $stmt mysqli_prepare($conn, INSERT INTO message (uid, content) VALUES (?, ?)); mysqli_stmt_bind_param($stmt, is, $uid, $content); mysqli_stmt_execute($stmt); // 写入成功后重定向避免刷新页面重复插入 header(Location: message.php); exit; } ?这个模式叫 POST/Redirect/GET行业内用得非常多。mysqli_stmt_bind_param 的 is 表示第一个参数是整数uid第二个是字符串content绑定的类型必须与数据库字段类型一致否则 MySQL 在严格模式下可能报错。header 跳转之后紧跟 exit 是必要的目的是让当前脚本立即停止确保用户看到的是一次全新 GET 请求。留言列表的查询和同学信息列表同理多一个 JOIN user 取用户名。留言内容展示时务必用 htmlspecialchars 转义否则留言里塞一段 script 标签就能在你浏览器里弹弹窗。4. 部署到服务器把班级同学录网站从 localhost 变成在线网站4.1 本地跑通不算完服务器选型决定上线体验本地能打开只是第一步部署到公网服务器才算是真正“在线网站”。服务器选型要按预算和动手能力来分。学生党最常用的是轻量云服务器一个控制面板就能开机关机月费也就是一顿食堂饭钱更便宜的是虚拟主机几十块一年自带控制面板和 phpMyAdmin不用命令行适合完全不想碰 Linux 的人。我一般建议选云服务器因为课程设计答辩时需要演示部署过程光会说“传上去了”不够考官很可能问“你改了哪些配置才让外网访问到”。4.2 上传文件与目录权限最容易翻车的两张权限牌上传本身不难FTP 客户端拖拽就行用命令行的 scp 更快但要注意 Windows 用户用 scp 得先打开 PowerShell。文件传上去之后Linux 系统会用严格的权限机制管理这些文件跟 Windows 完全不同这也是很多新手从本地搬到服务器后突然访问报 403 的根源。# Mac/Linux 终端直接传整个目录到服务器 scp -r ./classmates root你的服务器IP:/var/www/html/ # 上传后统一修正权限文件 644目录 755 find /var/www/html/classmates -type f -exec chmod 644 {} \; find /var/www/html/classmates -type d -exec chmod 755 {} \;scp 命令里 -r 表示递归拷贝整个目录root 后面跟服务器 IP执行后会要求输入服务器密码。chmod 的含义要记牢644 表示文件所有者可读写、其他人只读这是 PHP 脚本的标准权限755 表示目录所有者可读可写可执行、其他人可读可执行。如果项目里有 upload 目录用于存放头像这个目录要额外执行 chmod -R 777 uploads或者给 www 用户单独授权否则 PHP 写入文件时会提示“Permission denied”。4.3 Nginx 还是 Apache老 PHP 项目选 Apache 更省心部署 PHP 网站时Apache 和 Nginx 各有一批拥趸。如果服务器是宝塔面板创建站点时默认就能选 Nginx 或 Apache对于这种原生 PHP 同学录项目Apache 是更省心的选择它能直接读取目录下的 .htaccess 文件很多老源码用 .htaccess 做伪静态和访问控制Nginx 默认不认这个文件。但如果是学生云服务器上已经装好的 Nginx 环境也不想重装那手动配一段 PHP 解析也很快。server { listen 80; server_name yourdomain.com; root /var/www/html/classmates; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; # 必须与 php-fpm 监听地址一致 } }server_name 要替换成你的真实域名或服务器 IP。root 指定的是项目目录也就是 index.php 所在的那一层写错一层就会出现 404。fastcgi_pass 127.0.0.1:9000 是 PHP-FPM 默认监听地址如果你的 PHP-FPM 配置改成了 socket 方式这里就要改成对应的 sock 路径比如 unix:/run/php/php7.4-fpm.sock。这一段配置最大的坑是 SCRIPT_FILENAME很多帖子抄来抄去没写这一行结果所有的 PHP 文件都返回空白页。4.4 上线后的功能验证从外网访问的第一步检查部署完成后不要急着把链接发同学群。先自己按用户路径把整个网站走一遍首页是否 200 → 注册新账号 → 登录 → 修改个人资料 → 发留言 → 退出登录全部通过再宣传。外网访问时常见的新问题是“能用 IP 访问但域名打不开”这不是代码问题而是域名解析和服务器安全组都没有放行去云厂商控制台里的安全组规则里确认 80 端口已入站放行。白屏问题在服务器上更隐蔽因为 php.ini 默认 display_errors 可能是 Off。碰到白屏第一时间在项目入口写一行临时调试代码?php ini_set(display_errors, 1); error_reporting(E_ALL); require_once config.php; // 后续业务代码... ?这说明一个排查思路先让错误显示出来再见招拆招。最常见的白屏原因按概率排序是PHP 扩展缺失mysqli 未安装、数据库密码不对、目录权限异常。逐项排查时可以先写一个只包含 phpinfo() 的文件放到服务器访问该文件确认 PHP 环境和扩展列表确认没事后再删掉这个文件绝不能留在正式环境里因为 phpinfo 页面会暴露服务器关键配置。5. 班级同学录网站常见问题5 条高频踩坑与排查5.1 环境类数据库连不上、PHP 页面白屏现象一本地首页能打开点登录就跳转到一个写着“数据库连接失败”的页面。原因config.php 里的登录参数和本机 MySQL 不一致最常见的是 DB_PASS 填错其次是 DB_NAME 指定了一个不存在的库再就是 MySQL 服务根本没有启动最后是 MySQL 8 的默认认证插件 caching_sha2_password 在 PHP 5.6 环境下无法兼容。这四个原因按顺序排查能命中九成场景。解决先打开 phpMyAdmin确认你手动设定的 MySQL 密码是什么然后改 config.php 里对应的 DB_PASS。再确认 phpMyAdmin 左侧列表里能看到你导入的库名。最后在 phpStudy 面板里把 MySQL 切换成 5.7 版本如果因为数据问题不好切换就在 MySQL 里把用户认证插件改成 mysql_native_password用一条 SQLALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY root;这条 SQL 的意思是把 root 账户的认证插件切换成老协议执行后在 PHP 5.6 下就能正常连接。改完记得刷新权限 flush privileges或者重启 MySQL 服务。建议排查时不改插件而是先降级 MySQL 版本因为改插件在部分云数据库上不允许执行。现象二访问项目根目录不是页面而是弹出下载框或直接白屏。原因Web 服务器没有把 .php 文件交给 PHP 解析器执行。Apache 场景下是 PHP 模块未启用Nginx 场景下是 fastcgi_pass 配置缺失或 SCRIPT_FILENAME 没传对。解决Apache 用户去 phpStudy 面板确认 Apache 已启动同时确认 PHP 扩展列表里 mysqli 已勾选Nginx 用户按上一章的配置段重点检查 fastcgi_pass 指向的 PHP-FPM 服务是否监听同一个端口或 socket。可以用一条命令测试 PHP-FPM 有没有在跑ps aux | grep php-fpm如果输出里没有任何 php-fpm 进程说明 PHP 服务根本没起来此时应该先把 PHP-FPM 启动而不是去改 Nginx 配置。这条命令在本地和服务器环境都通用。5.2 数据类中文乱码、刷新重复提交、图片不显示现象三注册时录入的中文姓名提交后页面上显示正常但打开 phpMyAdmin 一看表里是问号或乱码。原因字符集从浏览器到 PHP 到 MySQL 三端没有统一。最常见的是数据库表本身用了 latin1或者 config.php 里没有执行 mysqli_set_charset导致连接层默认字符集是 latin1写入时中文被转成问号。解决三步走。第一步把表改成 utf8mb4执行 ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci第二步在 config.php 的连接代码后加 mysqli_set_charset($conn, utf8mb4)第三步确认 HTML 页面 head 里有meta charsetutf-8标签。三处统一后新写入的中文不会再乱但已经乱掉的数据要手动清理或删除重录。现象四留言板里点了一次提交浏览器刷新一次页面数据库里就多一条一模一样的留言。原因这是典型的“刷新重复提交”根因不在 PHP 而在 HTTP 请求方式。POST 请求提交后浏览器地址栏没有变化用户按 F5 时浏览器会认为你要重新提交刚才的表单。解决在 insert 成功后加入 header(Location: message.php); exit; 这行代码把 POST 请求转成 GET 请求返回列表页。这个处理方式在 PHP 社区叫 Post/Redirect/Get英文简称 PRG是处理表单提交的事实标准。改完后刷新页面只会在地址栏重新 GET 一次列表数据不会重复插入。现象五同学信息里的头像图片在本地正常上传到服务器后图片裂了控制台显示 404但 FTP 里明明能看到文件。原因图片路径写的是相对路径比如 uploads/avatar/1.jpg而当前页面 URL 层级变深后相对路径解析的基准目录变了浏览器找不着文件。另一个常见原因是目录权限不对PHP 生成了文件但被系统拒读FTP 里能看到文件但 HTTP 访问 403。解决把图片地址统一改成可公网访问的绝对路径。最简单的方式是把 uploads 目录放在项目根目录下数据库中只存相对根目录的路径如 /classmates/uploads/avatar/1.jpg页面输出时加上域名前缀。同时用上一章的 chmod 命令把 uploads 目录权限设置成 755 或 777Nginx 和 Apache 都要确保对该目录有读权限。6. 把班级同学录网站做成能交差、能二次开发的样子6.1 交差前的功能验证清单答辩前给自己列一份逐项打钩的清单比临时翻代码靠谱得多。注册、登录、权限拦截、同学新增、同学编辑、同学删除、留言发布、留言列表、中文显示、图片上传这十项是核心加分项包括退出登录、管理员专属菜单、空数据提示。每一项按“操作 → 预期结果”过一遍预期结果描述得越具体答辩时越能体现出你真正跑过流程。验证项操作预期结果注册提交新用户名和密码跳转登录页数据库出现新记录登录用刚注册的账号登录跳转首页右上角显示用户名权限拦截未登录直接访问后台页跳转登录页并提示登录留言发布登录后提交留言列表页出现新留言刷新不重复中文编码姓名填“张三”页面和数据库均为正常中文6.2 三个必做的安全加固如果源码里全是直接拼接 SQL 的老写法上线前至少要补三处。第一处是 SQL 注入所有涉及参数拼接的查询改成预处理语句这是最核心的一道防线。第二处是密码存储如果表里 password 字段长度只有 32说明用的 md5把它改成 password_hash 存储、password_verify 校验字段长度扩到 255。第三处是 XSS 输出转义所有从数据库取出来再回显到 HTML 的内容都要套一层 htmlspecialchars。?php // 输出同学昵称时统一转义 echo htmlspecialchars($row[name], ENT_QUOTES, UTF-8); ?第三个参数 UTF-8 指定源字符串编码ENT_QUOTES 表示单引号和双引号都转义防止有人用昵称字段注入脚本标签。这三个改动量不大但对答辩安全类提问是有效的定心丸。6.3 再进一步这套代码能往哪改跑通以后往三个方向延伸最能体现工程能力加一个管理员后台把“删同学”“删留言”这类危险操作从普通页面挪进后台并做 role 权限校验把前端页面和数据接口拆开写一组返回 JSON 的 api.php 供手机端调用算是提前摸一下前后端分离的边界再把班级筛选、学号搜索做成搜索条件让列表页不再是单纯的分页。源码建站的核心从来不是把文件传上去然后用起来而是你能改得动、调得通、说得清。我第一次交课程设计时没先读文档就一头扎进代码里结果在数据库连接上耗了一整晚后来养成习惯先跑通最小闭环再改一行配置最后补细节。希望帮到你。本文还有配套的精品资源点击获取