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图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ra4LtDeM-1624975650567)(C:\Users\Alone Dog\AppData\Roaming\Typora\typora-user-images\1624975193819.png)]

图2 E-R图

4.2 数据库的模型图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FgFbMLAI-1624975650569)(C:\Users\Alone Dog\AppData\Roaming\Typora\typora-user-images\1624975198694.png)]
图3 表模型图

4.3 各表的SQL脚本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UklA3sWi-1624975650572)(C:\Users\Alone Dog\AppData\Roaming\Typora\typora-user-images\1624975205728.png)]

图4 Record表
在这里插入图片描述

图5 User表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mV2bNgAq-1624975650575)(C:\Users\Alone Dog\AppData\Roaming\Typora\typora-user-images\1624975214918.png)]

图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的多表联结查询不熟悉,甚至不理解

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值