文档内容
软件设计说明书
姓名:
第 1 页目 录
第一章 引言........................................................3
1.1项目介绍.......................................................................................................................3
第二章 系统概述........................................................4
2.1 系统需求分析................................................................................................................4
2.2 Android平台介绍..........................................................................................................4
第三章 系统设计........................................................6
3.1 数据库设计....................................................................................................................6
3.2 系统界面设计................................................................................................................7
第四章 系统的实现.....................................................13
4.1 系统文件列表..............................................................................................................13
4.2 登录功能的实现..........................................................................................................14
4.2 注册功能的实现..........................................................................................................15
4.3 添加账目的实现..........................................................................................................16
4.4 业务逻辑层实现..........................................................................................................16
} 4.5 数据库操作的实现...................................................................................................18
4.6 配置文件的设置..........................................................................................................21
第 2 页第一章 引言
随着科学技术的发展,Android系统平台的逐渐普及,加之人们在日常生活中随
时随地记账的需要。纸质记账本已经不能满足需求,一种基于智能手机操作平台的
记账软件的需求逐渐显现出来。基于此原因,本文展开了对基于Android手机平台记
账软件的设计与实现的研究。虽然目前智能手机操作系统不少,但就目前的市场份
额和发展趋势来看,谷歌基于Linux的手机操作系统Android一度被业内视为最有希
望的移动平台。它不但开源免费,而且有强大的技术支持。本次选择的手机平台是
Android,这样能使本项目开发出的软件能运行在尽可能多的移动设备中,方便人们
的生活记账。
1.1项目介绍
该项目是基于android系统开发的一套手机记账系统,随着人们理财观念的不断
提升越来约需要一款软件能够随时的记住自己的消费和花费记录,能够对自己每天
的消费能有一些总结从而能培养自己的理财观念,不至于使自己陷入盲目的花销之
中,使自己真正的能够及时的掌握自己的消费信息,从而节约花销,使自己的钱能够
真正用在该用的地方从而达到节约自己消费的目的。
第 3 页第二章 系统概述
2.1 系统需求分析
针对记账软件的性质,用户最基础的的需求是记账。这也是需要着重开发和重
点设计的基础功能。
系统总体功能可以描述为以下几点:
(1) 注册功能
(2) 登录功能
(3) 添加账目功能
(4) 查看账目功能
2.2 Android平台介绍
以下图表展示了Android操作系统的主要组成部分:
图2.1 系统架构图
第 4 页以下是系统架构的详细介绍:
(1) 应用程序。Android会同一些核心程序包一起发布,包括日历、地图、浏览器
等。所有的应用程序均是用Java语言编写。
(2) 应用程序框架。这种框架可以使开发人员可以完全的访问核心程序所使用的
API框架,简化了组件的使用。同时也使用户可以方便的替换程序组件。
(3) 系统运行库。Android包含一些C/C++库,这些库能被Android系统中不同的
组件使用。一般情况下如果要将Android移植到其他硬件去运行,只需要实现这部分
代码即可。Android也包括了一个核心库,该核心库提供了Java编程语言核心库的大
多数功能。
(4) Linux内核。Android的核心系统服务依赖于Linux 2.6内核,如安全性、内存
管理、进程管理、网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间
的抽象层。
第 5 页第三章 系统设计
本章描述了软件的各个模块的设计以及整个软件系统的功能框架。本软件使用
了面向对象的设计思想来对整个系统进行设计。
3.1 数据库设计
1、数据的设计
a)建立表
create table 表名
(
列名 数据类型 约束,
列名 数据类型 约束,
列名 数据类型 约束
)
b)插入数据
insert into 表名(列名,列名) values(值,值)
c)删除数据
delete from 表名 where 条件
d)修改数据
update 表名 set 列名=值,列名=值 where 条件
e)查询数据
select 列名,列名
from 数据来源
where 条件
group by 分组列
having 条件
order by 排序列 【asc|desc】
3.2现金日记账的数据库结构
表1:用户表
表名 ACCOUNTS 说明 用户表
字段名 数据类型 约束 说明 备注
USERNAME TEXT 主键 用户名
USERPASS TEXT 密码
表2:账目明细表
表名 JOURNALS 说明
字段名 数据类型 约束 说明 备注
JID INTEGER 主键、 编号
autoincrement
JDATE TEXT 日期
JEVENT TEXT 事由
JAMOUNT REAL 金额
第 6 页USERNAME TEXT 用户名
3.2 系统界面设计
表结构设计
软件界面如下:
第 7 页图3.1 登录界面
第 8 页图3.2 创建新账户
第 9 页图3.3 账目列表
第 10 页图3.4 添加账目
第 11 页图3.5按日期查询
第 12 页图3.6查询结果
第四章 系统的实现
4.1 系统文件列表
Activity类:
AddActivity
第 13 页LoginActivity
MainActivity
RegisterActivity
Biz类:
AccountsBiz
JournalsBiz
Dao类:
AccountsDao
JournalsDao
Dbutil类:
DBHelp
Vo类:
Accounts
Journals
4.2 登录功能的实现
类被初始点击登录按钮后去数据库查询,然后返回结果。关键代码为:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//按钮绑定
btn_login = (Button) findViewById(R.id.btn_login);
btn_register = (Button) findViewById(R.id.btn_register);
//设置监听器
Moniter mnt = new Moniter();
btn_login.setOnClickListener(mnt);
btn_register.setOnClickListener(mnt);
}
监听类,代码为:
public class Moniter implements OnClickListener{
@Override
第 14 页public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
//获取界面数据
EditText txtName = (EditText) findViewById(R.id.userNameLG);
EditText txtPass = (EditText) findViewById(R.id.passwordLG);
String strName = txtName.getText().toString().trim();
String strPass = txtPass.getText().toString().trim();
Accounts user = new Accounts(strName, strPass);
AccountsBiz biz = new AccountsBiz(LoginActivity.this);
boolean flag = biz.login(user);
if(flag){
//登录成功
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
intent.putExtra("uname", user.getUserName());//传数据
startActivity(intent);
}else{
//登录失败
Toast.makeText(LoginActivity.this, " 用 户 名 或 密 码 错 误 ",
Toast.LENGTH_LONG).show();
}
break;
case R.id.btn_register:
Intent intent =new Intent();
intent.setClass(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}
4.2 注册功能的实现
关键代码:
EditText txtName = (EditText) findViewById(R.id.userNameRG);
EditText txtPass = (EditText) findViewById(R.id.passwordRG);
第 15 页String strName = txtName.getText().toString().trim();
String strPass = txtPass.getText().toString().trim();
Accounts oneUser = new Accounts(strName, strPass);
AccountsBiz biz = new AccountsBiz(RegisterActivity.this);
boolean flag = biz.register(oneUser);
if(flag){
Toast.makeText(RegisterActivity.this, " 注 册 成 功 , 请 登 录 ",
Toast.LENGTH_LONG).show();
RegisterActivity.this.finish();
}else{
Toast.makeText(RegisterActivity.this, " 注 册 失 败 ",
Toast.LENGTH_LONG).show();
}
4.3 添加账目的实现
关键代码:
//获取文本
EditText txtDate = (EditText) findViewById(R.id.addDate);
EditText txtEvent = (EditText) findViewById(R.id.addEvent);
EditText txtAmount = (EditText) findViewById(R.id.addAmount);
//封装到vo中
Journals ones = new Journals();
ones.setJamount(Double.parseDouble(txtAmount.getText().toString().trim()));
ones.setJdate(txtDate.getText().toString().trim());
ones.setJevent(txtEvent.getText().toString().trim());
ones.setUserName(getIntent().getStringExtra("uname"));
//调用biz
JournalsBiz biz = new JournalsBiz(AddActivity.this);
boolean flag = biz.add(ones);
//执行结果
if(flag){
Toast.makeText(AddActivity.this, " 添 加 成 功 ",
Toast.LENGTH_LONG).show();
}else{
Toast.makeText(AddActivity.this, " 添 加 失 败 ",
Toast.LENGTH_LONG).show();
}
第 16 页4.4 业务逻辑层实现
AccountsBiz类:
public class AccountsBiz {
public Activity ac;
public AccountsBiz(Activity ac) {
super();
this.ac = ac;
}
public boolean register(Accounts user) {
boolean flag = false;
AccountsDao dao = new AccountsDao(ac);
long row = dao.insert(user);
if (row > 0)
flag = true;
return flag;
}
public boolean login(Accounts user) {
boolean flag = false;
AccountsDao dao=new AccountsDao(ac);
flag=dao.search(user);
return flag;
}
}
JournalsBiz类:
public class JournalsBiz {
private Activity ac;
public JournalsBiz(Activity ac) {
super();
this.ac = ac;
}
public boolean add(Journals one){
boolean flag =false;
第 17 页JournalsDao dao=new JournalsDao(ac);
long row=dao.insert(one);
if(row>0){
flag=true;
}
return flag;
}
public List getInfo(String name,String date){
List list=new ArrayList();
JournalsDao dao=new JournalsDao(ac);
List listOne=dao.searchByNameAndDate(name, date);
double sum=0;
for(Journals nn:listOne){
list.add(nn.toString());
sum+=nn.getJamount();
}
list.add("合计:"+sum);
return list;
}
4.5 数据库操作的实现
}
AccountsDao类:
public class AccountsDao {
private Activity ac;
public AccountsDao(Activity ac) {
super();
this.ac = ac;
}
/**
* 注册
*/
public long insert(Accounts user){
DBHelp hp = new DBHelp(ac);
ContentValues cv = new ContentValues();
cv.put("USERNAME", user.getUserName());
cv.put("USERPASS", user.getUserPass());
第 18 页return hp.insert("ACCOUNTS", cv);
}
/**
* 登录
*/
public boolean search(Accounts user){
DBHelp hp = new DBHelp(ac);
String[] columns = {"USERNAME", "USERPASS"};
String[] selectionArgs = {user.getUserName(),user.getUserPass()};
Cursor cur = hp.select(false, "ACCOUNTS", columns, "USERNAME=? and
USERPASS=?", selectionArgs, null, null, null, null);
System.out.println(user.getUserName().toString());
boolean flag = cur.moveToNext();
System.out.println(flag);
cur.close();
return flag;
}
}
JournalsDao类:
public class JournalsDao {
private Activity ac;
public JournalsDao(Activity ac) {
super();
this.ac = ac;
}
//添加消费记录的方法
public long insert(Journals one){
DBHelp hp = new DBHelp(ac);
ContentValues cv = new ContentValues();
cv.put("JDATE", one.getJdate());
cv.put("JEVENT", one.getJevent());
cv.put("JAMOUNT", one.getJamount());
cv.put("USERNAME", one.getUserName());
return hp.insert("JOURNALS", cv);
}
}
第 19 页DBHelp类:
public class DBHelp extends SQLiteOpenHelper {
private final static String dbName="cashjournal.db";
private final static int DB_VERSION=1;
public DBHelp(Context context){
super(context, dbName, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sqlUser="CREATE TABLE ACCOUNTS (USERNAME TEXT primary
key,USERPASS TEXT);";
String sqlJournal="CREATE TABLE JOURNALS (JID INTEGER primary key
autoincrement,JDATE TEXT,JEVENT TEXT,JAMOUNT REAL,USERNAME TEXT);";
db.execSQL(sqlUser);
db.execSQL(sqlJournal);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
String sql="DROP TABLE IF EXISTS ACCOUNTS";
String sql2="DROP TABLE IF EXISTS JOURNALS";
db.execSQL(sql);
db.execSQL(sql2);
onCreate(db);
}
//查询
public Cursor select(boolean distinct,String tableName,String []columns,String
selection,String [] selectionArgs,String groupBy,String having,String orderBy,String limit){
SQLiteDatabase db=this.getReadableDatabase();
return db.query(distinct, tableName, columns, selection, selectionArgs, groupBy,
having, orderBy, limit);
}
//添加
public long insert(String tableName,ContentValues cv){
SQLiteDatabase db=this.getReadableDatabase();
return db.insert(tableName, null, cv);
}
//修改
public long update(String tableName,ContentValues cv,String whereClause,String[]
第 20 页whereArgs){
SQLiteDatabase db=this.getReadableDatabase();
return db.update(tableName, cv, whereClause, whereArgs);
}
//删除
public long delete(String tableName,String whereClause,String[] whereArgs){
SQLiteDatabase db=this.getReadableDatabase();
return db.delete(tableName, whereClause, whereArgs);
}
}
4.6 配置文件的设置
AndroidManifest.xml文件的配置:
第 21 页
第 22 页