快速原型法(RapidPrototyping)是一种有效且高效的以用户为中心(User-Centered Design)的技术,可以帮
助用户体验专家、设计师、工程师创造更加有用、可用的产品。
一、Axure RP简介
Axure的完整英文名是AxureRP Pro。Axure的英文发音是Ack-sure,RP 是RapidPrototyping的缩写,意思为快速原型设计;Pro是―Professional的缩写,意思是专业版。Axure RP Pro是美国AxureSoftware Solution公司的旗舰产品,是一个让负责定义需求和规格、设计功能和界面的专家快速创建应用软件或Web网站线框图、原型、规格说明书的专业快速原型设计工具。Axure所针对的专家包括用户体验设计师(UX)、交互设计师(UI)、业务分析师(BA)、信息架构师(IA)、可用性专家(UE)和产品经理(PM)。
在Axure中设计线框图和原型会使你更加高效;可以让团队成员一起体验你的设计;向用户演示和交流以确认用户需求;自动产生规格说明书;让团队进行多人协同设计和对版本进行管理控制;等等。
二、Axure工作环境介绍
Axure的可视化工作环境可以让你轻松快速的以鼠标拖曳的方式创建带有注释的线框图。不用进行编程,就可以在线框图上定义简单链接和高级交互。在线框图的基础上,可以自动生成HTML原型和Word格式的规格说明书。
以下是AxureRP工作环境的简要说明:
三、实战篇-系统登陆界面
案例描述
这是一个较为简单的登陆界面,输入用户名、密码后,点击登陆按钮进行登陆校验:
1.如果未输入用户名或密码,则提示―请输入用户名和密码‖,蓝色字体;
2.如果用户名或密码错误,则提示―用户名或密码错误‖,红色字体;
3.如果用户名和密码都匹配,则提示―您好,【用户名】‖,黑色字体。
实现步骤
步骤一、绘制线框图
1、打开Axure软件,新建一个RP文件;
2、拖动控件面板中的控件到线框图面板中,绘制登陆界面如下图:
所用到的控件清单如下:
控件名 作用 文本内容 标识符 其它属性
TextPanel 信息提示 默认:登陆窗口 frmLogin
TextPanel 信息提示 用户名:
TextPanel 信息提示 密码:
TextField 输入用户名userName
TextField 输入密码 PassWord
Button 点击登录 登陆 cmdLogin
步骤二、设计控件交互
1、选中登陆按钮,在控件交互和注释面板中鼠标双击onClick事件;
2、在弹出的―交互场景属性对话框中,点击添加条件这个链接;
3、在弹出的―条件创建对话框中,添加条件如下:
4、回到―交互场景属性对话框中,Step2中选择动作设置变量和控件值,并点击Step
3中的链接;
5、在弹出的―设置变量和控件值‖对话框中,设置如下:
select本质是通过设置或检查存放fd标志位的数据结构来进行下一步的处理。会阻塞,直到有一个或多个I/O就绪。
监视的文件描述符分为三类set,每一种对应不同的事件。readfds、writefds和exceptfds是指向描述符集的指针。
readfds列出的文件描述符被监视是否有数据可供读取。(可读)
writefds列出的文件描述符被监视是否有写入操作完成。(可写)
exceptfds列出的文件描述符被监视是否发生异常,或无法控制的数据是否可用。(仅仅用于socket)
这三类set为NULL时,select()不监视其对应的该类事件。
select()成功返回时,每组set都被修改以使它只包含准备好的I/O描述符。
其缺点:(a)单个进程可监视的fd数量被限制;
(b)需要维护一个用来存放大量fd的数据结构,这样会使用户空间和内核空间在传递该结构时复制开销大;
(c)对fd进行扫描是线性的,fd剧增后,IO效率较低,因为每次调用都对fd进行线性扫描遍历,所以随着fd的增加会造成遍历速度慢的性能问题;
(d)内核需要将消息传递用户空间,需要内核拷贝动作;
(e)最大支持1024个fd。
2.实战server端代码,文件名为:select-server.c
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/time.h> #include <sys/types.h> #define MAXBUF 1024 /************关于本文档******************************************** *filename: select-server.c *purpose: 演示网络异步通讯、select用法,这是服务器端程序 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 * 但请遵循GPL *Thanks to: Google.com *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献! *********************************************************************/ int main(int argc, char **argv) { int sockfd, new_fd; socklen_t len; struct sockaddr_in my_addr, their_addr; unsigned int myport, lisnum; char buf[MAXBUF + 1]; fd_set rfds; struct timeval tv; int retval, maxfd = -1; if (argv[1]) myport = atoi(argv[1]); else myport = 7838; if (argv[2]) lisnum = atoi(argv[2]); else lisnum = 2; if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = PF_INET; my_addr.sin_port = htons(myport); if (argv[3]) my_addr.sin_addr.s_addr = inet_addr(argv[3]); else my_addr.sin_addr.s_addr = INADDR_ANY; if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(sockfd, lisnum) == -1) { perror("listen"); exit(1); } while (1) { printf ("\n----等待新的连接到来开始新一轮聊天……\n"); len = sizeof(struct sockaddr); if ((new_fd = accept(sockfd, (struct sockaddr *) &their_addr, &len)) == -1) { perror("accept"); exit(errno); } else printf("server: got connection from %s, port %d, socket %d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port), new_fd); /* 开始处理每个新连接上的数据收发 */ printf ("\n准备就绪,可以开始聊天了……直接输入消息回车即可发信息给对方\n"); while (1) { /* 把集合清空 */ FD_ZERO(&rfds); /* 把标准输入(stdin)句柄0加入到集合中 */ FD_SET(0, &rfds); maxfd = 0; /* 把当前连接(socket)句柄new_fd加入到集合中 */ FD_SET(new_fd, &rfds); if (new_fd > maxfd) maxfd = new_fd; /* 设置最大等待时间 */ tv.tv_sec = 1; tv.tv_usec = 0; /* 开始等待 */ retval = select(maxfd + 1, &rfds, NULL, NULL, &tv); if (retval == -1) { printf("将退出,select出错! %s", strerror(errno)); break; } else if (retval == 0) { /* printf ("没有任何消息到来,用户也没有按键,继续等待……\n"); */ continue; } else { /*判断当前IO是否是stdin*/ if (FD_ISSET(0, &rfds)) { /* 用户按键了,则读取用户输入的内容发送出去 */ bzero(buf, MAXBUF + 1); fgets(buf, MAXBUF, stdin); if (!strncasecmp(buf, "quit", 4)) { printf("自己请求终止聊天!\n"); break; } len = send(new_fd, buf, strlen(buf) - 1, 0); if (len > 0) printf ("消息:%s\t发送成功,共发送了%d个字节!\n", buf, len); else { printf ("消息'%s'发送失败!错误代码是%d,错误信息是'%s'\n", buf, errno, strerror(errno)); break; } } /*判断当前IO是否是来自socket*/ if (FD_ISSET(new_fd, &rfds)) { /* 当前连接的socket上有消息到来则接收对方发过来的消息并显示 */ bzero(buf, MAXBUF + 1); /* 接收客户端的消息 */ len = recv(new_fd, buf, MAXBUF, 0); if (len > 0) printf ("接收消息成功:'%s',共%d个字节的数据\n", buf, len); else { if (len < 0) printf ("消息接收失败!错误代码是%d,错误信息是'%s'\n", errno, strerror(errno)); else printf("对方退出了,聊天终止\n"); break; } } } } close(new_fd); /* 处理每个新连接上的数据收发结束 */ printf("还要和其它连接聊天吗?(no->退出)"); fflush(stdout); bzero(buf, MAXBUF + 1); fgets(buf, MAXBUF, stdin); if (!strncasecmp(buf, "no", 2)) { printf("终止聊天!\n"); break; } } close(sockfd); return 0; }
client端代码,文件名为select-client.c
#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <resolv.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #define MAXBUF 1024 /************关于本文档******************************************** // *filename: select-client.c *purpose: 演示网络异步通讯,这是客户端程序 *Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 * 但请遵循GPL *Thanks to: Google.com *Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力 * 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献! *********************************************************************/ int main(int argc, char **argv) { int sockfd, len; struct sockaddr_in dest; char buffer[MAXBUF + 1]; fd_set rfds; struct timeval tv; int retval, maxfd = -1; if (argc != 3) { printf ("参数格式错误!正确用法如下:\n\t\t%s IP地址 端口\n\t比如:\t%s 127.0.0.1 80\n此程序用来从某个 IP 地址的服务器某个端口接收最多 MAXBUF 个字节的消息", argv[0], argv[0]); exit(0); } /* 创建一个 socket 用于 tcp 通信 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket"); exit(errno); } /* 初始化服务器端(对方)的地址和端口信息 */ bzero(&dest, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(atoi(argv[2])); if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) { perror(argv[1]); exit(errno); } /* 连接服务器 */ if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) { perror("Connect "); exit(errno); } printf ("\n准备就绪,可以开始聊天了……直接输入消息回车即可发信息给对方\n"); while (1) { /* 把集合清空 */ FD_ZERO(&rfds); /* 把标准输入句柄0加入到集合中 */ FD_SET(0, &rfds); maxfd = 0;