软件工程课程设计 (个人账本管理系统)_个人帐本管理系统
软件工程课程设计 (个人账本管理系统)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“个人帐本管理系统”。
软件工程课程设计报告---个人帐本管理
一、需求分析
1、系统开发背景
当今社会是一个信息与科技并行的时代,在社会中消费时每个人都有的社会行为,消费与人的日常生活是息息相关的,一个人如果有一个很好的消费观的话能给自己带来很到好处。鉴于此目的,编写了一个小型的个人账本管理系统。此系统是一个简单的系统,可以管理个人的日常消费,可以为一般人所使用。对于业务较多的用户来说此系统就不是一个很好的选择。
2、软件主要组成及功能
收入模块
功能:录入收入
任何时间录入你所得到的收入(共有以下几种选择:
1、工资;
2、奖金;
3、其他收入;);
输入你所的到的金额; 录入金额的原因(可选);
支出模块
功能:支出的记录
什么时候
什么类型的支出(1、生活费;
2、日常用品;
3、休闲娱乐;
4、社交应酬;
5、交通费;
6、通讯费;
7、医疗保健;
8、其他支出)输入支出的金额 什么原因的支出
查询模块 功能:查询
以选择查询的类型(1、支出;
2、收入;
3、全部)
时间(1、今天;
2、昨天;
3、本周;
4、上周;
5、本月;
6、上月;
7、本年;
8、去年;
9、全部;)以及什么类别
消费的金额在什么范围之类的记录 将时间,类别,金额,备注显示出来
统计模块 功能:统计
选择统计的类型(1、支出;
2、收入;)
时间(1、今天;
2、昨天;
3、本周;
4、上周;
5、本月;
6、上月;
7、本年;
8、去年;
9、全部;)什么类别
统计的方式(1、总和;
2、平均值;
3、最大值;
4、最小值;)将时间,类别,方式,数值显示出来
管理模块
功能:完成系统相应的管理
可以对数据库进行备份 数据库的还原 查看日志操作。
修改模块
功能:对已有数据进行修改更新操作
对记录进行修改 对记录删除。
退出模块 退出此系统3、4、用户特点及一般约束 功能需求(DFD图)
收入 顶层图:
填写相应的信息收入录入事务确认成功录入成功
一层图: 收入录入事务填写相应的信息返回确认信息确认成功录入成功D:添加收入信息
支出 顶层图:
填写相应的信息支出录入事务确认成功录入成功
一层图:
填写相应的信息支出录入事务返回确认信息确认成功录入成功D:添加支出信息
查询 顶层图:
填写相应的信息查询命令输入事务确认成功查询成功
一层图: 查询命令输入事务填写相应的信息返回确认信息确认成功显示查询结果D:查询信息
统计 顶层图:
填写相应的信息统计命令输入事务确认成功显示统计结果
一层图:
填写相应的信息统计命令输入事务返回确认信息确认成功显示统计结果D:查询信息
管理 顶层图:
填写相应的信息管理命令输入事务确认成功管理成功
一层图: 管理命令输入事务填写相应的信息返回确认信息确认成功处理成功D:记录 查询
修改 顶层图:
填写相应的信息修改命令输入事务确认成功修改成功
一层图:
填写相应的信息修改命令输入事务返回确认信息确认成功修改成功D:查询数据库
5、外部接口需求
在用户界面方面要求对每一个操作都以主界面为前提弹出相应的对话框,硬软件接口方面没有特别的需求,一般用户都可以直接使用。
6、性能需求
因为系统本身较小,实际使用的人群的特点,响应时间可能有不同的要求。
7、软件属性需求
在数据的检索、数据的增删改方面必须做到丝毫不差,满足软件开发的正确性的要求。必须充分考虑软件的异常处理机制以及软件的复用性,以增强软件的健壮性。
在软件的保密性方面可以不用考虑,此软件主要是面向小型用户,对系统的保密没有要求。
所开发出来的软件必须是可维护的,要有可以升级的空间,要预留接口,方便后面软件的升级。
8、二、项目概要设计
1、总体设计(系统总流程图)
个人账本管理系统数据需求(ER图)
收入管理模块支出管理模块查询功能模块统计模块管理模块修改模块退出模块
2、各个界面的截图及相应的操作规则
在第一次运行是要首先运行此文件对控件进行注册。
第一次运行的结果如图所示
收入
支出
查询
统计
管理
退出
三、详细设计
1、进行项目详细设计工作;
2、写出详细设计说明书。
四、编 码
1、此系统用MFC来编写。
2、编码分工:
3、各个模块核心代码 查询模块:
// CSelect 消息处理程序
void CSelect::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码
UpdateData(true);CString type,date,kind,count,start,end;m_type.GetLBText(m_type.GetCurSel(),type);m_date.GetLBText(m_date.GetCurSel(),date);m_kind.GetLBText(m_kind.GetCurSel(),kind);m_count.GetLBText(m_count.GetCurSel(),count);CTime t = CTime::GetCurrentTime();int tyear,tmonth,tday;CString year,month,day;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay();if(date==“今天”){
year.Format(_T(“%d”),tyear);
if(tmonth
month.Format(_T(“0%d”),tmonth);
else
month.Format(_T(“%d”),tmonth);
if(tday
day.Format(_T(“0%d”),tday);
//确定查询
else
day.Format(_T(“%d”),tday);
start=year+_T(“-”)+month+_T(“-”)+day;
end=year+_T(“-”)+month+_T(“-”)+day;}
CString str,str1,str2,str3,str4;ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();CString sql;
if(type==_T(“0”)&&kind!=_T(“所有收入”))
sql.Format(_T(“select 时间,类别,金额,备注from mymoney where 类型= ”+type+“ and 类别= '”+kind+“' and 时间>= '”+start+“'and 时间= ”+count+“ order by 时间asc”));
_RecordsetPtr m_pRecordset;m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);m_list.DeleteAllItems();while(m_AdoConn.m_pRecordset->adoEOF==0){
m_list.InsertItem(0,_T(“”));
m_list.SetItemText(0,0,(_bstr_t)m_pRecordset->GetCollect(_T(“时间”)));
m_list.SetItemText(0,1,(_bstr_t)m_pRecordset->GetCollect(_T(“类别”)));
m_list.SetItemText(0,2,(_bstr_t)m_pRecordset->GetCollect(_T(“金额”)));
m_list.SetItemText(0,3,(_bstr_t)m_pRecordset->GetCollect(_T(“备注”)));
m_pRecordset->MoveNext();}
str=m_list.GetItemText(0,0);if(str==_T(“”)){
m_list.DeleteAllItems();
m_date.GetLBText(m_date.GetCurSel(),str1);
m_kind.GetLBText(m_kind.GetCurSel(),str2);
m_count.GetLBText(m_count.GetCurSel(),str3);
str4=_T(“无此记录”);
m_list.InsertItem(0,_T(“”));
}
} m_list.SetItemText(0,0,str1);m_list.SetItemText(0,1,str2);m_list.SetItemText(0,2,str3);m_list.SetItemText(0,3,str4);管理模块:
void CManage::OnBnClickedButton1()//数据库备份 { // TODO: 在此添加控件通知处理程序代码
m_button1.EnableWindow(false);m_button2.EnableWindow(true);m_static.SetWindowTextW(_T(“请选择备份目录:”));m_static.ShowWindow(SW_SHOW);m_button.ShowWindow(SW_SHOW);m_edit.ShowWindow(SW_SHOW);m_edit.SetWindowTextW(_T(“”));flag=1;strname=_T(“”);UpdateData(false);Invalidate(true);}
void CManage::OnBnClickedButton2()//数据库还原 { // TODO: 在此添加控件通知处理程序代码
m_button2.EnableWindow(false);m_button1.EnableWindow(true);m_static.SetWindowTextW(_T(“请选择还原文件目录:”));m_static.ShowWindow(SW_SHOW);m_button.ShowWindow(SW_SHOW);m_edit.ShowWindow(SW_SHOW);m_edit.SetWindowTextW(_T(“”));flag=-1;strname=_T(“”);UpdateData(false);Invalidate(true);}
void CManage::OnBnClickedButton3()//察看日志 { // TODO: 在此添加控件通知处理程序代码
CFile file;CTime t=CTime::GetCurrentTime();int tyear,tmonth,tday,thour,tmin,tsec;CString year,month,day,hour,min,sec;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay();thour=t.GetHour();tmin=t.GetMinute();tsec=t.GetSecond();year.Format(_T(“%d”),tyear);month.Format(_T(“%d”),tmonth);day.Format(_T(“%d”),tday);hour.Format(_T(“%d”),thour);min.Format(_T(“%d”),tmin);sec.Format(_T(“%d”),sec);
CString str;str=year+_T(“”)+month+_T(“”)+day+_T(“ ”)+hour+_T(“:”)+min+_T(“ 察看日志rnrn”);}
void CManage::OnBnClickedButton4()//浏览 { // TODO: 在此添加控件通知处理程序代码
if(flag==1){
UpdateData(true);
TCHAR szDir[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST *pidl;
bi.hwndOwner = this->m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = _T(“请选择目录”);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
if(pidl == NULL)return;
if(!SHGetPathFromIDList(pidl, szDir))return;
else strname=szDir;
UpdateData(false);} else if(flag==-1){
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,_T(“数据库文件|moneyback.db||”));
if(dlg.DoModal()==IDOK)
{
strname=dlg.GetPathName();
}
if(strname!=_T(“”))
{
UpdateData(false);
} } }
收入模块:
// CIncome 消息处理程序
void CIncome::OnBnClickedOk()//确定按钮 { // TODO: 在此添加控件通知处理程序代码
UpdateData(true);if(m_count.IsEmpty()){
MeageBox(_T(“金额不能为空”));
return;}
ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();_bstr_t sql;sql = “select * from mymoney”;_RecordsetPtr m_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(sql);CString mydate,mykind;m_date.GetLBText(m_date.GetCurSel(),mydate);m_kind.GetLBText(m_kind.GetCurSel(),mykind);mydate.Remove(' ');try {
m_pRecordset->AddNew();//添加新行
m_pRecordset->PutCollect(“类型”,(_bstr_t)_T(“0”));
m_pRecordset->PutCollect(“时间”,(_bstr_t)mydate);
m_pRecordset->PutCollect(“类别”,(_bstr_t)mykind);
m_pRecordset->PutCollect(“金额”,(_bstr_t)m_count);
m_pRecordset->PutCollect(“备注”,(_bstr_t)m_remark);
m_pRecordset->GetFields()->GetItem(“类型”)->Value =(_bstr_t)_T(“0”);
m_pRecordset->GetFields()->GetItem(“时间”)->Value =(_bstr_t)mydate;
m_pRecordset->GetFields()->GetItem(“类别”)->Value =(_bstr_t)mykind;
m_pRecordset->GetFields()->GetItem(“金额”)->Value =(_bstr_t)m_count;
m_pRecordset->GetFields()->GetItem(“备注”)->Value =(_bstr_t)m_remark;
m_pRecordset->Update();
m_AdoConn.ExitConnect();} catch(...){
MeageBox(_T(“操作失败”));
return;} }
统计模块:
// CCount 消息处理程序
void CCount::OnBnClickedOk()//确定统计 { // TODO: 在此添加控件通知处理程序代码
UpdateData(true);CString type,date,kind,way,start,end;m_type.GetLBText(m_type.GetCurSel(),type);m_date.GetLBText(m_date.GetCurSel(),date);m_kind.GetLBText(m_kind.GetCurSel(),kind);m_way.GetLBText(m_way.GetCurSel(),way);
if(type==“支出”)
type=_T(“1”);else
type=_T(“0”);
CTime t = CTime::GetCurrentTime();int tyear,tmonth,tday;CString year,month,day;tyear=t.GetYear();tmonth=t.GetMonth();tday=t.GetDay();
if(date==“今天”){
year.Format(_T(“%d”),tyear);
month.Format(_T(“%d”),tmonth);
day.Format(_T(“%d”),tday);
start=year+_T(“-”)+month+_T(“-”)+day;
end=year+_T(“-”)+month+_T(“-”)+day;} ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();CString sql;
if(kind!=_T(“所有收入”)&&kind!=_T(“所有支出”)&&way==_T(“总和”))
sql.Format(_T(“select sum(金额)as my from mymoney where 类型= ”+type+“ and 类别= '”+kind+“' and 时间>= '”+start+“'and 时间
_RecordsetPtr m_pRecordset;m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
while(m_AdoConn.m_pRecordset->adoEOF==0){
m_list.InsertItem(0,_T(”“));
m_list.SetItemText(0,0,date);
m_list.SetItemText(0,1,kind);
m_list.SetItemText(0,2,way);
try
{ m_list.SetItemText(0,3,(_bstr_t)m_pRecordset->GetCollect(_T(”my“)));
}
catch(...)
{
m_list.SetItemText(0,3,_T(”0“));
}
m_pRecordset->MoveNext();} } 支出模块:
// COutlay 消息处理程序
void COutlay::OnBnClickedOk(){ // TODO: 在此添加控件通知处理程序代码
UpdateData(true);if(m_count.IsEmpty()){
MeageBox(_T(”金额不能为空“));
return;} ADOConn m_AdoConn;m_AdoConn.OnInitADOConn();_bstr_t sql;sql = ”select * from mymoney“;_RecordsetPtr m_pRecordset;m_pRecordset=m_AdoConn.GetRecordSet(sql);CString mydate,mykind;m_date.GetLBText(m_date.GetCurSel(),mydate);m_kind.GetLBText(m_kind.GetCurSel(),mykind);mydate.Remove(' ');
try {
m_pRecordset->AddNew();//添加新行
m_pRecordset->PutCollect(”类型“,(_bstr_t)_T(”1“));
m_pRecordset->PutCollect(”时间“,(_bstr_t)mydate);
m_pRecordset->PutCollect(”类别“,(_bstr_t)mykind);
m_pRecordset->PutCollect(”金额“,(_bstr_t)m_count);
m_pRecordset->PutCollect(”备注“,(_bstr_t)m_remark);
m_pRecordset->GetFields()->GetItem(”类型“)->Value =(_bstr_t)_T(”1“);
m_pRecordset->GetFields()->GetItem(”时间“)->Value =(_bstr_t)mydate;
m_pRecordset->GetFields()->GetItem(”类别“)->Value =(_bstr_t)mykind;
m_pRecordset->GetFields()->GetItem(”金额“)->Value =(_bstr_t)m_count;
m_pRecordset->GetFields()->GetItem(”备注“)->Value =(_bstr_t)m_remark;
m_pRecordset->Update();
m_AdoConn.ExitConnect();} catch(...){
MeageBox(_T(”操作失败“));
return;} }
五、项目测试
1、2、3、4、黑盒测试用例: 白盒测试用例: 黑盒测试记录: 白盒测试记录: