11.14 完成项目计划管理系统(idea中使用Mysql(9.4)Tomcat(11)jdk(21.0.8)) - GENGAR

news/2025/11/14 12:37:22/文章来源:https://www.cnblogs.com/NekrosPrime/p/19221131

一.
创建项目
注意:项目属性选择java 构建系统选择Maven 演示图片所用jdk版本为21.0.8
image

二.
连接数据库
注意:演示图片Mysql版本为9.4 确保数据库已经打开
(1)首先检查Mysql是否已经打开
同时按住win+R,显示如下界面,输入services.msc
image

进入后找到Mysql 显示如下界面则已经成功打开
image

(2)在idea中接入Mysql
在项目右侧找到DataBase按键,打开后显示如下
image

点击左上角加号,选择Data Source,选择其中的Mysql
image

打开后可以选择更改名字,然后填入User(一般为root),再输入Password(你的Mysql密码)
image

填完后点击下方的Test Connection,若显示如下图所示,则连接成功,点击Applay和OK后返回即可
image

三.
部署Tomcat
注意:演示图片所用Tomcat版本为11版

选择Project Structure创建Artifact
image

选择From moudles后选择此项目
image

上方选择Edit configurations
image

进入后点击左上角加号,进去后寻找Tomcat Server
image

application server选择你的Tomcat安装的位置
image

点击Deployment,选择加号添加Artifact,选择之前创建好的Artifact
image

四.
搭建项目结构
如下图所示
image
文件说明:
1.配置文件:
pom.xml :项目的Maven配置文件 定义项目的基本信息和依赖库(Servlet API、Mysql驱动 )
db.properties:数据库连接配置文件 存储数据库中的URL、用户名和密码,用于DBUtil类加载,建立和管理数据库连接
2.实体类(Bean)
Project.java:项目实体类,封装项目所有属性(项目ID、名称、位置等),提供构造方法,getter和setter方法
DBUtil.java:数据库工具类,负责数据库的创建,通过静态代码加载db.properties配置,提供getConnection()方法获取数据库连接,提供close()方法关闭数据库
3.数据访问层(DAO):
ProjectDao.java:项目数据访问对象,封装与项目相关的数据库操作,主要方法addProject():项目立项(插入数据)、getProjectByNo()根据项目编号查询项、updateProject():修改项目信息、deleteProject()删除项目、auditProject():审核项目、fuzzyQuery():多条件模糊查询项目
4.过滤器(Filter)
主要用于解决中文乱码问题,确保系统能够正确处理中文数据
5.控制器层(servlet)
MainServlet:系统的入口控制器,负责将用户请求转发到主页面
ProjectCreateServlet:处理项目立项功能,包括显示表单和提交数据
ProjectAuditServlet:处理项目审核功能,包括项目查询和审核操作
ProjectUpdateServlet:处理项目信息修改功能
ProjectDeleteServlet:处理项目删除功能
6. 视图层(JSP页面)
main.jsp:系统的主页面,提供功能菜单入口,包含四个主要功能模块的导航链接:项目立项、修改项目、删除项目、项目审核
createProject.jsp:项目立项信息录入页面
auditProject.jsp:项目审核管理页面
updateProject.jsp:项目信息更新页面
deleteProject.jsp:项目删除页面

五. 文件内容
1.bean
(1.DBUtil)
`package com.project.bean;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DBUtil {
private static String driver;
private static String url;
private static String username;
private static String password;

static {try (InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties")) {Properties prop = new Properties();prop.load(is);driver = prop.getProperty("driver");url = prop.getProperty("url");username = prop.getProperty("username");password = prop.getProperty("password");Class.forName(driver);} catch (Exception e) {throw new RuntimeException("数据库配置加载失败", e);}
}public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);
}public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {try {if (rs != null) rs.close();if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}
}

}(2.Project)package com.project.bean;

import java.sql.Date;

public class Project {
private String projectId;
private String projectName;
private String projectLocation;
private String projectType;
private int totalInvestment;
private int currentInvestment;
private Date startDate;
private Date endDate;
private String constructionContent;
private int auditStatus;
private String auditOpinion;

// 构造方法
public Project(String projectId, String projectName, String projectLocation, String projectType,int totalInvestment, int currentInvestment, Date startDate, Date endDate,String constructionContent) {this.projectId = projectId;this.projectName = projectName;this.projectLocation = projectLocation;this.projectType = projectType;this.totalInvestment = totalInvestment;this.currentInvestment = currentInvestment;this.startDate = startDate;this.endDate = endDate;this.constructionContent = constructionContent;this.auditStatus = 0;this.auditOpinion = null;
}// 所有字段的 Getter/Setter 方法
public String getProjectId() { return projectId; }
public void setProjectId(String projectId) { this.projectId = projectId; }public String getProjectName() { return projectName; }
public void setProjectName(String projectName) { this.projectName = projectName; }public String getProjectLocation() { return projectLocation; }
public void setProjectLocation(String projectLocation) { this.projectLocation = projectLocation; }public String getProjectType() { return projectType; }
public void setProjectType(String projectType) { this.projectType = projectType; }public int getTotalInvestment() { return totalInvestment; }
public void setTotalInvestment(int totalInvestment) { this.totalInvestment = totalInvestment; }public int getCurrentInvestment() { return currentInvestment; }
public void setCurrentInvestment(int currentInvestment) { this.currentInvestment = currentInvestment; }public Date getStartDate() { return startDate; }
public void setStartDate(Date startDate) { this.startDate = startDate; }public Date getEndDate() { return endDate; }
public void setEndDate(Date endDate) { this.endDate = endDate; }public String getConstructionContent() { return constructionContent; }
public void setConstructionContent(String constructionContent) { this.constructionContent = constructionContent; }public int getAuditStatus() { return auditStatus; }
public void setAuditStatus(int auditStatus) { this.auditStatus = auditStatus; }public String getAuditOpinion() { return auditOpinion; }
public void setAuditOpinion(String auditOpinion) { this.auditOpinion = auditOpinion; }

}`

2.dao
(ProjectDao)
`package com.project.dao;

import com.project.bean.DBUtil;
import com.project.bean.Project;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class ProjectDao {
// 项目立项(插入数据)
public boolean addProject(Project project) throws SQLException {
String sql = "INSERT INTO project (project_id, project_name, project_location, project_type, " +
"total_investment, current_investment, start_date, end_date, construction_content, " +
"audit_status, audit_opinion) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, project.getProjectId());
pstmt.setString(2, project.getProjectName());
pstmt.setString(3, project.getProjectLocation());
pstmt.setString(4, project.getProjectType());
pstmt.setInt(5, project.getTotalInvestment());
pstmt.setInt(6, project.getCurrentInvestment());
pstmt.setDate(7, project.getStartDate());
pstmt.setDate(8, project.getEndDate());
pstmt.setString(9, project.getConstructionContent());
pstmt.setInt(10, project.getAuditStatus());
pstmt.setString(11, project.getAuditOpinion());
return pstmt.executeUpdate() > 0;
} finally {
DBUtil.close(conn, pstmt, null);
}
}

// 根据项目编号查询项目
public Project getProjectByNo(String projectId) throws SQLException {String sql = "SELECT * FROM project WHERE project_id = ?";Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, projectId);rs = pstmt.executeQuery();if (rs.next()) {Project project = new Project(rs.getString("project_id"),rs.getString("project_name"),rs.getString("project_location"),rs.getString("project_type"),rs.getInt("total_investment"),rs.getInt("current_investment"),rs.getDate("start_date"),rs.getDate("end_date"),rs.getString("construction_content"));project.setAuditStatus(rs.getInt("audit_status"));project.setAuditOpinion(rs.getString("audit_opinion"));return project;}return null;} finally {DBUtil.close(conn, pstmt, rs);}
}// 修改项目(仅更新未审核项目的非关键字段)
public boolean updateProject(Project project) throws SQLException {String sql = "UPDATE project SET current_investment = ?, start_date = ?, end_date = ?, " +"construction_content = ? WHERE project_id = ? AND audit_status = 0";Connection conn = null;PreparedStatement pstmt = null;try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setInt(1, project.getCurrentInvestment());pstmt.setDate(2, project.getStartDate());pstmt.setDate(3, project.getEndDate());pstmt.setString(4, project.getConstructionContent());pstmt.setString(5, project.getProjectId());return pstmt.executeUpdate() > 0;} finally {DBUtil.close(conn, pstmt, null);}
}// 删除项目(仅删除未审核项目)
public boolean deleteProject(String projectId) throws SQLException {String sql = "DELETE FROM project WHERE project_id = ? AND audit_status = 0";Connection conn = null;PreparedStatement pstmt = null;try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, projectId);return pstmt.executeUpdate() > 0;} finally {DBUtil.close(conn, pstmt, null);}
}// 审核项目(更新审核状态与意见)
public boolean auditProject(String projectId, int auditStatus, String auditOpinion) throws SQLException {String sql = "UPDATE project SET audit_status = ?, audit_opinion = ? WHERE project_id = ?";Connection conn = null;PreparedStatement pstmt = null;try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setInt(1, auditStatus);pstmt.setString(2, auditOpinion);pstmt.setString(3, projectId);return pstmt.executeUpdate() > 0;} finally {DBUtil.close(conn, pstmt, null);}
}// 多条件模糊查询项目
public List<Project> fuzzyQuery(String projectId, String projectName) throws SQLException {String sql = "SELECT * FROM project WHERE 1=1";List<Object> params = new ArrayList<>();if (projectId != null && !projectId.isEmpty()) {sql += " AND project_id LIKE ?";params.add("%" + projectId + "%");}if (projectName != null && !projectName.isEmpty()) {sql += " AND project_name LIKE ?";params.add("%" + projectName + "%");}Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;List<Project> projectList = new ArrayList<>();try {conn = DBUtil.getConnection();pstmt = conn.prepareStatement(sql);for (int i = 0; i < params.size(); i++) {pstmt.setObject(i + 1, params.get(i));}rs = pstmt.executeQuery();while (rs.next()) {Project project = new Project(rs.getString("project_id"),rs.getString("project_name"),rs.getString("project_location"),rs.getString("project_type"),rs.getInt("total_investment"),rs.getInt("current_investment"),rs.getDate("start_date"),rs.getDate("end_date"),rs.getString("construction_content"));project.setAuditStatus(rs.getInt("audit_status"));project.setAuditOpinion(rs.getString("audit_opinion"));projectList.add(project);}return projectList;} finally {DBUtil.close(conn, pstmt, rs);}
}

}`

3.filter
(CharacterEncodingFilter)
`package com.project.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;

/**

  • 自定义字符编码过滤器

  • 用于解决中文乱码问题
    */
    public class CharacterEncodingFilter implements Filter {
    private String encoding = "UTF-8";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    // 从web.xml中获取编码参数
    String encodingParam = filterConfig.getInitParameter("encoding");
    if (encodingParam != null && !encodingParam.trim().isEmpty()) {
    this.encoding = encodingParam;
    }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
    // 设置请求和响应的字符编码
    request.setCharacterEncoding(encoding);
    response.setCharacterEncoding(encoding);
    response.setContentType("text/html;charset=" + encoding);

     // 继续执行过滤器链chain.doFilter(request, response);
    

    }

    @Override
    public void destroy() {
    // 过滤器销毁时的清理工作
    }
    }`

4.servlet
(1.MainServlet)
`package com.project.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/main")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("main.jsp").forward(req, resp);
}
}`

(2.ProjectAuditServlet)
`package com.project.servlet;

import com.project.bean.Project;
import com.project.dao.ProjectDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

@WebServlet("/auditProject")
public class ProjectAuditServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(ProjectAuditServlet.class);
private final ProjectDao projectDao = new ProjectDao();

// 处理GET请求:显示审核页面,支持多条件模糊查询
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");// 获取查询条件(项目编号、项目名称,支持模糊查询)String projectId = req.getParameter("projectId");String projectName = req.getParameter("projectName");List<Project> projectList = null;String errorMsg = "";try {// 调用DAO执行模糊查询(无条件时查询所有项目)projectList = projectDao.fuzzyQuery(projectId, projectName);} catch (SQLException e) {logger.error("项目查询异常", e);errorMsg = "查询失败:系统错误,请重试";}// 回显查询条件和结果到页面req.setAttribute("projectList", projectList);req.setAttribute("errorMsg", errorMsg);req.setAttribute("echoProjectId", projectId);req.setAttribute("echoProjectName", projectName);req.getRequestDispatcher("auditProject.jsp").forward(req, resp);
}// 处理POST请求:执行审核操作(同意/不同意)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");// 获取审核参数String projectId = req.getParameter("projectId");String auditStatusStr = req.getParameter("auditStatus"); // 1-同意,2-不同意String auditOpinion = req.getParameter("auditOpinion");String errorMsg = "";String successMsg = "";// 参数校验if (projectId == null || projectId.isEmpty() || auditStatusStr == null) {errorMsg = "参数错误:未指定项目或审核状态";} else {try {int auditStatus = "1".equals(auditStatusStr) ? 1 : 0; // 1-已审核(同意),0-未审核(逻辑保留,实际用状态区分)// 不同意时必须填写审核意见if ("2".equals(auditStatusStr) && (auditOpinion == null || auditOpinion.trim().isEmpty())) {errorMsg = "审核不同意时,必须填写审核意见";} else {// 执行审核(更新审核状态为1,无论同意/不同意均标记为“已审核”)boolean isAudited = projectDao.auditProject(projectId,1, // 审核状态:1-已审核(区分于0-未审核)"1".equals(auditStatusStr) ? "同意" : auditOpinion // 同意时意见为“同意”,不同意时为用户输入);if (isAudited) {successMsg = "项目【" + projectId + "】审核成功";} else {errorMsg = "审核失败:项目不存在或已被删除";}}} catch (SQLException e) {logger.error("项目审核异常", e);errorMsg = "审核失败:系统错误,请重试";}}// 审核后重新查询并跳转回审核页面,显示结果req.setAttribute("successMsg", successMsg);req.setAttribute("errorMsg", errorMsg);// 回显查询条件(保持用户之前的查询状态)req.setAttribute("echoProjectId", req.getParameter("echoProjectId"));req.setAttribute("echoProjectName", req.getParameter("echoProjectName"));doGet(req, resp); // 复用GET方法的查询逻辑
}

}`

(3.ProjectCreateServlet)
`package com.project.servlet;

import com.project.bean.Project;
import com.project.dao.ProjectDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

@WebServlet("/createProject")
public class ProjectCreateServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(ProjectCreateServlet.class);
private final ProjectDao projectDao = new ProjectDao();
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 项目编号规则:8位数字(前4位“年+月”,如2410代表2024年10月,后4位序号)
private final Pattern projectIdPattern = Pattern.compile("^\d{4}\d{4}$");
// 项目位置规则:省市区三级(如“河北省石家庄市长安区XX路”)
private final Pattern locationPattern = Pattern.compile("^.{2,}省.{2,}市.{2,}区.*$");

// 处理GET请求:显示立项表单页面
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.getRequestDispatcher("createProject.jsp").forward(req, resp);
}// 处理POST请求:提交立项数据并入库
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");// 1. 获取表单参数String projectId = req.getParameter("projectId");String projectName = req.getParameter("projectName");String projectLocation = req.getParameter("projectLocation");String projectType = req.getParameter("projectType");String totalInvestmentStr = req.getParameter("totalInvestment");String currentInvestmentStr = req.getParameter("currentInvestment");String startDateStr = req.getParameter("startDate");String endDateStr = req.getParameter("endDate");String constructionContent = req.getParameter("constructionContent");// 2. 参数校验(格式+逻辑)String errorMsg = "";// 项目编号校验if (projectId == null || !projectIdPattern.matcher(projectId).matches()) {errorMsg = "项目编号格式错误(8位数字,前4位年+月,后4位序号,如24100130)";}// 项目名称校验(非空+长度≤50字)else if (projectName == null || projectName.trim().isEmpty() || projectName.length() > 50) {errorMsg = "项目名称不能为空且长度不超过50个汉字";}// 项目位置校验(符合省市区格式)else if (projectLocation == null || !locationPattern.matcher(projectLocation).matches()) {errorMsg = "项目位置格式错误(需包含省、市、区,如“河北省石家庄市长安区XX路”)";}// 项目属性校验(必选)else if (projectType == null || projectType.trim().isEmpty()) {errorMsg = "请选择项目属性";}// 投资金额转换与校验(正整数)Integer totalInvestment = null, currentInvestment = null;try {totalInvestment = Integer.parseInt(totalInvestmentStr);currentInvestment = Integer.parseInt(currentInvestmentStr);if (totalInvestment <= 0 || currentInvestment < 0 || currentInvestment > totalInvestment) {errorMsg = "总投资需为正数,已投资需≥0且≤总投资";}} catch (NumberFormatException e) {errorMsg = "总投资和已投资需为整数";}// 日期转换与校验(开工日期≤竣工日期)Date startDate = null, endDate = null;try {startDate = new Date(sdf.parse(startDateStr).getTime());endDate = new Date(sdf.parse(endDateStr).getTime());if (startDate.after(endDate)) {errorMsg = "开工日期不能晚于竣工日期";}} catch (ParseException e) {logger.error("日期解析异常", e);errorMsg = "日期格式错误(需yyyy-MM-dd)";}// 建设内容校验(非空+长度≤500字)if (errorMsg.isEmpty() && (constructionContent == null || constructionContent.trim().isEmpty() || constructionContent.length() > 500)) {errorMsg = "建设内容不能为空且长度不超过500个汉字";}// 3. 校验失败:返回表单页面并显示错误if (!errorMsg.isEmpty()) {req.setAttribute("errorMsg", errorMsg);// 回显表单数据(避免用户重新输入)req.setAttribute("echoProjectId", projectId);req.setAttribute("echoProjectName", projectName);req.setAttribute("echoProjectLocation", projectLocation);req.setAttribute("echoProjectType", projectType);req.setAttribute("echoTotalInvestment", totalInvestmentStr);req.setAttribute("echoCurrentInvestment", currentInvestmentStr);req.setAttribute("echoStartDate", startDateStr);req.setAttribute("echoEndDate", endDateStr);req.setAttribute("echoConstructionContent", constructionContent);req.getRequestDispatcher("createProject.jsp").forward(req, resp);return;}// 4. 校验成功:封装实体并入库try {Project project = new Project(projectId,projectName,projectLocation,projectType,totalInvestment,currentInvestment,startDate,endDate,constructionContent);// 检查项目编号是否已存在if (projectDao.getProjectByNo(projectId) != null) {errorMsg = "项目编号已存在,请更换";req.setAttribute("errorMsg", errorMsg);req.getRequestDispatcher("createProject.jsp").forward(req, resp);return;}// 执行插入boolean isSuccess = projectDao.addProject(project);if (isSuccess) {// 立项成功后跳转审核页面,默认查询当前项目resp.sendRedirect(req.getContextPath() + "/auditProject?projectId=" + projectId);} else {errorMsg = "立项失败,请重试";req.setAttribute("errorMsg", errorMsg);req.getRequestDispatcher("createProject.jsp").forward(req, resp);}} catch (Exception e) {logger.error("项目立项异常", e);errorMsg = "系统错误,立项失败";req.setAttribute("errorMsg", errorMsg);req.getRequestDispatcher("createProject.jsp").forward(req, resp);}
}

}`

(4.ProjectDeleteServlet)
`package com.project.servlet;

import com.project.bean.Project;
import com.project.dao.ProjectDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

@WebServlet("/deleteProject")
public class ProjectDeleteServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(ProjectDeleteServlet.class);
private final ProjectDao projectDao = new ProjectDao();
// 项目编号规则:8位数字(与立项功能保持一致)
private final String PROJECT_ID_PATTERN = "^\d{8}$";

// 处理GET请求:显示删除页面,支持根据项目编号查询
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");String projectId = req.getParameter("projectId");Project project = null;String errorMsg = "";// 如果传入项目编号,则查询项目信息if (projectId != null && !projectId.trim().isEmpty()) {// 校验项目编号格式if (!projectId.matches(PROJECT_ID_PATTERN)) {errorMsg = "项目编号格式错误(需8位数字)";} else {try {project = projectDao.getProjectByNo(projectId);if (project == null) {errorMsg = "未查询到编号为【" + projectId + "】的项目";}} catch (SQLException e) {logger.error("项目查询异常", e);errorMsg = "查询失败:系统错误,请重试";}}}// 传递数据到页面req.setAttribute("project", project);req.setAttribute("errorMsg", errorMsg);req.setAttribute("echoProjectId", projectId); // 回显查询的项目编号req.getRequestDispatcher("deleteProject.jsp").forward(req, resp);
}// 处理POST请求:执行删除操作(仅允许删除未审核项目)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");String projectId = req.getParameter("projectId");String errorMsg = "";String successMsg = "";// 参数校验if (projectId == null || !projectId.matches(PROJECT_ID_PATTERN)) {errorMsg = "参数错误:项目编号格式不正确";} else {try {// 1. 查询项目是否存在及审核状态Project project = projectDao.getProjectByNo(projectId);if (project == null) {errorMsg = "删除失败:未查询到编号为【" + projectId + "】的项目";} else if (project.getAuditStatus() == 1) {// 已审核项目不允许删除errorMsg = "删除失败:项目【" + projectId + "】已审核,不能删除";} else {// 2. 执行删除(仅删除未审核项目)boolean isDeleted = projectDao.deleteProject(projectId);if (isDeleted) {successMsg = "项目【" + projectId + "】删除成功";} else {errorMsg = "删除失败:系统异常,请重试";}}} catch (SQLException e) {logger.error("项目删除异常", e);errorMsg = "删除失败:系统错误,请重试";}}// 传递结果到页面,复用GET方法的查询逻辑req.setAttribute("successMsg", successMsg);req.setAttribute("errorMsg", errorMsg);req.setAttribute("echoProjectId", projectId); // 回显项目编号doGet(req, resp);
}

}`

(5.ProjectUpdateServlet)
`package com.project.servlet;

import com.project.bean.Project;
import com.project.dao.ProjectDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

@WebServlet("/updateProject")
public class ProjectUpdateServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(ProjectUpdateServlet.class);
private final ProjectDao projectDao = new ProjectDao();
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private final Pattern projectIdPattern = Pattern.compile("^\d{8}$");

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");String projectId = req.getParameter("projectId");Project project = null;String errorMsg = "";if (projectId != null && !projectId.trim().isEmpty()) {if (!projectIdPattern.matcher(projectId).matches()) {errorMsg = "项目编号格式错误(需8位数字)";} else {try {project = projectDao.getProjectByNo(projectId);if (project == null) {errorMsg = "未查询到编号为【" + projectId + "】的项目";} else if (project.getAuditStatus() == 1) {errorMsg = "项目【" + projectId + "】已审核,不允许修改";}} catch (Exception e) {logger.error("项目查询异常", e);errorMsg = "查询失败:系统错误,请重试";}}}req.setAttribute("project", project);req.setAttribute("errorMsg", errorMsg);req.setAttribute("echoProjectId", projectId);req.getRequestDispatcher("updateProject.jsp").forward(req, resp);
}@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");String projectId = req.getParameter("projectId");String currentInvestmentStr = req.getParameter("currentInvestment");String startDateStr = req.getParameter("startDate");String endDateStr = req.getParameter("endDate");String constructionContent = req.getParameter("constructionContent");String errorMsg = "";Project project = null;if (projectId == null || !projectIdPattern.matcher(projectId).matches()) {errorMsg = "参数错误:项目编号格式不正确";} else {try {project = projectDao.getProjectByNo(projectId);if (project == null) {errorMsg = "修改失败:未查询到编号为【" + projectId + "】的项目";} else if (project.getAuditStatus() == 1) {errorMsg = "修改失败:项目【" + projectId + "】已审核,不允许修改";}} catch (Exception e) {logger.error("项目查询异常", e);errorMsg = "查询失败:系统错误,请重试";}}if (errorMsg.isEmpty()) {Integer currentInvestment = null;try {currentInvestment = Integer.parseInt(currentInvestmentStr);if (currentInvestment < 0 || currentInvestment > project.getTotalInvestment()) {errorMsg = "已投资需≥0且≤总投资(" + project.getTotalInvestment() + "万元)";}} catch (NumberFormatException e) {errorMsg = "已投资需为整数";}Date startDate = null, endDate = null;try {startDate = new Date(sdf.parse(startDateStr).getTime());endDate = new Date(sdf.parse(endDateStr).getTime());if (startDate.after(endDate)) {errorMsg = "开工日期不能晚于竣工日期";}} catch (ParseException e) {logger.error("日期解析异常", e);errorMsg = "日期格式错误(需yyyy-MM-dd)";}if (errorMsg.isEmpty() && (constructionContent == null || constructionContent.trim().isEmpty() || constructionContent.length() > 500)) {errorMsg = "建设内容不能为空且长度不超过500个汉字";}}if (!errorMsg.isEmpty()) {req.setAttribute("errorMsg", errorMsg);req.setAttribute("project", project);req.setAttribute("echoProjectId", projectId);req.getRequestDispatcher("updateProject.jsp").forward(req, resp);return;}try {Project updatedProject = new Project(project.getProjectId(),project.getProjectName(),project.getProjectLocation(),project.getProjectType(),project.getTotalInvestment(),Integer.parseInt(currentInvestmentStr),new Date(sdf.parse(startDateStr).getTime()),new Date(sdf.parse(endDateStr).getTime()),constructionContent);updatedProject.setAuditStatus(project.getAuditStatus());boolean isUpdated = projectDao.updateProject(updatedProject);if (isUpdated) {req.setAttribute("successMsg", "项目【" + projectId + "】修改成功");} else {errorMsg = "修改失败:系统异常,请重试";req.setAttribute("errorMsg", errorMsg);}} catch (Exception e) {logger.error("项目修改异常", e);errorMsg = "修改失败:系统错误,请重试";req.setAttribute("errorMsg", errorMsg);}req.setAttribute("project", project);req.setAttribute("echoProjectId", projectId);req.getRequestDispatcher("updateProject.jsp").forward(req, resp);
}

}`

5.resources
(db.properties)
url=jdbc:mysql://localhost:3306/project_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username=root password=#你的密码 driver=com.mysql.cj.jdbc.Driver

6.jsp
(1.auditProject)
`<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.project.bean.Project" %>
<%@ page import="java.util.List" %>
<%
// 从请求域获取数据
List projectList = (List) request.getAttribute("projectList");
String errorMsg = (String) request.getAttribute("errorMsg");
String successMsg = (String) request.getAttribute("successMsg");
// 回显查询条件
String echoProjectId = (String) request.getAttribute("echoProjectId");
String echoProjectName = (String) request.getAttribute("echoProjectName");
// 处理空值
if (echoProjectId == null) echoProjectId = "";
if (echoProjectName == null) echoProjectName = "";
%>

项目审核 - 项目计划管理系统

项目审核管理

<!-- 消息提示区域 -->
<% if (errorMsg != null && !errorMsg.isEmpty()) { %>
<div class="msg error"><%= errorMsg %></div>
<% } %>
<% if (successMsg != null && !successMsg.isEmpty()) { %>
<div class="msg success"><%= successMsg %></div>
<% } %><!-- 1. 多条件模糊查询表单 -->
<form action="${pageContext.request.contextPath}/auditProject" method="get" class="query-form"><div class="form-item"><label>项目编号:</label><input type="text" name="projectId" value="<%= echoProjectId %>" placeholder="支持模糊查询,如2410"></div><div class="form-item"><label>项目名称:</label><input type="text" name="projectName" value="<%= echoProjectName %>" placeholder="支持模糊查询,如道路"></div><button type="submit" class="btn query-btn">查询项目</button>
</form><!-- 2. 项目列表与审核操作 -->
<% if (projectList != null && !projectList.isEmpty()) { %>
<table class="data-table"><thead><tr><th>项目编号</th><th>项目名称</th><th>项目位置</th><th>项目属性</th><th>总投资(万元)</th><th>开工日期</th><th>竣工日期</th><th>审核状态</th><th>操作</th></tr></thead><tbody><% for (Project project : projectList) { %><tr><td><%= project.getProjectId() %></td><td><%= project.getProjectName() %></td><td><%= project.getProjectLocation() %></td><td><%= project.getProjectType() %></td><td><%= project.getTotalInvestment() %></td><td><%= project.getStartDate() %></td><td><%= project.getEndDate() %></td><td><%= project.getAuditStatus() == 0 ? "未审核" :(project.getAuditOpinion().startsWith("同意") ? "已同意" : "已拒绝") %></td><td><% if (project.getAuditStatus() == 0) { %><!-- 未审核项目显示审核按钮 --><button type="button" class="btn audit-btn"onclick="showAuditModal('<%= project.getProjectId() %>')">审核</button><% } else { %><!-- 已审核项目显示审核结果 --><span><%= project.getAuditOpinion() %></span><% } %></td></tr><% } %></tbody>
</table>
<% } else if (echoProjectId != null || echoProjectName != null) { %>
<div class="msg error">未查询到符合条件的项目</div>
<% } %><!-- 3. 返回主页面按钮 -->
<div style="margin-top: 30px; text-align: center;"><a href="${pageContext.request.contextPath}/main"><button type="button" class="btn">返回主页面</button></a>
</div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月天津电商财税公司榜单:五家服务商综合对比与选型建议

双十一刚过,天津跨境电商卖家林先生在整理平台结算单时发现:境内平台已代扣代缴,境外平台却仍需自行申报出口退税;同时,公司小规模纳税人身份即将突破500万元销售额,若不及时升级为一般纳税人,发票链将断裂,订…

2025年知名的工程级液压浴室夹厂家最新实力排行

2025年知名的工程级液压浴室夹厂家最新实力排行行业背景与市场趋势随着建筑装修行业向高品质、精细化方向发展,工程级液压浴室夹作为卫浴五金的关键部件,其市场需求持续增长。据中国五金制品协会最新数据显示,2024年…

2025年口碑好的电视柜缓冲铰链高评价厂家推荐榜

2025年口碑好的电视柜缓冲铰链高评价厂家推荐榜行业背景与市场趋势随着家居智能化与品质化需求的不断提升,电视柜作为客厅核心家具之一,其功能性与耐用性日益受到消费者重视。据中国五金制品协会2024年数据显示,国内…

2025年热门的温室生长灯热门厂家推荐榜单

2025年热门的温室生长灯热门厂家推荐榜单行业背景与市场趋势随着全球农业现代化进程加速和设施农业的蓬勃发展,温室生长灯作为现代农业的核心装备之一,正迎来前所未有的市场机遇。据国际农业照明协会(IAL)最新报告显…

智谱智能体接入

1、Post地址: $url = "https://open.bigmodel.cn/api/llm-application/open/v3/application/invoke" 2、写入Bearer 3、json格式:{"app_id": "8022231040","conversation_id&quo…

2025年口碑好的双螺杆清洗料厂家最新推荐排行榜

2025年口碑好的双螺杆清洗料厂家最新推荐排行榜行业背景与市场趋势随着塑料加工行业的快速发展,双螺杆清洗料作为生产过程中不可或缺的辅助材料,其市场需求呈现稳定增长态势。据中国塑料加工工业协会最新数据显示,2…

2025年质量好的玻璃温室智能厂家最新实力排行

2025年质量好的玻璃温室智能厂家最新实力排行行业背景与市场趋势随着现代农业技术的快速发展和国家对智慧农业的政策支持,玻璃温室产业迎来了前所未有的发展机遇。据中国农业机械化协会温室园艺分会最新数据显示,202…

P8127 [BalticOI 2021] The Xana coup (Day2) 分析

题目概述 给你一颗树并且每个点上面有点权,你可以进行一次操作:选择一个点将他自己和与他距离为 \(1\) 的点的点权全部异或 \(1\)。 求最少多少次操作使得每个点的点权都是 \(0\)。 分析 遇到这种题目,一般都是先考…

2025年质量好的耙犁片TOP实力厂家推荐榜

2025年质量好的耙犁片TOP实力厂家推荐榜行业背景与市场趋势随着全球农业机械化程度不断提高,耙犁片作为农业机械的关键部件,市场需求持续增长。据《2024-2029年全球农业机械零部件市场分析报告》显示,2023年全球耙犁…

2025年比较好的高端定制生态板最新TOP厂家排名

2025年高端定制生态板最新TOP厂家排名:品质与创新的行业标杆行业背景与市场趋势随着消费者环保意识的提升和家居品质需求的升级,高端定制生态板市场在2025年迎来了新一轮增长。据中国林产工业协会最新数据显示,2024…

2025年广东AI交互一体机最新评测:迎宾、指引、企业宣传,全搞定

随着AI交互技术在企业服务场景的深度渗透,具备"数字人+大模型+智能屏"三位一体能力的交互一体机正成为企业降本增效的核心工具。本榜单基于技术融合度、场景适配性、服务可靠性三大维度,结合行业案例与用户…

2025年比较好的面粉粮油厂家推荐及采购参考

2025年比较好的面粉粮油厂家推荐及采购参考行业背景与市场趋势中国粮油行业作为国民经济的基础产业,近年来保持着稳健的发展态势。根据国家粮食和物资储备局发布的数据,2023年我国粮油加工业总产值达到3.2万亿元,同…

2025年质量好的虾仁优质厂家推荐榜单

2025年质量好的虾仁优质厂家推荐榜单行业背景与市场趋势近年来,随着消费者健康意识的提升和餐饮行业的快速发展,虾仁作为高蛋白、低脂肪的优质食材,市场需求持续增长。据中国水产流通与加工协会数据显示,2024年我国…

2025年靠谱的白刚玉厂家最新TOP排行榜

2025年靠谱的白刚玉厂家最新TOP排行榜行业背景与市场趋势白刚玉作为工业制造领域的重要基础材料,在磨料磨具、耐火材料、精密铸造等行业中扮演着关键角色。根据中国磨料磨具行业协会最新数据显示,2024年我国白刚玉市…

2025年知名的帽子激光打孔机厂家推荐及采购指南

2025年知名的帽子激光打孔机厂家推荐及采购指南行业背景与市场趋势随着全球纺织服装行业的持续发展和技术升级,激光打孔技术作为一项高效、精准的加工方式,在帽子制造领域获得了广泛应用。根据《2024-2029年全球激光…

2025年热门的婚礼激光灯厂家最新TOP实力排行

2025年热门的婚礼激光灯厂家最新TOP实力排行行业背景与市场趋势随着婚礼行业向个性化、高端化方向发展,激光灯作为现代婚礼的重要装饰元素,正经历着前所未有的市场增长。根据中国照明电器协会最新发布的《2024-2025年…

2025年知名的印花金钻绒厂家选购指南与推荐

2025年知名的印花金钻绒厂家选购指南与推荐行业背景与市场趋势印花金钻绒作为一种兼具美观性与功能性的高端纺织面料,近年来在服装、家纺、装饰品等领域需求持续增长。据中国纺织工业联合会最新数据显示,2024年中国功…

2025年靠谱的印花丝绒厂家最新热销排行

2025年靠谱的印花丝绒厂家最新热销排行行业背景与市场趋势印花丝绒作为纺织行业的重要细分品类,近年来随着消费升级和家居装饰需求的增长,市场规模持续扩大。根据中国纺织品商业协会最新数据,2024年中国印花丝绒市场…

MySQL——桥梁JDBC - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年热门的景区观光车用户好评厂家排行

2025年热门的景区观光车用户好评厂家排行行业背景与市场趋势随着国内旅游业的蓬勃发展,景区观光车作为提升游客体验的重要工具,市场需求持续增长。据中国旅游研究院最新数据显示,2024年全国A级旅游景区接待游客量突…