今日思考,完成一个工资管理系统项目,需要实现哪些功能?
此类项目常见描述如下:
随着经济的发展,企业正向着大型化、规模化发展,而对于大中型企业,员工、职称等跟工资管理有关的信息随之急剧增加。在这种情况下单靠人工来处理员工的工资不但显得力不从心,而且极容易出错。如何设计一个小型企业工资的数据库管理系统,由计算机代替人工执行一系列诸如增加新员工,删除旧员工,工资查询,统计等操作。这样就使办公人员可以轻松快捷地完成工资管理的任务。
SSM(MYECLIPSE)框架及其适合本类项目,使用MVC的思想可以极大程度减少重复工作量。和SSM(MYECLIPSE)框架最配的开发工具是MYECLIPSE。MYECLIPSE集成了大量插件,可以更好的使用SSM(MYECLIPSE)进行项目的开发,使得项目开发时事半功倍。
通过对工资管理系统系统的仔细分析,可以得出工资管理系统系统是一个 后台项目。
在这样一个项目中,系统的登录角色是必不可少的,对每个登录角色设置账号、密码。以确保系统可以正常登录使用。SSM(MYECLIPSE)项目中包含的登录角色有管理员、用户。
总结得出该系统所有数据为:管理员(admin)、用户(yonghu)、员工增加(yuangongzengjia)、工资清单(gongziqingdan)
管理员表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 管理员id username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码
用户表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 用户id xingming | VARCHAR(255) | | 姓名 zhiwu | VARCHAR(255) | | 职务 nianling | VARCHAR(255) | | 年龄 xingbie | VARCHAR(255) | | 性别 quanxian | VARCHAR(255) | | 权限 username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码
员工增加表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 员工增加id xingming | VARCHAR(255) | | 姓名 nianling | VARCHAR(255) | | 年龄 xingbie | VARCHAR(255) | | 性别 xueli | VARCHAR(255) | | 学历
工资清单表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 工资清单id jibengongzi | VARCHAR(255) | | 基本工资 yejiticheng | VARCHAR(255) | | 业绩提成 jiangligongzi | VARCHAR(255) | | 奖励工资
package org.mypro.front; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import javax.jms.Session; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mypro.dao.GongziqingdanMapper; import org.mypro.entity.Gongziqingdan; import org.mypro.entity.GongziqingdanExample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(VALUE = "/") public class GongziqingdanController { private static final Log logger = LogFactory.getLog(GongziqingdanController.class); @Autowired private GongziqingdanMapper gongziqingdandao; //定义方法tianjiagongziqingdan,响应页面tianjiagongziqingdan请求 @RequestMapping(VALUE = "tianjiagongziqingdan") public String tianjiagongziqingdan(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,String backurl) { logger.debug("GongziqingdanController.tianjiagongziqingdan ......"); IF(backurl != NULL && backurl.indexOf("tianjiagongziqingdan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "tianjiagongziqingdan"; } @RequestMapping(VALUE = "tianjiagongziqingdanact") public String tianjiagongziqingdanact(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,Gongziqingdan gongziqingdan,String backurl) throws IOException { logger.debug("GongziqingdanController.tianjiagongziqingdanact ......"); gongziqingdandao.insert(gongziqingdan); request.setAttribute("message", "添加工资清单成功"); IF(backurl != NULL && backurl.indexOf("tianjiagongziqingdanact.action") == -1){ RETURN "forward:/" + backurl; } //返回tianjiagongziqingdan方法 RETURN "forward:/tianjiagongziqingdan.action"; } //定义gongziqingdanguanli方法响应页面请求 @RequestMapping(VALUE = "gongziqingdanguanli") public String gongziqingdanguanli(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,String backurl) { logger.debug("GongziqingdanController.gongziqingdanguanli ......"); GongziqingdanExample example = NEW GongziqingdanExample(); List gongziqingdanall = gongziqingdandao.selectByExample(example); request.setAttribute("gongziqingdanall", gongziqingdanall); IF(backurl != NULL && backurl.indexOf("gongziqingdanguanli.action") == -1){ RETURN "forward:/" + backurl; } RETURN "gongziqingdanguanli"; } // 定义 gongziqingdanchakan方法 @RequestMapping(VALUE = "gongziqingdanchakan") public String gongziqingdanchakan(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,String backurl) { logger.debug("GongziqingdanController.gongziqingdanchakan ......"); GongziqingdanExample example = NEW GongziqingdanExample(); List gongziqingdanall = gongziqingdandao.selectByExample(example); request.setAttribute("gongziqingdanall", gongziqingdanall); IF(backurl != NULL && backurl.indexOf("gongziqingdanchakan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "gongziqingdanchakan"; } // 定义 xiugaigongziqingdan方法 @RequestMapping(VALUE = "xiugaigongziqingdan") public String xiugaigongziqingdan(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,INT id,String backurl){ logger.debug("GongziqingdanController.xiugaigongziqingdan ......"); Gongziqingdan gongziqingdan = gongziqingdandao.selectByPrimaryKey(id); request.setAttribute("gongziqingdan", gongziqingdan); IF(backurl != NULL && backurl.indexOf("xiugaigongziqingdan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "xiugaigongziqingdan"; } // 定义xiugaigongziqingdanact处理工资清单修改 @RequestMapping(VALUE = "xiugaigongziqingdanact") public String xiugaigongziqingdanact(HttpServletRequest request, HttpServletResponse response,Gongziqingdan gongziqingdan,HttpSession SESSION,String backurl) throws IOException { logger.debug("GongziqingdanController.xiugaigongziqingdanact ......"); gongziqingdandao.updateByPrimaryKeySelective(gongziqingdan); request.setAttribute("message", "修改工资清单信息成功"); IF(backurl != NULL && backurl.indexOf("xiugaigongziqingdanact.action") == -1){ RETURN "forward:/" + backurl; } RETURN "forward:/gongziqingdanguanli.action"; } // 定义shanchugongziqingdan,处理删除工资清单 @RequestMapping(VALUE = "shanchugongziqingdan") public String shanchugongziqingdan(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,INT id,String backurl){ logger.debug("GongziqingdanController.shanchugongziqingdan ......"); gongziqingdandao.deleteByPrimaryKey(id); request.setAttribute("message", "删除工资清单成功"); IF(backurl != NULL && backurl.indexOf("shanchugongziqingdan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "forward:/gongziqingdanguanli.action"; } // 定义sousuogongziqingdan方法,处理搜索操作 @RequestMapping(VALUE = "sousuogongziqingdan") public String sousuogongziqingdan(HttpServletRequest request, HttpServletResponse response,HttpSession SESSION,String SEARCH,String backurl) { logger.debug("GongziqingdanController.sousuogongziqingdan ......"); GongziqingdanExample example = NEW GongziqingdanExample(); GongziqingdanExample.Criteria criteria = example.createCriteria(); IF(SEARCH != NULL){ criteria.andJibengongziLike("%" + SEARCH + "%"); } List gongziqingdanall = gongziqingdandao.selectByExample(example); request.setAttribute("gongziqingdanall", gongziqingdanall); IF(backurl != NULL && backurl.indexOf("sousuogongziqingdan.action") == -1){ RETURN "forward:/" + backurl; } RETURN "sousuogongziqingdan"; } // 定义GongziqingdanpinglunMapper @RequestMapping(VALUE = "gongziqingdanxiangqing") public String gongziqingdanxiangqing(HttpServletRequest request,HttpSession SESSION, HttpServletResponse response,INT id,String backurl) { logger.debug("GongziqingdanController.gongziqingdanxiangqing ......"); Gongziqingdan gongziqingdan = gongziqingdandao.selectByPrimaryKey(id);request .setAttribute("gongziqingdan", gongziqingdan); IF(backurl != NULL && backurl.indexOf("gongziqingdanxiangqing.action") == -1){ RETURN "forward:/" + backurl; } RETURN "gongziqingdanxiangqing"; } // 上传文件图片等public String uploadUtile (MultipartFile file, HttpServletRequest request) throws IOException { // 根据当前时间生成时间字符串SimpleDateFormat sdf = NEW SimpleDateFormat("yyyyMMddHHmmssSS");String res = sdf.format(NEW DATE()); // uploads文件夹位置String rootPath = request.getSession().getServletContext().getRealPath("resource/uploads/"); // 原始名称String originalFileName = file.getOriginalFilename(); // 新文件名String newFileName = "sliver" + res + originalFileName.substring(originalFileName.lastIndexOf(".")); // 创建年月文件夹Calendar DATE = Calendar.getInstance();File dateDirs = NEW File(DATE.get(Calendar.YEAR) + File.separator + (DATE.get(Calendar.MONTH)+1)); // 新文件File newFile = NEW File(rootPath + File.separator + dateDirs + File.separator + newFileName); // 判断目标文件所在目录是否存在 IF( !newFile.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录newFile .getParentFile().mkdirs(); }System .out.println(newFile); // 将内存中的数据写入磁盘file .transferTo(newFile); // 完整的urlString fileUrl = DATE.get(Calendar.YEAR) + "/" + (DATE.get(Calendar.MONTH)+1) + "/" + newFileName; RETURN fileUrl; }}
添加工资清单模块:
在gongziqingdanController中定义tianjiagongziqingdanact接收页面传入的工资清单参数,定义为gongziqingdan。其中gongziqingdan包含字段:基本工资,业绩提成,奖励工资,使用tianjiagongziqingdanact将该工资清单对象存入数据库中,在gongziqingdanMapper中定义了insert方法,匹配数据库中的insert into gongziqingdan语句实现将工资清单数据存入数据库的操作。该部分核心代码如下:
通过gongziqingdandao的insert方法将页面传输的工资清单添加到数据库中 gongziqingdandao.insert(gongziqingdan);
将添加工资清单成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "添加工资清单成功");
返回工资清单管理界面
return "forward:/tianjiagongziqingdan.action";
查询工资清单模块:
在后台gongziqingdanguanli方法中,通过selectByexample方法获取所有的数据信息。将其保存到request中,在页面中通过foreach方法
进行循环展示到table中。完成工资清单查询操作。具体代码如下:
生成工资清单样例类,通过example定义查询条件 GongziqingdanExample example = new GongziqingdanExample();
通过gongziqingdandao的selectByExample方法查询出所有的工资清单信息 List gongziqingdanall = gongziqingdandao.selectByExample(example);
将工资清单信息,保存到request中,在页面通过foreach方法进行展示 request.setAttribute("gongziqingdanall", gongziqingdanall);
返回工资清单管理界面
return "forward:/gongziqingdanguanli.action";
修改工资清单模块:
点击修改按钮,可以跳转到工资清单修改页面。在工资清单修改页面中,将初始化该工资清单的所有信息,并将信息一一对应填充到对应编辑栏中。编辑完工资清单信息后,页面通过post方法将数据封装为一个工资清单实体,传入到gongziqingdanController中。在xiugaigongziqingdan中进行接收,接收完毕后,调用gongziqingdanMapper中的updateByPrimaryKeySelective方法进行修改。该部分代码如下:
通过gongziqingdandao的修改方法根据id修改对应的工资清单 gongziqingdandao.updateByPrimaryKeySelective(gongziqingdan);
将修改工资清单成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "修改工资清单信息成功");
返回工资清单管理界面
return "forward:/gongziqingdanguanli.action";
删除工资清单模块:
在页面中通过a标签,shanchugongziqingdan?id=将id传入到后台中,通过shanchugongziqingdan接收工资清单id。使用deleteByid的方法
删除该工资清单,完成删除操作。定义删除成功提示信息,删除工资清单成功,并保存到request中,该部分代码如下:
通过gongziqingdandao的删除方法根据id删除对应的工资清单 gongziqingdandao.deleteByPrimaryKey(id);
将删除工资清单成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "删除工资清单成功");
返回工资清单管理界面
return "forward:/gongziqingdanguanli.action";