基于SpringBoot的财务管理系统

news2024/11/28 23:50:13

末尾获取源码
开发语言:Java
Java开发工具:JDK1.8
后端框架:SpringBoot
前端:Vue
数据库:MySQL5.7和Navicat管理工具结合
服务器:Tomcat8.5
开发软件:IDEA / Eclipse
是否Maven项目:是


目录

一、项目简介

二、系统功能

三、系统项目截图

3.1管理员

3.2员工

四、核心代码

4.1登录相关

4.2文件上传

4.3封装


一、项目简介

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,财务管理系统就是信息时代变革中的产物之一。

任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于java技术、springboot框架、B/S机构、Mysql数据库设计并实现了财务管理系统。系统主要包括首页,个人中心,员工管理,部门管理,员工工资管理,工资调整管理,资产类别管理,固定资产管理,经营信息管理,序时账管理,年度利润管理,系统管理等功能模块。

本文首先介绍了财务管理技术的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及E-R图。然后,设计框架并根据设计的框架编写代码以实现系统的各个功能模块。最后,对初步完成的系统进行测试,主要是功能测试、单元测试和性能测试。测试结果表明,该系统能够实现所需的功能,运行状况尚可并无明显缺点


二、系统功能

系统主要包括首页,个人中心,员工管理,部门管理,员工工资管理,工资调整管理,资产类别管理,固定资产管理,经营信息管理,序时账管理,年度利润管理,系统管理等功能模块。



三、系统项目截图

3.1管理员

管理员登录系统后,可以对首页,个人中心,员工管理,部门管理,员工工资管理,工资调整管理,资产类别管理,固定资产管理,经营信息管理,序时账管理,年度利润管理,系统管理等功能进行相应的操作管理

员工管理,在员工管理页面可以对索引,员工工号,员工姓名,图片,性别,部门,职位,联系方式,入职时间等内容进行详情,修改和删除等操作

部门管理,在部门管理页面可以对索引,部门等信息进行详情,修改和删除等操作

员工工资管理,在员工工资管理页面可以对索引,工资月份,员工工号,部门,基本工资,工龄补贴,加班工资,奖励,罚款,个税,社保代缴,奖惩说明,实发工资,登记时间等内容进行详情,修改,删除等操作

工资调整管理,在工资调整管理页面可以对索引,调整原因,调整额度,调整时间,员工工号,员工姓名,部门等内容进行详情,修改,删除等操作

固定资产管理,在固定资产管理页面可以对索引,资产名称,封面,资产类别,资产状态,资产价值,风险计提,计提原因,登记时间等内容进行详情,修改,删除等操作 

经营信息管理,在经营信息管理页面可以对索引,统计月份,营收金额,月产量,前一客户,前一百分比,前二客户,前二百分比,前三客户,前三百分比,登记时间等内容进行详情,修改,删除等操作 

序时账管理,在序时账管理页面可以对索引,凭证单号,发票,收支类型,摘要,对方科目,金额,登记时间等内容进行详情,修改,删除等操作 

年度利润管理,在年度利润管理页面可以对索引,年度统计,主要收入,只要业务成本,只要业务税金及附加,其他业务利润,营业费用,管理费用,财务费用,投资收益,补贴收益,营业外收入,营业外支出,所得税,净利润,登记时间等内容进行详情,修改,删除等操作

系统管理,在公司公告页面可以对索引,标题,图片等内容进行详情,修改和删除等操作; 

3.2员工

员工登录进入系统可以对首页,个人中心,员工工资管理,工资调整管理,系统管理等功能进行相应操作


个人中心,在个人信息页面通过填写员工工号,员工姓名,照片,性别,职位,联系方式,入职时间等内容进行个人信息修改操作 

工资调整管理,在工资调整管理页面可以对索引,调整原因,调整额度,调整时间,员工工号,员工姓名,部门等内容进行详情操作 


四、核心代码

4.1登录相关


package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

4.2文件上传

package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;

/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if(!path.exists()) {
		    path = new File("");
		}
		File upload = new File(path.getAbsolutePath(),"/upload/");
		if(!upload.exists()) {
		    upload.mkdirs();
		}
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
		file.transferTo(dest);
		FileUtils.copyFile(dest, new File("C:\\Users\\Desktop\\jiadian\\springbootl7own\\src\\main\\resources\\static\\upload"+"/"+fileName));
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if(!path.exists()) {
			    path = new File("");
			}
			File upload = new File(path.getAbsolutePath(),"/upload/");
			if(!upload.exists()) {
			    upload.mkdirs();
			}
			File file = new File(upload.getAbsolutePath()+"/"+fileName);
			if(file.exists()){
				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
					getResponse().sendError(403);
				}*/
				HttpHeaders headers = new HttpHeaders();
			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
			    headers.setContentDispositionFormData("attachment", fileName);    
			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
}

4.3封装

package com.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据
 */
public class R extends HashMap<String, Object> {
	private static final long serialVersionUID = 1L;
	
	public R() {
		put("code", 0);
	}
	
	public static R error() {
		return error(500, "未知异常,请联系管理员");
	}
	
	public static R error(String msg) {
		return error(500, msg);
	}
	
	public static R error(int code, String msg) {
		R r = new R();
		r.put("code", code);
		r.put("msg", msg);
		return r;
	}

	public static R ok(String msg) {
		R r = new R();
		r.put("msg", msg);
		return r;
	}
	
	public static R ok(Map<String, Object> map) {
		R r = new R();
		r.putAll(map);
		return r;
	}
	
	public static R ok() {
		return new R();
	}

	public R put(String key, Object value) {
		super.put(key, value);
		return this;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王石创立“生物圈三号”发起“双碳同行者大会”,绿色家居企业参与其中

2023年5月27日 &#xff0c;由万科集团创始人、深石集团创始人王石先生创立的碳中和社区品牌“生物圈三号”在深圳大梅沙成功举办了“回归未来双碳同行——生物圈三号双碳同行者大会暨全球运河穿越新书发布会”。 生物圈三号作为社区碳中和综合解决方案平台&#xff0c;为建筑、…

JVM-基础知识

JVM基础知识 JVM结构图 字节码文件 Java虚拟机不和包括Java在内的任何语言绑定,它只与字节码文件这种特定的二进制文件格式所关联. Class文件结构不仅仅是JVM的执行入口,更是Java生态圈的基础和核心. 字节码文件内容是什么 字节码是一种二进制的类文件,他的内容是JVM指令,而…

OpenAI竞对再被谷歌加注!4.5亿美元新融资到位,累计已吸金14.5亿美元

量子位 | 公众号 QbitAI OpenAI之外&#xff0c;第二不差钱的AI初创公司出现了&#xff01; 研发出ChatGPT最强竞品Claude的Anthropic公司&#xff0c;在谷歌投资之后&#xff0c;再次官宣获得了4.5亿美元C轮融资。 这轮收购之后&#xff0c;Anthropic资金一跃达到14.5亿美元…

CPLEX Studio OPL项目介绍

参考B站视频&#xff1a;cplex入门到精通 1.理解 OPL 项目 CPLEX Studio 处理 OPL 项目文件(.project)、数据文件(.dat)、模型文件 (.mod)、设置文件(.ops)和运行配置(.oplproject)。 文件类型扩展名作用份数说明模型文件.mod模型存储和数据1~n必须数据文件.dat数据存储0~n非…

【代码随想录】刷题Day42

1.01背包问题 问题介绍&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 1.二维数组实现思想 1.dp[i][j]的含义&#xff1a;首先…

头羊部落亮相首届校园预制菜展,成为预制菜行业领头羊

由北京工商大学与北京市学校基建后勤管理事务中心共同主办的首届预制菜产业与智慧团餐高质量发展研讨会暨校园食材展&#xff08;以下简称大会&#xff09;于2023年5月26-27日在北京工商大学举办。 △首届预制菜产业与智慧团餐高质量发展研讨会在北京工商大学隆重举行 △预制菜…

【Python map()、filter() 和 reduce()】零基础也能轻松掌握的学习路线与参考资料

Python编程中常使用map()、filter()和reduce()函数来实现对数据集的操作&#xff0c;尤其是在处理数据时&#xff0c;这些函数非常有用。在本文中&#xff0c;将介绍这些函数的学习路线和优秀实践&#xff0c;并提供一些参考资料供读者参考。 一、Python map() 函数 Python中…

附录5-黑马头条案例

目录 1 效果 2 组件库vant 2.1 安装 2.2 配置 2.3 项目中的使用 2.3.1 引用 2.3.2 tabbar 底部切换 2.3.3 navbar 顶部标题 2.3.4 van-list 上拉触底更新 2.3.5 van-pull-refresh 下拉更新 2.3.6 v-cell 2.3.7 van-icon 2.3.8 自定义风格 3 保持滚…

做接口测试时遇到接口加密了该如何处理

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。 摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 对称加密 对称加…

C语言获取AIX单网卡的多IP地址

环境配置 在AIX上&#xff0c;可以使用smitty tcpip命令给单个网卡配置多个IP别名。操作步骤如下&#xff1a; 选择Further Configuration 选择Network Interfaces 选择 Network Interfaces Selection 选择 Configure Aliases 5.选择Add an IPV4 Network Alias 选择需要配…

Vue3:组合式写法入门

Vue3&#xff1a;组合式写法入门 Date: May 11, 2023 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API <script> export default {data(){return {count:0}},methods:{addCount(){this.count}} } </script><script setup> imp…

超声波都应用在哪些领域中?功率放大器如何放大超声波?

超声波是声波的一部分&#xff0c;它的频率高于20kHz&#xff0c;是无法被人耳听到的声波&#xff0c;超声波与声波有共通之处&#xff0c;即它们都是由物体振动所产生&#xff0c;只能在介质中进行传播。无论是在自然界&#xff0c;还是人们的日常生活之中&#xff0c;超声波都…

Power BI DAX函数

1、聚合函数——由表达式定义的列或表中所有行的&#xff08;标量&#xff09;值&#xff0c;例如计数、求和、平均值、最小值或最大值。 函数说明APPROXIMATEDISTINCTCOUNT在列中返回唯一值的估计计数AVERAGE返回列中所有数字的平均值&#xff08;算术平均值&#xff09;AVER…

基于 Python 和深度学习技术实现的人体姿态识别

人体姿态识别是计算机视觉领域的一个重要应用&#xff0c;它通过识别人体的关键点和关节位置&#xff0c;能够准确地判断人体的姿态和动作。这项技术可以应用在很多领域&#xff0c;比如运动训练、医疗康复、安保监控等&#xff0c;为人们的生活和工作带来了很大的便利和效益。…

Fiddler抓包工具之fiddler设置弱网测试

弱网测试 概念&#xff1a;弱网看字面意思就是网络比较弱&#xff0c;我们通称为信号差&#xff0c;网速慢。 意义&#xff1a;模拟在地铁、隧道、电梯和车库等场景下使用APP &#xff0c;网络会出现延时、中断和超时等情况。 Fiddler弱网测试流程&#xff1a; 一、限速操作…

redis学习记录

前言 1. 什么是Redis&#xff1f;它主要用来什么的&#xff1f; Redis&#xff0c;英文全称是 Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xf…

代码里乐观锁与悲观锁

乐观锁与悲观锁区别 synchronized与cas举例 cas算法自旋 乐观锁原理&#xff1a;cas算法自旋 1.cas算法 2.自旋 乐观锁工具类 Atomiclnteger原子类incrementAndGet方法源码解析

React Fiber架构

说到Fiber&#xff0c;不得不说说他的发展史&#xff1a; React15 架构 React16之前的版本比对更新虚拟DOM的过程是采用循环递归方式来实现的&#xff0c;这种比对方式有一个问题&#xff0c;就是一旦任务开始进行就无法中断&#xff0c;如果应用中数组数量庞大&#xff0c;主…

红黑树及插入过程详解

推荐可视化插入、删除节点的二叉树网站&#xff1a;Red/Black Tree Visualization (usfca.edu) 1. 概述 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff08;Binary Search Tree&#xff09;。它在普通二叉搜索树的基础上通过引入额外的颜色属…

DragGAN图像生成原理与实现

DragGAN图像生成原理与实现 DragGAN模型是什么呢1. DragGAN背景介绍2. 模型方法2.1 算法原理2.1.1 Motion Supervision2.1.2 点跟踪 3. 实现部署步骤3.1 安装PyTorch3.2 安装 DragGAN3.3 运行 DragGAN Demo3.4 功能介绍 项目地址&#xff1a;https://github.com/Zeqiang-Lai/Dr…