12.8
学生日报管理系统(多角色版)开发与问题排查通用模板
一、系统概述
- 功能定位
面向校园场景的日报管理系统,实现「学生发表日报→小组长审核→教师评分」全流程,支持多角色权限管控(学生 / 小组长 / 教师)。 - 角色分工
角色 核心功能 权限边界
学生 发表日报、查看个人日报列表 仅操作本人数据
小组长 审核本组待审批日报(通过 / 退回) 仅操作本组学生的待审批日报
教师 评分已通过审核的日报 仅操作 “通过” 状态的未评分日报
二、代码分层与文件放置规范 - 项目目录结构(Maven Web 标准)
plaintext
src/
└── main/
├── java/ # 后端代码
│ └── 根包/ # 示例:com.school.daily
│ ├── dao/ # 数据访问层(接口)
│ │ └── impl/ # DAO实现类
│ ├── service/ # 业务逻辑层(接口)
│ │ └── impl/ # Service实现类
│ ├── controller/ # Servlet控制层
│ ├── entity/ # 实体类(DailyReport/User等)
│ └── util/ # 工具类(DBUtil等)
└── webapp/ # 前端页面
├── student/ # 学生专属页面
├── leader/ # 小组长专属页面
├── teacher/ # 教师专属页面
└── WEB-INF/ # 配置文件(可选) - 核心文件放置规则
功能模块 文件类型 放置路径示例
学生发表日报 Servlet com.school.daily.controller.PublishDailyReportServlet
小组长审核日报 JSP 页面 webapp/leader/auditDailyReport.jsp
教师评分 Service 接口 com.school.daily.service.DailyReportService
日报实体 实体类 com.school.daily.entity.DailyReport
三、核心功能实现模板 - 通用编码规范
包名、类名统一使用驼峰命名(如LeaderAuditServlet);
数据库操作统一封装到 DAO 层,禁止 Servlet 直接操作数据库;
页面路径统一硬编码(或正确解析 EL 表达式),避免 404:
jsp
审核日报
2. 各角色核心代码模板
(1)学生发表日报(Servlet 核心逻辑)
java
运行
package 根包.controller;
import 根包.entity.DailyReport;
import 根包.entity.User;
import 根包.service.DailyReportService;
import 根包.service.impl.DailyReportServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/student/publishDailyReport")
public class PublishDailyReportServlet extends HttpServlet {
private DailyReportService dailyReportService = new DailyReportServiceImpl();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 权限校验
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
User loginUser = (User) session.getAttribute("loginUser");
if (loginUser == null || loginUser.getUserCategory() != 0) { // 0=学生
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
// 2. 封装日报数据
DailyReport dailyReport = new DailyReport();
dailyReport.setStuno(loginUser.getUserId());
dailyReport.setName(loginUser.getUserName());
dailyReport.setSpenttime(Integer.parseInt(request.getParameter("spenttime")));
dailyReport.setCodeamount(Integer.parseInt(request.getParameter("codeamount")));
dailyReport.setBlogsnumber(Integer.parseInt(request.getParameter("blogsnumber")));
dailyReport.setKnowledgepoints(request.getParameter("knowledgepoints"));
dailyReport.setPublishdate(new SimpleDateFormat("yyyyMMdd").format(new Date()));
dailyReport.setState("待审批");
// 3. 调用Service发表
int result = dailyReportService.publishDailyReport(dailyReport);
if (result > 0) {
response.sendRedirect(request.getContextPath() + "/student/myDailyReports.jsp");
} else {
request.setAttribute("errorMsg", "发表失败,请重试!");
request.getRequestDispatcher("/student/publishDailyReport.jsp").forward(request, response);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
(2)小组长审核日报(DAO 核心逻辑)
java
运行
package 根包.dao.impl;
import 根包.dao.DailyReportDao;
import 根包.entity.DailyReport;
import 根包.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class DailyReportDaoImpl implements DailyReportDao {
// 查询本组待审核日报
@Override
public List
List
String sql = "SELECT r.* FROM t_daily_report r JOIN t_user u ON r.stuno = u.user_id WHERE u.group_no = ? AND r.state = '待审批'";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, groupNo);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
DailyReport report = new DailyReport();
// 封装字段(id/publishdate/stuno等)
report.setId(rs.getInt("id"));
report.setPublishdate(rs.getString("publishdate"));
report.setStuno(rs.getString("stuno"));
report.setName(rs.getString("name"));
report.setSpenttime(rs.getInt("spenttime"));
report.setCodeamount(rs.getInt("codeamount"));
report.setBlogsnumber(rs.getInt("blogsnumber"));
report.setKnowledgepoints(rs.getString("knowledgepoints"));
list.add(report);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
// 审核日报(更新状态)
@Override
public int auditDailyReport(Integer id, String state, String statereason) {
String sql = "UPDATE t_daily_report SET state = ?, statereason = ? WHERE id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, state);
pstmt.setString(2, statereason);
pstmt.setInt(3, id);
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
}
}
}
(3)教师评分日报(Service 核心逻辑)
java
运行
package 根包.service.impl;
import 根包.dao.DailyReportDao;
import 根包.dao.impl.DailyReportDaoImpl;
import 根包.entity.DailyReport;
import 根包.service.DailyReportService;
import java.util.List;
public class DailyReportServiceImpl implements DailyReportService {
private DailyReportDao dailyReportDao = new DailyReportDaoImpl();
// 查询待评分日报
@Override
public List<DailyReport> getPendingScoreReports() {
return dailyReportDao.queryPendingScoreReports();
}
// 评分(校验逻辑)
@Override
public int scoreDailyReport(Integer id, Integer dailyscore, String statereason) {
// 校验:分数0-100、ID非空
if (id == null || dailyscore == null || dailyscore < 0 || dailyscore > 100) {
return 0;
}
return dailyReportDao.scoreDailyReport(id, dailyscore, statereason);
}
}
四、常见问题排查模板
- 编译错误排查
错误现象 核心原因 解决步骤
找不到符号(如 DailyReport) 未导入实体类 / 类名拼写错误 1. 添加导入语句:import 根包.entity.DailyReport;;2. 检查类名拼写;3. 清理重建项目
找不到方法(如 publishDailyReport) Service/DAO 方法未定义 1. 检查接口是否声明该方法;2. 检查实现类是否重写方法;3. 确认方法名大小写一致 - 运行时错误排查
错误现象 核心原因 解决步骤
404 页面未找到 路径错误 / 文件缺失 1. 核对 Servlet 注解路径与页面跳转路径;2. 检查 JSP 文件是否在指定目录;3. 替换为硬编码上下文路径
日报提交后不显示 数据未入库 / 查询逻辑错误 1. 打印 DAO 层 SQL 执行结果,确认数据是否入库;2. 检查查询条件(学号 / 小组号 / 状态);3. 验证数据库字段映射
权限越权访问 权限校验缺失 1. 在 Servlet 开头添加角色校验;2. 确认 User 实体的 userCategory 字段赋值正确 - 数据显示异常排查流程
plaintext - 验证数据是否入库:执行SQL查询t_daily_report表,确认有对应数据;
- 验证查询逻辑:检查DAO层SQL的WHERE条件(如学号/小组号/状态);
- 验证权限关联:检查t_user表中角色的group_no/userCategory字段是否赋值;
- 验证页面渲染:检查JSP的c:forEach标签是否正确遍历${dailyReports}等参数;
- 清理缓存:重启Tomcat+浏览器强制刷新,排除缓存干扰。
五、测试与上线验证模板 - 全流程测试用例
测试步骤 预期结果
学生登录→发表日报 数据库 t_daily_report 新增数据,状态为 “待审批”
小组长登录→审核通过 日报状态更新为 “通过”,学生端可查
教师登录→评分 日报 dailyscore/statereason 字段赋值,状态为 “评分”
非对应角色访问页面 重定向到登录页 - 上线前检查清单
所有编译错误已修复,项目可正常编译;
数据库表结构与实体类字段完全匹配;
各角色路径权限校验完整;
页面路径无硬编码(或上下文路径正确);
关键操作添加日志 / 错误提示,无空白页面;
边界条件(如评分超范围、数据为空)已处理。
六、扩展优化模板 - 功能扩展方向
消息通知:日报审核 / 评分后推送提示给学生;
数据统计:按小组 / 时间维度统计学习数据;
分页查询:日报列表添加分页,优化大数据量加载;
导出报表:支持导出日报数据为 Excel。 - 技术优化方向
引入前端框架(Bootstrap/Vue)美化页面;
使用日志框架(Log4j)替代 System.out.println;
配置文件分离(数据库参数 / 上下文路径);
增加事务管理,避免数据不一致。

浙公网安备 33010602011771号