大学生个人理财管理系统.docx
《大学生个人理财管理系统.docx》由会员分享,可在线阅读,更多相关《大学生个人理财管理系统.docx(82页珍藏版)》请在冰豆网上搜索。
![大学生个人理财管理系统.docx](https://file1.bdocx.com/fileroot1/2023-1/27/104e515a-9ecc-413f-bf6e-5b8b1f1da379/104e515a-9ecc-413f-bf6e-5b8b1f1da3791.gif)
大学生个人理财管理系统
密级:
A
软件学院
SOFTWARECOLLEGEOF
NANCHANGUNIVERSITY
项目报告书
PROJECTTRANSACTION
(2007—2008年)
题目大学生个人理财管理系统
专业:
软件工程
班级:
软件测试062班
学生姓名:
赵麒,程爱财,齐辰升,任蕾蕾,
修花平,袁宁英,易锦浩,祝胜康
撰稿人:
赵麒(组长)
指导教师:
谢书良
起讫日期:
2007-12-18~2008-01-02
课程设计项目报告书
一、课题名称
大学生个人理财管理系统
二、建项目的
1、熟练的掌握MicrosoftVisualC++6.0的使用,学会应用MFC架构制作具有完整功能的应用软件。
2、熟悉VC各种图形界面控件的用法。
3、掌握数据库的相关知识,会用Access创建具有完整结构的数据库。
4、学会用ODBC操作数据库,并了解SQL语句的用法。
5、在工程的制作过程中从需求分析,功能分析,数据库设计,功能模块设计,软件编码,软件调试及测试,软件的打包发布及推广等一系列的步骤初步了解软件工程的思想。
6、通过团队的分工努力学会合作,懂得团队精神。
三、需求分析
大学生个人理财管理系统是一款管理大学生个人财物的应用软件。
该软件代替了手工记账的麻烦,可以方便的实现个人收支状况的浏览、添加、删除、修改、查询等功能,适合个人管理自己的日常收入、支出、借款、银行账户、负债,并且专门针对大学生设计,没有那些债券基金家庭财务等纷繁复杂不宜使用的功能,有着更合理的功能结构布局,还有独具特色的提醒功能,当用户支出超过规定限额的时候及时帮助用户合理安排收支。
四、功能说明
1、用户管理
用户管理模块是实现对该软件的使用者-用户进行管理的功能。
一台计算机上的软件有可能有好几个不同的用户使用,每个用户都要拥有自己的收支信息,银行账户信息以及个人设置等,所以要进行相对独立的管理。
软件没有为用户划分权限,每个用户在管理上都是平等的,都可以得到软件的全部功能;然而每个用户又是独立的,无法获知其他用户的存在情况,即使直接打开数据库也无法得到加密后的用户密码及银行帐号等一些隐私信息。
图1:
用户登录界面
1.1用户登陆
用户登录模块是为了判断用户身份,以便正确的让其使用该软件,以及阻拦非法用户的功能。
该模块主要由一个登陆窗口完成,在登录窗口中同样可以注册新用户和退出程序。
1.2用户注册
用户注册功能主要提供给使用该软件的新用户,使他们能够用自己的用户名和密码建立新用户,并且能设置自己的使用偏好。
1.3用户设置
“用户设置”功能模块的页面在软件主界面中,为用户提供了重新更改基本设置及使用偏好的条件。
在该模块中用户能够更改其用户名或密码,及支出上限、收支类别等。
图2:
程序主界面
2、收支管理
“收支管理”模块是该软件中最重要的部分,也是用户每日主要记账的地方。
模块完成收支记录的录入,修改,删除,筛选及统计和提醒的功能,尽可能的为用户提供方便,使其能够对自己的财政状况有更明晰的认识。
图3:
软件收支管理的界面
2.1添加收支记录
记录用户的每笔收支情况,用户在添加收支记录的时候可以自定义收支类别和支付方式,也可为收支记录添加备注,以使其能够更好的管理每笔收支情况。
每次添加收支记录以后,软件会在历史余额的记录中新添加一条,记录用户当前账户的最新余额,也有利于用户能够浏览账户过去的余额状态,更清楚地了解资金流向。
2.2修改记录
修改账户添加过的收支记录,用户可以重新填写收支金额,支付方式及类别等。
若用户更改了金额和支付方式,软件会自动添加新的历史余额信息,以正确的显示用户当前余额。
2.3删除记录
删除用户添加过的收支记录。
同样,软件也会集联更新用户的历史余额信息,并且在添加的历史余额信息中为用户写好备注。
2.4筛选记录
可以按用户选定的账户、收支类别及起止时间筛选收支记录,并显示到列表框中。
也可以在筛选的时候选择全部类别,抑或是所有收入或所有支出。
当起止时间相同的时候默认显示所有时间的收支记录。
2.5统计收支信息
在用户单击“查询”按钮筛选过收支记录以后,软件会自动计算出此时筛选后的总收入金额,总支出金额,以及选定账户的当前余额或者用户的总余额。
2.6提醒
在用户输入或修改收支记录的时候软件可以按照用户预先设定的月平均收入以及月支出上限合理的提醒用户,使用户在超过支出上限的时候能够及时意识到,以便合理安排自己的收支。
3、余额管理
“余额管理”模块是为用户显示、管理和筛选历史余额而设计的,便于用户浏览自己账户往期的余额,清晰的了解资金流向。
3.1察看历史余额
在列表框中显示用户往期的历史余额信息。
3.2为余额添加修改注释
用户可以手动添加修改选定历史余额记录的注释,方便用户对余额信息的管理。
由于余额信息是软件对用户当前所有银行账户资金流向的自动记录,故未设置历史余额的添加和删除功能,同样也不能修改历史余额的金额和类型,否则会造成不可预知的错误。
3.3按时间及账户筛选余额记录
按照用户选定的起止时间及银行账户对显示的余额记录进行筛选。
4、账户管理
每位用户可以在该功能模块里为自己添加多个银行账户,以便于系统能够正确的计算个账户的余额以及分析资金流向。
在银行账户管理中系统已经包含了“现金”作为一个默认隐含账户进行管理。
图5:
银行账户管理页面
4.1添加银行账户
按照用户输入的账户名称和账户卡号向软件添加银行账户,在新建账户时需要用户输入账户的初始余额,以便管理。
4.2修改账户
修改已经建立的账户的名称,卡号以及备注,在此情况下账户的余额是不可修改的,由软件自动算得。
4.3删除账户
删除已经建立的账户。
为了方便用户的历史查询,该操作不会影响收支记录和历史余额记录中和该账户相关的记录信息,但会使支付方式里面的账户名不可用。
4.4察看账户的当前余额
单击选定列表框中的一个账户,即可在界面左下角的“账户余额”文本框中显示该银行账户的余额。
5、数据库管理
管理用来存放用户所有数据的数据库。
该软件采用利用默认数据源动态连接数据库的方式,无需用户自己创建ODBC数据源,非常方便,具有更高的可移植性。
5.1更改数据源
此功能可以让用户更改当前软件使用的数据源,此功能模块的设计目的主要是是为了使用户可以在不改变现有数据库的情况下先打开备份的数据库,察看一下数据库里面的收支记录等,以便于用户选择正确的备份数据进行还原。
5.2数据库备份
备份软件的数据库,有利于防止因意外而造成的数据库损坏。
5.3数据库还原及恢复
还原用户备份过的数据库,并用还原的数据库覆盖软件现有的数据库。
6、其他功能
图7:
导出收支记录界面
6.1导出用户收支记录
此功能模块可以导出数据库里的收支记录保存成文本文件,为用户提供一个理财记录。
在该记录文件中会显示用户名以及导出记录总的收入金额、支出金额及余额等相关信息。
用户亦可以自己按时间、类别或账户对收支记录进行筛选,然后再导出。
五、系统架构
六、数据表及逻辑关系
各数据表之间的关系
数据库逻辑结构示意图:
各数据表的实现:
表1:
用户信息表User
序号
字段名称
字段描述
类型
位数
属性
1
ID
用户编号
自动编号
长整形
主键
2
Name
用户名称
文本
15
无重复
3
Password
用户密码
文本
20
4
Aver
月平均收入
货币
1(小数)
5
Limit
月收入上限
货币
1(小数)
6
InType
自定义的收入类型
文本
50
7
OutType
自定义的支出类型
文本
50
表2:
账户信息表Account
该表用来储存关于用户的银行账户相关信息
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
Cardno
卡号
文本
20
无重复
3
Name
卡类型
文本
15
无重复
4
User
用户
数字
长整型
5
Comment
备注
文本
50
表3:
收支平衡表Balance
用来记录用户的历史余额信息
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
b_Date
日期
日期/时间
短日期
3
Amount
数目
货币
货币
4
User
用户
数字
长整型
5
Type
支付方式
数字
长整型
6
Comment
备注
文本
50
表4:
输入表Input
储存用户收支信息
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
Amount
数目
货币
1位小数
3
b_Date
日期
日期/时间
短日期
4
Type
类型
数字
长整型
5
Card
卡
数字
长整型
6
User
用户
数字
长整型
7
Comment
备注
文本
50
表5:
收入类型表InType
储存用户定义的收入类型,其ID与Input中的Type对应
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
Title
类型名
文本
15
无重复
表6:
支出表Out
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
Amount
数目
货币
货币
3
b_Date
日期
日期/时间
短日期
4
Type
类型
数字
长整型
5
Card
卡
数字
长整型
6
User
用户
数字
长整型
7
Comment
备注
文本
50
表7:
支出类型表
序号
字段名称
字段描述
类型
位数
属性
1
ID
编号
自动编号
长整型
主键
2
Title
类型名
文本
15
无重复
七、系统实现
基本步骤:
1、用VC建立单文档工程,数据源连接选MSAccessDatabase
2、添加全局变量和全局函数,实现默认数据源的连接。
3、设计软件主界面及Tab页布局的实现。
4、设计登录窗口
5、设计注册窗口
6、设计用户设置界面
7、设计银行账户管理界面
8、设计余额信息管理界面
9、设计收支信息管理界面
10、设计收支记录导出管理界面
11、设计数据库备份和还原功能模块
12、软件界面的美化
13、软件的调试及测试
程序具体设计思路及各实现过程的详细步骤:
1、建立工程框架
1.1在新建MFC项目向导的“数据源”中选中MSAccessDatabase
1.2单击OK键弹出“选择数据源”对话框选定所需的数据库文件(*.mdb)
1.3然后选择一个表以后点击新建项目向导的Finish即可完成项目框架的建立。
2、建立数据库链接
2.1由于那种方法刚才建立的连接是使用默认数据源,每次在程序启动时都要弹出选择数据库的窗口,十分不便,所以在程序的CNCUApp类里添加了m_database及m_recordSet作为公用数据库及公用数据集,利用extern声明为全局变量,然后建立OpenDB()及其参数重载函数作为打开数据库的函数使用以便以后功能调用。
(详见下一章对应源代码)
3、设计软件主界面及Tab布局
3.1由于单文档界面默认布局不美观,所以打算设计成Tab页面以在主窗口上显示所有窗口。
3.2新建对话框,按照设计要求制作出每个功能的界面,然后利用类向导为每个对话框新建类,新建时的BaseClass选择CPropertyPage
3.3建立CPropertySheet类的对象m_sheet,以及指针*m_page,以指向当前打开的页面。
3.4建立打开Tab页的函数CreateTab()和关闭函数DestoryTab()(详见对应源代码)
3.5为侧面对应的按钮添加OnClick事件处理函数。
4、设计登录界面
4.1设计登录界面对话框
4.2为对话框建立类CLogin
4.3为注册和登录按钮添加单击事件处理函数。
(详见对应源代码)
4.4在CNCUApp中的InitInstance()函数添加弹出登录窗口的相关代码。
4.5建立theUser字符串变量,在用户登录成功以后用来储存用户的ID值。
5、设计用户注册界面
5.1设计用户注册界面对话框并建立相关联的类
5.2为界面上的每个控件连接控制变量。
5.3添加确定按钮的OnClick事件处理函数。
5.3.1从界面各控件获得数据。
5.3.2判断各数据的合法性,其中用户名不能少于3个字节而且不能和已有的用户名重复;密码不能少于6位。
5.3.3若各数据合法,连接数据库并在User表中插入用户填写的相关信息,显示注册成功,提示用户返回登录界面。
6、设计用户设置界面
6.1在已经设计好的用户设置对话框中为各个控件添加控制变量。
6.1.1其中“收入类型”中采用ListControl,属性设置为Nocolumnheader。
6.2为该对话框加入初始化函数。
6.2.1从数据库中依据theUser变量读取用户的相关信息。
其中读取出的InType和OutType字符串经过分割以后存到对应字符串数组里。
6.2.2使用读取的数据初始化界面上的各个控件。
6.3为对话框的“收入类型”的“添加”按钮添加处理函数。
6.3.1判断文本框是否为空。
6.3.2若不为空的话向数据库的InType中添加新类别,然后同步更新储存TypeID的相关数组。
6.3.3同理制作“支出类型”的添加按钮。
6.4为对话框的“收入类型”的“删除”按钮添加处理函数。
6.4.1判断是否选中一条记录。
6.4.2获得该记录对应的行数。
6.4.3在列表框中删除该记录,并同步更新存储其ID的相关数组。
6.5为界面的“确定”按钮添加处理函数。
6.5.1从界面上的各控件获得数据并储存在变量中。
6.5.2判断各数值的有效性。
6.5.3判断登录密码是否为空
6.5.3.1若不为空则判断是否和确认密码相等,否则返回。
6.5.3.2判断密码的位数是否合法。
6.5.4判断用户名是否修改过,若修改过是否和已有的用户重复。
6.5.5对偏好设置的字符串进行处理,去掉“元”。
6.5.6根据储存收入支出类型ID的字符串数组生成typeID相关字符串。
(用逗号隔开)
6.5.7根据获得的数据更新User数据表中相关记录。
6.6为界面的“取消”按钮添加代码。
6.6.1调用OnInitDialog();函数使对话框重新回到初始状态,还原用户修改过的设置。
7、设计银行帐户管理界面
7.1为设计好的对话框连接控件的控制变量
7.2为对话框的OnInitDialog();函数添加语句,获得数据库中用户关于银行帐户的相关信息并显示到界面上。
7.3建立RefleshList函数,刷新列表框。
7.4为列表框添加单击事件的处理函数。
7.4.1判断是否选中一行。
7.4.2获得行数,并把该行的相关信息显示到各控件中,以便用户修改。
7.4.3搜索出数据库中关于该账户的最后一条历史余额的记录,即最新当前余额显示到左下角的文本框中。
7.5添加“添加”按钮的单击事件处理函数。
7.5.1从各控件获得数据,并储存在相关变量中。
7.5.2判断各数据的合法性。
7.5.3把“账户余额”文本框设为有效,提示用户在里面输入新建账户的初始余额。
返回。
7.5.4若用户输入完初始余额以后,按照获得的各项数据向数据库的Account表中添加新记录。
7.5.5刷新列表框。
7.6同理,添加“修改”按钮的处理函数。
7.7添加“删除”按钮的处理函数。
8、设计余额信息管理界面
8.1为界面个控件连接变量。
8.2从数据库中取出历史余额信息。
8.3初始化对话框各控件
8.3.1制作RefreshList()函数用来刷新列表框。
8.3.1.1函数带默认参数,在参数中获得SQL语句,以便在筛选功能时显示列表使用。
8.3.2从数据库中获得该用户的所有银行帐户显示到“查询”中的“账户”下拉列表框中。
8.4为“更新”按钮添加代码。
8.4.1判断是否选定一行。
8.4.2按照用户填写的信息更新数据库。
8.5为“筛选”按钮添加代码。
8.5.1获得起止时间及选定的账户
8.5.2根据获得的数据生成SQL语句。
8.5.3调用RefreshList(strSQL)对列表框的内容进行刷新。
8.6添加“取消”按钮的代码。
9、设计收支信息管理界面
9.1为各控件连接变量。
9.2从数据库中获取该用户的收支信息,并存入相关变量。
9.3根据变量来初始化对话框,显示各控件的内容。
9.3.1制作RefreshList函数用来根据参数获得的SQL语句读取数据库刷新列表。
9.3.2制作ListIn()函数来刷新收入类别的下拉列表框。
9.3.3制作ListOut()函数来刷新支出类别的下拉列表框。
9.3.4制作ListAll()函数来刷新“分类显示”部分的“所有类别”下拉列表框。
9.4添加单击列表框事件的处理函数。
9.4.1判断是否选中一行。
9.4.2根据选中行在相应控件上显示出数据。
9.4.2.1对“金额”进行处理以去掉符号。
9.4.2.2对时间进行处理,转化为CTime类型使其能够显示到TimeDatePicker控件上。
9.5添加单击收入/支出单选按钮时的事件。
9.5.1通过判断语句直接调用ListIn()或ListOut()
9.6添加“添加”按钮单击事件的处理函数。
9.6.1从界面控件上获得数据。
9.6.2判断各数据的有效性。
9.6.3向数据库的Input或Out表中添加新的收支记录。
9.6.4读取数据库中的Balance表获取该项收支记录对应账户的当前金额。
9.6.5把当前金额和新添加的收支记录的金额转化为浮点型。
9.6.6计算出添加以后的余额。
9.6.7把计算后的余额等相关信息添加到Balance表中,并以收支记录的注视或类型作为该记录的注释。
9.6.8调用Alarm(amount)函数判断收支是否超过规定,以进行合理的提醒。
9.7添加“修改”按钮单击事件的处理函数。
9.7.1从控件中获得数据
9.7.2判断有效性。
9.7.3更新Input或者Out数据表
9.7.4从数据库中取得当前余额。
9.7.5利用修改前后的差值计算出修改以后的当前余额。
9.7.6把计算后的余额信息添加到Balance表中。
9.7.7调用函数进行适当的提醒。
9.8添加“删除”按钮单击事件的处理函数。
9.9添加“查询”按钮单击事件的处理函数。
9.9.1从控件中获得数据。
9.9.2根据获得的数据生成相应的SQL语句
9.9.3利用RefreshList(strSQL)函数刷新列表框。
9.9.4获得从刷新列表框函数里算得的所有收入和所有支出的金额。
9.9.5从数据库中获得帐户的当前余额。
9.9.5.1若选定“所有账户”则遍历每个账户的余额,然后算出总余额。
9.10添加“取消”按钮单击事件的处理函数。
9.10.1使对话框的每个控件回到初始状态。
10、设计收支记录导出界面
10.1为界面控件连接变量。
10.2从数据库中获得相关的收支记录。
10.3利用收支记录初始化各控件。
10.4添加“筛选”按钮的代码。
(同9.9)
10.5添加“导出”按钮的代码。
10.5.1调用“筛选”按钮确保列表处于最新状态。
10.5.2获得系统当前时间,以生成导出的文本文件的默认文件名。
10.5.3弹出导出文件对话框,让用户选择文件存放的目录及文件名。
10.5.3.1创建CArchive类型的ar对象,以便实现文件的写操作。
10.5.4根据theUser变量查询用户名,写到文件的第一行。
10.5.5显示文件的标题行。
10.5.6遍历列表框中的记录,导出每一项收支记录。
10.5.7获得用户的总收入/支出金额以及当前余额等信息,写到文件的最后一段。
10.5.8关闭文件,提示导出成功,返回。
10.6添加“取消”按钮的代码
10.6.1调用OnInitDialog();使对话框中的各控件回到初始状态。
八、源代码
NCU.h
//声明全局变量和全局函数
intSplitString(CString&str,TCHARcTok,CStringArray&aryItem);
voidOpenDB(void);
voidOpenDB(CStringstr);
voidOpenDB(CDatabase&db,CRecordset&rs);
voidSetDate(CStringtime,CDateTimeCtrl&timer);
voidDeleteAllColumn(CListCtrl&m_lstCtrl);
CStringFixValue(CStringtemp);
CStringFixTime(CStringtemp);
CStringFixAccount(CStringtemp);
CStringFixInType(CStringtemp);
CStringFixOutType(CStringtemp);
intFindStr(CStringstr,CStringArray&strArr);
longGetCount(CRecordset&rs,CStringstr);
floatGetBalance(CStringaccountID);
externCStringcSQL;
externCStringcPath;
externCRecordsetm_recordSet;
externCDatabasem_database;
externCStringtheUser;
NCU.cpp
//全局函数体
//////////分割字符串函数///////////
///用法:
SplitString("要分割的字符串",'分隔符',用来保存分割后的字符串数组);
////////////////////////////////////
intSplitString(CString&str,TCHARcTok,CStringArray&aryItem)
{
TCHAR*p=str.GetBuffer(0);
TCHAR*e=p;
TCHARcEnd=*e;
intnCount=0;
while(cEnd)
{
if(*e==