基于 Android studio 开发的一个记账本

目录

1. 项目简介
1.1项目设计目标
1.2项目功能分析
2. 需求分析
2.1特性需求分析
2.2功能需求分析
3. 项目设计
3.1总体设计
3.2数据库ER图
3.3功能模块设计
4. 项目实现
4.1各功能模块的实现

原码转载至:https://download.csdn.net/download/XMJJCY/20382112
有偿的哦
或者加QQ:2372683984
我的android studio版本2021版

1. 项目简介

1.1项目简介
本组设计的记账本app是基于android系统开发的一款手机应用程序,其主要为了满足用户在快节奏的生活中可以较为便捷快速地记录个人收支情况,实现个人财务管理。App可以清晰显示收支情况,并以图表的形式根据个人理财实际需求,对于衣食住行进行分类,记录消费用途,项目能够精确到每一个款项的收入支出时间、结余并且可以设置年度和每月的预算。超出预算提醒,并且有每个月账单统计图表,较为清晰明确帮助用户分析自己当前的支出和收入。
本小组组长为陈钖境,四名成员分别是陈钖境、黄彪益、马昊、成力,由黄彪益同学主要完成登录注册以及主页面的设计,由马昊同学主要完成理财记账模块设计,由陈钖境同学主要负责明细页面以及适配器的设计,由成力同学主要完成个人中心和图表模块设计。

1.2项目功能分析
本项目主要包括以下功能。
1、登陆注册功能。
2、查看收入明细,时间收入支出结余明细一目了然。
3、检索收入及支出记录。
4、记录收入及支出。
4、图表展示收入及支出。
5、设置年度预算,每月预算,查看结余。
6、设置超出预算功能,超出预算给出提醒。
7、设置底部导航栏,将多个页面组合在一起,可以让用户快速的访问希望访问的页面。

2. 需求分析

2.1特性需求分析
(1)易操作、功能简单明确便捷。本记账本初心即为在当今快节奏生活中便捷记录支出收入,帮助用户更好规划理财。此应用应该做到让用户可以很明了的通过界面明白各项功能,操作简单,界面友好易懂。用户可以根据手机界面很清楚的进行记账,删除,查账,更改等功能。
(2)应用的整个页面需要做到外观美观,操作流畅。
(3)软件易维护,系统各个模块设计应该明确易懂。
2.2功能需求分析
用户在登陆后应该便捷的完成查看账本、添加删除账单、搜索账单、图表显示收支、个人中心各项功能。
(1)用户查看账本功能:用户进入app后在主界面可以通过明细便捷查看收支和结余情况,并可明了最近账目的类型例如吃饭、购物、话费、工资、津贴、红包等等。
(2)添加删除账单:可便捷添加和删除账单,并在添加时可以备注账单并选择收支分类例如例如吃饭、购物、话费、工资、津贴、红包等等
(3)搜索账单:可根据备注来便捷搜索相关所有账单。
(4)图表显示:可在图表页面清晰明白看到支出和输入在总支出和总输入里的占比,更好的让用户了解个人收支习惯和基本情况。
(5)个人中心:用户可在个人中心查看个人使用该app的情况,并可设计年预算和月预算,并显示预算余额,刚好地帮助用户完成个人财务管理。

3. 项目设计

3.1.1总体设计
本项目采用MVC三层架构。
包含三个主页面:明细、图表、我的。
3.1.2文件结构与用途
(1)给出工程源代码的结构图,示例如下:
在这里插入图片描述
在这里插入图片描述

(2)源代码文件。
表4-1 工程的文件用途说明
包 名 称 文 件 名 说 明

main AndroidManifest.xml #Android应用的入口文件,描述项目信息
com.lyc.cashbook App.java #应用的配置文件
com.lyc.cashbook.ui LoginActivity.java #登陆页面
com.lyc.cashbook.ui MainActivity.java #登陆之后的首页
com.lyc.cashbook.ui RegsterActivity.java #注册页面
com.lyc.cashbook.ui FbActivity.java #添加收入或支出页面
com.lyc.cashbook.ui SearchActivity.java #查询信息页面
com.lyc.cashbook.adapter MxAdapter.java #适配器文件
com.lyc.cashbook.adapter MyAdapter.java #适配器文件
com.lyc.cashbook.bean Info.java #收入和支出类
com.lyc.cashbook.bean User.java #用户类
com.lyc.cashbook.base BaseActivity.java #自定义的Activity类
com.lyc.cashbook.base BaseFragment.java #自定义的Fragment类
com.lyc.cashbook.base BaseMainActivity.java #自定义的Activity类
com.lyc.cashbook.fragment MxFragment.java #收入和支出明细页面
com.lyc.cashbook.fragment SRFragment.java #添加收入页面
com.lyc.cashbook.fragment TbFragment.java #图表页面
com.lyc.cashbook.fragment WdFragment.java #我的信息页面
com.lyc.cashbook.fragment ZCFragment.java #添加支出页面

表4-2 资源文件名称与用途
资源目录 文 件 说 明

drawable ic_delete.png #存放布局文件所需要的图片或样式
layout activity_fb.xml #收入和支出明细的布局
activity_login.xml #登陆页面的布局
activity_main.xml #主页面的布局
activity_register.xml #注册页面的布局
fragment_tb.xml #表格的碎片布局
activity_search.xml #查询页面的布局
fragment_mx.xml #收入和支出明细的碎片布局
fragment_sr.xml #添加收入的碎片布局
fragment_wd.xml #我的信息的碎片布局
fragment_zc.xml #添加支出的碎片布局
item_mx.xml #支出和收入列表的布局
view_title.xml #菜单栏布局
menu menu.xml #菜单栏
values colors.xml #颜色样式
strings.xml #字符串
styles.xml#样式布局

3.2数据库ER图

在这里插入图片描述

3.3功能模块设计
3.3.1 登录模块
3.3.2 注册模块
3.3.3 理财记账模块
3.3.4 个人中心模块

3.3.1 登录模块
(1)该功能模块首先制作界面,然后对账号和密码进行操作,密码验证后才可以进到软件,具有安保性。通过查询数据库来查询是否存在该用户,并且判断用户名或密码是否正确。

关键技术:如果没有账号,点击“注册”跳转到注册界面;如果已经有了账号,点击“已有账号?去登录”跳转到登录界面,账号或者密码错误都会提醒,输入账号密码正确,提示“登录成功”会跳转到账单界面,跳转时传递数据(用户的id) ;数据库的查询;

(2)给出该功能模块的关健代码

  //登录
    private void login() {
        String account = mEt_account.getText().toString();
        String psw = mEt_psw.getText().toString();
        if (TextUtils.isEmpty(account)) {
            toast("账号不能为空");
        } else if (TextUtils.isEmpty(psw)) {
            toast("密码不能为空");
        } else {
            //本地所有用户
            final List<User> all = LitePal.findAll(User.class);
            //查询本地所有用户
            for (int i = 0; i < all.size(); i++) {
                //如果有输入的账号的
                if (all.get(i).getUsername().equals(account)) {
                    //如果账号存在去匹配这条数据的密码
                    if (all.get(i).getPassword().equals(psw)) {
                        toast("登录成功");
                        //保存用户id和登录状态到本地,不用重复登录
                        getSharedPreferences("user", MODE_PRIVATE).edit()
                                .putString("userId", all.get(i).getId() + "")
                                .putBoolean("isLogin",true)
                                .commit();
                        startActivity(MainActivity.class);
                        finish();
                    }else {
                        toast("密码错误");
                    }
                }else {
                    toast("账号不存在");
                }
            }

        }
    }

3.3.2 注册模块
(1)该模块先制作界面,对新用户的账户、密码进行注册,并且需要重复确认密码,输入两次密码不同时会提醒“两次密码输入不一致”。管理密码验证功能,注册成功后数据会存入数据库中。
关键技术:如果已经注册过账号,可以点击“已有账号?去登录”跳转到登录界面数据库的插入:
(2)给该各功能模块的关键代码


    //注册
    private void register() {
        String account = mEt_account.getText().toString();
        String psw = mEt_psw.getText().toString();
        String psw_again = mEt_psw_again.getText().toString();
        if (TextUtils.isEmpty(account)) {
            toast("账号不能为空");
        } else if (TextUtils.isEmpty(psw) || TextUtils.isEmpty(psw_again)) {
            toast("密码不能为空");
        } else if (!psw.equals(psw_again)) {
            toast("两次密码输入不一致");
        } else {
            User user=new User();
            user.setId(System.currentTimeMillis());//设置id
            user.setUsername(account);//设置账号
            user.setPassword(psw);//设置密码
            user.setMonthBudget("0");//设置默认月预算
            user.setYearBudget("0");//设置默认年预算
            boolean save = user.save();//保存数据
            if(save){
               toast("注册成功");
               finish();
            }else {
                toast("注册失败");
            }
        }
    }

3.3.3 理财记账模块
(1)该模块先制作界面,可以记录收入支出的金额,进行描述,具体发生时间,并且保存,点击右上角菜单按钮(关于、换背景、关闭/开启音乐)。点击界面右下方红色“+”跳转到记账界面,点击支出,添加类别相应支出金额数据点击确定按钮即可添加记录,支出界面操作也是如此。然后跳转到账单明细页面,
每一条收支记录详细到添加时间,右滑单独账单点击“垃圾桶”即可完成删除操作。
关键技术:数据库添加;页面的跳转(收支界面到记账界面之间来回传递数据)。

(2)给该各功能模块的关键代码

 // 设置创建者
        listView.setMenuCreator(creator);

        listView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {//设置菜单项目的监听事件
            @Override
            public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {//打开菜单项单击
                switch (index) {
                    case 0:

                        Info infoBean = new Info();
                        infoBean = list_show.get(position);//获取列表位置
                        LitePal.delete(Info.class, infoBean.getId());//在数据库中找到
                        list_show.remove(position);//删除
                        adapter.notifyDataSetChanged();//通知数据集已更改
                        setData();
                        Log.d("delete", "onMenuItemClick: "+"删除成功");
                        break;
                }
                // false:关闭菜单;正确:不关闭菜单
                return false;
            }
        });

   case R.id.btn_reset:
                mTv_value.setText("0");//重置归0
                break;
            case R.id.btn_sure:
                if (mTv_value.getText().equals("0")) {
                    toast("请输入金额");
                } else {
                    SharedPreferences sharedPreferences = getActivity().getSharedPreferences("user", Context.MODE_PRIVATE);
                    String userId = sharedPreferences.getString("userId","");
                    Info info = new Info();
                    info.setId(System.currentTimeMillis());//设置id
                    info.setType(2);//设置类型
                    info.setName(name);//设置类别
                    info.setRemark(mEt_remark.getText().toString());//设置备注信息
                    info.setTime(mTv_time.getText().toString());//设置时间
                    info.setMoney(mTv_value.getText().toString());//设置金额
                    info.setRes(res);//设置图片资源
                    info.setUserId(userId);
                    boolean save = info.save();//保存到数据库
                    if(save){
                        toast("记录成功");
                        getActivity().sendBroadcast(new Intent("refresh"));
                        getActivity().finish();
                    }else {
                        toast("记录失败");
                    }
                }
                break;

3.3.4 个人中心模块
(1)该模块先制作界面,包括每个月预算就是用来进行提醒,与改进措施的;我的界面里有相关预算设置(2020年预算、2020年余额、6月预算、6月余额)及退出登录操作。点击设置即可设定预算和修改预算,点击”退出登录”跳转到登录页面。
关键技术:页面的跳转

(2)给该各功能模块的关键代码

    //得到登录存在本地的用户id
        mUserId = getActivity().getSharedPreferences("user", Context.MODE_PRIVATE).getString("userId", "");
        List<User> userList = LitePal.findAll(User.class);
        for (int i = 0; i < userList.size(); i++) {
            if(String.valueOf(userList.get(i).getId()).equals(mUserId)){//匹配到id 获取该用户的月和年预算
                String monthBudget = userList.get(i).getMonthBudget();
                String yearBudget = userList.get(i).getYearBudget();
                if(monthBudget.equals("0")){//如果没有设置月预算
                    mTv_month_ys.setText("点击设置");
                    mTv_month_ye.setText("暂未设置预算");
                }else{
                    mTv_month_ys.setText(monthBudget);
                    mTv_month_ye.setText(String.valueOf(Double.parseDouble(monthBudget)-totalMonty));
                    double yue = Double.parseDouble(monthBudget)-totalMonty;
                    if (yue<0){
                        mTv_remind.setText("超出预算"+Math.abs(yue));
                    }
                }
                if(yearBudget.equals("0")){//没有设置年预算
                    mTv_year_ys.setText("点击设置");
                    mTv_year_ye.setText("暂未设置预算");
                }else {
                    mTv_year_ys.setText(yearBudget);
                    mTv_year_ye.setText(String.valueOf(Double.parseDouble(yearBudget)-totalMonty));
                }
            }
        }

3.3.5 查询统计模块
(1)该模块先制作界面,可以查询用户在某天某月的收支记录;

(2)给该各功能模块的关键代码

 //找到控件
    @Override
    protected void initView() {
        setTitle("搜索");
        mList = findViewById(R.id.list);
        mEt_search = findViewById(R.id.et_search);
        findViewById(R.id.btn_search).setOnClickListener(this);//按键触发
        mList.setLayoutManager(new LinearLayoutManager(this));
    }

 if(TextUtils.isEmpty(keyword)){
            searchList=list;
        }else {
            //如果搜索收入,显示所有收入数据
            if("收入".equals(keyword)){
                for (int i = 0; i <list.size() ; i++) {
                   if(list.get(i).getType()==1){
                       searchList.add(list.get(i));
                   }
                }
                //如果搜索支出,显示所有支出数据
            }else if("支出".equals(keyword)){
                for (int i = 0; i <list.size() ; i++) {
                    if(list.get(i).getType()==2){
                        searchList.add(list.get(i));
                    }
                }
            }else {
                //如果明细信息匹配搜索结果,则添加到列表
                for (int i = 0; i < list.size(); i++) {
                    if(!list.get(i).getName().contains(keyword)){
                        if(!list.get(i).getMoney().contains(keyword)){
                            if(!list.get(i).getRemark().contains(keyword)){
                                if(!list.get(i).getTime().contains(keyword)){
                                }else {
                                    searchList.add(list.get(i));
                                }
                            }else {
                                searchList.add(list.get(i));
                            }
                        }else {
                            searchList.add(list.get(i));
                        }
                    }else {
                        searchList.add(list.get(i));
                    }
                }
            }

4. 项目实现

4.1各功能模块的实现
登陆界面
用户可以直接输入账号密码进行登陆。如没有账户,可以通过点击下方注册按钮,跳转到注册页面,进行用户的注册。
在这里插入图片描述

注册界面
用户输入用户名和密码,点击注册。
在这里插入图片描述

主页面
登陆之后进入主页面,主页面分为三大区域。包括菜单栏、内容区域、底部导航栏。点开侧滑栏,显示效果如下图。
在这里插入图片描述

记账页面
点击加号,跳转到记账界面。包括支出、收入。

在这里插入图片描述

收支明细页面(主页面添加数据之后)
精确到用途、时间、收入支出结余。

在这里插入图片描述

搜索页面
点击搜索按钮,即可跳出输入框,输入想要搜索的内容即可完成检索功能。
在这里插入图片描述

图表页面
以饼图的形式把每个月的支出百分比清楚的体现出来。

在这里插入图片描述

我的页面
包含年度预算及月度预算功能及超出预算提醒功能。
在这里插入图片描述
原码转载至:https://download.csdn.net/download/XMJJCY/20382112
或者加QQ:2372683984
我的android studio版本2021版


版权声明:本文为XMJJCY原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。