12.3

四、核心功能开发(按模块逐步实现)
模块 1:数据库工具类(util 层,确保数据库连接)
创建com.student.daily.util.DBUtil.java,封装数据库连接与关闭操作,避免重复代码:
java
运行
package com.student.daily.util;

import java.sql.*;

/**

  • 数据库工具类

  • 班级:2023级XX班

  • 作者:XXX

  • 学号:2023XXXX

  • 日期:2024-12-27
    */
    public class DBUtil {
    // 数据库连接信息(需替换为自己的MySQL用户名和密码)
    private static final String URL = "jdbc:mysql://localhost:3306/daily_summary_db?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "你的MySQL密码";

    // 加载驱动(静态代码块,仅执行一次)
    static {
    try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    throw new RuntimeException("MySQL驱动加载失败!");
    }
    }

    // 获取数据库连接
    public static Connection getConnection() {
    try {
    return DriverManager.getConnection(URL, USER, PASSWORD);
    } catch (SQLException e) {
    e.printStackTrace();
    throw new RuntimeException("数据库连接失败!");
    }
    }

    // 关闭资源(ResultSet、PreparedStatement、Connection)
    public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
    try {
    if (rs != null) rs.close();
    if (pstmt != null) pstmt.close();
    if (conn != null) conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    模块 2:实体类(entity 层,映射数据库表)
    以User(人员信息)和DailyReport(日报信息)为例,创建实体类(使用 lombok 可简化 getter/setter,若未使用则手动编写):

  1. User.java
    java
    运行
    package com.student.daily.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**

  • 人员实体类(对应t_user表)
  • 班级:2023级XX班
  • 作者:XXX
  • 学号:2023XXXX
  • 日期:2024-12-27
    */
    @Data // 自动生成getter、setter、toString等方法
    @NoArgsConstructor // 无参构造
    @AllArgsConstructor // 全参构造
    public class User {
    private String userId; // 人员ID(学号/工号)
    private String userName; // 姓名
    private Integer userCategory;// 人员类别(0学生/1小组长/2教师)
    private Integer groupNo; // 组号
    }
  1. DailyReport.java
    java
    运行
    package com.student.daily.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**

  • 日报实体类(对应t_daily_report表)
  • 班级:2023级XX班
  • 作者:XXX
  • 学号:2023XXXX
  • 日期:2024-12-27
    */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class DailyReport {
    private Integer id; // 日报编号
    private String publishdate; // 发表时间(20241227)
    private String stuno; // 学号
    private String name; // 姓名
    private Integer spenttime; // 所花时间(小时)
    private Integer codeamount; // 代码量(行)
    private Integer blogsnumber; // 博客量(篇)
    private String knowledgepoints; // 知识点
    private String state; // 状态(待审批/通过/评分/退回)
    private Integer dailyscore; // 评分
    private String statereason; // 评语
    }
    模块 3:登录功能(核心入口,区分角色)
  1. DAO 层(UserDao.java):查询用户信息
    创建com.student.daily.dao.UserDao.java,实现根据userId和userCategory查询用户(登录验证逻辑):
    java
    运行
    package com.student.daily.dao;

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

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

/**

  • 用户DAO层(操作t_user表)

  • 班级:2023级XX班

  • 作者:XXX

  • 学号:2023XXXX

  • 日期:2024-12-27
    */
    public class UserDao {
    // 登录验证:根据userId(账号)和userCategory(角色)查询用户(注:实际项目需加密码字段,此处按题目需求简化)
    public User login(String userId, Integer userCategory) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    User user = null;
    // SQL:查询指定ID和角色的用户
    String sql = "SELECT user_id, user_name, user_category, group_no FROM t_user WHERE user_id = ? AND user_category = ?";

     try {
         conn = DBUtil.getConnection();
         pstmt = conn.prepareStatement(sql);
         pstmt.setString(1, userId);
         pstmt.setInt(2, userCategory);
         rs = pstmt.executeQuery();
         
         if (rs.next()) {
             // 封装查询结果为User对象
             user = new User();
             user.setUserId(rs.getString("user_id"));
             user.setUserName(rs.getString("user_name"));
             user.setUserCategory(rs.getInt("user_category"));
             user.setGroupNo(rs.getInt("group_no"));
         }
     } catch (SQLException e) {
         e.printStackTrace();
     } finally {
         DBUtil.close(rs, pstmt, conn);
     }
     return user; // 若查询不到,返回null(登录失败)
    

    }
    }

  1. Service 层(UserService.java):封装登录业务逻辑
    创建com.student.daily.service.UserService.java和实现类UserServiceImpl.java:
    java
    运行
    // UserService.java(接口)
    package com.student.daily.service;

import com.student.daily.entity.User;

public interface UserService {
// 登录方法:参数为账号(userId)、角色(userCategory),返回用户信息
User login(String userId, Integer userCategory);
}

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

import com.student.daily.dao.UserDao;
import com.student.daily.entity.User;
import com.student.daily.service.UserService;

// 业务层依赖DAO层,通过new创建DAO实例(实际项目可用Spring注入)
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDao();

@Override
public User login(String userId, Integer userCategory) {
    // 简单业务校验:账号不为空
    if (userId == null || userId.trim().isEmpty()) {
        return null;
    }
    // 调用DAO层方法查询用户
    return userDao.login(userId, userCategory);
}

}
3. Controller 层(LoginServlet.java):处理登录请求
创建com.student.daily.controller.LoginServlet.java,继承HttpServlet,处理前端登录请求:
java
运行
package com.student.daily.controller;

import com.student.daily.entity.User;
import com.student.daily.service.UserService;
import com.student.daily.service.impl.UserServiceImpl;

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("/login") // 配置Servlet访问路径
    public class LoginServlet extends HttpServlet {
    private UserService userService = new UserServiceImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 1. 设置请求编码(解决中文乱码)
    request.setCharacterEncoding("UTF-8");
    // 2. 获取前端传递的参数(账号、角色)
    String userId = request.getParameter("userId"); // 对应登录页输入框name="userId"
    String userCategoryStr = request.getParameter("userCategory"); // 角色(0/1/2)
    Integer userCategory = Integer.parseInt(userCategoryStr); // 转换为整数

     // 3. 调用Service层登录方法
     User user = userService.login(userId, userCategory);
     
     // 4. 处理登录结果
     if (user != null) {
         // 登录成功:将用户信息存入Session(用于后续权限判断)
         HttpSession session = request.getSession();
         session.setAttribute("loginUser", user);
         // 根据角色跳转至对应功能页
         if (userCategory == 0) { // 学生
             response.sendRedirect(request.getContextPath() + "/student/index.jsp");
         } else if (userCategory == 1) { // 小组长
             response.sendRedirect(request.getContextPath() + "/leader/index.jsp");
         } else if (userCategory == 2) { // 教师
             response.sendRedirect(request.getContextPath() + "/teacher/index.jsp");
         }
     } else {
         // 登录失败:返回登录页,提示错误信息
         request.setAttribute("errorMsg", "账号或角色错误,请重新选择!");
         request.getRequestDispatcher("/login.jsp").forward(request, response);
     }
    

    }

    // 处理GET请求(默认跳转登录页)
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
    }
    }

  1. 前端登录页面(login.jsp):用户交互界面
    在webapp目录下创建login.jsp,设计登录表单(包含账号输入框、角色下拉框、登录按钮):
    jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
每日总结管理系统 - 登录
posted @ 2026-01-14 19:31  muyuxiaxing  阅读(3)  评论(0)    收藏  举报