12.4

  1. 测试登录功能
    配置 Tomcat:点击 IDEA 右上角「Add Configuration」→「+」→「Tomcat Server」→「Local」,在「Deployment」标签页点击「+」→「Artifact」,选择项目的war包(如DailySummarySystem:war),点击「OK」。
    启动 Tomcat:点击「Run」按钮,等待服务器启动成功后,在浏览器访问http://localhost:8080/DailySummarySystem/login.jsp。
    输入测试数据:
    学生:账号20230001,角色选择「学生」,点击登录→跳转至学生首页。
    小组长:账号20230002,角色选择「小组长」→跳转至小组长首页。
    教师:账号02000069,角色选择「教师」→跳转至教师首页。
    模块 4:学生发表日报功能(核心业务之一)
  2. DAO 层(DailyReportDao.java):插入日报数据
    创建com.student.daily.dao.DailyReportDao.java,实现「判断当天是否已发表日报」和「插入日报」功能:
    java
    运行
    package com.student.daily.dao;

import com.student.daily.entity.DailyReport;
import com.student.daily.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**

  • 日报DAO层(操作t_daily_report表)

  • 班级:2023级XX班

  • 作者:XXX

  • 学号:2023XXXX

  • 日期:2024-12-27
    */
    public class DailyReportDao {
    // 1. 判断学生当天是否已发表日报(参数:学号、当天日期)
    public boolean isReportedToday(String stuno, String todayDate) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT id FROM t_daily_report WHERE stuno = ? AND publishdate = ?";

     try {
         conn = DBUtil.getConnection();
         pstmt = conn.prepareStatement(sql);
         pstmt.setString(1, stuno);
         pstmt.setString(2, todayDate);
         rs = pstmt.executeQuery();
         return rs.next(); // 若有结果,返回true(已发表)
     } catch (SQLException e) {
         e.printStackTrace();
     } finally {
         DBUtil.close(rs, pstmt, conn);
     }
     return false;
    

    }

    // 2. 插入日报数据(发表日报)
    public int addDailyReport(DailyReport dailyReport) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    String sql = "INSERT INTO t_daily_report (publishdate, stuno, name, spenttime, codeamount, blogsnumber, knowledgepoints, state) " +
    "VALUES (?, ?, ?, ?, ?, ?, ?, '待审批')"; // 初始状态为“待审批”

     try {
         conn = DBUtil.getConnection();
         pstmt = conn.prepareStatement(sql);
         // 给SQL参数赋值
         pstmt.setString(1, dailyReport.getPublishdate());
         pstmt.setString(2, dailyReport.getStuno());
         pstmt.setString(3, dailyReport.getName());
         pstmt.setInt(4, dailyReport.getSpenttime());
         pstmt.setInt(5, dailyReport.getCodeamount());
         pstmt.setInt(6, dailyReport.getBlogsnumber());
         pstmt.setString(7, dailyReport.getKnowledgepoints());
         
         return pstmt.executeUpdate(); // 返回影响行数(1表示成功)
     } catch (SQLException e) {
         e.printStackTrace();
     } finally {
         DBUtil.close(null, pstmt, conn);
     }
     return 0; // 插入失败
    

    }
    }

  1. Service 层(DailyReportService.java):封装发表日报逻辑
    java
    运行
    // DailyReportService.java(接口)
    package com.student.daily.service;

import com.student.daily.entity.DailyReport;

public interface DailyReportService {
// 判断当天是否已发表
boolean isReportedToday(String stuno, String todayDate);
// 发表日报
boolean addDailyReport(DailyReport dailyReport);
}

// DailyReportServiceImpl.java(实现类)
package com.student.daily.service.impl;

import com.student.daily.dao.DailyReportDao;
import com.student.daily.entity.DailyReport;
import com.student.daily.service.DailyReportService;

public class DailyReportServiceImpl implements DailyReportService {
private DailyReportDao dailyReportDao = new DailyReportDao();

@Override
public boolean isReportedToday(String stuno, String todayDate) {
    return dailyReportDao.isReportedToday(stuno, todayDate);
}

@Override
public boolean addDailyReport(DailyReport dailyReport) {
    // 业务校验:知识点不能为空(否则形式审核不通过,此处提前校验)
    if (dailyReport.getKnowledgepoints() == null || dailyReport.getKnowledgepoints().trim().isEmpty()) {
        return false;
    }
    // 调用DAO层插入数据
    return dailyReportDao.addDailyReport(dailyReport) > 0;
}

}
3. 工具类:日期格式化(获取当天日期)
创建com.student.daily.util.DateUtil.java,用于生成「yyyyMMdd」格式的当天日期(如 20241227):
java
运行
package com.student.daily.util;

import java.text.SimpleDateFormat;
import java.util.Date;

/**

  • 日期工具类
  • 班级:2023级XX班
  • 作者:XXX
  • 学号:2023XXXX
  • 日期:2024-12-27
    */
    public class DateUtil {
    // 获取当天日期(格式:yyyyMMdd)
    public static String getTodayDate() {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    return sdf.format(new Date());
    }
    }
  1. Controller 层(AddDailyServlet.java):处理发表日报请求
    java
    运行
    package com.student.daily.controller;

import com.student.daily.entity.DailyReport;
import com.student.daily.entity.User;
import com.student.daily.service.DailyReportService;
import com.student.daily.service.impl.DailyReportServiceImpl;
import com.student.daily.util.DateUtil;

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;

/**

  • 发表日报Servlet

  • 班级:2023级XX班

  • 作者:XXX

  • 学号:2023XXXX

  • 日期:2024-12-27
    */
    @WebServlet("/student/addDaily")
    public class AddDailyServlet extends HttpServlet {
    private DailyReportService dailyReportService = new DailyReportServiceImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    // 1. 从Session中获取当前登录学生信息(避免前端传递姓名/学号,保证数据安全)
    HttpSession session = request.getSession();
    User loginUser = (User) session.getAttribute("loginUser");
    if (loginUser == null) {
    // 未登录,跳转至登录页
    response.sendRedirect(request.getContextPath() + "/login.jsp");
    return;
    }
    String stuno = loginUser.getUserId(); // 学号
    String name = loginUser.getUserName(); // 姓名

     // 2. 获取前端传递的日报数据(所花时间、代码量等)
     Integer spenttime = Integer.parseInt(request.getParameter("spenttime"));
     Integer codeamount = Integer.parseInt(request.getParameter("codeamount"));
     Integer blogsnumber = Integer.parseInt(request.getParameter("blogsnumber"));
     String knowledgepoints = request.getParameter("knowledgepoints");
    
     // 3. 生成当天日期(不可编辑)
     String todayDate = DateUtil.getTodayDate();
    
     // 4. 判断当天是否已发表日报
     if (dailyReportService.isReportedToday(stuno, todayDate)) {
         // 已发表,返回发表页提示
         request.setAttribute("msg", "今日已发表日报,不可重复提交!");
         request.getRequestDispatcher("/student/addDaily.jsp").forward(request, response);
         return;
     }
    
     // 5. 封装日报实体类
     DailyReport dailyReport = new DailyReport();
     dailyReport.setPublishdate(todayDate);
     dailyReport.setStuno(stuno);
     dailyReport.setName(name);
     dailyReport.setSpenttime(spenttime);
     dailyReport.setCodeamount(codeamount);
     dailyReport.setBlogsnumber(blogsnumber);
     dailyReport.setKnowledgepoints(knowledgepoints);
    
     // 6. 调用Service层发表日报
     boolean isSuccess = dailyReportService.addDailyReport(dailyReport);
     if (isSuccess) {
         // 发表成功,跳转至日报列表页
         response.sendRedirect(request.getContextPath() + "/student/listDaily.jsp");
     } else {
         // 发表失败(如知识点为空),返回发表页
         request.setAttribute("msg", "知识点不能为空,请填写具体内容!");
         request.getRequestDispatcher("/student/addDaily.jsp").forward(request, response);
     }
    

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    }

  1. 学生发表日报页面(addDaily.jsp)
    在webapp/student目录下创建addDaily.jsp:
    jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
学生 - 发表日报
<h3>发表今日日报</h3>
<form action="${pageContext.request.contextPath}/student/addDaily" method="post">
    <div class="form-item">
        <label>发表时间:</label>
        <input type="text" value="${com.student.daily.util.DateUtil.getTodayDate()}" readonly>
        <!-- 日期自动生成,不可编辑 -->
    </div>
    <div class="form-item">
        <label>所花时间(小时):</label>
        <input type="number" name="spenttime" required min="0">
    </div>
    <div class="form-item">
        <label>代码量(行):</label>
        <input type="number" name="codeamount" required min="0">
    </div>
    <div class="form-item">
        <label>博客量(篇):</label>
        <input type="number" name="blogsnumber" required min="0">
    </div>
    <div class="form-item">
        <label>所学知识点:</label>
        <textarea name="knowledgepoints" required placeholder="请填写具体知识点,如:Java多线程、MySQL索引..."></textarea>
    </div>
    <div class="form-item">
        <input type="submit" class="btn-submit" value="提交日报">
    </div>
    <div class="msg">${msg}</div>
</form>
posted @ 2026-01-14 19:33  muyuxiaxing  阅读(0)  评论(0)    收藏  举报