JavaEE课程设计个人账务统计.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateJavaEE课程设计个人账务统计数据库原理及应用软 件 学 院课程设计报告书课程名称 Java EE 与中间件 设计题目 个人账务统计系统 专业班级 软件工程10-04班 学 号 1020010432 姓 名 张小龙 指导教师 刘佳旭 2013年 1 月目 录1 设计时间22 设计目的23设计任务24 设计内容24.1需求分析24.1.1总体目标24.1.2具体目标34.1.3系统数据建模(ER图)44.1.4系统功能建模(数据流程图)44.1.5数据字典54.2总体设计74.3详细设计94.3.1模块详细设计94.3.2流程设计124.4运行与测试134.5主要源代码185 总结与展望24参考文献25成绩评定251 设计时间 2013年1月21日2013年1月24日2 设计目的JavaEE课程设计是对所学JavaEE与中间件课程的小结,是提高学生对所学知识综合应用能力的一种方式,是集中实践性环节之一。要求同学们对课程中所学习到的知识综合运用,开发有一定规模的Java Web程序。3设计任务 个人账务统计系统设计任务: (一)必备功能说明: 功能描述:用户以合法身份登录系统后,才能进行所有操作;用户可以添加、查看和删除账务信息(账务类型(包括支出和收入两种)、数额(人民币)、日期、备注(存储说明信息,如购买了什么东西,或发了工资还是福利津贴等);用户可以统计某个时间段内的支出总货币数目和收入总货币数目。 添加账务信息 查看账务信息 删除账务信息 分别统计某个时间段内的收入和支出总额 (二)开发语言与开发环境: MyEclipse、Java、数据库(sqlserver2000、mysql、oracle等任选一种)4 设计内容4.1需求分析4.1.1总体目标本系统是针对用户要求,使用计算机对自己日常的资金的收入、支出以及相关的各种信息进行记录、修改、添加、删除、统计等操作,并实现对信息进行统计设计的一种现代化个人财务管理软件。经过分析,本系统需要具有以下功能:1)能够实现个人财务管理方面各项功能,能成功的对用户各种信息进行管理。2)实现查询、统计、删除、添加数据方便,数据的稳定性和可靠性好。3)能够实现按日期查询。4)拥有良好的人机交互界面。4.1.2具体目标本系统具有以下几个功能模块:用户登录模块、查看账务信息模块、添加账务信息模块、删除账务信息模块、统计账务信息模块。用户登录模块为用户分配账号密码使得个人的财务信息具有隐私性,收支管理各个模块能有效的管理用户的现金,可以进行添加,查询,删除操作,统计模块使得用户能够查询用户一段时间的收支情况。各个功能模块描述:1) 用户登录模块:系统正常登录,并跳转到主页面。2) 查看账务信息模块:系统正常显示所有存储的信息。3) 添加账务信息模块:系统正常添加所输入的信息。4) 删除账务信息模块:系统正常删除所要删除的项目。5) 统计账务信息模块:系统正常统计所输入的时间段内的收入与支出账务。对于个人财务管理系统,我们要求软件满足用户对个人财务的隐私性管理,确保在用户以外的其他人使用软件对其信息进行操作,所以要采用用户注册和登录制度,确保用户对自己财务信息的隐私管理。性能需求:稳定性:本系统为财务管理系统,多为查询、修改、删除、添加数据等操作,要求数据的稳定性好。可靠性:用户财务数据多比较重要,要求系统具有数据备份,数据恢复等性能。安全性:系统设计个人银行账号以及密码的保存,要求系统提供加密保存等安全措施,即要求系统有较高的安全性能。4.1.3系统数据建模(ER图)图4-1 系统ER图4.1.4系统功能建模(数据流程图)简称DFD,它用来描述目标系统的逻辑结构,它是由实体部分,处理部分,数据存储部分和数据流四部分组成。图4-2 顶层数据流程图图4-3 一层数据流程图4.1.5数据字典数据字典是对数据流图的解释和说明,包含的内容如下:数据元素: 表4-1 数据元素表 数据元素名 类型 长度 说明用户名 字符型 50 用户登录的名字 密码 字符型 50 用户登录的密码 ID 整形 8 账务的编号 日期 日期型 8 账务的记录日期 类型 字符型 50 账务的类型,分为收入与支出 数额 双精度浮点数 8 账务的金额,单位元 备注 字符型 50 账务的相关备注信息数据流:表4-2 数据流表 数据流名 来源 去向 简述用户信息 用户 用户信息表 用户个人基本信息账务信息 用户 账务信息表 用户账务相关信息数据存储:表4-3 数据存储表 数据存储名 简述 组成 用户信息表 用户登录的用户名和密码 用户名+密码 账务信息表 用户的账务信息 ID+日期+类型+数额+备注4.2总体设计 一、系统层次图个人账务统计系统统计账务信息模块删除账务信息模块账务管理添加账务信息模块查看账务信息模块用户登录模块用户登录图4-4 系统层次图 二、数据库设计本系统包含两个数据库表,分别是t_user 和ConsumeRecord。下面是两个数据库表的设计和录入内容的截图:1) t_user表图4-5 t_user设计截图图4-6 t_user 数据录入截图2) ConsumeRecord表图4-7 ConsumeRecord设计截图图4-8 ConsumeRecord数据录入截图4.3详细设计4.3.1模块详细设计本系统具有以下几个功能模块:用户登录模块、查看账务信息模块、添加账务信息模块、删除账务信息模块、统计账务信息模块。用户登录模块为用户分配账号密码使得个人的财务信息具有隐私性,收支管理各个模块能有效的管理用户的现金,可以进行添加,查询,删除操作,统计模块使得用户能够查询用户一段时间的收支情况。1) 用户登录模块流程图: 开始登陆成功并跳转结束输入用户名输入密码匹配?YN图4-9用户登录模块流程图2)查看账务信息模块流程图:开始结束点击用户账务信息管理点击查看账务信息图4-10查看账务信息模块流程图3)添加账务信息模块流程图: 开始结束点击添加账务信息添加信息点击添加按钮继续?YN图4-11添加账务信息模块流程图4)删除账务信息模块流程图:开始结束点击删除账务信息输入要删除信息的ID点击删除按钮继续?YN图4-12删除账务信息模块流程图5)统计账务信息模块流程图:开始结束点击统计账务信息输入开始和截止时间点击统计按钮继续?YN 图4-13统计账务信息模块流程图4.3.2流程设计本系统采用struts2框架,用到了和数据库有关的最基本的方法定义,包括增、删、改、查等。主要Action类与页面的设计如下:1)类和方法的说明:表4-4 类和方法的相关说明 包名 类名/方法名 功能说明 action LifeAction.java 包含所有action action login() 用户登录的方法 action searchRecord( ) 查看账务信息的方法 action addRecord ( ) 添加账务信息的方法 action delectRecord( ) 删除账务信息的方法 action calrecord( ) 统计账务信息的方法 dao LifeDAO.java 与数据库的交互 domain ConsumeRecord.java 定义数据库表的建立 domain User.java 定义数据库表的建立 service LifeService.java 面向接口的中间层次的服务类 util DBConnection.java java中工具辅助层2)MVC架构Jsp页面actionserviceDAO图4-14 MVC架构图3)页面设计的说明:表4-5 页面设计表 页面名 功能说明 login.jsp 用户登录页面 main.jsp 系统主页面 left.jsp 主页面左边部分 top.jsp 主页面顶部设计 index.jsp 主页面布局 searchRecord.jsp 查看账务信息页面 addRecord.jsp 添加账务信息页面 delectRecord.jsp 删除账务信息页面 calRecord.jsp 输入查询时间段前的统计页面 calculator,jsp 计算收入与支出之后的统计页面4.4运行与测试 一、运行1)用户登录:图4-15登录页面login.jsp2)登录成功后的主页面:图4-16 登录成功后的主页面3)查看账务信息页面:图4-17查看账务信息页面4)添加账务信息页面:图4-18 添加信息前的添加页面图4-19 添加成功后的页面5)删除账务信息页面:图4-20 删除前的删除页面图4-21 删除成功后的删除页面6)统计账务信息页面:图4-22 输入统计时间段前的统计页面图4-23 成功计算收入与支出后的统计页面二、测试此处采用的是黑盒测试法,及主要测试系统的每个功能是否能正确运作。以下为接受测试的各个功能模块描述:1) 用户登录模块:系统能否正常登录,并跳转到主页面。2) 查看账务信息模块:系统能否正常显示所有存储的信息。3) 添加账务信息模块:系统能否正常添加所输入的信息。4) 删除账务信息模块:系统能否正常删除所要删除的项目。5) 统计账务信息模块:系统能否正常统计所输入的时间段内的收入与支出账务。4.5主要源代码1action:package action;/省略了变量定义以及set、get方法public String login() user.setName(name); user.setPassword(password); LifeService lifeService=new LifeService(); if(lifeService.checkUser(user)=true) return "success" else return "failure"public String searchRecord()LifeService lifeService=new LifeService();List list=lifeService.getRecord();ActionContext act=ActionContext.getContext();Map request=(Map)act.get("request");request.put("searchrecord", list);return "searchRecord"public String addRecord()ConsumeRecord consumeRecord=new ConsumeRecord();consumeRecord.setExtre(extre1);consumeRecord.setCostclass(costclass1);consumeRecord.setDate(date1);consumeRecord.setMoney(money1);LifeService lifeService=new LifeService();lifeService.getAddRecord( consumeRecord);List list=lifeService.getRecord();ActionContext act=ActionContext.getContext();Map request=(Map)act.get("request");request.put("searchrecord", list);return "addRecords"public String delectRecord()ConsumeRecord consumeRecord=new ConsumeRecord();consumeRecord.setId(id);LifeService lifeService=new LifeService();lifeService.getDeleteRecord(consumeRecord);List list=lifeService.getRecord();ActionContext act=ActionContext.getContext();Map request=(Map)act.get("request");request.put("searchrecord", list);return "delectRecords"public String calRecord()LifeService lifeService=new LifeService();ConsumeRecord consumeRecord=new ConsumeRecord();List list=lifeService.getcalRecord(consumeRecord);List l=lifeService.getRecord();float cost=0,earn=0;for(Iterator it=list.iterator();it.hasNext(); )ConsumeRecord cos=(ConsumeRecord)it.next();if(cos.getDate().getTime()>=stadate.getTime()&cos.getDate().getTime()<=enddate.getTime()if(cos.getCostclass().equals("支出")cost+=cos.getMoney();elseearn+=cos.getMoney();ActionContext act=ActionContext.getContext();Map request=(Map)act.get("request");request.put("cost", cost);request.put("earn", earn);request.put("searchrecord", l);return "calRecords"2.struts.xml<?xml version="1.0" encoding="GBK"?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "http:/struts.apache.org/dtds/struts-2.0.dtd"><struts><!- 处理中文乱码 -><constant name="struts.i18n.encoding" value="gbk"></constant><package name="com" extends="struts-default"><!- 此处的class属性值不是实际的类 -> <action name="login" class="action.LifeAction" method="login"><result name="success">/index.jsp</result><result name="failure">/login.jsp</result></action><action name="searchRecord" class="action.LifeAction" method="searchRecord"><result name="searchRecord">/searchRecord.jsp</result></action><action name="addRecord" class="action.LifeAction" method="searchRecord"><result name="searchRecord">/addRecord.jsp</result></action><action name="delectRecord" class="action.LifeAction" method="searchRecord"><result name="searchRecord">/delectRecord.jsp</result></action><action name="calRecord" class="action.LifeAction" method="searchRecord"><result name="searchRecord">/calRecord.jsp</result></action><action name="add" class="action.LifeAction" method="addRecord"><result name="addRecords">/addRecord.jsp</result></action><action name="delect" class="action.LifeAction" method="delectRecord"><result name="delectRecords">/delectRecord.jsp</result></action><action name="calculator" class="action.LifeAction" method="calRecord"><result name="calRecords">/calculator.jsp</result></action></package>3.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http:/www.w3.org/2001/XMLSchema-instance" xmlns=" xmlns:web=" xsi:schemaLocation=" version="2.5"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>4.addRecord.jsp<body> <s:form action="add"> <table border="1"> <tr><th>ID</th><th>类型</th><th>数额(单位:元)</th><th>日期</th><th>备注</th> </tr> <s:iterator value="#request.searchrecord"> <tr> <td><s:property value="id"></s:property></td> <td><s:property value="costclass"></s:property></td> <td><s:property value="money"></s:property></td> <td><s:property value="date"></s:property></td> <td><s:property value="extre"></s:property></td> </tr> </s:iterator> </table> <table> <%- <s:radio list="#'1':'收入','2':'支出'" label="类型" name="costclass1" listKey="value" value='1'></s:radio>-%> <tr><td>类型</td><td><s:select list="'收入','支出'" name="costclass1" value="收入"></s:select></td></tr> <tr><td>数额(单位:元)</td><td><s:textfield name="money1"/></td></tr> <tr><td>日期</td><td><s:textfield name="date1"/></td></tr> <tr><td>备注</td><td><s:textfield name="extre1"/></td></tr> <s:submit value="添加"/> </table></s:form></body>5.calculator.jsp<body> <s:form action="calculator"> <table border="1"> <tr><th>ID</th><th>类型</th><th>数额(单位:元)</th><th>日期</th><th>备注</th></tr> <s:iterator value="#request.searchrecord"> <tr> <td><s:property value="id"></s:property></td> <td><s:property value="costclass"></s:property></td> <td><s:property value="money"></s:property></td> <td><s:property value="date"></s:property></td> <td><s:property value="extre"></s:property></td> </tr> </s:iterator> </table> <p>统计一段时间的收入支出情况:</p> <table> <tr><td>开始日期</td><td><s:textfield name="stadate"/></td></tr> <tr><td>结束日期</td><td><s:textfield name="enddate"/></td></tr> <s:submit value="统计"/> <tr><td>总支出为:</td><td><s:property value="#request.cost"/></td></tr> <tr><td>总收入为:</td><td><s:property value="#request.earn"/></td></tr> </table></s:form></body>5 总结与展望通过这次的课程设计,首先,认识到自己对于专业知识掌握的不足,以及对所用开发工具运用的不熟,这使我完成这个课程设计的程序比较费劲,在同学的多次帮助下才完成。本次试验使用了struts2,使我对它有了一个新的理解,更加熟练的运用。任何系统都应该以用户需求为最终目标,以方便用户为最高原则,同进要融入先进的管理经验与技巧。尽可能降低使用前的培训、实施和使用中的维护时间。力求满足现在及未来的各种需求,真正为管理及决策提供强有力的支持。不论在软件设计还是硬件制造中,稳定都是压倒一切的。本管理系统通过选用先进的开发软件,成熟的网络结构及安全可靠的数据库,再配合硬件的优化选型,从而保证系统的可靠性与容错性。同时用户可自行灵活设置参数和各种代码,适应自己的特殊需要。总体而言,本次课程设计使我对java EE的各个知识点以及知识体系有了更深的了解,深刻了解了软件生命周期的各个时期以及阶段。对struts2也有了更好认识,并且能够很好使用。平时应该多看,多看一些好的程序借鉴其思路和程序框架;多写,学习程序设计很重要的就是要自己亲自动手写代码,切忌犯要高手低的弊病,而且这样记忆非常深刻;多想,程序调试中出现一些“莫名其妙”的问题,为什么是这样而不是那样。通过实践,对知识与实践结合有了更多认识,相信这也仅仅是一个开始,今后我会更多更好的完成相关问题。参考文献1 王永贵,冯永安,郭伟,焦学理,Java高级框架应用开发案例教程,清华大学出版社 2 郑人杰,马素霞,麻志毅,软件工程,第三版,人民邮电出版社3 王珊,萨师煊.数据库系统概论,第四版,高等教育出版社4 郭有强,面向对象程序设计,清华大学出版社成绩评定成绩 教师签字-