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

简介: 本课题主要实现通过APP应用来进行员工考勤的在线管理和员工工资的在线管理操作。系统通过开发安卓应用APP以及相应的后台管理程序,来完成了一个前后端分离的企业考勤和工资管理系统的开发。后台开发使用Spring框架集成mybatis-plus框架来完成后台管理系统的开发,数据库采用MYSQL5.7,开发工具先用IDEA和Andriod Studio开发工具实现。

 作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码

项目编号: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.考勤异常申请

功能结构图如下所示:

image.gif编辑

三,系统展示

5.1 前端用户的基本功能

5.1.1 APP应用登录管理的展示

企业员工和部门经理用户打开APP应用,输入账户和密码提交请求到后台服务接口进行验证,验证通过后即登陆成功。如下图5.1所示。

image.gif编辑

图5.1 登录界面

5.1.2新闻资讯浏览的展示

企业员工和其部门经理角色登陆APP后可以在线查看新闻和公告信息,并对新闻进行点赞、评论、收藏等操作,具体如下图5.2、5.3所示:

image.gif编辑

图5.2新闻浏览展示图

image.gif编辑

图5.3新闻互动展示图

5. 1.3 员工在线考勤展示

  员工登陆APP后可以在我的个人中心里找到员工考勤,进行在线打卡操作,打卡的相关记录会有部门经理登陆后进行相应的审核操作,员工打卡具体如下图5.4所示。image.gif编辑

图5.4员工打卡信息界面图

5.1.5 员工请假管理展示

   员工登陆APP后可以在我的个人中心里找到员工请假,进行在线请假操作,填请假的相关事宜和时间后,请假的相关记录会有部门经理登陆后进行相应的审核操作,员工请假具体如下图5.5所示。

image.gif编辑

图5.5 在线请假管理界面图

5.1.5 部门经理缺勤扣款展示

部门经理登陆是入APP后,可以对自己部门员工的考勤信息进行查看,员工考勤出异常后,系统会自动进行记录,部门经理可以根据缺勤情况进行手动扣除绩效,具体如下图5.6所示。

image.gif编辑

图5.6 考勤扣款界面图

5.1.6 查看员工工资

部门经理登陆是入APP后,可以查看自己部门员的工资详情,具体如下图5.7所示。

image.gif编辑

图5.7工资查看界面图

5.1.7 签到审核实现

部门经理登陆是入APP后,可以对自己部门员工的考勤信息进行审核,未通过的审核将作为缺勤处理,具体如下图5.8所示。

image.gif编辑

图5.8签到审核界面图

5.1.8 请假审核实现

部门经理登陆是入APP后,可以对自己部门员工的请假信息进行审核具体如下图5.9所示。

image.gif编辑

图5.9请假审核界面图

5.2 后台管理功能展示

5.2.1管理员登陆

   企业员工考勤和工资管理平台的后台管理员登陆后方可以进行相关的信息管理操作,具体登陆界面如下图5.10所示。

image.gif编辑

图5.10 员工登陆管理界面图

5.2.2 员工管理功能展示

    管理员进入后台管理中选择系统用户管理下的员工管理,可以对企业的员工信息进行相应的管理操作,主要包含信息查询,员工添加,详情查看,修改和删除操作,具体如下图5.11所示。

image.gif编辑

图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;
    }
}

image.gif

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

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

image.gif编辑

image.gif编辑image.gif编辑

image.gif编辑

image.gif编辑image.gif编辑

image.gif编辑

image.gif编辑


相关文章
|
24天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
372 7
|
24天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
437 1
|
10天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
1月前
|
JavaScript 前端开发 小程序
uniapp一个人开发APP关键步骤和考虑因素
uniapp一个人开发APP关键步骤和考虑因素
97 1
uniapp一个人开发APP关键步骤和考虑因素
|
24天前
|
JavaScript 前端开发 UED
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
52 9
|
28天前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
153 1
|
7天前
|
机器人
布谷直播App系统源码开发之后台管理功能详解
直播系统开发搭建管理后台功能详解!
|
29天前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
448 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
2月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
16天前
|
NoSQL PHP Redis
布谷语音app源码服务器环境配置及技术开发语言
布谷语音app源码服务器环境配置及技术语言研发。。

热门文章

最新文章

下一篇
无影云桌面