课程设计--家庭财务管理系统

记得第一次接触FLEX3是在毕业那一年,那时已经工作了大半年了,时隔两年多,终于有机会拿来露一手了,虽然只是当做课程设计来交付作业,但总算比以往有所突破吧。
先上截图:
[img]http://dl.iteye.com/upload/attachment/0066/5781/64e0cbac-2f87-3fd2-954b-511ba649b10a.png[/img]

事先声明下这个仅是课程设计,供各位过客参观学习。

进入正题,大家一看就知道前端是Flash,采用Flex3开发的,后端采用java做应用服务器(spring架构),至于Flex3和服务端的通信采用了BlazedDS。

用户:demo
密码 :111111
DEMO:[url]http://dyml.v108.10000net.cn/family_financial/financial/index.html[/url](服务器不给力,速度很差劲,估计BlazedDS的通信效率也不高吧)

桌面版本下载:[url]http://dyml.v108.10000net.cn/family_financial/download.jsp[/url]

家庭财务管理系统主要分为三个模块:
财务分析:主要分析从今年01月01日开始的家庭收入、支出情况,按照月份进行统计,从图表中可以很容易看出每个月的收支是否平衡。
收入:对家庭成员的收入进行管理分析,记录每位家庭成员的收入情况,以及家庭成员占家庭财务收入的比重分析。
支出:分析每位家庭成员的开销情况,以及按照分类显示当前的开销分析图表。

贴上Flex端部分源码:


<?xml version="1.0" encoding="utf-8"?>
<!-- Simple example to demonstrate the Application container. -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
backgroundGradientColors="[0xCCCCCC, 0x66CCFF]"
backgroundColor="0xCCCCCC"
horizontalAlign="center" verticalAlign="center"
xmlns:module="module.*"
initialize="init()"
minWidth="800" minHeight="620"
>

<mx:Script>
<![CDATA[
import mx.events.CloseEvent;
import com.adobe.serialization.json.JSON;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.events.ResultEvent;
import flash.net.navigateToURL;
import module.form.LoginForm;
import mx.events.FlexEvent;
import mx.managers.PopUpManager;
import module.form.SettingForm;
import mx.controls.Alert;

public var curentVersion : String = "1.2";
public var downloadUrl :String = "/family_financial/download.jsp";

public function init():void{
//Alert.show((Session.getSession("userInfo")==null).toString());

if(Session.getSession("server_url") == null || Session.getSession("server_url").toString() == ""){
//设置服务器地址
Session.setSession("server_url", "http://dyml.v108.10000net.cn");
}

openLoginForm();
}

public function destory():void{
Session.clearSession("userInfo");

}

private function addCallback(evt:Event):void{
if(Session.getSession("userInfo") != null && Session.getSession("userInfo").userId != ""){
Session.setSession("_userId",Session.getSession("userInfo").userId);
cwfx.init();
checkVersion();

}
}


// Event handler function for displaying the selected Alert button.
private function alertClickHandler(event:CloseEvent):void {
if (event.detail==Alert.YES){
//打开下载页面
var url:URLRequest = new URLRequest(Session.getSession("server_url").toString() + downloadUrl);
navigateToURL(url, "_blank");
}
}
private function checkVersion():void{
var remote:RemoteObject = CustomRemoteObject.getRemogeObject("versionService");

//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,function(evt:ResultEvent):void{
var object:Object = (JSON.decode(evt.result.toString()) as Object);
if(object.success){
if(object.object != null){
downloadUrl = object.object;
}
Alert.show(object.msg, "更新提示", Alert.YES|Alert.NO, null, alertClickHandler);
}
});

//调用J2EE端类中的方法
remote.checkVersion(curentVersion);

}

private function openLoginForm():void{
var form:LoginForm = LoginForm(PopUpManager.createPopUp(this, LoginForm , true));
PopUpManager.centerPopUp(form);
if(Session.getSession("_userId") != null && Session.getSession("_userId") != ""){
form.username.text = Session.getSession("_userId").toString();
}
form.addEventListener(FlexEvent.REMOVE, addCallback);
}


private function openBlog(event:Event):void {
var url:URLRequest = new URLRequest("http://lym6520.iteye.com");
navigateToURL(url, "_blank");

}
]]>
</mx:Script>
<mx:Style>
Label{
paddingTop:-18px;
}
</mx:Style>
<mx:Label text="家庭财务管理系统" width="100%" height="10"
fontSize="18" color="#D1FC09" fontWeight="bold" enabled="true" alpha="0.9" >
</mx:Label>

<mx:ApplicationControlBar dock="false" width="100%">
<mx:Button label="财务分析" click="containerViewStack.selectedChild=cwfx;"/>
<mx:Button label="成员管理" click="containerViewStack.selectedChild=cygl;"/>
<mx:Button label="收 入" click="containerViewStack.selectedChild=sr;"/>
<mx:Button label="支 出" click="containerViewStack.selectedChild=zc;"/>
</mx:ApplicationControlBar>



<mx:ViewStack id="containerViewStack" borderStyle="solid" width="100%" height="100%">
<module:analyze id="cwfx" title="家庭财务分析" >

</module:analyze>
<module:memberMgr id="cygl" title="家庭成员管理" >
</module:memberMgr>

<module:income id="sr" title="家庭收入" >
</module:income>

<module:expend id="zc" title="家庭支出">
</module:expend>

</mx:ViewStack>

<mx:HBox paddingTop="5">
<mx:LinkButton label="Copyright © 2012脉兜课程设计" color="blue" click="openBlog(event);"/>
</mx:HBox>

</mx:Application>



<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="100%" height="100%"
xmlns:chart="module.chart.*" initialize="init();" xmlns:form="module.form.*">

<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import com.adobe.utils.IntUtil;
import mx.events.ScrollEvent;
import com.adobe.utils.DateUtil;
import mx.formatters.DateFormatter;
import module.form.IncomeForm;
import mx.events.CloseEvent;
import mx.core.Application;
import mx.events.FlexEvent;
import mx.managers.PopUpManager;
import mx.collections.ArrayCollection;
import com.adobe.serialization.json.JSON;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
var beforePage:int = 0;
public function init():void{
var remote:RemoteObject = CustomRemoteObject.getRemogeObject("incomeService");
var pageSize : Number = 12;
//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,
function(evt:ResultEvent):void{
var object:Object = (JSON.decode(evt.result.toString()) as Object);

if(object.success){
var arr:Array = (object.object.objectList as Array);
var dp:ArrayCollection = new ArrayCollection();
var totalPage : int = (object.object.total as int)/pageSize ;

if((object.object.total % pageSize) > 0){
pageBar.maxScrollPosition = totalPage;
}else{
pageBar.maxScrollPosition = totalPage -1 ;
}

if(object.object.total <= pageSize){
pageBar.setVisible(false);
pageBarSpacer.width = -30;
}else{
pageBar.setVisible(true);
pageBarSpacer.width = -20;
}

for(var i = 0, len=arr.length; i < len; i++){
var bean:Object = new Object();
bean.id = arr[i]["id"];
bean.jtcy = arr[i]["cyid"];
bean.cyname = arr[i]["cyname"];
bean.lb = arr[i]["lb"];
bean.lbname = arr[i]["lbname"];
bean.je = arr[i]["je"];
bean.sm = arr[i]["sm"];
bean.sj = arr[i]["sj"];
bean.bcsj = arr[i]["bcsj"];
dp.addItem(bean);
}

dataGrid.dataProvider = dp;
}else{
Alert.show(object.msg);
}
}
);

var str_startDate : String = startDate.text;
var str_endDate :String = endDate.text;
var date:Date = new Date();
var df : DateFormatter = new DateFormatter();

if(str_startDate == ""){
df.formatString = "YYYY";
str_startDate = df.format(date) + "-01-01";
startDate.text = str_startDate;
}
if(endDate.text == ""){
df.formatString = "YYYY-MM-DD";
str_endDate = df.format(date);
endDate.text = str_endDate;
}

var param:Object = new Object();
param.userId = Session.getSession("userInfo").userId;
param.startDate = str_startDate;
param.endDate = str_endDate;
param.pageSize = pageSize.toString();
param.pageNumber = (pageBar.maxScrollPosition >= pageBar.scrollPosition ? pageBar.scrollPosition +1 : pageBar.maxScrollPosition).toString();

beforePage = param.pageNumber;
//调用J2EE端类中的方法
remote.list(param);
incomePieChart.str_startDate = str_startDate;
incomePieChart.str_endDate = str_endDate;
incomePieChart.init();

}

private function pageScroll(event:ScrollEvent):void {
//event.currentTarget.scrollPosition ;
//event.currentTarget.maxScrollPosition;
if(beforePage != (event.currentTarget.scrollPosition+1)){
init();
}
}

private function addCallback(evt:Event):void{
init();
}

private function showAddFormWindow():void {
var date:Date = new Date();
var df : DateFormatter = new DateFormatter();
df.formatString = "YYYY-MM-DD";

var form:IncomeForm = IncomeForm(PopUpManager.createPopUp(this, IncomeForm , true));
form.rq.text = df.format(date);
PopUpManager.centerPopUp(form);
form.addEventListener(FlexEvent.REMOVE, addCallback);
}

private function showModifyFormWindow():void {
if(dataGrid.selectedItem != null){

var form:IncomeForm = IncomeForm(PopUpManager.createPopUp(this, IncomeForm , true));
PopUpManager.centerPopUp(form);
form.addEventListener(FlexEvent.REMOVE, addCallback);
form.fid.text = dataGrid.selectedItem.id;
form.je.text = dataGrid.selectedItem.je;
form.rq.text = dataGrid.selectedItem.sj;
form.sm.text = dataGrid.selectedItem.sm;
form.addBtn.visible = false;
var xmList1 : ArrayCollection = (form.lb.dataProvider as ArrayCollection);
for(var i=0, len=xmList1.length; i < len; i++){
if(xmList1[i].data == dataGrid.selectedItem.lb){
form.lb.selectedIndex = i;
break;
}
}

var xmList2 : ArrayCollection = (form.xm.dataProvider as ArrayCollection);
for(var i=0, len=xmList2.length; i < len; i++){
if(xmList2[i].data == dataGrid.selectedItem.jtcy){
form.xm.selectedIndex = i;
break;
}
}

}else{
Alert.show("请选中一条记录!");
}
}

private function deleteItemConfirm(event:Event):void {
if(dataGrid.selectedItem != null){
Alert.show("是否确认删除当前选中记录?", "删除提示", 3, this, deleteItem);
}else{
Alert.show("请选中一条记录!");
}
}
private function deleteItem(event:CloseEvent):void {
if (event.detail==Alert.YES){

var remote:RemoteObject = CustomRemoteObject.getRemogeObject("incomeService");

//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,
function(evt:ResultEvent):void{
var object:Object = (JSON.decode(evt.result.toString()) as Object);

if(object.success){
init();
}else{
Alert.show(object.msg);
}
}
);

var object: Object = new Object();
object.id = dataGrid.selectedItem.id;
object.userId = Session.getSession("userInfo").userId;
//调用J2EE端类中的方法
remote.deleteItem(object);
}
}

private function doubleClick(event: ListEvent):void{
showModifyFormWindow();
}

]]>
</mx:Script>

<mx:ApplicationControlBar dock="true" width="100%" alpha="1.0"
fillAlphas="[1.0, 0.0]"
fillColors="[#F7F7F1, #C7E6F6]" themeColor="#D8ECF8" cornerRadius="0">
<mx:Button label="添加" click="showAddFormWindow()"/>
<mx:Button label="修改" click="showModifyFormWindow()"/>
<mx:Button label="删除" click="deleteItemConfirm(event);"/>
</mx:ApplicationControlBar>

<mx:HBox width="80%" paddingTop="5">
<mx:Spacer width="10"/>
<form:MyDateField id="startDate" yearNavigationEnabled="true" width="200" formatString="YYYY-MM-DD"/>
<form:MyDateField id="endDate" yearNavigationEnabled="true" width="200" formatString="YYYY-MM-DD"/>
<mx:Button label="确 定" click="init();"/>
</mx:HBox>
<mx:HBox width="100%" height="85%" paddingLeft="5" paddingRight="5">
<mx:DataGrid id="dataGrid" width="100%" height="100%" verticalScrollPolicy="off" doubleClickEnabled="true" itemDoubleClick="doubleClick(event);">
<mx:columns>
<mx:DataGridColumn dataField="id" visible="false"/>
<mx:DataGridColumn dataField="jtcy" visible="false"/>
<mx:DataGridColumn dataField="cyname" headerText="家庭成员"/>
<mx:DataGridColumn dataField="lb" visible="false"/>
<mx:DataGridColumn dataField="lbname" headerText="类别"/>
<mx:DataGridColumn dataField="je" headerText="金额"/>
<mx:DataGridColumn dataField="sm" headerText="说明"/>
<mx:DataGridColumn dataField="sj" headerText="收入日期"/>
<mx:DataGridColumn dataField="bcsj" headerText="保存时间"/>
</mx:columns>
</mx:DataGrid>
<mx:Spacer id="pageBarSpacer" width="-30"/>
<mx:VScrollBar id="pageBar" height="100%" visible="false"
minScrollPosition="0" maxScrollPosition="1"
lineScrollSize="1" pageScrollSize="1"
repeatDelay="1000" repeatInterval="500" scroll="pageScroll(event);"/>
<chart:IncomePieChart id="incomePieChart" title="收入比重分析" width="350" height="300"/>
</mx:HBox>
</mx:Panel>




<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="100%" height="100%"
initialize="init();" xmlns:chart="module.chart.*" xmlns:form="module.form.*">

<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import mx.events.ScrollEvent;
import com.adobe.utils.DateUtil;
import mx.formatters.DateFormatter;
import module.form.ExpendForm;
import mx.events.CloseEvent;
import mx.core.Application;
import mx.events.FlexEvent;
import mx.managers.PopUpManager;
import mx.collections.ArrayCollection;
import com.adobe.serialization.json.JSON;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public var beforePage:int = 0;

public function init():void{
var remote:RemoteObject = CustomRemoteObject.getRemogeObject("expendService");
var pageSize : Number = 12;
//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,
function(evt:ResultEvent):void{
var object:Object = (JSON.decode(evt.result.toString()) as Object);

if(object.success){
var arr:Array = (object.object.objectList as Array);
var dp:ArrayCollection = new ArrayCollection();
var totalPage : int = (object.object.total as int)/pageSize ;

if((object.object.total % pageSize) > 0){
pageBar.maxScrollPosition = totalPage;
}else{
pageBar.maxScrollPosition = totalPage -1 ;
}

if(object.object.total <= pageSize){
pageBar.setVisible(false);
pageBarSpacer.width = -30;
}else{
pageBar.setVisible(true);
pageBarSpacer.width = -20;
}

for(var i = 0, len=arr.length; i < len; i++){
var bean:Object = new Object();
bean.id = arr[i]["id"];
bean.jtcy = arr[i]["cyid"];
bean.cyname = arr[i]["cyname"];
bean.lb = arr[i]["lb"];
bean.lbname = arr[i]["lbname"];
bean.je = arr[i]["je"];
bean.sm = arr[i]["sm"];
bean.sj = arr[i]["sj"];
bean.bcsj = arr[i]["bcsj"];
dp.addItem(bean);
}

dataGrid.dataProvider = dp;
}else{
Alert.show(object.msg);
}
}
);

var str_startDate : String = startDate.text;
var str_endDate :String = endDate.text;
var date:Date = new Date();
var df : DateFormatter = new DateFormatter();

if(str_startDate == ""){
df.formatString = "YYYY";
str_startDate = df.format(date) + "-01-01";
startDate.text = str_startDate;
}
if(endDate.text == ""){
df.formatString = "YYYY-MM-DD";
str_endDate = df.format(date);
endDate.text = str_endDate;
}
var param:Object = new Object();
param.userId = Session.getSession("userInfo").userId;
param.startDate = str_startDate;
param.endDate = str_endDate;
param.pageSize = pageSize.toString();
param.pageNumber = (pageBar.maxScrollPosition >= pageBar.scrollPosition ? pageBar.scrollPosition +1 : pageBar.maxScrollPosition).toString();


beforePage = param.pageNumber;
//调用J2EE端类中的方法
remote.list(param);

expendBarChart.str_startDate = str_startDate;
expendBarChart.str_endDate = str_endDate;
expendBarChart.init();

}

private function pageScroll(event:ScrollEvent):void {
if(beforePage != (event.currentTarget.scrollPosition+1)){
init();
}
}

private function addCallback(evt:Event):void{
init();
}

private function showAddFormWindow():void {
var date:Date = new Date();
var df : DateFormatter = new DateFormatter();
df.formatString = "YYYY-MM-DD";
var form:ExpendForm = ExpendForm(PopUpManager.createPopUp(this, ExpendForm , true));
form.rq.text = df.format(date);
PopUpManager.centerPopUp(form);
form.addEventListener(FlexEvent.REMOVE, addCallback);
}

private function showModifyFormWindow():void {
if(dataGrid.selectedItem != null){

var form:ExpendForm = ExpendForm(PopUpManager.createPopUp(this, ExpendForm , true));
PopUpManager.centerPopUp(form);
form.addEventListener(FlexEvent.REMOVE, addCallback);
form.fid.text = dataGrid.selectedItem.id;
form.je.text = dataGrid.selectedItem.je;
form.rq.text = dataGrid.selectedItem.sj;
form.sm.text = dataGrid.selectedItem.sm;
form.addBtn.visible = false;
var xmList1 : ArrayCollection = (form.lb.dataProvider as ArrayCollection);
for(var i=0, len=xmList1.length; i < len; i++){
if(xmList1[i].data == dataGrid.selectedItem.lb){
form.lb.selectedIndex = i;
break;
}
}

var xmList2 : ArrayCollection = (form.xm.dataProvider as ArrayCollection);
for(var i=0, len=xmList2.length; i < len; i++){
if(xmList2[i].data == dataGrid.selectedItem.jtcy){
form.xm.selectedIndex = i;
break;
}
}

}else{
Alert.show("请选中一条记录!");
}
}

private function deleteItemConfirm(event:Event):void {
if(dataGrid.selectedItem != null){
Alert.show("是否确认删除当前选中记录?", "删除提示", 3, this, deleteItem);
}else{
Alert.show("请选中一条记录!");
}
}
private function deleteItem(event:CloseEvent):void {
if (event.detail==Alert.YES){

var remote:RemoteObject = CustomRemoteObject.getRemogeObject("expendService");

//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,
function(evt:ResultEvent):void{
var object:Object = (JSON.decode(evt.result.toString()) as Object);

if(object.success){
init();
}else{
Alert.show(object.msg);
}
}
);

var object: Object = new Object();
object.id = dataGrid.selectedItem.id;
object.userId = Session.getSession("userInfo").userId;
//调用J2EE端类中的方法
remote.deleteItem(object);
}
}

private function doubleClick(event: ListEvent):void{
showModifyFormWindow();
}
]]>
</mx:Script>

<mx:ApplicationControlBar dock="true" width="100%" alpha="1.0"
fillAlphas="[1.0, 0.0]"
fillColors="[#F7F7F1, #C7E6F6]" themeColor="#D8ECF8" cornerRadius="0">
<mx:Button label="添加" click="showAddFormWindow()"/>
<mx:Button label="修改" click="showModifyFormWindow()"/>
<mx:Button label="删除" click="deleteItemConfirm(event);"/>
</mx:ApplicationControlBar>

<mx:HBox width="80%" paddingTop="5">
<mx:Spacer width="10"/>
<form:MyDateField id="startDate" yearNavigationEnabled="true" width="200" formatString="YYYY-MM-DD"/>
<form:MyDateField id="endDate" yearNavigationEnabled="true" width="200" formatString="YYYY-MM-DD"/>
<mx:Button label="确 定" click="init();"/>
</mx:HBox>

<mx:HBox width="100%" height="85%" paddingLeft="5" paddingRight="5">
<mx:DataGrid id="dataGrid" width="100%" height="100%" verticalScrollPolicy="off" doubleClickEnabled="true" itemDoubleClick="doubleClick(event);">
<mx:columns>
<mx:DataGridColumn dataField="id" visible="false"/>
<mx:DataGridColumn dataField="jtcy" visible="false"/>
<mx:DataGridColumn dataField="cyname" headerText="家庭成员"/>
<mx:DataGridColumn dataField="lb" visible="false"/>
<mx:DataGridColumn dataField="lbname" headerText="类别"/>
<mx:DataGridColumn dataField="je" headerText="金额"/>
<mx:DataGridColumn dataField="sm" headerText="说明"/>
<mx:DataGridColumn dataField="sj" headerText="支出日期"/>
<mx:DataGridColumn dataField="bcsj" headerText="保存时间"/>
</mx:columns>
</mx:DataGrid>
<mx:Spacer id="pageBarSpacer" width="-30"/>
<mx:VScrollBar id="pageBar" height="100%" visible="false"
minScrollPosition="0" maxScrollPosition="1"
lineScrollSize="1" pageScrollSize="1"
repeatDelay="1000" repeatInterval="500" scroll="pageScroll(event);"/>
<chart:ExpendBarChart id="expendBarChart" title="支出分析" width="350" height="100%"/>
</mx:HBox>
</mx:Panel>




<?xml version="1.0" encoding="utf-8"?>

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"
title="登入" >

<mx:Script>
<![CDATA[
import mx.events.ValidationResultEvent;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.controls.Alert;
import com.adobe.serialization.json.JSON;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;

// Event handler for the OK button.
private function submit():void {

if(username_validator.validate().type == ValidationResultEvent.INVALID){
return;
}
if(password_validator.validate().type == ValidationResultEvent.INVALID){
return;
}

var remote:RemoteObject = CustomRemoteObject.getRemogeObject("loginService");

//监听调用成功事件
remote.addEventListener(ResultEvent.RESULT,result);

var objectBean:Object = new Object();
objectBean.userId = username.text;
objectBean.password = password.text;
//调用J2EE端类中的方法
remote.login(objectBean);


}

private function result(evt:ResultEvent):void{

var object:Object = (JSON.decode(evt.result.toString()) as Object);

if(object.success){
var object2 : Object = new Object();
object2.userId = object.object.yhm;
object2.name = object.object.mc;
Session.setSession("userInfo",object2);
PopUpManager.removePopUp(this);
}else{
Alert.show(object.msg);
}

}

private function openSettingForm():void{
var form:SettingForm = SettingForm(PopUpManager.createPopUp(this, SettingForm , true));
form.url.text = Session.getSession("server_url").toString();
PopUpManager.centerPopUp(form);
}
]]>
</mx:Script>

<mx:Form width="100%" height="100%">

<mx:FormItem label="用户名:">
<mx:TextInput id="username" width="200"/>
</mx:FormItem>

<mx:FormItem label="密 码:">
<mx:TextInput id="password" displayAsPassword="true" width="200"/>
</mx:FormItem>
</mx:Form>

<mx:HBox width="100%" horizontalAlign="right" paddingRight="10" paddingBottom="10">
<mx:TextInput id="fid" visible="false" text=""/>
<mx:Button label="登入" click="submit();"/>
<!--
<mx:Button label="网络设置" click="openSettingForm();" fillAlphas="[1.0, 1.0]" fillColors="[#AAA5A5, #D4C9C9, #DFC3C3, #F7DDDD]"/>
-->
</mx:HBox>
<mx:StringValidator id="username_validator" source="{username}" property="text" minLength="4" requiredFieldError="不能放空。"/>
<mx:StringValidator id="password_validator" source="{password}" property="text" minLength="6" requiredFieldError="不能放空。"/>
</mx:TitleWindow>

家庭理财管理系统课程设计 目 录 1 项目概述 1 1.1 系统概述 1 1.2 项目目标 1 1.3 项目范围 1 1.4 业务流程图 2 1.5 现系统存在的问题及薄弱环节分析 2 2问题定义 3 3 可行性研究 3 4 需求分析 4 4.1 总体目标 4 4.2 具体目标 5 4.3 系统功能建模 5 4.3.1 系统数据流程图 5 4.3.2 数据字典 7 4.4 系统数据模型 9 5概要设计 11 5.1 总体系结构设计 11 5.2 接口设计 12 5.2.1外部接口 12 5.2.2 内部接口 12 5.3 代码设计 12 5.3.1 代码设计 12 5.4 数据库设计 12 5.4.1关系模式设计 12 5.4.2 数据字典 13 5.5 家庭理财系统输入、输出设计 15 5.5.1 输入设计 15 5.5.2 输出设计 15 输出内容输出到各个对应数据窗口。 15 5.6运行设计 15 5.6.1运行环境 15 5.6.3 运行控制 16 5.6.4运行时间 16 5.7出错处理设计 16 5.7.1出错输出信息 16 5.7.2出错处理对策 16 5.8安全保密设计 16 5.8.1登录用户的安全性 16 5.9维护设计 16 6 详细设计 17 6.1 登陆模块 17 6.1.1 模块定义 17 6.1.2 算法 17 6.1.3 算法描述 17 6.2 存储查询模块 18 6.2.1 模块定义 18 6.2.2 算法 18 6.2.3 算法描述 18 6.3 界面设计 18 6.3.1 登录窗口界面 18 6.3.2 系统登窗口主界面 18 6.3.3"正常收入"窗口界面 19 6.3.4"正常支出"窗口界面 19 7 编码 20 7.1概述开发工具及编程脚本 20 7.2编码设计 20 7.2.1主函数模块 20 7.2.2数据连接读取模块 23 7.2.3登陆模块 24 8课程设计小结 26 9参考文献 26 10附录 27 附录1程序清单 27 附录1.2 显示模块程序清单 28 附录1.3 帮助模块程序清单 30 附录1.4 学生模块程序清单 31 1 项目概述 1.1 系统概述 家庭财务的中心内容账务管理。人们几乎每一天都会经过许多次货币活动。其中包括 了买入卖出实物,娱乐消费,起居饮食消费,还有发放工资,收缴保费等。如果能把各 类不同的活动进行分类,建立不同的账户,分别对活动进行管理,那么无论现在还是将 来,你的账务就会清楚明白了。 每天,我们对自己账务的操作有如下几类:添加新的数据项,比如今天我卖出了多少 股票,生活中,我们就要对自己还有多少钱,今天所得的利润进行统计。现在我们把这 些工作放到程序里去实现,就是这样的操作。某账户今天是添加还是减少,比如对RMB的 操作就是减少,如果与这个操作相关的账户是现金,然后根据货币兑换率提供的值计算 现金账户今天该录入的数值。再如变卖所有古董的收藏,再存入银行,在软件的实现就 为把古董的变卖值转入存款账户。日常生活中,当我们要对一周来,外汇交易的情况进 行了解,就非常困难,而观察外汇一个月里的利率走势就更加是问题。做到程序里,把 它存放到一个数据表里就可以了。归结后,账户的操作一般如下:新添,删除,增加, 减少,查找,转账,统计。 1.2 项目目标 现代社会家庭的理财观念进一步提高,理财手段变得更加丰富。随着生活水平和文化 水平的提高,家庭购买电脑的能力和应用电脑的能力开始提高。电脑及其应用的普及化 ,人们应用电脑进行家庭财务管理的观念增强,因此,开发一个通用性家庭理财软件已 经成为社会需求。本系统是一个家庭通用型理财软件,系统目标是把适合家庭化管理的 各种理财手段及家庭日常收支管理实现计算机化管理,使对家庭及家庭成员的收支活动 更好地进行记录并加以统计分析成为可能,也使家庭理财变得方便,快捷,全面。 1.3 项目范围 现在,人们的生活水平和文化素质普遍提高,并且开始注重生活质量。随着市场经济的 快速发展,观念的不断更新,个人理财意识普遍增强,特别是家庭理财意识得到很大发 展,在意识上,一方面,人们对家庭和个人的各方面消费有想进行统计和分析的愿望, 以便更好地做好家庭收支计划,和家庭财务管理。另一方面,各种理财手段不断丰富, 如何把各种理财手段统一起来,并且能更加方便的操作成为要求。在物质基础上,计算 机的应用开始普及,人们购置计算机和使用计算机的能力增强,人均计算机拥有量将快 速提高。这些条件说明,人们有购买一个家庭化财务软件的要求,在一个可接受的价格 范围内,将购买这种软件。使用这种软件学要家庭有一定的经济基础,所以这种软件适 用于家庭收入在中下层或中下层以上的家庭。 1.4 业务流程图 现行系统的业务流程图是分析和描述现行系统业务的重要工具之一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值