JavaWeb项目管理系统

  • Post author:
  • Post category:java


1. 构建项目,创建项目目录结构、导入jar包、导入数据库表结构

创建数据库 project 字符编码选 UTF-8

db.properties配置文件,粘贴到src下:

driver=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/project?useSSL=false&characterEncoding=utf8
userName=root
password=root

2. 创建Project、Emp、Company的VO类


public class Company {
    private int companyid;
    private String companyname;
    public int getCompanyid() {
        return companyid;
}
    public void setCompanyid(int companyid) {
        this.companyid = companyid;
    }
    public String getCompanyname() {
        return companyname;
    }
    public void setCompanyname(String companyname) {
        this.companyname = companyname
    }
}

public class Emp {
    private int empid;
    private int dutyid;
    private String empname;
    public int getEmpid() {
        return empid;
    }
    public void setEmpid(int empid) {
        this.empid = empid;
    }
    public int getDutyid() {
        return dutyid;
    }
    public void setDutyid(int dutyid) {
        this.dutyid = dutyid;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
}
package com.hyxy.project.vo;

import java.util.Date;

public class Project {
    private int projectid;
    private int companyid;
    private int empid;
    private String projectname;
    private int prosum;
    private int amount;
    private int state;
    private int budget;
    private int realcost;
    private Date planbegindate;
    private Date planenddate;
    private int priority;
    private Date realbegindate;
    private Date realenddate;
    private int expired;
    private int expiredday;
    private String descript;
    //加两行
    private String companyname;
    private String empname;

    public String getCompanyname() {
        return companyname;
    }

    public void setCompanyname(String companyname) {
        this.companyname = companyname;
    }

    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }

    public int getProjectid() {
        return projectid;
    }

    public void setProjectid(int projectid) {
        this.projectid = projectid;
    }

    public int getCompanyid() {
        return companyid;
    }

    public void setCompanyid(int companyid) {
        this.companyid = companyid;
    }

    public int getEmpid() {
        return empid;
    }

    public void setEmpid(int empid) {
        this.empid = empid;
    }

    public String getProjectname() {
        return projectname;
    }

    public void setProjectname(String projectname) {
        this.projectname = projectname;
    }

    public int getProsum() {
        return prosum;
    }

    public void setProsum(int prosum) {
        this.prosum = prosum;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public int getBudget() {
        return budget;
    }

    public void setBudget(int budget) {
        this.budget = budget;
    }

    public int getRealcost() {
        return realcost;
    }

    public void setRealcost(int realcost) {
        this.realcost = realcost;
    }

    public Date getPlanbegindate() {
        return planbegindate;
    }

    public void setPlanbegindate(Date planbegindate) {
        this.planbegindate = planbegindate;
    }

    public Date getPlanenddate() {
        return planenddate;
    }

    public void setPlanenddate(Date planenddate) {
        this.planenddate = planenddate;
    }

    public int getPriority() {
        return priority;
    }

    public void setPriority(int priority) {
        this.priority = priority;
    }

    public Date getRealbegindate() {
        return realbegindate;
    }

    public void setRealbegindate(Date realbegindate) {
        this.realbegindate = realbegindate;
    }

    public Date getRealenddate() {
        return realenddate;
    }

    public void setRealenddate(Date realenddate) {
        this.realenddate = realenddate;
    }

    public int getExpired() {
        return expired;
    }

    public void setExpired(int expired) {
        this.expired = expired;
    }

    public int getExpiredday() {
        return expiredday;
    }

    public void setExpiredday(int expiredday) {
        this.expiredday = expiredday;
    }

    public String getDescript() {
        return descript;
    }

    public void setDescript(String descript) {
        this.descript = descript;
    }


}

项目基本信息管理开发

1. 实现项目基本信息管理的业务层开发

import java.util.Date;
import java.util.List;

public interface ProjectService {
    public List<Project> query(Date startdate, Date enddate);
    public void delete(int[] ids);
    public void save(Project project);
    public void update(Project project);
    public Project queryById(int id);
}

ProjectServiceImpl


import com.oracle.jdbc.util.Dao;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ProjectServiceImpl implements ProjectService {
    @Override
    public List<Project> query(Date startdate, Date enddate) {
        String sql = "select p.*,c.companyname,e.empname from tb_project p " +
                "left outer join tb_company c on p.companyid = c.companyid " +
                "left outer join tb_emp e on p.empid = e.empid where 1=1 ";
//拼查询条件的sql,而查询条件是动态的,因此上面的SQL 中含有where 1=1
        if(startdate!=null){
            sql += " and realbegindate >= ?";
        }
        if(enddate!=null){
            sql += " and realbegindate <= ?";
        }
        List params = new ArrayList();
        if(startdate!=null){
            params.add(startdate);
        }
        if(enddate!=null){
            params.add(enddate);
        }
//问题:分析Dao.query方法的执行过程,
// 执行SQL语句获得一个结果集,将结果集中的一行数据注入到一个Project对象中
// 而执行的SQL语句是多表连接的SQL,结果集中含有companyname和empname,要这两列的数据注入到
      //  Project对象中
// 在Project对象中定义两个属性 名字也叫companyname和empname
        List<Project> list = Dao.query(sql,Project.class,params.toArray());
        return list;
    }
    @Override
    public void delete(int[] ids) {
        String sql = "delete from tb_project where projectid in (";
        if(ids!=null){
            Object[] objs = new Object[ids.length];
            for(int i = 0;i<ids.length;i++){
                sql += "?,";
                objs[i] = ids[i];
            }
            sql = sql.substring(0,sql.length()-1);
            sql += ")";
            Dao.execute(sql,objs);
        }
    }
    @Override
    public void save(Project project) {
        String sql = "insert into tb_project " +
                "values(default,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        Dao.executeSql(sql,project.getCompanyid(),project.getEmpid(),project.getProjectname(),
                project.getProsum(),
                project.getAmount(),project.getState(),project.getBudget(),project.getRealcost(),
                project.getPlanbegindate(),project.getPlanenddate(),project.getPriority(),project.getRealbegindate(),
                project.getRealenddate(),project.getExpired(),project.getExpiredday(),project.getDescript(
                ));
    }
    @Override
    public void update(Project project) {
        String sql = "update tb_project set companyid=?,empid=?,projectname=?,prosum=?," +
                "amount=?,state=?,budget=?,realcost=?,planbegindate=?," +
                "planenddate=?,priority=?,realbegindate=?,realenddate=?," +
                "expired=?,expiredday=?,descript=? where projectid=?";
        Dao.executeSql(sql,project.getCompanyid(),project.getEmpid(),project.getProjectname(),project.getProsum(),
                project.getAmount(),project.getState(),project.getBudget(),project.getRealcost(),
                project.getPlanbegindate(),project.getPlanenddate(),project.getPriority(),project.getRealbegindate(),
                project.getRealenddate(),project.getExpired(),project.getExpiredday(),project.getDescript(
                ),project.getProjectid());
    }
    @Override
    public Project queryById(int id) {
        String sql = "select * from tb_project where projectid=?";
        return Dao.queryOne(sql,Project.class,id);
    }


}

搭建单元测试类的环境,使用JUnit工具实现单元测试 导入JUnit的jar包


import org.junit.Assert;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class ProjectServiceTest {
    //查询的测试方法
    @Test
    public void queryTest() {
//测试 预定好的测试用例
        ProjectService projectService = new ProjectServiceImpl();
        List<Project> list = projectService.query(null, null);
        for (Project p : list) {
            System.out.println(p.getProjectname() + "," + p.getEmpname() + "," + p.getCompanyname());
        }
        System.out.println("---------------------------");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse("2022-07-01");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        list = projectService.query(date, null);
        for (Project p : list) {
            System.out.println(p.getProjectname() + "," + p.getEmpname() + "," + p.getCompanyname());
        }
        System.out.println("---------------------------");
    }

    @Test
    public void deleteTest() {
        ProjectService projectService = new ProjectServiceImpl();
        projectService.delete(new int[]{3, 4, 5});
    }

    @Test
    public void saveTest() {
        ProjectService projectService = new ProjectServiceImpl();
        Project project = new Project();
        project.setProjectname("12306售票系统");
        project.setAmount(400000000);
        project.setEmpid(3);
        project.setProsum(20);
        project.setPlanbegindate(new Date());
        project.setCompanyid(1);
        projectService.save(project);
    }

    @Test
    public void updateTest() {
        ProjectService projectService = new ProjectServiceImpl();
        Project project = projectService.queryById(7);
        project.setAmount(300000000);
        projectService.update(project);
    }
}

1. 项目查询页面功能

实现Controller的查询请求处理方法

 protected void query(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
//接收查询条件
        String startdate = request.getParameter("startdate");
        String enddate = request.getParameter("enddate");
//调用ProjectService的query方法
        ProjectService projectService = new ProjectServiceImpl();
// 封装一个日期处理工具类,调用这个工具类的方法
        List<Project> list =
                projectService.query(Common.parseDate(startdate),Common.parseDate(enddate));
//将结果和查询条件 传到页面上
        request.setAttribute("list",list);
        request.setAttribute("startdate",startdate);
        request.setAttribute("enddate",enddate);
//向页面请求转发跳
        request.getRequestDispatcher("/files/project/query.jsp").forward(request,response);
    }

实现/files/project/query.jsp的代码


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>项目管理系统 by www.eyingda.com</title>
    <style type="text/css">
        <!--
        body {
            margin-left: 0px;
            margin-top: 0px;
            margin-right: 0px;
            margin-bottom: 0px;
        }
        .tabfont01 {
            font-family: "宋体";
            font-size: 9px;
            color: #555555;
            text-decoration: none;
            text-align: center;
        }
        .font051 {font-family: "宋体";
            font-size: 12px;
            color: #333333;
            text-decoration: none;
            line-height: 20px;
        }
        .font201 {font-family: "宋体";
            font-size: 12px;
            color: #FF0000;
            text-decoration: none;
        }
        .button {
            font-family: "宋体";
            font-size: 14px;
            height: 37px;
        }
        html { overflow-x: auto; overflow-y: auto; border:0;}
        -->
    </style>
    <link href="${pageContext.request.contextPath}/css/css.css" rel="stylesheet"
          type="text/css" />
    <link href="${pageContext.request.contextPath}/css/style.css" rel="stylesheet"
          type="text/css" />
    <script type="text/javascript"
            src="${pageContext.request.contextPath}/js/xiangmu.js"></script>
</head>
<SCRIPT language=JavaScript>
    function sousuo(){
        window.open("gaojisousuo.htm","","depended=0,alwaysRaised=1,width=800,height=510," +
            "location=0,menubar=0,resizable=0,scrollbars=0,status=0,toolbar=0");
    }
    function selectAll(){
        var obj = document.fom.elements;
        for (var i=0;i<obj.length;i++){
            if (obj[i].name == "delid"){
                obj[i].checked = true;
            }
        }
    }
    function unselectAll(){
        var obj = document.fom.elements;
        for (var i=0;i<obj.length;i++){
            if (obj[i].name == "delid"){
                if (obj[i].checked==true) obj[i].checked = false;
                else obj[i].checked = true;
            }
        }
    }
    function link(){
        document.getElementById("fom").action="xiangmu.htm";
        document.getElementById("fom").submit();
    }
    function on_load(){
        var loadingmsg=document.getElementById("loadingmsg");
        var mainpage=document.getElementById("mainpage");
        loadingmsg.style.display="";
        mainpage.style.display="none";
        loadingmsg.style.display="none";
        mainpage.style.display="";
    }
</SCRIPT>
<body onload="on_load()">
<form name="projectForm" id="projectForm" method="post"
      action="${pageContext.request.contextPath}/project.do?op=query">
    <table id="mainpage" width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td height="30"><table width="100%" border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td height="62"
                        background="${pageContext.request.contextPath}/images/nav04.gif">
                        <table width="98%" border="0" align="center" cellpadding="0" cellspacing="0">
                            <tr>
                                <td width="21"><img src="${pageContext.request.contextPath}/images/ico07.gif" width="20" height="18" />
                                </td>
                                <td width="550">查看内容:按时间:
                                    <input name="startdate" type="text" size="12"
                                           value="${startdate}"/><span class="newfont06">至</span>
                                    <input name="enddate" type="text" size="12"
                                           value="${enddate}"/>
                                    <input name="Submit" type="submit" class="right-button02" value="查 询" /></td>
                                <td width="132" align="left"><a href="#"
                                                                onclick="sousuo()">
                                    <input name="Submit" type="button" class="right-button07" value="高级搜索" /></a></td>
                            </tr>
                        </table></td>
                </tr>
            </table></td>
        </tr>
        <tr>
            <td><table id="subtree1" style="DISPLAY: " width="100%" border="0"
                       cellspacing="0" cellpadding="0">
                <tr>
                    <td><table width="95%" border="0" align="center" cellpadding="0"
                               cellspacing="0">
                        <tr>
                            <td height="20"><span class="newfont07">选择:<a href="#"
                                                                          class="right-font08" onclick="selectAll();">全选</a>-<a href="#" class="right-font08"
                                                                                                                                onclick="unselectAll();">反选</a></span>
                                <input name="Submit" type="button" class="right-button08" value="删除所选项目信息" />
                                <input name="Submit2" type="button" class="right-button08" value="添加项目" onclick="link();"/></td>
                        </tr>
                        <tr>
                            <td height="40" class="font42"><table width="100%"
                                                                  border="0" cellpadding="4" cellspacing="1" bgcolor="#464646" class="newfont03">
                                <tr>
                                    <td height="20" colspan="13" align="center"
                                        bgcolor="#EEEEEE"class="tablestyle_title">
                                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb
                                        sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb
                                        sp; 项目信息列表 &nbsp;</td>
                                </tr>
                                <tr>
                                    <td width="5%" align="center" bgcolor="#EEEEEE">选
                                        择</td>
                                    <td width="10%" height="20" align="center"
                                        bgcolor="#EEEEEE">项目名称</td>
                                    <td width="10%" align="center" bgcolor="#EEEEEE">客
                                        户名称</td>
                                    <td width="10%" align="center" bgcolor="#EEEEEE">项
                                        目经理</td>
                                    <td width="5%" align="center" bgcolor="#EEEEEE">开
                                        发人数</td>
                                    <td width="10%" align="center" bgcolor="#EEEEEE">立
                                        项时间</td>
                                    <td width="10%" align="center" bgcolor="#EEEEEE">更
                                        新时间</td>
                                    <td width="6%" align="center" bgcolor="#EEEEEE">任
                                        务优先级</td>
                                    <td width="5%" align="center" bgcolor="#EEEEEE">状
                                        态</td>
                                    <td width="10%" align="center" bgcolor="#EEEEEE">操
                                        作</td>
                                </tr>
                                <c:forEach items="${list}" var="p">
                                <tr align="center">
                                    <td bgcolor="#FFFFFF"><input type="checkbox"
                                                                 name="id" value="${p.projectid}"/></td>
                                    <td height="20" bgcolor="#FFFFFF"><a
                                            href="xiangmuzongbiao.htm">${p.projectname}</a></td>
                                    <td bgcolor="#FFFFFF">${p.companyname}</td>
                                    <td bgcolor="#FFFFFF">${p.empname}</td>
                                    <td bgcolor="#FFFFFF">${p.prosum}</td>
                                    <td bgcolor="#FFFFFF">${p.realbegindate}</td>
                                    <td bgcolor="#FFFFFF">${p.realenddate}</td>
                                    <!-- 0普通;1急;2特急; -->
                                    <td bgcolor="#FFFFFF">
                                        <c:choose>
                                            <c:when test="${p.priority==0}">普通
                                            </c:when>
                                            <c:when test="${p.priority==1}">急</c:when>
                                            <c:when test="${p.priority==2}">特急
                                            </c:when>
                                        </c:choose>
                                    </td>
                                    <!-- 0需求;1发开;2测试;3完成; -->
                                    <td bgcolor="#FFFFFF">
                                        <c:choose>
                                            <c:when test="${p.state==0}">需求</c:when>
                                            <c:when test="${p.state==1}">开发</c:when>
                                            <c:when test="${p.state==2}">测试</c:when>
                                            <c:when test="${p.state==3}">完成</c:when>
                                        </c:choose>
                                    </td>
                                    <td bgcolor="#FFFFFF"><a href="editxiangmu.htm">编
                                        辑</a>|<a href="listxiangmumingxi.htm">查看</a></td>
                                </tr>
                                </c:forEach>
                            </table></td>
                        </tr>
                    </table></td>
                </tr>
            </table>
                <table width="95%" border="0" align="center" cellpadding="0"
                       cellspacing="0">
                    <tr>
                        <td height="6"><img
                                src="${pageContext.request.contextPath}/images/spacer.gif" width="1" height="1" /></td>
                    </tr>
                    <tr>
                        <td height="33"><table width="100%" border="0" align="center"
                                               cellpadding="0" cellspacing="0" class="right-font08">
                            <tr>
                                <td width="50%">共 <span class="right-text09">5</span>
                                    页 | 第 <span class="right-text09">1</span> 页</td>
                                <td width="49%" align="right">[<a href="#"
                                                                  class="right-font08">首页</a> | <a href="#" class="right-font08">上一页</a> | <a
                                        href="#" class="right-font08">下一页</a> | <a href="#" class="right-font08">末页</a>] 转
                                    至:</td>
                                <td width="1%"><table width="20" border="0"
                                                      cellspacing="0" cellpadding="0">
                                    <tr>
                                        <td width="1%"><input name="textfield3"
                                                              type="text" class="right-textfield03" size="1" /></td>
                                        <td width="87%"><input name="Submit23222"
                                                               type="submit" class="right-button06" value=" " />
                                        </td>
                                    </tr>
                                </table></td>
                            </tr>
                        </table></td>
                    </tr>
                </table></td>
        </tr>
    </table>
</form>
<div id="loadingmsg" style="width:100px; height:18px; top:0px; display:none;">
    <img src="file:///F|/项目管理相关资料/项目管理系统页面/images/loadon.gif" />
</div>
</body>
</html>



版权声明:本文为qq_47436715原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。