《移动应用开发》课程设计报告书.docx
《《移动应用开发》课程设计报告书.docx》由会员分享,可在线阅读,更多相关《《移动应用开发》课程设计报告书.docx(46页珍藏版)》请在冰豆网上搜索。
《移动应用开发》课程设计报告书
《移动应用开发》课程设计报告
学院名称:
计算机与信息工程学院
班级名称:
计科对口14
学生:
胡闻璐
学号:
**********
题目:
基于《个人理财通》的计算器
任课教师
******************
起止日期:
2017年04月18日至04月30日
摘要
随着移动终端的迅速普及,Android系统平台引用软件的需求随之增大。
伴随着Android智能手机与平板电脑已经出现在我们生活的大量的使用,越来越多的基于Android开发平台也随之而出,为丰富人们使用Android智能产品的用途,使其可以帮人们记录一些事情。
本设计开发通过研究Android体系结构和个人理财管理方面的知识,设计并实现了个人理财通系统。
能够对理财信息进行获取、汇总、整理、计算等功能,从而实现随身随时随地地进行日常的理财活动。
1项目需求分析
1.1需求分析
物质和科技的飞速发展,人们的生活水平也不断的在提高,往往有很多人在快节奏的生活中迷失和迷茫,很多人觉得自己没钱,但每个月的工资也不是很低,却往往不知道钱花在哪,为什么每到月底自己的钱包会空空如也,正因为这样,人们才需要一款个人理财软件,简单的界面,易懂的操作,十分便携直观的理财方式,可以让人们更好的进行个人理财。
以下是本软件的一些功能:
①登录界面:
初始登陆时没有密码,为了方便用户保护隐私,可以自行设置密码
②新增支出:
添加支出金额、时间、类别和地点等信息
③新增收入:
添加收入金额、时间、类别和付款方等信息
④数据管理:
支出汇总,收入汇总,便签信息
⑤便签功能:
添加便签,设置提醒或事项
⑥计算器:
对数据进行计算,方便记录,长按结果可直接复制
⑦移动课堂:
泛雅平台中的安卓课程访问
⑧帮助:
对个人理财通各个功能部件的使用介绍
⑨退出:
退出该系统
1.2功能需求
目前国外理财软件已有上百种之多,如美国的直觉公司QUICKEN软件为美国13个州及加拿大的客户提供金融管理和预算等财务问题。
国在财务管理方面做的比较突出的当属金蝶公司。
然而,在手机理财软件方面做的很突出的还没有,本软件是针对个人用户的一款Android软件,主要对个人理财收入、支出做一个记录和统计,可以对用户的收入、支出记录做添加、删除、查询和修改的管理,本软件该具备以下功能:
①功能操作要方便、易懂、,不要有多余或复杂的操作。
②对用户收入支出信息做添加、删除、查询和修改。
③系统的功能复合本人的实际情况。
④界面直观简洁,方便用户更好的使用。
⑤保证软件的安全性。
2系统总体设计
2.1系统架构设计
图2-1系统架构图
2.2系统功能体系
系统总体功能主要包括系统各功能模块的详细划分和定义,以及各子功能模
块具体实现细节,通过详细划分和定义细节可以将系统各功能进行有效区分,防
止功能重叠,功能冗余等现象,系统总体功能分析如表2-2所示.
用户功能
具体描述
新增支出
用户对新增支出财产进行详细的记录
新增收入
在此处添加了计算器方便用户对收入/支出财产进行详细记录
我的支出
用户对我的支出财产记录进行详细的查询
我的收入
用户对我的收入财产进行详细的查询
数据管理
用户管理个人账户以及虚拟账户等
系统设置
对手机系统进行规化设置
收支便签
对财产的收支进行记录
计算器
对数据进行计算,可以长按结果进行复制
移动课堂
学习泛亚平台中的安卓课程
3系统详细设计
3.1数据库设计
(1)数据类型简要规则
程序中需要定义常量,变量,这些需要指定的类型。
下面介绍常见的数据库类型,如表3-1所示。
数据类型
简写
整形
int
字符型
str
布尔型
bl
单精度浮点型
flt
双精度浮点型
dbl
表3-1数据类型简要规则
(2)组件命名规则
所有的组件对象名称的拼音简写,如果发现冲突可采用不同的简写规则。
组件命名如表3-2所示。
控件
缩写形式
EditText
txt
Button
btn
Spinner
sp
ListView
lv
表3-2组件命名规则
个人理财通是一款运行在Android系统上的程序,在Android系统中,集成了一种轻量型的数据库,即SQLite,该数据库是使用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB,使用该数据库,用户可以像使用SQLServer数据库或者Oracle数据库那样来存储、管理和维护数据,本系统采用了SQLite数据库,并且命名为account.db,,该数据库中用到了4个数据表,分别是tb_flag、tb_inaccount、tb_outaccount和tb_pwd。
3.2系统界面设计
1启动界面:
清新简洁的启动界面,标识着个人理财通和开发者微博,提升整体软件美观程度,如图3-1所示。
图3-1
2.用户登录:
首次登录不需要密码,进去后可在系统设置里设置密码。
由于本软件属于个人客户端,通常情况下只有本人使用,所以没有用户名,直接进入密码输入环节,便于保护用户隐私,如图3-2所示。
图3-2
3.用户登入后进入软件的主界面,主界面包括软件的所有功能图标,用户可根据需要使用,如图3-3所示。
图3-3
4.计算器:
基本的加减乘除,可以方便用户对金额进行计算,从而方便记录,在本计算机中计算的结果,可以长按结果进行复制,从而到收入支出页面进行快捷的粘贴,如图3-4、3-5所示。
图3-4图3-5
5.新增支出:
此模块的功能是添加用户的新增支出。
同样新增支出可以选择金额、时间、类别、地点和备注。
类别可以选择餐费、应酬、礼金、车费以及其他,长按金额后面的填写框可以快捷复制计算器的计算结果,如图3-6、3-7所示。
图3-6图3-7
6.新增收入:
此模块的功能是添加用户新增的收入。
在平时理财的过程中,添加收入记录是很频繁操作,所以此模块为用户提供了一个非常实用而且便捷的操作过程。
在这个模块中,用户可以添加收入信息记录的容包括:
金额、时间、类别、付款方以及备注。
为了用户能够方便的查看收入记录,故将收入类别进行了分类,具体分为五类,分别为工资、兼职、分红、奖金、其他,长按金额后面的填写框可以快捷复制计算器的计算结果,如图3-8、3-9所示。
图3-8图3-9
7.我的支出、我的收入:
当在新增收入模块进行了添加操作后,添加的收入记录就会显示在模块中。
在这两个界面中可以清楚的看到所有的记录,如图3-10、3-11所示。
图3-10图3-11
8.数据管理:
对于家庭理财系统来说,数据管理功能是非常重要的一个功能,它主要是管理支出、收入以及便签的记录信息,如图3-12所示。
图3-12
9.系统设置:
让用户来设置密码。
密码设置成功后,用户再次登录时就需要所设置的密码,如图3-13所示。
图3-13
10.新增便签,主要实现添加便签记录。
便签模块可以记录将要进行的收入或支出信息,也就是相当于备忘录的功能,如图3-14所示。
图3-14
11.移动课堂:
泛雅平台的移动应用开发学习界面,用户可以在这里学习安卓有关知识,如图3-15所示。
图3-15
12.帮助:
《个人理财通》使用帮助,用于解决在系统中遇到的问题,如图3-16所示。
图3-16
13.退出:
用户点击退出图标后回到登录界面。
3.3数据存储设计
package.edu.chzu.xxy.sp15.dao;
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassDBOpenHelperextendsSQLiteOpenHelper{
privatestaticfinalintVERSION=1;//定义数据库版本号
privatestaticfinalStringDBNAME="account.db";//定义数据库名
publicDBOpenHelper(Contextcontext){//定义构造函数
super(context,DBNAME,null,VERSION);//重写基类的构造函数
}
Override
publicvoidonCreate(SQLiteDatabasedb){//创建数据库
db.execSQL("createtabletb_outaccount(_idintegerprimarykey,moneydecimal,timevarchar(10),"
+"typevarchar(10),addressvarchar(100),markvarchar(200))");//创建支出信息表
db.execSQL("createtabletb_inaccount(_idintegerprimarykey,moneydecimal,timevarchar(10),"
+"typevarchar(10),handlervarchar(100),markvarchar(200))");//创建收入信息表
db.execSQL("createtabletb_pwd(passwordvarchar(20))");//创建密码表
db.execSQL("createtabletb_flag(_idintegerprimarykey,flagvarchar(200))");//创建便签信息表
}
Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//覆写基类的onUpgrade方法,以便数据库版本更新
}
}
3.4信息统计设计
当点击支出汇总、收入汇总或便签信息时,下方就会出现所有的支出、收入或便签信息。
如图3-17、3-18所示。
图3-17图3-18
3.5地图轨迹设计
package.edu.chzu.xxy.sp15.hwl;
/**
*计算器项目
*/
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.ViewTreeObserver;
importandroid.view.ViewTreeObserver.OnGlobalLayoutListener;
importandroid.widget.Button;
importandroid.widget.GridLayout;
importandroid.widget.GridLayout.LayoutParams;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassCalculatorextendsActivity{
privatestaticfinalbooleanisDebug=true;//判断项目是否处于debug调试模式,控制是否打印log
//char用来进行判断用
privatestaticfinalcharCJia='+';
privatestaticfinalcharCJian='-';
privatestaticfinalcharCCheng='*';
privatestaticfinalcharCChu='÷';
//String用来进行显示用
privatestaticfinalStringSJia="+";
privatestaticfinalStringSJian="-";
privatestaticfinalStringSCheng="*";
privatestaticfinalStringSChu="÷";
privateTextViewtextView;
privateButtonmCopy;//複製按鈕
privatebooleanisTextViewInputted=false;//判断textView是否有输入,用来判断0按钮的功能
//privateButtonbtn_c,btn_del;//C、DEL
//privateButtonbtn_jia,btn_jian,btn_chu,btn_cheng;//+、-、x、÷
//privateButtonbtn_dian,btn_dengyu;//.,=
//privateButtonbtn_0,btn_1,btn_2,btn_3,btn_4;//0,1,2,3,4
//privateButtonbtn_5,btn_6,btn_7,btn_8,btn_9;//5,6,7,8,9∞
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
//布局
//动态的设置Gridlayout中控件的宽度,使其全屏匹配屏幕
GridLayoutgridlayout=(GridLayout)findViewById(R.id.gridlayout_c);
ViewTreeObservervto=gridlayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
publicvoidonGlobalLayout(){
GridLayoutgl=(GridLayout)findViewById(R.id.gridlayout_c);
fillview(gl);
ViewTreeObserverobs=gl.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
//获得每个按钮的点击事件
initViews();
}
//为每个Button设置了onClick属性
publicvoidonClick(Viewview){
switch(view.getId()){
//0-9
caseR.id.btn_0:
button0Function();
break;
caseR.id.btn_1:
button1Function();
break;
caseR.id.btn_2:
button2Function();
break;
caseR.id.btn_3:
button3Function();
break;
caseR.id.btn_4:
button4Function();
break;
caseR.id.btn_5:
button5Function();
break;
caseR.id.btn_6:
button6Function();
break;
caseR.id.btn_7:
button7Function();
break;
caseR.id.btn_8:
button8Function();
break;
caseR.id.btn_9:
button9Function();
break;
caseR.id.btn_dian:
buttonDianFunction();
break;
//C
caseR.id.btn_c:
buttonClear();
break;
//DEL
caseR.id.btn_del:
buttonDel();
break;
//+
caseR.id.btn_jia:
buttonJiaYunSuanFunction();
break;
//-
caseR.id.btn_jian:
buttonJianYunSuanFunction();
break;
//X
caseR.id.btn_cheng:
buttonChengYunSuanFunction();
break;
//÷
caseR.id.btn_chu:
buttonChuYunSuanFunction();
break;
//=
caseR.id.btn_dengyu:
buttonDengYuFunction();
break;
default:
Buttonb=(Button)view;
Toast.makeText(this,b.getText(),Toast.LENGTH_SHORT).show();
break;
}
}
/*=============================*/
/*private私有方法*/
/*===========================*/
privatevoidfillview(GridLayoutgl){
Buttonbuttontemp;
GridLayout.LayoutParamsparams;
for(inti=0;ibuttontemp=(Button)gl.getChildAt(i);
params=(LayoutParams)buttontemp.getLayoutParams();
params.width=(gl.getWidth()/gl.getColumnCount())
-params.rightMargin-params.leftMargin;
buttontemp.setLayoutParams(params);
}
}
//初始化所有的控件
privatevoidinitViews(){
textView=(TextView)findViewById(R.id.calculate_textview);
mCopy=(Button)findViewById(R.id.fz);
mCopy.setOnClickListener(newOnClickListener(){
Override
publicvoidonClick(Viewv){
//TODO自动生成的方法存根
if(textView.getText().toString().equals("")){
Toast.makeText(Calculator.this,"結果為空",Toast.LENGTH_SHORT)
.show();
return;
}
}
});
}
privatevoidprintDebugInfo(Stringstr){
if(isDebug){
Log.i("TAG","Debug:
"+str);
}
}
//往Textv的尾部追加容
privatevoidappendTextView(Stringstr){
CharSequencetext=textView.getText();
text=text+str;
printDebugInfo(text.toString());
textView.setText(text);
}
//添加数字按钮的功能start===========================
//对于0的输入的注意点:
//1、当还没有输入时,就是textview显示为0时,什么都不用做,继续保持为0
//2、当textview的显示不为0时,在textview的尾部追加一个0
//问题:
判断条件怎样来确定。
有两个方案
//1、获取textview的容,然后调用比较的方法,是否和0相等
//2、设置一个Boolean标记,当textview第一次输入不为0时,将标记设为true,然后根据标记来进行0按钮的功能实现
//对比:
方案一有点简单,缺点相对来说耗性能。
每次都要读取textview的值然后进行比较;方案二有点性能上比第一个高,但是控制条件比第一个复杂
//0按钮的功能
privatevoidbutton0Function(){
if(isTextViewInputted&&!
textView.getText().toString().equals("0")){
//条件成立,textview的值不是0
appendTextView("0");
}elseif(!
textView.getText().toString().equals("0")){
textView.setText("0");//当有运算操作后,isTextViewInputted为false时,需要把textView设置为0
}
}
//如果已经有输入了,则在textview尾部追加一,是第一次输入则将textview显示改为1.此规则同样适用于其他数字按钮
//1按钮的功能
privatevoidbutton1Function(){
if(isTextViewInputted){
appendTextView("1");
}else{
//第一次进行输入
isTextViewInputted=true;