构建Flex用户界面:AF-客户端管理器项目实战
立即解锁
发布时间: 2025-08-19 01:52:23 阅读量: 9 订阅数: 16 


Flex与Spring构建RIA企业级应用
### 构建Flex用户界面:AF - 客户端管理器项目实战
#### 1. 引言
在当今的软件开发中,构建一个高效、美观且功能强大的用户界面是至关重要的。Flex作为一种强大的开发技术,能够帮助我们实现丰富的用户体验。本文将详细介绍如何构建AF - 客户端管理器应用程序的Flex用户界面,包括组件模型定义、应用程序布线、远程对象配置、组件构建以及皮肤和样式设计等方面。
#### 2. Flex架构与组件定义
在开始构建Flex应用程序之前,我们需要定义一个组件模型。组件模型的目的是为应用程序的各个组件命名,并在编写应用程序逻辑之前构建每个视图的骨架。这样做的好处是可以让开发者更清晰地了解需要编码的内容,并且便于进行模块化开发。
创建组件模型的步骤如下:
1. 完成应用程序的线框图设计,以便有可视化的参考。
2. 根据线框图创建组件模型,确定各个组件的名称和功能。
3. 可以使用本地XML文件进行快速原型开发,在没有实时数据源的情况下演示应用程序的功能。
组件模型创建完成后,我们可以根据该模型编写应用程序的骨架。这样可以在深入编写各个组件的实际代码之前,解决流程问题,并且更容易调试。
#### 3. AF - 客户端管理器组件模型与目录结构
我们之前已经完成了AF - 客户端管理器应用程序的设计并生成了线框图。现在,我们将对应用程序的组件进行建模,并将应用程序连接起来,以便了解应用程序的流程和屏幕之间的过渡效果。
首先,根据组件模型创建目录结构,示例如下:
```plaintext
af_ClientManager
├── view
│ ├── ClientManager
│ │ ├── components
│ │ ├── ClientDetailViews
│ │ ├── ClientProjectsDetailViews
│ │ ├── ClientFinancialsDetailViews
│ │ └── ClientManagerView.mxml
│ ├── ProjectManager
│ │ └── ProjectManagerView.mxml
│ ├── Dashboard
│ │ ├── DashboardView.mxml
│ │ ├── GraphCanvas.mxml
│ │ └── MetricsMenu.mxml
│ └── Main
│ ├── Header.mxml
│ ├── Footer.mxml
│ └── MainView.mxml
├── model
│ ├── ModelLocator.mxml
│ └── vo
│ └── ClientVO.as
└── services
└── Services.mxml
```
#### 4. AF - 客户端管理器模型
为了正确连接应用程序,我们需要使用模型进行绑定。以下是`ModelLocator.mxml`和`ClientVO.as`的代码示例:
```actionscript
// ModelLocator.mxml
package com.af.clientmanager.model
{
import com.adobe.cairngorm.model.ModelLocator;
import com.af.clientmanager.model.vo.*;
import mx.collections.ArrayCollection;
[Bindable]
public class ModelLocator implements com.adobe.cairngorm.model.ModelLocator
{
private static var modelLocator : com.af.clientmanager.model.ModelLocator;
public static function getInstance() : com.af.clientmanager.model.ModelLocator
{
if ( modelLocator == null )
modelLocator = new com.af.clientmanager.model.ModelLocator();
return modelLocator;
}
public function ModelLocator()
{
if( com.af.clientmanager.model.ModelLocator.modelLocator != null )
throw new Error( "Only one ModelLocator instance should be instantiated" );
}
public const SERVICE_ENDPOINT:String = "http://localhost:8080/af_Central/spring/messagebroker/amf";
public const YAHOO_APP_ID:String = "YOUR YAHOO APP ID";
public const UPLOAD_URL:String = "";
public const DIRECTORY_NAME:String = "af_Central";
//Global Menu Constants
public const CLIENT_MANAGER:int = 0;
public const PROJECT_ADMIN:int = 1;
public const DASHBOARD:int = 2;
public var MainViewStackState:int = 0;
// Data Providers
public var clientsDP:ArrayCollection = new ArrayCollection();
public var contactsDP:ArrayCollection = new ArrayCollection();
public var issuesDP:ArrayCollection = new ArrayCollection();
public var documentsDP:ArrayCollection = new ArrayCollection();
public var selectedClient:ClientVO = new ClientVO;
public var selectedContact:ClientContactsVO = new ClientContactsVO;
}
}
```
```actionscript
// ClientVO.as
package com.af.clientmanager.model.vo
{
[Bindable]
[RemoteClass(alias="com.af.core.domain.Client")]
public class ClientVO
{
public var objectIdentifier:Number;
public var assocobjectID:Number;
public var clientName:String;
public var clientID:int;
public var link:String;
public var description:String;
public var notes:String;
public var phone:String;
public var addressLine1:String;
public var addressLine2:String;
public var city:String;
public var state:String;
public var zip:String;
}
}
```
#### 5. AF - 客户端管理器应用程序布线
应用程序布线是将各个组件连接起来,形成一个完整的应用程序。我们将从应用程序视图开始,逐步深入到各个关键视图。
##### 5.1 应用程序视图
应用程序视图的根文件是`af_ClientManager.mxml`,示例代码如下:
```xml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
pageTitle="AF Client Manager"
layout="absolute"
xmlns:view="com.af.view.*"
xmlns:services="com.af.clientmanager.services.*"
xmlns:control="com.af.clientmanager.control.*"
xmlns:Main="com.af.clientmanager.view.Main.*"
xmlns:model="com.af.clientmanager.model.*"
initialize="initApp()" >
<mx:Style source="assets/css/style.css"/>
<mx:Script>
<![CDATA[
import mx.events.ListEvent;
import mx.controls.Alert;
private function initApp():void
{
// Currently set to applicationView to bypass
// the login process.
vsAppLevel.selectedChild = applicationView;
}
public function loginSuccess():void
{
vsAppLevel.selectedChild = applicationView;
}
]]>
</mx:Script>
<!-- ===================================================================== -->
<!-- the ServiceLocator where we specify the remote services -->
<services:Services id="services"/>
<!-- the FrontController, containing Commands-to-Event mappings -->
<control:MainController id="mainController" />
<!-- ===================================================================== -->
<mx:Fade id="fadeInApp" alphaFrom="0" alphaTo="1" duration="500" />
<mx:VBox width="100%" height="100%" backgroundAlpha=".88"
verticalScrollPolicy="off" horizontalScrollPolicy="off"
verticalAlign="top" horizontalAlign="center">
<mx:ViewStack id="vsAppLevel" width="100%" height="100%" paddingTop="0"
creationPolicy="all">
<mx:Canvas id="loginView" showEffect="Fade" hideEffect="Fade">
<Main:Login width="100%" height="100%" />
</mx:Canvas>
<mx:VBox width="100%" height="100%"
id="applicationView" backgroundAlpha="0"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
paddingTop="0"
verticalAlign="top" horizontalAlign="center"
showEffect="Fade" hideEffect="Fade">
<mx:VBox width="985" height="735"
paddingTop="0" verticalGap="0"
verticalScrollPolicy="off"
horizontalScrollPolicy="off"
borderStyle="solid" borderThickness="2"
backgroundColor="#FFFFFF"
backgroundAlpha=".75">
<Main:Header backgroundColor="red" />
<mx:VBox width="100%" height="100%">
<Main:MainView />
</mx:VBox>
<Main:Footer backgroundColor="blue"/>
</mx:VBox>
</mx:VBox>
</mx:ViewStack>
</mx:VBox>
</mx:Application>
```
该文件包含了应用程序的根标签`<mx:Application>`,在`<mx:Script>`块中,`initApp()`函数用于设置视图堆栈的初始选择。视图堆栈控制着应用程序的可见部分,同时包含了应用程序的头部、主视图和底部。
##### 5.2 头部和底部组件
头部组件`Header.mxml`和底部组件`Footer.mxml`的示例代码如下:
```xml
<!-- Header.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="75">
<mx:Script>
<![CDATA[
import com.af.clientmanager.view.dialogs.DeleteClientConfirmationDialog;
import mx.managers.PopUpManager;
import com.af.clientmanager.control.commands.events.DeleteClientEvent;
import com.af.clientmanager.control.commands.events.InsertClientEvent;
import mx.events.ItemClickEvent;
import com.af.clientmanager.model.vo.ClientVO;
import com.adobe.cairngorm.control.CairngormEventDispatcher;
import com.af.clientmanager.control.commands.events.UpdateClientEvent;
import mx.controls.Alert;
import com.af.clientmanager.model.ModelLocator;
[Bindable]
public var model : ModelLocator = ModelLocator.getInstance();
private function clearClientDetails():void
{
// remove all information from
// the panels after pop-up
model.selectedClient = new ClientVO();
}
private function saveClient():void
{
if(model.selectedClient.objectIdentifier > 0)
CairngormEventDispatcher.getInstance().dispatchEvent(new UpdateClientEvent(model.selectedClient));
else
{
CairngormEventDispatcher.getInstance().dispatchEvent(new InsertClientEvent(model.selectedClient));
}
}
private function deleteClient():void
{
// Don't try to delete unless a client is selected
if(model.selectedClient.objectIdentifier > 0)
{
var pop1:DeleteClientConfirmationDialog = DeleteClientConfirmationDialog(
PopUpManager.createPopUp(this, DeleteClientConfirmationDialog, true));
pop1.confirmationMessageTitle = "Delete Confirmation";
pop1.confirmationMessageBody = "Are you sure you want to delete: " + model.selectedClient.clientName;
PopUpManager.centerPopUp(pop1);
}
}
private function functionsBBClick(event:ItemClickEvent):void
{
switch (event.index)
{
case 0:
clearClientDetails();
break;
case 1:
saveClient();
break;
case 2:
deleteClient();
break;
}
}
private function componentsBBClick(event:ItemClickEvent):void
{
switch (event.index)
{
case 0:
model.MainViewStackState = model.CLIENT_MANAGER;
break;
case 1:
model.MainViewStackState = model.PROJECT_ADMIN;
break;
case 2:
model.MainViewStackState = model.DASHBOARD;
break;
}
}
]]>
</mx:Script>
<mx:HBox width="100%" height="100%">
<mx:Image width="190" height="74"/>
<mx:VBox width="100%" height="100%" verticalAlign="bottom">
<mx:HBox width="100%">
<mx:Button label="N" click="clearClientDetails()"/>
<mx:Button label="S" click="saveClient()"/>
<mx:Button label="D" click="deleteClient()"/>
<mx:Spacer width="100%" />
<mx:Button label="Client Manager"
click="{model.MainViewStackState=model.CLIENT_MANAGER}"/>
<mx:Button label="Project Administrator"
click="{model.MainViewStackState=model.PROJECT_ADMIN}"/>
<mx:Button label="Dashboard"
click="{model.MainViewStackState=model.DASHBOARD}"/>
</mx:HBox>
</mx:VBox>
</mx:HBox>
</mx:Canvas>
```
```xml
<!-- Footer.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="25">
<mx:Label text="Footer" fontSize="16" color="white" fontWeight="bold" />
</mx:Canvas>
```
头部组件包含了一些导航按钮和操作按钮,用于切换视图和执行客户端的增删改操作。底部组件仅用于显示公司信息。
##### 5.3 主视图
主视图`MainView.mxml`的示例代码如下:
```xml
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="100%"
backgroundColor="#888888"
xmlns:ClientDetailViews="com.af.clientmanager.view.ClientManager.ClientDetailViews.*"
xmlns:ClientFinancialsDetailViews="com.af.clientmanager.view.ClientManager.ClientFinancialsDetailViews.*"
xmlns:ClientProjectsDetailViews="com.af.clientmanager.view.ClientManager.ClientProjectsDetailViews.*"
xmlns:components="com.af.clientmanager.view.ClientManager.components.*"
xmlns:ClientManager="com.af.clientmanager.view.ClientManager.*"
xmlns:ProjectManager="com.af.clientmanager.view.ProjectManager.*"
xmlns:Dashboard="com.af.clientmanager.view.Dashboard.*">
<mx:Script>
<![CDATA[
import com.af.clientmanager.model.ModelLocator;
[Bindable]
public var model : ModelLocator = ModelLocator.getInstance();
]]>
</mx:Script>
<mx:HBox width="100%" height="100%">
<components:ClientList />
<mx:ViewStack id="vsMain" width="100%" height="100%"
paddingTop="0"
creationPolicy="all"
selectedIndex="{model.MainViewStackState}">
<mx:Canvas id="clientManagerView"
showEffect="Fade" hideEffect="Fade">
<ClientManager:ClientManagerView />
</mx:Canvas>
<mx:Canvas id="projectManagerView"
showEffect="Fade" hideEffect="Fade">
<ProjectManager:ProjectManagerView />
</mx:Canvas>
<mx:Canvas id="dashboardView" showEffect="Fade"
hideEffect="Fade">
<Dashboard:DashboardView />
</mx:Canvas>
</mx:ViewStack>
</mx:HBox>
</mx:Canvas>
```
主视图包含了客户端列表和一个视图堆栈,视图堆栈根据`model.MainViewStackState`的值切换不同的视图。
##### 5.4 客户端管理器视图
客户端管理器视图`ClientManagerView.mxml`的示例代码如下:
```xml
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
width="100%" height="100%"
xmlns:ClientDetailViews="com.af.clientmanager.view.ClientManager.ClientDetailViews.*"
xmlns:ClientProjectsDetailViews="com.af.clientmanage
```
0
0
复制全文
相关推荐










