摘要本次课程设计在Windows 7平台上,以Macromedia Dreamweaver 8作为界面开发工具,使用ASP作为开发语言,SQL Server 2008作为数据库工具,分析设计了“个人财务管理系统”。
系统软件和对数据库的操作和管理都可在计算机上完成。
如今计算机已走进千家万户,传统的在纸上记录收入支出的方式已经过时,人们需要一种可以在计算机记录自己收入支出信息的软件,可是市场上的财务管理软件大多数十面向企业,或是有专门用途,面向普通用户的个人财务管理系统很难找到,在者免费的软件更是少之又少,为了满足普通用户的需求,特开发此软件。
本系统功能简单,只适合对个人财务管理要求不高的用户,可以完成收入支出金钱及物品的记录与查询操纵,但这些对普通用户还说应该够了,本系统操作简单,用户无需记录复杂的命令,打开主机面就可以很容易看出系统的功能,在者,本软件为免费产品,对于不愿花很多钱购买软件的用户来说是个很好的选择,本软件无需很高的硬件配置,一般的配置均可运行,占用系统资源少。
本报告中首先说明了该系统的特点与业务需求,之后详细说明了系统的业务流程和系统开发流程,重点介绍了系统各模块的功能及相关功能的具体实现。
该系统功能完善、用户界面友好、运行稳定,可完成日常个人财务信息的管理和维护。
本报告中首先说明了该系统的业务需求,之后介绍了系统的总体设计思路以及着重介绍了数据库表的设计过程及说明可供研究此系统的人员提供参考。
关键词软件工程;数据库设计;个人财务管理系统;ASP;SQL Server 2008第一章绪论1.1课题背景当今社会越来越着朝着信息化和数字化法发展,计算机的应用领域使我们的生活越来越方便和快捷,可以说我们的每个人生活都离不开计算机的帮助了。
越来越多的个人应用软件成为了人们重要的助手,也在潜移默化的改变着我们的生活。
随着市场经济的发展,我国居民对理财有着越来越高的要求。
理财,是每个家庭和个人所必须面对的问题。
现在,关于企业的会计制度逐渐完善,而且针对企业的财务软件以及EPR(enterprise resource planning)系统也在飞速发展,但针对个人或家庭的财务系统目前还是一段空白。
实际生活中经常要对个人的各项财务收支进行管理,本课题的目的就是利用计算机对各项财务进行电子化的管理,使我们的理财更加方便和理性化,提升我们生活的质量和品位。
课题意义我们经常看到企业的一些财务报表,这些报表主要是关注企业的资产负债表和损益表。
简单的说,前者是反映这个企业有多少钱,是存量;后者,反映了企业在一定时间能赚到多少钱,是流量。
其实,对一个人或者家庭的财务情况,也是关注这两个方面。
关注家里存多少钱,关注今年赚了多少钱,花了多少,借出什么等等。
要做到这些需要对大量的数据做存储和计算,工作是相当的复杂繁琐和枯燥的,因而这些问题容易被人忽略。
我们纵然可以为生活中的每一笔花销记账,但是对这样大量的数据做分类处理确实是一个会令大多数人头疼的问题,如果有一个个人理财的软件理财的软件对我们的日常财务进行那样的繁琐的数据处理和计算工作,相信可以让我们理财的效率大大提高。
这样一个软件不但可以方便我们的生活,更可以使我们对自己的财务状况有一个清楚的了解。
与此同时,这样的一个软件开发和制作也是对我们大学学到各种知识进行的一次综合运用的一个好机会,是对我大学学习的一个检验和实践。
第2章可行性分析2.2.1 可行性分析当接受一个软件开发任务,就进入软件生命的第一个阶段,即进行可行性的研究。
并不是所有问题都具有简单的解决办法,许多问题不能在预定的规模之内解决。
可行性分析就是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。
可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。
2.1.2 技术可行性根据客户提出的系统功能、性能及实现系统的各项约束条件,根据新系统目标,来衡量所需的技术是否具备。
本系统主要采用数据库管理方法,服务器选用微软的SQLServer 2008数据库,他是它是目前能处理所有中小型系统最方便的流行数据库,它能够处理大量数据,同时保持数据的完整性并提供许多高级管理功能。
它的灵活性、安全性和易用性为数据库编程提供了良好的条件。
硬件方面,该系统短小精悍对赢家没有太大要求,只要能够运行Windows 7就可以很好的运行该软件。
另外在划单操作中可用磁条来触发事件的响应,这项技术也已经很成熟。
2.1.3 操作可行性本系统采用用户界面交互方式,并有必要的帮助信息,操作简单,用户只要具备简单的应用计算机的能力,无论学历,无论背景,均可以使用本系统,用户界面上的按钮的功能明确,用户一看就可以了解怎么使用本系统,以及本系统能够完成的功能,因此本系统在操作上是可行的。
2.1.2 经济可行性估算新系统的成本效益分析,其中包括估计项目开发的成本,开发费用和今后的运行、维护费用,估计新系统将获得的效益,估算开发成本是否回高于项目预期的全部经费。
并且,分析系统开发是否会对其它产品或利润带来一定影响。
本系统作为一个课程设计,没有必要考虑维护费用,以及本系统可获得的效益等问题。
2.1.4 法律及社会效益方面的可行性由于本系统只是一个课程设计,在图书馆查询相关资料因此不存在侵权等法律与社会影响方面的问题,不存在侵权级相应的法律问题。
关于效益方面,本系统仅仅是一个课程设计,只是为了提高自己的分析,设计能力,而非为了社会效益而编写设计,因此社会效益方面也是可行的。
第3章需求分析3.1 用户需求本系统是针对用户要求,使用计算机对自己日常的资金和物品的收入、支出以及相关的各种信息进行记录、修改、添加、删除等操作,并实现对信息进行统计和以文档形式输出的操作而设计的一种现代化个人财务管理软件。
经过分析,本系统需要具有以下功能:1、能够实现个人财务管理方面各项功能,能成功的对用户各种信息进行管理。
2、实现查询、修改、删除、添加数据方便,数据的稳定性和可靠性好。
3、能够实现按日期查询以及对库存数据进行按月统计和以文本形式输出。
4、拥有良好的人机交互界面。
3.2 功能需求系统业务需求本系统具有以下几个功能模块:用户登录模块、系统管理模块、收支管理模块、报表统计模块。
用户登录模块为每个用户分配账号密码使得个人的财务信息具有隐私性,收支管理模块能有效的管理用户的现金,可以进行添加,查询,删除操作,报表统计模块使得用户能够查询用户某月的金钱和物品统计信息,能够让用户对自己每月或一段时间的收支情况,系统管理模块可以让用户修改密码。
登陆功能对于个人财务管理系统,我们要求软件满足用户对个人财务的隐私性管理,确保在用户以外的其他人使用软件对其信息进行操作,所以要采用用户注册和登录制度,确保用户对自己财务信息的隐私管理。
收支管理模块功能现金管理模块是用户对现金进行添加、删除、修改操作的模块,提供用户对现金的收入支出进行操作的功能,使得当用户的记录需要修改时,可以方便的添加和修改。
报表统计管理模块提供用户对现金收支信息和物品收支信息进行统计输出功能。
系统管理模块系统管理模块提供用户对用户个人信息的管理和修改的功能。
系统技术需求稳定性:本系统为财务管理系统,多为查询、修改、删除、添加数据等操作,要求数据的稳定性好。
可靠性:用户财务数据多比较重要,要求系统具有数据备份,数据恢复等性能。
安全性:系统设计个人银行账号以及密码的保存,要求系统提供加密保存等安全措施,即要求系统有较高的安全性能。
数据流图数据字典名称:收支信息报表别名:描述:描述某日收支信息定义:收入报表=【收入|支出】+金额+原因+日期位置:显示给用户名称:收支统计报表别名:描述:描述某月收支收支信息定义:月收支信息=收入总额+支出总额+日期位置:显示给用途状态转换图状态转换图模拟系统的行为模型,把系统概括的分为几个状态,并表示触发状态转换的事件,由于该系统是医院内部使用的小型系统故不用设置登录功能,打开系统自动初始化为等待状态,接受事件,并根据事件类型进入相应状4.2.1 ER 图数据库的ER图如下所示:图4.2 ER 图其中用户编号是用户的主键,每个用户都有唯一的编号,其中收入编号是收入的主键,收入类型包括买入、借入,收入,如果是金钱,金额就是金钱的数量,备注就是对事件的详细说明,支出联系同收入联系,支出类型包括:借出、卖出、支出,备注可以填写用途或原因的说明。
第四章:总体设计4.1:层次结构图把整个系统分为收支管理,报表统计管理,系统管理四个模块,收支管理模块分为添加收入,添加支出,修改收入,修改支出,查询收支,删除收支6个模块,统计管理模块分为物品统计信息,收支统计信息两个模块,收支管理模块分为修改密码,数据备份,数据恢复,系统说明,退出系统5个部分,每个模块完成的功能可以从名字上明显的看出。
层次从结构图如下所示:图4.1 层次结构图4.2:数据库设计4.2.2 数据库表表4.2 支出信息表表4.3 收入信息表第五章:详细设计5.1界面设计:一个好的用户界面能够给用户一个好印象,甚至能够事半功倍,有的时候,即使软件设计的很好,但用户界面不符合用户操作的习惯,也可能会让用户不满意,因此说,一个好的用户界面是至关重要的。
本系统的界面设计如下:主界面左侧有四个选项,分别对应层次图的四个模块,分别为:用户收支管理,统计查询,系统管理,用户管理,每个选项下面还有相应的几个子选项,完成相应的添加、查询、修改、删除操作,右侧为正文部分,显示用户需要的信息。
用表单的形式显示出来。
5.2数据库查询设计输出的显示主要是对数据库的组合或单独查询得出的结果,三个表用用户的编号联系起来,在用户表中用户的编号是主键,在收入表中和支出表中则是作为外键,三个表组合查询就可以查到想要的所有信息。
其中收入类型填写金钱收入,借入物品,买入物品:收入物资类型填写物品、金钱,支出类型填写金钱支出,物品借出,物品卖出;备注填写原因后用途。
5.3登录界面数据流程图登录模块代码:<%if request("admin")=" 登陆" thenUserName=request.form("UserName")PassWd=md5(request.form("PassWd"))set rs=server.CreateObject("ADODB.RecordSet")sql="select * from [user] where username='"&UserName&"'"rs.Open Sql,conn,1,1if rs("password")<>PassWd thenresponse.write"<script>alert(‘用户或密码错误’);location.href='javascript:history.go(-1)';</script>"response.endelseResponse.Cookies("key")="gu_ke"Response.Cookies("key").expires=date+2Response.Cookies("user")=rs("username")Response.Cookies("user").expires=date+2Response.Cookies("id")=rs("id")Response.Cookies("id").expires=date+2response.redirect "admin.asp"end ifrs.closeend if%><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><link href="css.css" rel="stylesheet" type="text/css" /><title>登陆页面</title></head><body><script language=javascript>function CheckForm() {if (erName.value==""){alert("用户不能为空");erName.focus();return false;}if (document.form1.Passwd.value==""){alert("密码不能为空");document.form1.Passwd.focus();return false;}}</script><table width="300" align="center" border="0" cellspacing="0" cellpadding="0"><form name="form1" method="post" action="index.asp" onSubmit="return CheckForm()"><tr><td height="95"></td></tr><tr><td height="35">用户:<input type="text" name="UserName" maxlength="16" size="24" /></td></tr><tr><td height="35">密码:<input type="password" name="Passwd" maxlength="22" size="24" /></td></tr><tr><td height="40" align="center"><input type="submit" name="admin" value=" 登陆" /></td></tr></form></table></body></html>添加用户模块:<!--#include file="conn.asp"--><!--#include file="heck.asp"--><!--#include file ="md5.asp"--><html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><LINK href="css.css" type=text/css rel=stylesheet /></head><%set rs=server.createobject("adodb.recordset")sql="select * from [user] where id="&Request.Cookies("id")rs.open sql,conn,1,1if rs("admin")<>1 thenResponse.Write "<script>alert('系统超时');this.location.href='index.asp';</SCRIPT>"rs.closeresponse.endend IfIf Request.form("add")=" 添加" ThenSet rs=Conn.Execute("Select * From [user] Where username='"&Request.form("user")&"'")If Not (rs.Eof or rs.Bof) ThenResponse.Write "<script>alert('该用户已存在');this.location.href='add_user.asp';</SCRIPT>" Response.Endrs.clsoeend ifIf request.form("pwd2") <> request.form("pwd3") thenResponse.Write "<script>alert('两次密码不相同');location='javascript:history.back(-1)'</SCRIPT>"Response.Endend ifSet rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [user] Where (ID is null)"rs.Open Sql,Conn,1,3rs.addNewrs("username") = Request.form("user")rs("admin") = Request.form("admin")md5pwd=md5(request("name2"))rs("password")=md5(request.form("pwd2"))rs.Updaters.CloseResponse.Write "<script>alert('操作成功');this.location.href='t_user.asp';</SCRIPT>"end if%><body><script language="JavaScript"><!--function chk(theForm){if (er.value == ""){alert("请输入用户");er.focus();return (false);}if (theForm.pwd2.value == ""){alert("请输入密码!");theForm.pwd2.focus();return (false);}if (theForm.pwd3.value == ""){alert("请重复密码!");theForm.pwd3.focus();return (false);}}//--></script><table width="100%"><tr><td height="25"></td></tr></table><table width="100%" border="0" align=center cellpadding="5" cellspacing="1" bgcolor="#eeeeee"><form action="" method=post name=form1 onSubmit="return chk(this)"><tr bgcolor=ffffff><td width="40%" align="right">用户:</td><td><input name="user" type="text" size="20" maxlength="30" /></td></tr><tr bgcolor=ffffff><td width="40%" align="right">权限:</div></td><td><select name="admin"><option value="0">普通用户</option><option value="1">管理员</option></select><font color=red><-- 请选择</font></td></tr><tr bgcolor=ffffff><td width="40%" align="right">密码:</td><td width="60%"><input name="pwd2" size="28" type="password" maxlength="26" /></td></tr><tr bgcolor=ffffff><td width="40%" align="right">重复密码:</td><td width="60%"><input name="pwd3" size="28" type="password" maxlength="26" /></td></tr><tr bgcolor=ffffff><td width="40%" align="right"> </td><td><input type="submit" name="add" value=" 添加" /></td></tr></form></table></body></html>管理用户:<!--#include file="conn.asp"--><!--#include file="heck.asp"--><html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><LINK href="css.css" type=text/css rel=stylesheet /></head><%set rs=server.createobject("adodb.recordset")sql="select * from [user] where id="&Request.Cookies("id")rs.open sql,conn,1,1if rs("admin")<>1 thenResponse.Write "<script>alert('系统超时');this.location.href='index.asp';</SCRIPT>" rs.closeend ifIf Request.form("user")=" 修改" ThenSet rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [user] Where id="&Request("id")&""rs.Open Sql,Conn,1,3rs("admin") = Request.form("admin")rs.Updaters.CloseResponse.Write "<script>alert('操作成功');this.location.href='t_user.asp';</SCRIPT>"end if%><body><table width="100%"><tr><td height="25"></td></tr></table><table width="100%" border="0" align=center cellpadding="5" cellspacing="1" bgcolor="#eeeeee"><%Set rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [user] Where id="&Request("id")&""rs.Open Sql,Conn,1,1%><form action="" method=post name=form1 onSubmit="return chk(this)"><tr bgcolor=ffffff><td width="40%" align="right">用户:</td><td><%=rs("username")%></td></tr><tr bgcolor=ffffff><td width="40%" align="right">权限:</td><td>管理员<input name="admin" type="radio" value="1" <%If rs("admin")=1 Then Response.Write "checked" End if%> /> 普通用户<input name="admin" type="radio" value="0" <%If rs("admin")=0 Then Response.Write "checked" End if%> /></td></tr><tr bgcolor=ffffff><td width="40%" align="right"> </td><td><input type="submit" name="user" value=" 修改" /></td></tr></form><%rs.Close%></table></body></html>显示当前用户及退出模块:<table width="100%" height="26" border="0" cellpadding="0" cellspacing="0" bgcolor="#335Ea8"><tr><td><table width="90%" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td><font color="ffffff">当前用户:<b><%=Request.Cookies("user")%></b> </font> <a href="quit.asp" target="_top"><font color="#ffffff">退出</font></a></td> </tr></table></td></tr></table>管理收入类型模块:<!--#include file="conn.asp"--><!--#include file="heck.asp"--><html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><LINK href="css.css" type=text/css rel=stylesheet /></head><%idd=Request.Cookies("id")If Request.form("add")=" 添加" Thenpaytype = Trim(Request.Form("paytype"))io = Trim(Request.Form("io"))Set rs=Conn.Execute("Select PayType From [type] Where user="&idd&" and PayType='"&paytype&"'")If Not (rs.Eof or rs.Bof) ThenResponse.Write "<script>alert('该类型已存在');this.location.href='add_type.asp';</SCRIPT>"Response.Endrs.clsoeelseSet rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [type] Where (ID is null)"rs.Open Sql,Conn,1,3rs.addNewrs("PayType") = paytypers("date") = now()rs("InOut") = iors("user") = iddrs.Updaters.CloseEnd ifResponse.Write "<script>alert('操作成功');this.location.href='type.asp';</SCRIPT>"end if%><body><script language="JavaScript"><!--function chk(theForm){if (theForm.paytype.value == ""){alert("请输入费用类型!");theForm.paytype.focus();return (false);}}//--></script><table width="100%"><tr><td height="25"></td></tr></table><table width="100%" border="0" align=center cellpadding="5" cellspacing="1" bgcolor="#eeeeee"><form action="" method=post name=form1 onSubmit="return chk(this)"><tr bgcolor=ffffff><td width="40%" align="right">费用类型:</td><td><input name="paytype" type="text" size="30" maxlength="30" /></td></tr><tr bgcolor=ffffff><td width="40%" align="right">所属类型:</div></td><td><select name="io"><option value="1">收入</option><option value="0">支出</option></select><font color=red><-- 请选择</font></td> </tr><tr bgcolor=ffffff><td width="40%" align="right"> </td><td><input type="submit" name="add" value=" 添加" /></td> </tr></form></table></body></html>管理类型模块:<!--#include file="conn.asp"--><!--#include file="heck.asp"--><html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <LINK href="css.css" type=text/css rel=stylesheet /></head><%idd=Request.Cookies("id")If Request.form("type")=" 修改" Thenpaytype = Trim(Request.Form("paytype"))Set rs=Conn.Execute("Select PayType From [type] Where user="&idd&" and PayType='"&paytype&"'")If Not (rs.Eof or rs.Bof) ThenResponse.Write "<script>alert('该类型已存在');this.location.href='javascript:history.back(-1)';</SCRIPT>"Response.Endrs.clsoeelseSet rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [type] Where user="&idd&" and id="&Request("id")&""rs.Open Sql,Conn,1,3rs("PayType") = paytypers.Updaters.CloseEnd ifResponse.Write "<script>alert('操作成功');this.location.href='type.asp';</SCRIPT>"end if%><body><script language="JavaScript"><!--function chk(theForm){if (theForm.paytype.value == ""){alert("请输入费用类型!");theForm.paytype.focus();return (false);}}//--></script><table width="100%"><tr><td height="25"></td></tr></table><table width="100%" border="0" align=center cellpadding="5" cellspacing="1" bgcolor="#eeeeee"><%Set rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [type] Where id="&Request("id")&""rs.Open Sql,Conn,1,1%><form action="" method=post name=form1 onSubmit="return chk(this)"><tr bgcolor=ffffff><td width="40%" align="right">费用类型:</td><td><input name="paytype" type="text" size="30" maxlength="30" value="<%=rs("PayType")%>" /></td></tr><tr bgcolor=ffffff><td width="40%" align="right">添加日期:</div></td><td><%=rs("date")%></td></tr><tr bgcolor=ffffff><td width="40%" align="right">所属类型:</div></td><td><%If rs("InOut")=0 ThenResponse.Write "<font color=""red"">支出</font>"ElseResponse.Write "收入"End if%></td></tr><tr bgcolor=ffffff><td width="40%" align="right"> </td><td><input type="submit" name="type" value=" 修改" /></td></tr></form><%rs.Close%></table></body></html>添加收入、添加支出模块:<!--#include file="conn.asp"--><!--#include file="heck.asp"--><%idd=Request.Cookies("id")InOut = Request("add")If Request.form("add")=" 添加" Thenadddate = Request.Form("adddate")selpayer = Request.Form("selpayer")seltype = Request.Form("seltype")moneys = Trim(Request.Form("moneys"))pjna = Trim(Request.Form("pjna"))if seltype="" thenResponse.Write "<script>alert('请先添加相关费用类型!');location='add_type.asp'</SCRIPT>"Response.Endend ifSet rs = Server.CreateObject("ADODB.RecordSet")Sql = "Select * From [list] Where (ID is null)"rs.Open Sql,Conn,1,3rs.addNewrs("InOut") = InOutrs("PayTypeID") = seltypers("Moneys") = moneysrs("Project") = pjnars("addTime") = adddaters("user") = iddrs.Updaters.CloseResponse.Write "<script>alert('操作成功');this.location.href='pay.asp';</SCRIPT>" End if%><html><head><title></title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><LINK href="css.css" type=text/css rel=stylesheet /></head><body><script language="JavaScript" src="time.js"></SCRIPT><script language=javascript>function CheckForm() {if (document.form1.adddate.value==""){alert("请选择日期");return false;}if (document.form1.moneys.value==""){alert("金额不能为空");document.form1.moneys.focus();return false;}if (document.form1.pjna.value==""){alert("项目名称不能为空");document.form1.pjna.focus();return false;}}</script><table width="100%"><tr><td height="25"></td></tr></table><table width="100%" border="0" align=center cellpadding="4" cellspacing="1" bgcolor="#eeeeee"><form action="" method=post name=form1 onSubmit="return CheckForm()"><tr bgcolor=ffffff><td height=25 colspan=5 align="center" bgcolor="#F9F9F9"><b><%If InOut=1 ThenResponse.Write "<font color=blue>添加收入</font>"ElseResponse.Write "<font color=red>添加支出</font>"End if%> </b></td></tr><tr bgcolor=ffffff><td width="35%" align="right">日期:</div></td><td colspan="4" ><input name="adddate" type="text" size="22" maxlength="22" readonly /><input onClick="popUpCalendar(this, form1.adddate, 'yyyy-mm-dd')" type="button" value="选择日期" /></td></tr><tr bgcolor=ffffff><td align="right">费用类型:</td><td colspan="4"><select name="seltype"><%set rs=server.createobject("adodb.recordset")sql="select * from [type] Where user="&idd&" and InOut="&InOut&""rs.open sql,conn,1,1do while not rs.eofsel="selected"response.write "<option " & sel & " value='"+CStr(rs("ID"))+"' name=seltype>"+rs("PayType")+"</option>"+chr(13)+chr(10)rs.movenextlooprs.close%></select><font color="red"><-- 请选择</font></td></tr><tr bgcolor=ffffff>。