Java课程设计——家庭理财管理系统SpringMVC+Mybatis+LayUI
1 前言
为了更方便地记录家庭成员之间的消费支出和收入,做一个家庭财务管理系统,对各家庭成员每天的消费做一个记录和统计,做成一个数据面板,以便更好的了解和展示家庭消费情况。
环境:Tmocat9.0+SpringMVC+Mabitas+Java
编程思路:Java+WebServlet的一个简单思路(相当于用SpringMVC来写Servlet)
2 需求与功能分析
1.实现家庭成员信息的实时更新和管理
2.实现家庭成员和消费记录的增删查改
3.实现家庭总的收入和支出状况的展示
3 概要设计
图1 系统功能图
4 数据库设计
4.1 E-R图
图2 E-R图
4.2 数据库的模型图
图3 表模型图
4.3 各表的SQL脚本
图4 Record表
图5 User表
图6 Admin表
5 系统各模块实现
5.1 登录模块
(未完善实现,仅在前段做出简单处理)
图7 登录界面
模块关键代码:
// 进行登录操作
form.on('submit(login)', function (data) {
data = data.field;
if (data.username == '') {
layer.msg('用户名不能为空');
return false;
}
if (data.password == '') {
layer.msg('密码不能为空');
return false;
}
if (data.captcha == '') {
layer.msg('验证码不能为空');
return false;
}
if (data.username == 'admin')
layer.msg('登录成功', function () {
//window.location.href = 'home?username='+data.username+'&'+'password='+data.password;
**window**.location.href = 'test';
});
if (data.username == 'user')
layer.msg('登录成功', function () {
//window.location.href = 'home?username='+data.username+'&'+'password='+data.password;
**window**.location.href = 'home';
});
return false;
});
5.2 数据展示模块
图8 数据展示界面
关键代码:
@Controller
@SessionAttributes({"users","map","daytime","records","listResultMap"})
public class Index2 {
/**
* 用户数据展示面板
* @param request
* @param response
* @param username
* @param password
* @return
*/
@RequestMapping(value = "/home")
public ModelAndView IndexData(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password", required = false) String password) {
InputStream resource = User.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resource);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
ModelAndView modelAndView = new ModelAndView("home");
int number = 0;// 家庭人数
double sumincome = 0;// 家庭收入
List<User> users = new ArrayList<>();
HashMap<String, Object> map = new HashMap<String, Object>();
// 全家人的基本数据
users = mapper.queryAll();
System.out.println(users.size());
for (User user1 : users) {
number++;
map.put(user1.getFname(), user1);
sumincome += user1.getFincome();
}
map.put("Fnumber", number);
map.put("Sumincome", sumincome);
InputStream recordresource = Record.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder2 = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder2.build(recordresource);
SqlSession sqlSession2 = sqlSessionFactory2.openSession();
RecordDao mapper2 = sqlSession2.getMapper(RecordDao.class);
List<Record> records = new ArrayList<>();
try {
SimpleDateFormat sdf0 = new SimpleDateFormat();// 格式化时间
sdf0.applyPattern("yyyy-MM-dd");// a为am/pm的标记
Date date = new Date();// 获取当前时间
String data = sdf0.format(date);
String reStr = new DataChangeUtil().yearAndmonth(date);
records = mapper2.queryAll(reStr);// 查询当前月的花销
// 获取近七天的消费数据
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String str1 = data;
Date dt10 = sdf1.parse(str1);
Calendar rightNow10 = Calendar.getInstance();
String reStr1 = null;
rightNow10.setTime(dt10);
// 七天时间
String daytime[] = new String[7];
// 每天的花销
double dailycost[] = new double[7];
for (int i = 1; i <= 7; i++) {
rightNow10.add(Calendar.DAY_OF_YEAR, -1);
Date dt11 = rightNow10.getTime();
reStr1 = sdf1.format(dt11);
daytime[i - 1] = reStr1;
List<Record> todayRecords = new ArrayList<>();
todayRecords = mapper2.queryAllByDay(daytime[i - 1]);
double daycost = 0;
for (Record todayRecord : todayRecords) {
daycost += todayRecord.getCost();
}
System.out.println();
dailycost[i - 1] = daycost * (-1);
System.out.println(i + " : " + dailycost[i - 1]);
}
map.put("daytime", daytime);
map.put("dailycost", dailycost);
} catch (ParseException e) {
e.printStackTrace();
}
// 花销
double cost = 0;
for (Record record : records) {
cost += record.getCost();
}
map.put("Cost", cost);
modelAndView.addObject("users", users);
request.setAttribute("users", users);
modelAndView.addObject("map", map);
return modelAndView;
}
5.3 后台信息管理模块
图9 后台数据管理界面
关键代码:
/**
* 删除表格元素
* @param request
* @param response
* @param Did
* @return
*/
@RequestMapping(value = "/crudRecord")
public ModelAndView crudRecord(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "Did",required = false)int Did){
InputStream recordresource = Record.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder2 = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder2.build(recordresource);
SqlSession sqlSession2 = sqlSessionFactory2.openSession();
RecordDao mapper2 = sqlSession2.getMapper(RecordDao.class);
mapper2.deleteById(Did);
sqlSession2.commit();
ModelAndView modelAndView = new ModelAndView("test");
modelAndView.setViewName("redirect:/test");
return modelAndView;
}
/**
* 删除表格元素
* @param request
* @param response
* @param Uid
* @return
*/
@RequestMapping(value = "/crudUser")
public ModelAndView crudUser(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "Uid")int Uid){
InputStream resource = User.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resource);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
System.out.println("Uid = " + Uid);
mapper.deleteById(Uid);
sqlSession.commit();
UserUtil userUtil = new UserUtil();
List<User> users = userUtil.util().queryAll();
request.setAttribute("users",users);
ModelAndView modelAndView = new ModelAndView("test");
modelAndView.addObject("users",users);
modelAndView.setViewName("redirect:/test");
return modelAndView;
}
@RequestMapping(value = "/updateRecord0")
public ModelAndView crudRecord(HttpServletRequest request,
HttpServletResponse response){
ModelAndView modelAndView = new ModelAndView("update");
return modelAndView;
}
/**
* 插入新的消费记录
* @param request
* @param response
* @param gname
* @param day
* @param cost
* @return
* @throws Exception
*/
@RequestMapping(value = "/updateRecord")
public ModelAndView crudRecord(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("gname")String gname,
@RequestParam("day")String day,
@RequestParam("cost")double cost,
@RequestParam("people")String people) throws Exception{
InputStream recordresource = Record.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder2 = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder2.build(recordresource);
SqlSession sqlSession2 = sqlSessionFactory2.openSession();
RecordDao mapper2 = sqlSession2.getMapper(RecordDao.class);
// sqlSession2.commit();
Record record = new Record();
record.setCost(cost);
record.setGname(gname);
record.setPeople(people);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = day;
Date dt = null;
dt = sdf.parse(str);
record.setDay(dt);
mapper2.insert(record);
sqlSession2.commit();
ModelAndView modelAndView = new ModelAndView("test");
modelAndView.setViewName("redirect:/test");
return modelAndView;
}
@RequestMapping(value = "/updateUser")
public ModelAndView updateUser(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("Fname")String Fname,
@RequestParam("Fincome")String Fincome
) throws Exception{
InputStream resource = User.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(resource);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setFname(Fname);
user.setFincome(Integer.parseInt(Fincome));
mapper.insert(user);
// sqlSession2.commit();
sqlSession.commit();
ModelAndView modelAndView = new ModelAndView("test");
modelAndView.setViewName("redirect:/test");
return modelAndView;
}
/**
* 修改表元素
* @param request
* @param response
* @param gname
* @param day
* @param cost1
* @param id
* @return
* @throws Exception
*/
@RequestMapping(value = "/updateRecord1")
public ModelAndView crudRecord1(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "gname",required = false)String gname,
@RequestParam(value = "day",required = false)String day,
@RequestParam(value = "cost",required = false)double cost1,
@RequestParam(value = "id",required = false)int id,
@RequestParam(value = "people",required = false)String people) throws Exception{
InputStream recordresource = Record.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder2 = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder2.build(recordresource);
SqlSession sqlSession2 = sqlSessionFactory2.openSession();
RecordDao mapper2 = sqlSession2.getMapper(RecordDao.class);
// sqlSession2.commit();
Record record = new Record();
record.setId(id);
record.setCost(cost1);
record.setGname(gname);
record.setPeople(people);
SimpleDateFormat sdf123 = new SimpleDateFormat("yyyy-MM-dd");
String str123 = day;
Date dt123 = null;
dt123 = sdf123.parse(str123);
record.setDay(dt123);
ModelAndView modelAndView = new ModelAndView("updateRecord1");
modelAndView.addObject("record",record);
System.out.println(record);
System.out.println(record);
System.out.println(record);
System.out.println(record);
System.out.println(record);
// modelAndView.setViewName("redirect:/updateRecord1");
return modelAndView;
}
/**
* 更新消费记录
* @param request
* @param response
* @param gname
* @param day
* @param cost1
* @return
* @throws Exception
*/
@RequestMapping(value = "/updates.do")
public ModelAndView crudRecord2(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("gname")String gname,
@RequestParam("day")String day,
@RequestParam("cost")double cost1,
@RequestParam("id")int id,
@RequestParam("people")String people) throws Exception{
InputStream recordresource = Record.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder2 = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder2.build(recordresource);
SqlSession sqlSession2 = sqlSessionFactory2.openSession();
RecordDao mapper2 = sqlSession2.getMapper(RecordDao.class);
// sqlSession2.commit();
Record record = new Record();
record.setCost(cost1);
record.setId(id);
record.setGname(gname);
record.setPeople(people);
SimpleDateFormat sdf123 = new SimpleDateFormat("yyyy-MM-dd");
String str123 = day;
Date dt123 = null;
dt123 = sdf123.parse(str123);
record.setDay(dt123);
mapper2.update(record);
sqlSession2.commit();
ModelAndView modelAndView = new ModelAndView("test");
modelAndView.setViewName("redirect:/test");
return modelAndView;
}
5.4 关键技术的实现
①网页实现:使用LayUI后台管理模板,创建修改为自己的一个网页布局,制作的网页布局中加入LayUI的样式
②后台返回数据给View:使用SpringMVC的@RequestMapping标签返回Json数据类型,还有@SessionAttribute标签将必要的数据在前段页面共享
③View传送数据给后台:通过请求“?sex=男&age=28”的形式或者利用@RequestParam标签实现后台对象属性匹配
④分页:编写一个简单的分页工具PageUtil,实现对后台数据库数据的的分页处理(PagesHelper没用明白)
⑤SQL语句生成:用的easyCode快速生成基本的增删查改语句
6 不足
①并未完全熟练SSM框架的使用,思想还为转换完成
②数据库设计毛病多,可能画的图也是错的
③对于Mybatis的多表联结查询不熟悉,甚至不理解