「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
今天带大家动手实践一下SSM框架项目:
本系统采用SSM技术进行开发与设计,可以让学员对JavaEE的框架有个全面的认识,并能将实用技能与理论知识进行完美的结合,让学员知其然的同时,也要知其所以然。
ps:
服务端:Spring+SpringMVC+MyBatis框架整合 数据库:MySql8.0 web服务器:Tomcat 项目管理:Maven 前端:jQuery+BootStrap+JavaScript 开发工具:idea2020
第一章:介绍
个人理财系统,主要帮助用户管理个人资金情况管理,养成良好的消费习惯。避免
铺张浪费。功能上主要有消费记录管理,营收管理,消费计划管理,对账管理,登录注册管理等几个主要业务模块
第二章:使用技术
使用主流开发环境SSM框架,数据库中使用MySql数据库服务器。在用户体现上引入了
JQUERY,AJAX等前沿的前端技术
第三章:项目优势
3.1 使用了成熟SSM框架
现如今SSM框架已经成为了项目开发时必然使用的技术。个人理财管理系统使用的就是SSM
这套成熟的框架。通过本项目的练习便于学员熟练使用SSM框架中各项开发技巧
3.2 前端应用
一直以来,JAVA学员对于前端的掌握都是一个缺点。经过多年教学实践发现主要有两个原因。一是对于前端使用感受的重要性认识不足。二是在课程学习过程中,前端练习相对较少
本系统在开发时,穿插了数量较多的前端开发,由简单到实用,循序渐进。确保学员进行醒目开发时,弥补前端开发的缺陷。
3.3 AJAX的应用
初学者前端知识的不足,也直接影响了AJAX的理解与使用。对于同步请求与异步请求的本质区别,尚不够清晰。甚至部分学员对于AJAX,谈虎色变。个人理财管理系统使用了较为经典,较为常见的AJAX案例,即生动又使用。同时进行陷阱式教学,制造问题并给出解题步骤。确保学员在经过项目开发之后,熟练掌握AJAX异步请求开发技术,对AJAX技术的理解迈上一个全新的台阶。
3.4 陷阱式教学
在教学过程中,经常听到学员对于异常调试的困惑。思路理解了,代码也形成了。但是在运行时却因为不具备异常调试能力,而陷入迷茫与痛苦。降低了学员学习的动力,同时也增加了学员对于手撕代码的恐惧。结合上述问题,个人理财管理系统在进行项目开发讲解时,将开发时常见异常,比如NullPointerException,NumberFormatException,ClassNotFoundException
等,引入到项目开发过程中,然后手把手带领学员进行BUG调试。确保学员能看懂常见异常信息描述,能定位异常位置,能熟练使用断点进行异常摸排与修改。
3.5 图文并茂式教学
在教学过程中,经常听到学员表示知识点已经掌握,但是独立开发没有思路。因此在个人理财管理系统开发教学中,都是先进行思路讲解,再进行代码演示。而且思路讲解会作为独立视频以此来增加学员关注度。并结合填鸭式教学方式,在相近功能上反复进行思路讲解,最终确保在学员完成项目开发后,掌握常见功能的解决方案,并熟练使用画图技法,来完成思路的引导,事半功倍,增加学员的自信心,激发学员学习热情,确保学员在实际工作中召之即来,来之能战的能力.
第四章:消费类型开发
4.1 介绍:
个人理财管理系统中,消费类型管理属于基础数据维护管理开发。通过消费类型的帮助在记账环节中突出钱花到哪里了,由是从哪里赚的钱
4.2 功能
- 消费类型添加
- 消费类型查询
- 消费类型删除
- 消费类型更新
4.3 Entity:
public class Consumption {
private Integer id;
private String typeName;
private Integer level;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public Consumption(Integer id, String typeName, Integer level) {
this.id = id;
this.typeName = typeName;
this.level = level;
}
public Consumption() {
}
@Override
public String toString() {
return "Consumption{" +
"id=" + id +
", typeName='" + typeName + '\'' +
", level=" + level +
'}';
}
4.4 Dao
import com.test.entity.Consumption;
import java.util.List;
public interface ConsumptionDao {
//1.消费类型添加
public int insert(Consumption obj);
//2.一级消费类型查询
public List findAllFirstConsumption();
//3.消费类型更新
public int update(Consumption obj);
//4.一级消费类型删除
public int delete(int id);
//5.根据ID编号查询消费类型详细信息
public Consumption findById(int id);
}
4.5 SQL映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.test.dao.ConsumptionDao">
<!--消费类型添加-->
<insert id="insert" parameterType="Consumption">
insert into Consumption(id,typeName,level)
values(#{id},#{typeName},#{level})
</insert>
<!-- 消费类型一级查询 -->
<select id="findAllFirstConsumption"
resultType="Consumption">
select * from consumption where level is null
</select>
<!--消费类型更新-->
<update id="update" parameterType="Consumption">
update consumption set typeName=#{typeName},level=#{level}
where id=#{id}
</update>
<!--消费类型删除-->
<delete id="delete">
delete from consumption where id=#{id}
</delete>
<!--消费类型详细信息查询-->
<select id="findById" resultType="Consumption">
select * from Consumption
where
id=#{id}
</select>
</mapper>
4.6 Service
package com.test.service;
import com.test.entity.Consumption;
import java.util.List;
public interface ConsumptionService {
//1.消费类型添加业务
public int insertConsumption(Consumption obj);
//2.消费类型更新业务
public int updateConsumption(Consumption obj);
//3.一级消费类型更新业务
public List findFirstConsumption();
//4.一级消费类型删除业务
public int deleteFirstConsumption(int id);
//5.根据id编号查询消费类型消息信息
public Consumption findById(int id);
4.7 ServiceImpl
package com.test.serviceImpl;\
\
import com.test.dao.ConsumptionDao;\
import com.test.entity.Consumption;\
import com.test.service.ConsumptionService;\
import org.springframework.beans.factory.annotation.Autowired;\
import org.springframework.beans.factory.annotation.Qualifier;\
import org.springframework.beans.factory.annotation.Value;\
import org.springframework.stereotype.Component;\
import org.springframework.stereotype.Controller;\
import org.springframework.stereotype.Service;\
\
import java.util.List;\
@Service(value = "consumptionService")\
public class ConsumptionServiceImpl implements ConsumptionService {\
\
@Autowired\
private ConsumptionDao consumptionDao;\
\
@Override\
public int insertConsumption(Consumption obj) {\
if(obj.getId()==null || 0==obj.getId()){\
obj.setId(1);\
}\
return consumptionDao.insert(obj);\
}\
\
@Override\
public int updateConsumption(Consumption obj) {\
return consumptionDao.update(obj);\
}\
@Override\
public List findFirstConsumption() {\
return consumptionDao.findAllFirstConsumption();\
}\
\
//进行事务管理,实现消费类型以及消费记录级联删除\
@Override\
public int deleteFirstConsumption(int id) {\
return consumptionDao.delete(id);\
}\
\
@Override\
public Consumption findById(int id) {\
return consumptionDao.findById(id);\
}\
}
4.8 Controller
package com.test.controller;
import com.test.entity.Consumption;
import com.test.service.ConsumptionService;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
@RequestMapping(value = "/consumption")
public class ConsumptionController {
@Autowired
@Qualifier(value = "consumptionService")
private ConsumptionService consumptionService;
//一级消费类型注册
@RequestMapping(value = "/first_insert.do")
public ModelAndView firstInsert(Consumption obj){
int result =-1;//表示失败
ModelAndView mv = new ModelAndView();
//1.调用业务类对象完成服务
result =consumptionService.insertConsumption(obj);
//2.处理结果
if(result<=0){
mv.addObject("info","一级消费类型添加失败");
}else{
mv.addObject("info","一级消费类型添加成功");
}
mv.setViewName("info");
return mv;
}
//一级消费类型删除
@RequestMapping(value = "/delete/first.do")
public ModelAndView deleteFirst(int id){
int result =-1;
ModelAndView mv = new ModelAndView();
//1.调用service处理服务
result = consumptionService.deleteFirstConsumption(id);
//2.处理结果
if(result<=0){
mv.addObject("info","一级消费类型删除失败");
}else{
mv.addObject("info","一级消费类型删除成功");
}
mv.setViewName("info");
return mv;
}
//根据id编号查询消费类型详细信息
@RequestMapping(value = "/findById.do")
public ModelAndView findById(int id){
Consumption cp = null;
ModelAndView mv = new ModelAndView();
//1.调用业务对象提供服务
cp = consumptionService.findById(id);
//2.处理结果
mv.addObject("result",cp);
mv.setViewName("first_Consumption_info");
return mv;\
}
//一级消费类型查询
@RequestMapping(value = "/first_findAll.do")
public ModelAndView findFirst(){
List consumptionList = null;
ModelAndView mv = new ModelAndView();
//1.调用service提供所有一级消费类型
consumptionList =consumptionService.findFirstConsumption();
//2.结果处理
mv.addObject("list",consumptionList);
mv.setViewName("comsumption_first_show");
return mv;
}
//消费类型更新\
@RequestMapping(value = "/update.do")
public ModelAndView updateConsumption(Consumption obj){
int result =-1;//表示失败
ModelAndView mv = new ModelAndView();
//1.调用业务类对象完成服务
result =consumptionService.updateConsumption(obj);
//2.处理结果
if(result<=0){
mv.addObject("info","消费类型更新失败");
}else{
mv.addObject("info","消费类型更新成功");
}
mv.setViewName("info");
return mv;
}
}
第五章 收入类型开发
5.1 介绍:
个人理财系统中,通过收入类型管理。确保用户可以科学有效的分析自己的财务来源
5.2 功能:
- 收入类型添加
- 收入类型查询
- 收入类型删除
- 收入类型更新
第六章 收支管理
6.1 介绍:
完成每日收支记录管理
6.2 功能:
- 收支类型添加
- 收支类型查询
- 收支类型删除
- 收支类型更新
第七章 财务任务管理
7.1介绍:
设置财务任务,即设定每月计划收入与消费金额。做到有计划的生活
7.2 功能
- 财务任务添加
- 财务任务查询
- 财务任务删除
- 财务任务更新
第八章 对账管理
8.1介绍:
基于指定的财务任务评价本月财务任务是否达标
8.2 功能
对账查询分析