Java项目:121SSM记账管理系统

博主主页:Java旅途
简介:分享计算机知识、学习路线、系统源码及教程
文末获取源码

一、项目介绍

记账管理系统基于Spring+SpringMVC+Mybatis开发,系统主要功能如下:

  • 收入项管理

  • 支出项管理

  • 收入方式管理

  • 支出方式管理

  • 添加收入

  • 添加支出

  • 余额管理

  • 历史收支

  • 图表统计

二、技术框架

  • 后端:Spring,Springmvc,Mybatis
  • 前端:bootstrap,echarts,jquery

三、安装教程

  1. 用idea打开项目
  2. 在idea中配置jdk环境
  3. 配置maven环境并下载依赖
  4. 配置Tomcat8.0
  5. 新建数据库,导入数据库文件
  6. mysqldb.properties文件中将数据库账号密码改成自己本地的
  7. 启动运行, , 管理员账号密码 system/123456

四、项目截图

image-20230720101826648

image-20230720101631060

image-20230720101716326

image-20230720101732513

image-20230720101750540

image-20230720101802942

五、相关代码

IncomeController

package com.taoxiuxia.controller;import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import com.taoxiuxia.model.Balance;
import com.taoxiuxia.model.Income;
import com.taoxiuxia.model.Item;
import com.taoxiuxia.model.PayMethod;
import com.taoxiuxia.model.SessionUser;
import com.taoxiuxia.service.IIncomeService;
import com.taoxiuxia.service.IItemService;
import com.taoxiuxia.service.IMonthlyStatisticsService;
import com.taoxiuxia.service.IPayMethodService;
import com.taoxiuxia.util.Constants;
import com.taoxiuxia.util.MyDateFormat;
import com.taoxiuxia.util.NumberFormat;@Controller
@RequestMapping("/incomeController")
public class IncomeController {private IIncomeService incomeService;private IItemService itemService;private IMonthlyStatisticsService monthlyStatisticsService;private IPayMethodService payMethodService;public IIncomeService getIncomeService() {return incomeService;}@Autowiredpublic void setIncomeService(IIncomeService incomeService) {this.incomeService = incomeService;}public IMonthlyStatisticsService getMonthlyStatisticsService() {return monthlyStatisticsService;}@Autowiredpublic void setMonthlyStatisticsService(IMonthlyStatisticsService monthlyStatisticsService) {this.monthlyStatisticsService = monthlyStatisticsService;}public IItemService getItemService() {return itemService;}@Autowiredpublic void setItemService(IItemService itemService) {this.itemService = itemService;}public IPayMethodService getPayMethodService() {return payMethodService;}@Autowiredpublic void setPayMethodService(IPayMethodService payMethodService) {this.payMethodService = payMethodService;}/*** income页面** @param model* @return*/@RequestMapping("/showIncome")public String showIncomes(Model model, HttpSession session) {Map<String, Float> map = monthlyStatistics(session);SessionUser sessionUser= (SessionUser) session.getAttribute(Constants.SESSION_USER_KEY);int userId = sessionUser.getUserId();//页面上的统计信息model.addAttribute("totalIncome", NumberFormat.save2Decimals(map.get("monthlyIncome")));model.addAttribute("totalExpenditure", NumberFormat.save2Decimals(map.get("monthlyExpenditure")));model.addAttribute("notActualExpenditure", NumberFormat.save2Decimals(map.get("notActualExpenditure")));model.addAttribute("balanceInBeginOfMonth", NumberFormat.save2Decimals(map.get("balanceInBeginOfMonth")));model.addAttribute("balanceId_InBeginOfMonth", NumberFormat.save2Decimals(map.get("balanceId_InBeginOfMonth")));model.addAttribute("balanceShould", NumberFormat.save2Decimals(map.get("balanceShould")));model.addAttribute("actualBalance", NumberFormat.save2Decimals(map.get("actualBalance")));model.addAttribute("actualBalanceId", NumberFormat.save2Decimals(map.get("actualBalanceId")));model.addAttribute("actualExpenditure", NumberFormat.save2Decimals(map.get("actualExpenditure")));// income listList<Income> incomes = incomeService.loadIncomes(userId);model.addAttribute("incomes", incomes);// 收入项 listList<Item> items = itemService.loadIncomeItems(userId);model.addAttribute("items", items);//收入方式listList<PayMethod> payMethods = payMethodService.loadPayMethods(userId, "in");model.addAttribute("payMethods", payMethods);model.addAttribute("sessionUser", sessionUser);return "pages/income";}/*** 增加income** @param item* @param money* @param remark*/@RequestMapping("/addIncome")public void addIncomes(String date, int item, float money, String moneyType, String remark, HttpSession session) {int userId = Integer.parseInt(session.getAttribute(Constants.USER_ID)+"");incomeService.addIncome(userId, date, item, money, moneyType, remark);}/*** 修改收入** @param incomeId* @param money* @param itemId* @param remark*/@RequestMapping("/changeIncome")public void changeIncome(int incomeId, float money, String moneyType, int itemId, String remark, String date) {incomeService.changeIncome(incomeId, money, moneyType, itemId, remark, MyDateFormat.dateFormat(date));}/*** 删除收入** @param incomeId* @param itemId*/@RequestMapping("/deleIncome")public void deleIncome(int incomeId, HttpSession session) {incomeService.deleIncome(incomeId);}/*** 在收入和支出页面上 统计部分的内容* 这部分和ExpenditureController的相同方法完全一样** @param session* @return*/public Map<String,Float> monthlyStatistics(HttpSession session) {int userId = Integer.parseInt(session.getAttribute(Constants.USER_ID)+"");Map<String,Float>map = new HashMap<String, Float>();// 月收入float monthlyIncome = monthlyStatisticsService.monthlyIncome(userId);map.put("monthlyIncome", monthlyIncome);// 月支出float monthlyExpenditure = monthlyStatisticsService.monthlyExpenditure(userId);map.put("monthlyExpenditure", monthlyExpenditure);// 月支出中花呗与信用卡的数额float notActualExpenditure = monthlyStatisticsService.notActualExpenditure(userId);map.put("notActualExpenditure", notActualExpenditure);// 本月实际支出float actualExpenditure = monthlyExpenditure - notActualExpenditure;map.put("actualExpenditure", actualExpenditure);// 本月初(上月末)结余Balance balance_InBeginOfMonth = monthlyStatisticsService.balanceInBeginOfMonth(userId);float actualBalance_InBeginOfMonth = balance_InBeginOfMonth.getActualBalance();map.put("balanceInBeginOfMonth", actualBalance_InBeginOfMonth);map.put("balanceId_InBeginOfMonth", balance_InBeginOfMonth.getId() + 0f);// 本月应结余 ==> 月初结余+月收入- (月支出-花呗/信用卡)float balanceShould = actualBalance_InBeginOfMonth + monthlyIncome - (monthlyExpenditure - notActualExpenditure);map.put("balanceShould", balanceShould);// 本月实际结余Balance balanceOfThisMonth = monthlyStatisticsService.balanceOfThisMonth(userId);float actualBalance; // 本月实际结余float actualBalanceId;if(balanceOfThisMonth == null){actualBalance = -1;actualBalanceId = -1;}else{actualBalance = balanceOfThisMonth.getActualBalance();actualBalanceId = balanceOfThisMonth.getId();}map.put("actualBalance", actualBalance);map.put("actualBalanceId", actualBalanceId);return map;}
}

PayMethodController

package com.taoxiuxia.controller;import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpSession;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.taoxiuxia.model.PayMethod;
import com.taoxiuxia.model.SessionUser;
import com.taoxiuxia.service.IPayMethodService;
import com.taoxiuxia.util.Constants;@Controller
@RequestMapping("/payMethodController")
public class PayMethodController {private Logger logger=LoggerFactory.getLogger(PayMethodController.class);private IPayMethodService payMethodService;public IPayMethodService getPayMethodService() {return payMethodService;}@Autowiredpublic void setPayMethodService(IPayMethodService payMethodService) {this.payMethodService = payMethodService;}/*** 收支方式管理页面* * @param model* @return*/@RequestMapping("/showManagePayMethods")public String showManagePayMethods(Model model,HttpSession session) {SessionUser sessionUser = (SessionUser) session.getAttribute(Constants.SESSION_USER_KEY);int userId = sessionUser.getUserId();List<PayMethod> incomePayMethods = payMethodService.loadPayMethods(userId, "in");List<PayMethod> expenditurePayMethods = payMethodService.loadPayMethods(userId, "ex");model.addAttribute("incomePayMethods", incomePayMethods);model.addAttribute("expenditurePayMethods", expenditurePayMethods);model.addAttribute("sessionUser", sessionUser);return "pages/managePayMethods";}/*** 修改PayMethod* @param payMethodId* @param payMethodName* @param isCountInThisMonthEx* @param remark*/@RequestMapping("/changePayMethod")public void changeItem(int payMethodId, String payMethodName, int isCountInThisMonthEx, String remark) {payMethodService.changePayMethod(payMethodId, payMethodName, isCountInThisMonthEx, remark);}/*** 删除PayMethod* @param payMethodId*/@RequestMapping("/delePayMethod")public void delePayMethod(int payMethodId) {payMethodService.delePayMethod(payMethodId);}/*** 增加PayMethod* @param session* @param payMethodName* @param isCountInThisMonthEx* @param remark* @param inOrEx*/@RequestMapping("/addPayMethod")public void addItem(HttpSession session,String payMethodName, int isCountInThisMonthEx, String remark, String inOrEx) {SessionUser sessionUser = (SessionUser) session.getAttribute(Constants.SESSION_USER_KEY);int userId = sessionUser.getUserId();payMethodService.addPayMethod(userId, payMethodName, isCountInThisMonthEx, inOrEx, remark);}/*** PayMethod的上移和下移* @param session* @param itemId* @param inOrEx* @param upAndDown* @return*/@RequestMapping(value = "/upAndDownPayMethod", produces = "application/json;charset=UTF-8")public @ResponseBody Map<String ,Object> upAndDownPayMethod(HttpSession session, int payMethodId, String inOrEx, String upAndDown) {Map<String, Object> map = new HashMap<String, Object>();SessionUser sessionUser = (SessionUser) session.getAttribute(Constants.SESSION_USER_KEY);int userId = sessionUser.getUserId();String msg = payMethodService.upAndDownPayMethod(userId, payMethodId, inOrEx, upAndDown);map.put("info", msg);return map;}
}

大家点赞、收藏、关注、评论啦 、👇🏻点开下方卡片👇🏻关注后回复 105

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

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

相关文章

《ORANGE’S:一个操作系统的实现》读书笔记(三十一)文件系统(六)

上一篇文章记录了对文件的读写操作&#xff0c;那么文件操作到目前为止&#xff0c;已经完成了创建和读写&#xff0c;还剩下的常用操作就是删除文件了。这篇文章就来记录删除文件的实现以及总结一下为文件系统添加系统调用的步骤。 删除文件 删除是添加的反过程&#xff0c;…

微服务自动化docker-compose

一、docker-compose介绍 Docker Compose是一个用来定义和运行多个复杂应用的Docker编排工具。例如&#xff0c;一个使用Docker容器的微服务项目&#xff0c;通常由多个容器应用组成。那么部署时如何快速启动各个微服务呢&#xff0c;一个个手动启动&#xff1f;假如有上百个微服…

计算机毕业设计 | SpringBoot+vue校园问卷调查系统(附源码)

1&#xff0c;绪论 研究目的 在进入21世纪以后&#xff0c;互联网得到了蓬勃的发展&#xff0c;电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后&#xff0c;传统问卷还存在很多弊端&#xff1a; 问卷分发起来比较困难&#xff0c;并且分发试卷耗费大量的金…

CSS 基本选择器 复合选择器

文章目录 基本选择器标记选择器类别选择器ID选择器测试基本选择器 复合选择器交集选择器并集选择器后代选择器全选选择器测试复合选择器 基本选择器 准备几个HTML标签用来测试 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"U…

智能小程序能做什么?

一. 自定义Tab页 涂鸦提供了丰富的场景化、个性化的 ToC 智能服务&#xff0c;不仅可以快速低成本的自由搭建出更多智能服务&#xff0c;还为你提供了基于小程序技术方案的可自主可控的自定义开发链路&#xff0c;为拓展更多品牌化、个性化、差异化智能服务提供生态基础。 我…

Javaweb之SpringBootWeb案例的详细解析

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xf…

word无法插入方程式(方程式反灰)

word无法插入方程式&#xff08;方程式反灰&#xff09; 来自实测>插入方程式&#xff0c;反灰用不了>随便存在哪里&#xff0c;右键看属性&#xff1a;>发现真的是doc&#xff0c;得改成docx才可以&#xff1a;>打开原始档案&#xff0c;另存为word文件即可&#…

什么是google算法?

谷歌算法本身指的是谷歌针对搜索引擎做的规定 要想在别人的地盘玩&#xff0c;那肯定要了解这个地盘的规定&#xff0c;不然做了什么违反了规定&#xff0c;谷歌肯定不会让你继续玩下去 要想做谷歌&#xff0c;那肯定要了解谷歌的算法&#xff0c;然而谷歌的算法也不是一成不变…

ros2 基础学习04 -colcon构建工具

一、colcon构建工具介绍 1.1 构建系统与构建工具 构建系统与构建工具区分点在于针对的对象不同&#xff0c;构建系统只针对一个单独的包进行构建&#xff0c;而构建工具重点在于按照依赖关系依次调用构建系统完成一系列功能包的构建。 1.2 构建系统 构建系统包括CMake、Pyt…

【python】进阶--->MySQL数据库(四)

一、主键约束 primary key : 唯一标识数据库中的每一条记录. 被主键的值唯一 主键列不能为null 每个表应该都要设置主键添加主键约束 在创建表时,直接在字段后面添加主键约束 create table 表名 (字段名 类型(长度) primary key )创建表时,不直接在字段后面添加主键…

ChatGPT网站小蜜蜂AI更新了

ChatGPT网站小蜜蜂AI更新了 前阶段郭震兄弟刚开发小蜜蜂AI网站的的时候&#xff0c;写了一篇关于ChatGPT的网站小蜜蜂AI的博文[https://blog.csdn.net/weixin_41905135/article/details/135297581?spm1001.2014.3001.5501]。今天听说小蜜蜂网站又增加了新的功能——在线生成思…

帆软后台(外观配置-主题)文件上传漏洞

漏洞利用 帆软上传主题获取shell&#xff08;管理系统-外观配置&#xff09; 添加主题上传的压缩包中放入shell.jsp马 &#xff08;没有添加主题功能直接构造数据包&#xff09; POST /WebReport/ReportServer?opfr_attach&cmdah_upload&filenametest.zip&widt…

充电桩发生短路故障时应该如何处理

安科瑞武陈燕acrelcy 一、什么是限流式保护器 ASCP系列电气防火限流式保护器是专门为了保护低压配电线路中短路、过载等问题研发&#xff0c;可以有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大&#xff0c;以及使用寿…

【uniapp + uView】仿BOSS直聘三级职位列表实现

1. 效果图 2. 完整代码 <template><view class="search-duty-page"><view class=

虾皮广告数据:​如何利用广告数据优化虾皮(Shopee)销售业绩

在虾皮&#xff08;Shopee&#xff09;平台上&#xff0c;广告数据对于卖家来说是至关重要的&#xff0c;它可以帮助卖家了解广告的效果并进行相应的优化。通过监控和分析这些广告数据&#xff0c;卖家可以更好地理解广告的表现&#xff0c;调整广告策略&#xff0c;提高广告的…

数据结构初阶之排序

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 一.前言 二.选择排序 …

大数据深度学习长短时记忆网络(LSTM):从理论到PyTorch实战演示

文章目录 大数据深度学习长短时记忆网络&#xff08;LSTM&#xff09;&#xff1a;从理论到PyTorch实战演示1. LSTM的背景人工神经网络的进化循环神经网络&#xff08;RNN&#xff09;的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门&#xff08;Forget Gat…

强烈推荐收藏!LlamaIndex 官方发布高清大图,纵览高级 RAG技术

近日&#xff0c;Llamaindex 官方博客重磅发布了一篇博文《A Cheat Sheet and Some Recipes For Building Advanced RAG》&#xff0c;通过一张图给开发者总结了当下主流的高级RAG技术&#xff0c;帮助应对复杂的生产场景需要。 喜欢记得收藏、点赞、关注。 通俗易懂讲解大…

c语言do while循环语句

c语言do while循环语句 c语言do while循环语句 c语言do while循环语句一、do while循环语句格式二、do while 循环案例 一、do while循环语句格式 do while语句先循环后判断,条件不符合就结束循环&#xff0c;条件符合继续循环 do { 代码 } while(表达式);int main() {int a 0…

KEIL MDK 工程(.uvprojx)目录更改后快速修改方法

概述 在项目过多时&#xff0c;为了方便管理&#xff0c; 需借用文件夹命名来&#xff0c;举例&#xff1a; 1、原工程是在“STM32_Test_Project\MDK-ARM”目录下&#xff0c;我现在创建新文件夹&#xff0c;“Test”&#xff0c;避免原来的受污染&#xff0c;或者好管理等等好…