个人记账本Word格式.docx
《个人记账本Word格式.docx》由会员分享,可在线阅读,更多相关《个人记账本Word格式.docx(40页珍藏版)》请在冰豆网上搜索。
![个人记账本Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/11/965105ee-b8df-4cbb-9924-8db91f999d69/965105ee-b8df-4cbb-9924-8db91f999d691.gif)
已有的分离的插件已经能够支持Ruby、Python、Perl、C/C++、telnet和数据库开发。
插件架构能够支持将任意的扩展加入到现有环境中,而决不仅仅限于支持各种编程语言。
Eclipse的设计思想是:
一切皆插件。
Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。
1.2.2Android技术
Android是基于Linux的自由且开放源代码的操作系统,主要用于便携设备,如平板电脑、智能手机。
其系统架构采用了分层的架构,从底层到高层分别是Linux内核层、系统运行库层、应用程序框架层和应用程序层。
Android开发四大组件分别是:
活动(Activity):
用于表现功能。
服务(Service):
后台运行服务,不提供界面呈现。
内容提供商(ContentProvider):
支持在多个应用中存储和读取数据,相当于数据库。
广播接收器(BroadcastReceiver):
用于接收广播。
1.2.3SQLite
SQLite是一款轻型的、遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经有许多嵌入式产品在使用它,在嵌入式设备有限的资源中,它仅需几百K的内存空间。
它支持Windows/Linux/Unix等主流操作系统,同时还能够跟很多主流的程序语言相结合,比如Java、C#、PHP等,还有ODBC接口。
比起PostgreSQL、Mysql这样的著名数据库管理系统来讲,它的处理速度毫不逊色。
1.3论文的主要研究内容
本课题将实现一个Android平台的记账应用,它为手机用户提供了丰富的功能,便于管理生活中一些理财的问题。
具体的研究内容如下:
(1)介绍实现系统的主要技术,包括Android技术、SQLite数据库。
(2)使用Android技术开发记账软件。
(3)分模块实现该软件的每个子模块和UI交互。
1.4本章小结
本章简要介绍了本次课题研究中应用的主要技术以及开发工具,也就是为什么要选择它们的原因。
其中包括开发所使用的Android技术以及用于建立数据库的SQLite数据库管理系统,在接下来的开发中均会使用到这些技术与工具。
2分析与设计
2.1需求分析
在软件生命周期中,其他阶段都是面向软件技术方面的,只有本阶段是面向用户的。
需求分析是对用户的业务活动进行分析的,以便确定在用户的业务环境中软件系统需要“做什么”。
软件需求包括两部分:
功能性需求和非功能性需求。
虽然功能性需求是对软件系统的一项基本需求,但却并不是唯一的需求。
除功能性需求外,软件质量属性的特性,称为系统的非功能性需求。
这些特性包括:
系统的易用性、执行速度、可靠性,处理异常情况的能力与方式等。
在决定系统的成功或失败的因素中,满足非功能性需求往往比满足功能性需求更为重要。
有研究表明,客户对系统的不满意很多因素是因为设计者没有与客户进行良好的沟通而造成的,所以编写需求分析报告要求无歧义性、完整性
、可验证性
、一致性
、可追踪性
、运行和维护阶段的可使用性
。
下面是在我们经过调研后得出的客户需求:
(1)明细界面:
显示当前年、月、周、日的收支情况,提供“流水明细”“记一笔”按钮进入对应的功能模块。
(2)钱包界面:
管理用户的账户,如现金、支付宝、借记卡、信用卡,查询剩余金额,还可进行转账功能。
(3)报表界面:
按时间、分类型地对用户的收支情况进行统计分析。
(4)更多界面:
可以设置软件密码,只有密码正确了才能进入该系统,否则无法操作账本内的数据,还有清空数据的功能。
2.2系统整体设计
根据以上的分析,该软件可按功能集合进行划分,整体结构如图2-1所示:
图2-1系统结构图
2.3数据库设计
2.3.1账本数据库
根据系统设计的分析,本系统需要钱包管理、账本管理、成员管理、收支类型管理、收支明细管理、密码管理这6张表。
账户管理表,需要记录账户名称以及余额。
表2-1钱包管理数据表
属性
数据类型
说明
id
INTEGER
自动增加的主键
acount
TEXT
账户名称
balance
REAL
余额
表2-2账本管理数据表
books
账本名称
表2-3成员管理数据表
member
成员名称
表2-4收支类型数据表
type
类型名称
books_id
所属的账本ID
in_out
属于支出
(2)或收入
(1)
表2-5收支明细数据表
type_id
类型ID
money
金额
date_time
日期
member_id
成员ID
account_id
账户ID
账本ID
表2-6密码管理数据表
pass
密码
2.4本章小结
本章首先对系统进行了需求分析,将客户端分为四个大模块来进行管理,分别是明细、钱包、报表、更多。
从四大模块入手,再到各个小功能,逐一实现。
同时根据各功能模块的需求,分析哪些数据是需要存储的,从而对数据库进行初步的设计。
3系统的实现
3.1系统功能模块实现
MainActivity作为整个程序的入口,采用Fragment来管理明细、钱包、报表,更多四个模块,同时将已经建立好的数据库文件导入,以供存储查询使用。
3.1.1明细模块
根据上面的分析,在明细界面需要显示年、月、周、日的收支情况,以及需要提供切换账本、记一笔、查看流水明细三个按钮。
(1)显示收支情况:
当APP启动的时候,默认进入明细界面,此时需要去查询收支情况,如下代码是查询月收入的语句:
dbHelper.queryMonth(DateUtils.ParseDateToString(calendar.getTime(),"
yyyy-MM"
),1,booksId)
其中DateUtils的ParseDateToString是将Date类型的日期转化为指定格式的String类型,因为queryMonth方法的日期参数(即第一个参数)类型被定义为String类型,所以需要统一。
第二个参数则是代表收支,“1”为收入,“2”为支出。
第三个参数是账本ID。
使用这个方法,就查询不同账本在不同月份的收支情况了。
其他的年收支、周收支、日收支与此相似,不再赘述。
(2)切换账本:
我们实现了一个自定义的弹窗类AlertDialogText,它可以帮助我们显示想要的展示的内容。
首先,需要查询数据库中有多少本账本可以给用户选择,于是,我们执行了数据库查询:
booksList=dbHelper.queryBooksList();
queryBooksList方法将查询到的数据赋值给了booksList,然后设置Adapter,Adapter规定了每一个item的样式:
adapterBooks=newQuickAdapter<
Books>
(getActivity(),
R.layout.item_text_view){
protectedvoidconvert(BaseAdapterHelperhelper,Booksitem){
helper.setText(R.id.tv_name,item.books);
}
};
接着为adapater添加数据源:
adapterBooks.addAll(booksList);
Adapter已经设置完毕,可以进行展示了。
我们为账本按钮添加点击事件,在点击事件中弹出一个窗口进行展示:
tvBooks.setOnClickListener(clickListener);
privateOnClickListenerclickListener=newOnClickListener(){
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.tv_books:
alertDialogText=newAlertDialogText(
getActivity(),"
选择账本"
"
"
);
alertDialogText.setGoneButton();
alertDialogText.setListViewAdapter(adapterBooks,itemClickListener,null);
break;
}
实现一个弹窗展示就完成了,当用户点击账本切换按钮的时候就会弹出一个窗口,显示了当前所有账本,用户即可点击切换。
(3)记一笔:
记一笔是系统中一个重要的功能,无论是想要记录收入状况还是支出状况都可以在此完成。
可以设置时间、收入或支出、金额、钱包、成员、类型,对于成员和类型,系统默认提供一些标签,如果用户觉得没有合适的,还可以添加自定义标签。
类型选择、添加、删除等操作,使用了一个GridView直接展示在界面底部,而非前面使用到的弹出窗口,首先查询所有类型,再为设置好每一行的样式,然后为GridView设置Adapter,设置点击事件与长按监听事件,点击的时候即选中当前类型,按住item的时候会弹出删除确认窗口:
typeList=dbHelper.queryTypeList(newDetail.books_id,1);
adapterType=newQuickAdapter<
Type>
(this,R.layout.item_text_view){
@Override
protectedvoidconvert(BaseAdapterHelperhelper,Typeitem){
helper.setText(R.id.tv_name,item.type);
}
};
adapterType.addAll(typeList);
gridView.setAdapter(adapterType);
gridView.setOnItemClickListener(itemClickListener);
gridView.setOnItemLongClickListener(itemLongClickListener);
以下是删除功能实现代码,先弹出一个窗口询问用户是否确认要删除,避免误操作造成了不必要的损失,当用户点击确认按钮即确认要删除当前数据,执行后给出成功或失败的提示,告诉用户结果:
privateOnItemLongClickListeneritemLongClickListener=
newOnItemLongClickListener(){
@Override
publicbooleanonItemLongClick(AdapterView<
?
>
parent,Viewview,
intposition,longid){
finalintpos=position;
if(parent.getAdapter()==adapterType){
alertDialogText=newAlertDialogText(AddDetailActivity.this,"
提示"
是否要删除类型:
+adapterType.getItem(pos).type+"
?
alertDialogText.setButtonConfirm("
确定"
newOnClickListener(){
@Override
publicvoidonClick(Viewv){
if(dbHelper.deleteType(adapterType.getItem(pos).id)>
0){
typeList.remove(adapterType.getItem(pos));
adapterType.remove(adapterType.getItem(pos));
alertDialogText.dismiss();
Toast.makeText(AddDetailActivity.this,"
类型删除成功"
Toast.LENGTH_LONG).show();
}else{
类型删除失败"
}
});
}
returntrue;
}};
接下来是添加自定义标签的代码,只需要获取用户输入的名称,并且添加到数据库就可以了,当然,还需要输入内容不能空,添加成功后还要刷新Adapter:
if(typeList.indexOf(adapterType.getItem(i))==typeList.size()-1){
alertDialogText=newAlertDialogText(AddDetailActivity.this,
添加类型"
alertDialogText.setEditTextMsg("
10);
alertDialogText.setButtonConfirm("
if(alertDialogText.getEditTextMsg()==null||
alertDialogText.getEditTextMsg().length()==0){
Toast.makeText(AddDetailActivity.this,"
名称不能为空"
return;
dbHelper.insertType(alertDialogText.getEditTextMsg(),
newDetail.books_id,newDetail.in_out);
typeList=dbHelper.queryTypeList(newDetail.books_id,
newDetail.in_out);
typeList.add(addT);
adapterType.clear();
adapterType.addAll(typeList);
Toast.makeText(AddDetailActivity.this,"
类型添加成功"
Toast.LENGTH_LONG).show();
alertDialogText.dismiss();
});
return;
(4)流水明细:
该界面显示了用户的所有记录,可以按时间查询,使用ListView展示,如果发现某条记录写错了,也可进行删除,重新记录。
3.1.2钱包模块
在这个界面所要展示的则是一个账户列表,其中显示账户名称和余额,所以使用ListView来作为显示的控件。
第一步,查询所有账户资料:
accountList=dbHelpser.queryAccountList();
设置Adapter,里面除了设置要显示的数据之外,还为每一行设置一个颜色背景,而颜色则是随机的,用random实现:
adapterAccount=newQuickAdapter<
Account>
R.layout.item_account){
protectedvoidconvert(BaseAdapterHelperhelper,Accountitem){
helper.setBackgroundColor(R.id.layout_root,getResources()
.getColor(colors[random.nextInt(max)%(max-min+1)+min]));
helper.setText(R.id.tv_account_name,"
"
+item.acount);
helper.setText(R.id.tv_account_blance,"
¥"
+
DoubleUtils.getFormatTwo(item.balance));
3.1.3报表模块
报表功能实现按收支类型查询指定时间内的收支状况,给出百分比柱状图,直接展示了用户在各类型上的收支,同时也统计出所有金额总和。
百分比柱状图是用ProgressBar来实现的。
例如查询一个月内的收入报表,那么就查询出该月的所有类型的收入金额,进行统计,将某类型的金额除以总金额,得出条状图的百分比。
根据账本、收入或支出、开始时间、结束时间四个条件来查询总金额:
sumMoney=dbHelper.queryReportSumMoney(DetailFragment.booksId,inOut,
startDate,endDate);
接着设置Adapter:
adapterReport=newQuickAdapter<
Report>
R.layout.item_report_form){
protectedvoidconvert(BaseAdapterHelperhelper,Reportitem){
helper.setText(R.id.tv_name,item.type);
helper.setText(R.id.tv_money,"
DoubleUtils.getFormatTwo(item.money));
helper.setText(R.id.tv_proportion,
DoubleUtils.getFormatOne((item.money/sumMoney)*100)+"
%"
//设置条状图百分比
helper.setProgress(R.id.progressBar,
(int)((item.money/sumMoney)*100));
//设置文字颜色,收入为红,支出为绿
if(selectPos==0){
helper.setTextColor(R.id.tv_money,
getResources().getColor(R.color.rule_red_dark));
}else{
getResources().getColor(R.color.rule_green_light));
3.1.4更多模块
(1)设置密码:
既然是一个账本,有时为了避免他人查看或操作自己的账本,就需要密码功能的存在了。
一旦打开密码功能,那么用户就需要输入正确的密码才能进入程序的首页,才能继续才做,密码错误是无法进入的,密码设定长度为4,当输入框的内容长度等于4的时候会自动结束输入,以下是设置密码功能实现:
if(type.equals("
set"
)){
if(tvTip.getText().toString().equals("
请输入4位密码"
passFirst=edPass.getText().toStri