APP应用开发|企业考勤与工资管理系统的设计与实现

简介: APP应用开发|企业考勤与工资管理系统的设计与实现

 

项目编号: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智能应用

基于大数据实现的各类数据管理和推荐系统

相关文章
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
650 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
729 1
|
4天前
|
移动开发 小程序 PHP
校园圈子论坛系统采取的PHP语音和uni账号开发的小程序APP公众号H5是否只需要4800元?是的,就是只需要4800元
关于校园圈子论坛系统采用PHP语言和uni-app开发的小程序、APP、公众号和H5是否仅需4800元这个问题,实际上很难给出一个确定的答案。这个价格可能受到多种因素的影响
|
7天前
|
缓存 移动开发 小程序
uni-vue3-wetrip自创跨三端(H5+小程序+App)酒店预订app系统模板
vue3-uni-wetrip原创基于vite5+vue3+uniapp+pinia2+uni-ui等技术开发的仿去哪儿/携程预约酒店客房app系统。实现首页酒店展示、预订搜索、列表/详情、订单、聊天消息、我的等模块。支持编译H5+小程序+App端。
42 8
毋庸置疑,就是要买好的上门家政APP系统!
在家政APP平台建设中,选择合适的家政系统至关重要。它直接影响平台的运营与未来发展。以低价为唯一标准选择系统,可能因质量问题导致重大损失。应注重系统的质量与适应性,确保平台稳定运行,支持市场快速变化的需求。
|
20天前
|
传感器 iOS开发 UED
探索iOS生态系统:从App Store优化到用户体验提升
本文旨在深入探讨iOS生态系统的多个方面,特别是如何通过App Store优化(ASO)和改进用户体验来提升应用的市场表现。不同于常规摘要仅概述文章内容的方式,我们将直接进入主题,首先介绍ASO的重要性及其对开发者的意义;接着分析当前iOS平台上用户行为的变化趋势以及这些变化如何影响应用程序的设计思路;最后提出几点实用建议帮助开发者更好地适应市场环境,增强自身竞争力。
|
22天前
|
人工智能 小程序 搜索推荐
uni app下开发AI运动小程序解决方案
本文介绍了在小程序中实现AI运动识别的解决方案。该方案依托于UNI平台,通过高效便捷的插件形式,实现包括相机抽帧控制、人体识别、姿态识别等在内的多项功能,无需依赖后台服务器,大幅提高识别效率和用户体验。方案内置多种运动模式,支持自定义扩展,适用于AI健身、云上赛事、AI体测等多场景,适合新开发和存量改造项目。
|
22天前
|
移动开发 小程序
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
仿青藤之恋社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
48 3
|
27天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!
|
1月前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。

热门文章

最新文章