项目编号:BS-APP-001
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或Hbuilder
开发技术:SSM框架开发后台+Andriod Studio开发实现APP应用端
二,项目简介
本课题主要研究如何利用现代信息化技术帮助企业进行考勤和工资管理。对于一个现代化企业来讲,信息化建设的水平直接关系着企业整体运作效率的高低,本课程研究的主要内容就是员工考勤和员工工资的管理,这两块业务在企业中具有存在的普遍性与适用性,企业对员工的考勤是对员工时间工作概念的约束,它也和员工的工资收入有效的结合起来,以往都是通过考勤机打卡来实现对员工考勤的约束,但是每到月底都需要导出数据再进行人工统计管理,相对比较麻烦,员工工资的管理也主要是靠会记手工记账管理,整体操作的复杂度较高,管理效率较低。
本课题主要实现通过APP应用来进行员工考勤的在线管理和员工工资的在线管理操作。系统通过开发安卓应用APP以及相应的后台管理程序,来完成了一个前后端分离的企业考勤和工资管理系统的开发。后台开发使用Spring框架集成mybatis-plus框架来完成后台管理系统的开发,数据库采用MYSQL5.7,开发工具先用IDEA和Andriod Studio开发工具实现。
本次课题依据要求开发设计的基于Andriod平台的工资考勤和员工工资管理的应用APP,使用的用户主要分为三类角色,一是系统管理员,二是公司员工,三是部门经理。这三类用户登陆系统后进行的操作权限是不同的,公司员工和部分门经理这两个角色主要通过APP来进行登陆使用,系统管理员主要通过后台对整个应用系统的业务数据做相应的管理操作。
管理员实现的主要功能:
1.发布企业公告(增删改查)
2.管理公司所有部门(增减部门经理)
3.所有员工管理(显示员工个人信息加职位)
4.工资管理(登记发放情况)
5.考勤统计显示与修改(包含日常考勤与请假情况)
6.修改考勤异常
部门经理需实现功能:
1.查看企业公告
2.部门管理及查看
3.签到签退
4.工资查看
5.本部门考勤情况查看
6.请假审批
7.考勤异常申请
员工实现功能:
1.查看企业公告
2.个人信息修改
3.查看工资
4.签到签退
5.请假申请
6.考勤异常申请
功能结构图如下所示:
三,系统展示
5.1 前端用户的基本功能
5.1.1 APP应用登录管理的展示
企业员工和部门经理用户打开APP应用,输入账户和密码提交请求到后台服务接口进行验证,验证通过后即登陆成功。如下图5.1所示。
图5.1 登录界面
5.1.2新闻资讯浏览的展示
企业员工和其部门经理角色登陆APP后可以在线查看新闻和公告信息,并对新闻进行点赞、评论、收藏等操作,具体如下图5.2、5.3所示:
图5.2新闻浏览展示图
图5.3新闻互动展示图
5. 1.3 员工在线考勤展示
员工登陆APP后可以在我的个人中心里找到员工考勤,进行在线打卡操作,打卡的相关记录会有部门经理登陆后进行相应的审核操作,员工打卡具体如下图5.4所示。
图5.4员工打卡信息界面图
5.1.5 员工请假管理展示
员工登陆APP后可以在我的个人中心里找到员工请假,进行在线请假操作,填请假的相关事宜和时间后,请假的相关记录会有部门经理登陆后进行相应的审核操作,员工请假具体如下图5.5所示。
图5.5 在线请假管理界面图
5.1.5 部门经理缺勤扣款展示
部门经理登陆是入APP后,可以对自己部门员工的考勤信息进行查看,员工考勤出异常后,系统会自动进行记录,部门经理可以根据缺勤情况进行手动扣除绩效,具体如下图5.6所示。
图5.6 考勤扣款界面图
5.1.6 查看员工工资
部门经理登陆是入APP后,可以查看自己部门员的工资详情,具体如下图5.7所示。
图5.7工资查看界面图
5.1.7 签到审核实现
部门经理登陆是入APP后,可以对自己部门员工的考勤信息进行审核,未通过的审核将作为缺勤处理,具体如下图5.8所示。
图5.8签到审核界面图
5.1.8 请假审核实现
部门经理登陆是入APP后,可以对自己部门员工的请假信息进行审核具体如下图5.9所示。
图5.9请假审核界面图
5.2 后台管理功能展示
5.2.1管理员登陆
企业员工考勤和工资管理平台的后台管理员登陆后方可以进行相关的信息管理操作,具体登陆界面如下图5.10所示。
图5.10 员工登陆管理界面图
5.2.2 员工管理功能展示
管理员进入后台管理中选择系统用户管理下的员工管理,可以对企业的员工信息进行相应的管理操作,主要包含信息查询,员工添加,详情查看,修改和删除操作,具体如下图5.11所示。
图5.11 员工管理信息界面
其它功能展示略
四,核心代码展示
package com.project.demo.controller.base; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.project.demo.service.base.BaseService; import com.project.demo.utils.IdWorker; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; /** */ @Slf4j public class BaseController<E, S extends BaseService<E>> { @Setter protected S service; @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { service.insert(service.readBody(request.getReader())); return success(1); } @Transactional public Map<String, Object> addMap(Map<String,Object> map){ service.insert(map); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { service.update(service.readQuery(request), service.readConfig(request), service.readBody(request.getReader())); return success(1); } @RequestMapping(value = "/del") @Transactional public Map<String, Object> del(HttpServletRequest request) { service.delete(service.readQuery(request), service.readConfig(request)); return success(1); } @RequestMapping("/get_obj") public Map<String, Object> obj(HttpServletRequest request) { List resultList = service.selectBaseList(service.select(service.readQuery(request), service.readConfig(request))); if (resultList.size() > 0) { JSONObject jsonObject = new JSONObject(); jsonObject.put("obj",resultList.get(0)); return success(jsonObject); } else { return success(null); } } @RequestMapping("/get_list") public Map<String, Object> getList(HttpServletRequest request) { Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request)); return success(map); } @RequestMapping("/list_group") public Map<String, Object> listGroup(HttpServletRequest request) { Map<String, Object> map = service.selectToList(service.readQuery(request), service.readConfig(request)); return success(map); } @RequestMapping("/bar_group") public Map<String, Object> barGroup(HttpServletRequest request) { Map<String, Object> map = service.selectBarGroup(service.readQuery(request), service.readConfig(request)); return success(map); } @RequestMapping(value = {"/count_group", "/count"}) public Map<String, Object> count(HttpServletRequest request) { Integer value= service.selectSqlToInteger(service.groupCount(service.readQuery(request), service.readConfig(request))); return success(value); } @RequestMapping(value = {"/sum_group", "/sum"}) public Map<String, Object> sum(HttpServletRequest request) { Integer value = service.selectSqlToInteger(service.sum(service.readQuery(request), service.readConfig(request))); return success(value); } @RequestMapping(value = {"/avg_group", "/avg"}) public Map<String, Object> avg(HttpServletRequest request) { Integer value = service.selectSqlToInteger(service.avg(service.readQuery(request), service.readConfig(request))); return success(value); } // @RequestMapping(value = {"/count_group", "/count"}) // public Map<String, Object> count(HttpServletRequest request) { // Query count = service.count(service.readQuery(request), service.readConfig(request)); // return success(count.getResultList()); // } // // @RequestMapping(value = {"/sum_group", "/sum"}) // public Map<String, Object> sum(HttpServletRequest request) { // Query count = service.sum(service.readQuery(request), service.readConfig(request)); // return success(count.getResultList()); // } // // @RequestMapping(value = {"/avg_group", "/avg"}) // public Map<String, Object> avg(HttpServletRequest request) { // Query count = service.avg(service.readQuery(request), service.readConfig(request)); // return success(count.getResultList()); // } @PostMapping("/upload") public Map<String, Object> upload(@RequestParam(value = "file",required=false) MultipartFile file,HttpServletRequest request) { log.info("进入方法"); if (file.isEmpty()) { return error(30000, "没有选择文件"); } try { //判断有没路径,没有则创建 String filePath = request.getSession().getServletContext().getRealPath("\\") +"upload\\"; // String filePath = System.getProperty("user.dir") + "\\target\\classes\\static\\upload\\"; File targetDir = new File(filePath); if (!targetDir.exists() && !targetDir.isDirectory()) { if (targetDir.mkdirs()) { log.info("创建目录成功"); } else { log.error("创建目录失败"); } } // String path = ResourceUtils.getURL("classpath:").getPath() + "static/upload/"; // String filePath = path.replace('/', '\\').substring(1, path.length()); String fileName = file.getOriginalFilename(); int lastIndexOf = fileName.lastIndexOf("."); //获取文件的后缀名 .jpg String suffix = fileName.substring(lastIndexOf); fileName = IdWorker.getId()+suffix; File dest = new File(filePath + fileName); log.info("文件路径:{}", dest.getPath()); log.info("文件名:{}", dest.getName()); file.transferTo(dest); JSONObject jsonObject = new JSONObject(); jsonObject.put("url", "/api/upload/" + fileName); return success(jsonObject); } catch (IOException e) { log.info("上传失败:{}", e.getMessage()); } return error(30000, "上传失败"); } // @PostMapping("/import_db") // public Map<String, Object> importDb(@RequestParam("file") MultipartFile file) throws IOException { // service.importDb(file); // return success(1); // } // // @RequestMapping("/export_db") // public void exportDb(HttpServletRequest request, HttpServletResponse response) throws IOException { // HSSFWorkbook sheets = service.exportDb(service.readQuery(request), service.readConfig(request)); // response.setContentType("application/octet-stream"); // response.setHeader("Content-disposition", "attachment;filename=employee.xls"); // response.flushBuffer(); // sheets.write(response.getOutputStream()); // sheets.close(); // } public Map<String, Object> success(Object o) { Map<String, Object> map = new HashMap<>(); if (o == null) { map.put("result", null); return map; } if (o instanceof List) { if (((List) o).size() == 1) { o = ((List) o).get(0); map.put("result", o); }else { String jsonString = JSONObject.toJSONString(o); JSONArray objects = service.covertArray(JSONObject.parseArray(jsonString)); map.put("result", objects); } } else if (o instanceof Integer || o instanceof String) { map.put("result", o); } else { String jsonString = JSONObject.toJSONString(o); JSONObject jsonObject = JSONObject.parseObject(jsonString); JSONObject j = service.covertObject(jsonObject); map.put("result", j); } return map; } public Map<String, Object> error(Integer code, String message) { Map<String, Object> map = new HashMap<>(); map.put("error", new HashMap<String, Object>(4) {{ put("code", code); put("message", message); }}); return map; } }
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统