【本章导读语】

东临碣石,以观沧海。

________曹操,《观沧海》

就成熟的SaaS应用而言,元数据服务供应商为客户提供了定制和配置应用、满足其特定需求的主要手段。

SaaS模式的可配置性体现了SaaS不同于ASP的特性。SaaS的可配置性表现在用户可按需要定制自己的功能、界面外观、显示方式等。SaaS应用系统开发商主要通过可自定义表单、自定义数据模型、自定义业务流程、自定义报表等功具实现可配置性。

11.1 配置的实现基础:元数据(MetaData)

系统通过配置数据展现不同的外观和行为,那么对整个系统来说,配置数据就是系统中的元数据。

元数据最本质,最抽象的定义为:data about data(关于数据的数据)。它是一种广泛存在的现象,在许多领域有其具体的定义和应用。首先,元数据能提供基于用户的信息,如记录数据项的业务描述信息的元数据能帮助用户使用数据。其次,元数据能支持系统对数据的管理和维护,如关于数据项存储方法的元数据能支持系统以最有效的方式访问数据。具体来说,在数据仓库系统中,元数据机制主要支持以下五类系统管理功能:(1)描述哪些数据在数据仓库中;(2)定义要进入数据仓库中的数据和从数据仓库中产生的数据;(3)记录根据业务事件发生而随之进行的数据抽取工作时间安排;(4)记录并检测系统数据一致性的要求和执行情况;(5)衡量数据质量。

在软件构造领域,元数据被定义为:在程序中不是被加工的对象,而是通过其值的改变来改变程序的行为的数据。它在运行过程中起着以解释方式控制程序行为的作用。在程序的不同位置配置不同值的元数据,就可以得到与原来等价的程序行为。

在图书馆与信息界,元数据被定义为:提供关于信息资源或数据的一种结构化的数据,是对信息资源的结构化的描述。其作用为:描述信息资源或数据本身的特征和属性,规定数字化信息的组织,具有定位、发现、证明、评估,选择等功能。

元数据:是描述数据仓库内数据的结构和建立方法的数据。可将其按用途的不同分为两类,技术元数据和商业元数据。

技术元数据是数据仓库的设计和管理人员用于开发和日常管理数据仓库时用的数据。包括:数据源信息、数据转换的描述、数据仓库内对象和数据结构的定义、数据清理和数据更新时用的规则、源数据到目的数据的映射、用户访问权限、数据备份历史记录、数据导入历史记录、信息发布历史记录等。

商业元数据从商业业务的角度描述了数据仓库中的数据。包括业务主题的描述,包含的数据、查询、报表。

元数据为访问数据仓库提供了一个信息目录(information directory),这个目录全面描述了数据仓库中都有什么数据、这些数据怎么得到的、和怎么访问这些数据。是数据仓库运行和维护的中心,数据仓库服务器利用他来存贮和更新数据,用户通过他来了解和访问数据。

对于一个成熟的SaaS应用,这种简单的配置方式可能是不够的。如何设计出结构灵活、功能强大、兼容性好的元数据结构,如何在代码中提供最有效率的元数据服务(Metadata Service),如何定义元数据的元数据(Metadata of metadata),如何保证在元数据结构发生变化的时候不影响程序的运行,这一切都需要我们在对元数据本身的语义特性和可能的技术支持手段进行过调研之后才能得出。下面是有关于元数据服务层设计的图片:

图11-1 元数据服务层设计

上面这幅图的上半部分给出了SaaS参考体系结构的一个概念模型,下半部分则给出了对应于体系结构的每一部分,现有的可能采取的技术手段。我们注意到,元数据服务和元数据数据结构定义是里面唯一的盲区。

下面这个图是Matias Woloski给出的对各主要配置模块(界面、业务规则、多用户数据结构、访问控制)提供的元数据服务的可能解决方案,也许可以做为我们进一步深入的一个线索。  

图11-2 配置模块解决方案

11.2 配置的需求基础:业务共性提取与业务个性分析

为什么是所有tenant共享一套代码?因为所有这些用户在软件需求上有共同的需要,在业务流程上有很多共通的地方,他们所有的应用都是在一个比较确定的业务领域(Business Domain)内展开的。我们需要把这个业务领域内的业务需求梳理清楚,然后提供我们的软件为这个业务领域服务。既然他们都属于一个业务领域,那么我们提供一套可以运行的软件就行了,为什么还要提供那么强的配置能力呢?因为同属于一个业务领域内的客户,他们在业务规则的细节上其实有很多不同,业务流完全相同的两个企业其实是不存在的。另外,每一个企业都在不停的发展变化,业务结构也都在不断的调整、重整、升级过程中,我们的软件应该可以在一定的弹性范围内,支持企业的这种升级。

所以,研究我们的SaaS软件所要解决的业务领域特点,找出这个领域目前在横向范围内的企业业务间的差异性,以及在可以预见的将来的业务升级要求,其实是实现SaaS软件最开始的、也是最难的一步。但这一步骤本身和技术的关系可能并没有那么大,所涉及的最多也能也就是包含UML在内的众多领域建模技术。这一部分应该属于SaaS研究中业务和技术结合、同时业务占据的比重更大的一部分内容。

11.3 配置手段的易用性

一个被广泛接受的观点是,易用性可能成为一个SaaS软件成败的关键。作为SaaS应用的使用者,肯定会关心是不是他的每一个员工都能很容易的使用这个系统,这其实是企业部署SaaS应用的主要成本之一。而在整个系统的操作中,对外观和业务流的自定义配置很有可能成为最复杂的部分,这部分操作的易用性也将直接影响整个软件的易用性。

想增强配置手段的易用性,需要我们多向salesforce这样的成熟SaaS应用学习取经。

l SaaS软件的易用性主要体现在三个方面:

易见(Easy to discover)藏得很深的功能就不容易被发现,无法使用。

易学(Easy to learn)学起来容易。

易用(Easy to use)熟练使用的时候可以更快的操作。

这三条本身其实是冲突的,需要平衡。微软的Windows界面是这样设计的:菜单是统一的发现功能的入口,通过把拷贝和粘贴放在编辑菜单下是用户容易学习使用,而不像DOS一样,只有通过说明书或者书籍才能发现(discover)和学会(learn)。不过,如果每次拷贝操作都要通过指向“编辑”,然后选择菜单中的“拷贝”虽然易学,但是不易用,所以就设计了Ctrl+C和Ctrl+V的快捷方式,供学会的人更容易的使用。

相反的,在专业领域,可以为了易用而放弃易学,银行柜台终端只用小键盘而不用鼠标操作就是个例子。

l 易用性原理

易见(Visibility)

单单凭观察,用户就应知道软件功能的状态,该软件供选择可以采取的操作。

关于门的例子,就是易见出了问题。通过观察它,让我没有办法判断我可以做哪些操作,推还是拉?有很多门上贴着“推”或“拉”,其实当一项设计需要用标签的时候,就说明设计本身已经失败了。

与消防相关的设计通常要求比任何物品有更高的易用性要求,以保证任何人可以在突发事件发生时几秒内可以准确地使用它。

现在的软件都是可见就可得,都提供可视化界面。特别是用一些工具按钮来代表某项功能,通过图标明示可进行什么操作。

映射(Mapping)

知识主要分布在两个地方:第一,每个人的脑子里,这些知识对高效的使用一样东西非常有用;第二,环境中,这些知识当第一次遇到时非常有用。

微软的DOS,就第一次采取了DIR(目录)作为目录的结构,而不用ls这样Unix的命令行,而且第一次使用了形象的C盘,D盘,而不是一股脑的mount到一个以/为根的庞大的文件系统中去。到了Windows时代,把目录干脆变成了文件夹的样子,文件变成了一张张写着字的纸。而Windows 95更加开创性的第一次引入了桌面的概念,反而把我的电脑变成桌面的一部分。这种种变化,都是把产品映射到了大家熟识的生活中的概念。

因为每人脑子里的知识都不相同,易用性也是针对与不同的人,设计者无法知道该产品是否对别人同样易用。不信,如果您用惯了Windows,去用用苹果的Mac试试。首先就受不了那只有一个键的鼠标。而对于一个Mac用户,Windows也是需要不懈的努力和适应才可以用得来的。

要实现SaaS系统的可配置性,让用户通过设计界面提供可拖曳的控件操作功能,并且提供数据控制与物理表的字段映射关系,这些都是必须要解决的问题。

反馈(Feedback)

反馈对于产品的易用性至关重要。通过不断的迅速的反馈,让用户知道自己的操作的结果。比如,Windows的应用中的那个“沙漏”的鼠标,就是让用户知道需要等待,而不是开始挥舞拳头来砸键盘。产品中“正在……,请稍后”就远好于死机一样的一动不动。

没有反馈,会让初次使用的用户非常的苦恼。比如Windows的登录框,输密码时,因为反馈被星号屏蔽了,多少次按了大写键以后没法输入密码就是一个易用问题。好在从Windows XP以后,用一个“大写键打开”的提示框作为反馈,好多了。

用户通过SaaS的可配置性实现表单时,好的系统应该即时地反馈用户操作的正确与错误性,并提醒下一步操作,当保存或删除数据成功时有正确的提示。

l 易用性和功能

产品设计是个取舍的问题。易用性和功能就存在冲突。更多的功能,可能使用户无所适从。

我讨厌那种好像4x6阵列似的遥控器,还有复印机的面板。很多时候,我被复印机的功能搞得发疯。其实,我理想中的好的复印机就是在面板上只有一个大大的可爱的绿色圆按钮,按一下,复印一张,再按一下,再复印一张……。

下面图11-3这个复印机功能非常少,只能复印,您喜欢吗?

图11-3 一个功能的复印机 图11-4 许多功能的复印机

图11-4这个复印机的功能非常多,该有的都有,您喜欢吗?

如果设计师发现如果他面对的复印机群体80%的操作只涉及复印一张纸,而其他时候还有别的要求,大概会设计成这个样子:

图11-5 更友好的复印机功能设计

物理世界的“高级选项”可能是一个小盖子,让面板上尽量简洁,也可能是不同的颜色和形状来区分。

软件的易用性实际上是以用户为中心,处处为用户着想。SaaS的可配置性是让用户自己设计开发软件,没有专业水平的用户,怎么能架驶高技术的开发工具呢?这必然对可配置的易用性提出了更高的要求。

11.4 配置能力

SaaS是一个典型的“单实例多处应用”的软件类型,这就要求实例本身在不同的应用环境下有很强的配置能力。具体说来,需要对以下4个方面提供配置能力:

(1)程序的外观。

(2)工作流程与业务规则。

(3)数据模型。

(4)用户及最终用户的存取权限。

这种自定义的能力应该在易配置性和配置能力两个方面做好权衡,最优的结果当然是通过最方便的配置手段来实现最复杂的自定义功能,但这并不容易做到,所以有可能我们会需要为一些比较高级的用户提供基于已有系统的二次开发能力(使用脚本等)。下面我们就具体来谈一下关于可配置性的各个方面。

11.5 动态表单

为了帮助客户灵活地根据需要进行软件配置,我们将上述选项组织成层级的配置单元,即“配置域”,每个配置域都包括不同的选项,以更针对上述四个领域做出相应更改。每家客户都拥有顶级配置域,使他们能够在需要时进行配置,并能在顶级配置域下构建任意层级的一个或多个配置域。我们还采用关系策略来决定子节点(child node)能否继承母节点(parent node)的配置设置,或忽略母节点的设置。

举例而言,如果普通客户购买了整个企业的应用使用权,其不同的业务部门有着不同的需要,那么这些部门都应遵循统一的公司标准,同时还应各自配置自身使用的应用元素。在各业务部门内部,同样也会存在下级单位,它们都有自己特殊的配置需要。对于上述各组织单元而言,客户可分别建立配置域,登录不同的单元选择各自的配置选项,设置或更改均可。

与供应商定制的传统业务应用不同,SaaS应用更多情况下是由客户自身进行配置的。因此,设计配置界面非常重要。理想情况下,客户应能够通过向导或简易而直观的屏幕指导进行应用配置,屏幕上应提供所有可用的选项,既避免客户面临一大堆信息无从下手,又能清晰地反映给定配置域下能否针对相关选项进行更改。

l 表单模板

表单模板用来配合表单资源动态生成最终表单内容的输出。表单模板可用任何HTML内容文件来制作,通过标签配合不同的属性值来进行区域定义。

最简单的表单模板是借助Word的强大功能,您可以打开Word软件,在空白的地方画表格,插入文本及其它控件,当然,您要在需要输入数据的地方插入特殊标记,以便系统自动识别并生成对应的数据模型字段。保存时保存类型选择“筛选过的网页”您就做成了一个表单模板。您在自定义的表单中选择此表单模板,系统自动读取按Word格式保存的表单模板并展现在界面上,同时自动地为每个标记生成数据表并定义好字段。

当然,最好的方法是提供可视化的表单外观设计器。

l 表单数据存储

表单的设计只要设计表单的外观,包括数据输入方法与展现。事实上,输入的数据不可能与表单模板一同保存的。表单数据往往是单独存储,有的存储在数据库里,有的存放在XML文件中。不管用什么方法来存储数据,一定要能正确的映射出对应关系。多用户的SaaS模式,更要考虑表单数据的存储方式、读取方法和权限控制问题。

动态表单的实现原理在第9章的9.8节有了详细介绍。

11.6 自定义数据模型

数据模型的扩展。对于许多数据驱动型SaaS应用而言,单个模型显然不能满足所有需要。即便对于相对简单的任务专用应用而言,如果数据字段和表格一成不变,也会给客户造成麻烦。可扩展的数据模型使客户能自由地让应用根据自身需要工作,而不必为了满足应用的要求而改变商业进程。

l 自定义数据绑定

在分析JAX-RPC时,您将看到WSDL/XML模式到Java的映射存在一定的限制。对于某些较为复杂的模式概念,JAX-RPC选择将它们(例如xsd:anyAttribute、xsd:choice等)映射到一个SOAPElement。如果我们展望J2EE Web服务编程模型的新一代版本JAX-WS2.0,您将注意到它并不是定义自己的映射,而是使用JAX-B 2.0规范作为数据绑定。JAX-B是一种比JAX-RPC提供的映射机制更完善的XML模式映射机制,但二者却截然不同。遗憾的是,要让JAX-RPC使用JAX-B 2.0作为其数据绑定机制是不可能的,因为该规范目前尚未完成。在许多情况下,您可能希望使用JAX-B或其他对您和您的应用程序更有意义的绑定技术来映射您的Web服务数据。或者,也许您已获得一组正在使用的Java Bean,并且打算在JAX-RPC选定的不同Java Bean组上维持这种映射。

运用上面介绍的某些概念和功能,您可通过使用原始SOAPElement作为输入和输出参数并自行进行转换以完成处理。但是,这意味着SOAPElement将出现在您的服务端点接口中(或作为对象内部的属性),并且您向其提供SOAPElement的对方也必须同样懂得如何处理SOAPElement。自定义数据绑定允许您将该逻辑隐藏在接口级别下,而提供更加以应用程序为中心的API。

l 字段

一个数据模型中最重要也是唯一需要的部分,是定义一个字段列表。字段列表包括字段名、字段类型、字段长度、校验表达式,默认值等。您所要关注的是字段名的命名规则,不能与系统数据库的保留字段同名,字段名是可识别的。字段类型应该是可扩展的自定义型,不能仅只有数据库默认的那几种。

l 表与表的关系

表与表的关系有一对多关系和多对多关系。父子表是种一对多关系,兄弟表是种多对多关系。表与表的关系通过主键与外键相关联。

l 表的名字

表的名字与一篇文章的标题一样重要,一个好的表名让人马上知道这个表的作用,表中存放些什么数据。您的系统里应该提供一个选项如db_table用来定义与模型映射在一起的数据库表的名字。

11.7 自定义用户界面

l 什么是好的用户界面

通俗地讲,用户界面“好不好”主要看它是否“容易使用”和“美观”。

易用性是指用户使用软件的容易程度。现代人的生活节奏快,干啥事都想图个方便。谁都不乐意掏钱买很难用的东西,所以把易用性作为用户界面的重要属性对待无可非议。

除了要求软件易用之外,人们还希望用户界面美观。电影《食神》里的一段精彩故事情节可以帮助我们理解界面美观的重要性。

美观的界面能消除用户由感觉引起的乏味、紧张和疲劳(情绪低落),大大提高用户的工作效率,从而进一步为发挥用户技能和为用户完成任务作出贡献。人们对美的向往和追求是与生俱有的。显然没有开发人员愿意丑化自己的软件,也没有用户嗜好丑陋的界面。软件开发者要设计美,用户要享受美,所以界面的美是开发者与用户的共同需求。

全世界无数人使用Microsoft公司的操作系统DOS,Windows 3.1,Windows 95,Windows 2000和Windows XP,这些操作系统的确是越来越好用了,并且越来越漂亮了。界面的“易用性”和“美”充分体现了人机交互作用中人的特性与意图,越来越多的用户将通过具有吸引力而令人愉快的人机界面与计算机打交道。

l 开发人员的能力缺陷

尽管国内有很多技术出色、聪明过人的软件开发人员,但是他们未必开发得出“易用”的和“美观”的软件。主要原因有:

国内绝大多数大学的计算机学科教育存在缺陷:没有开设人机工程学、美学、心理学这些必修课。由于学生们接受的教育几乎全是科学与技术,他们根本不知道怎样才能设计出易用、美观的用户界面,很多人甚至想都没有想过。当他们毕业后真正参与软件产品开发时,只好凭着个人的经验与感觉设计软件的用户界面,这样产生的界面往往得不到大众用户的认可。

开发人员在设计用户界面方面不仅存在先天的教育缺陷,更加糟糕的是还常常犯“错位”的毛病,即他以为只要自己感觉用户界面漂亮、使用起来方便,那么用户也一定会满意。俗话说“王婆卖瓜,自卖自夸”。当开发人员向用户展示软件时,常会得意地讲:“这个软件非常好用,我操作给您看……是很好用吧!蛮漂亮的吧!”

软件是否易用、是否美观要让用户来评价。如果用户对界面很不满意,开发人员不要有逆反心里“到哪里找来的笨蛋!”。其实不是用户笨,是自己开发的软件太笨了。当用户真的感到软件很好用时,一股温暖的感觉油然而生,于是就用“界面友好”来表扬这个软件。

l 用户界面设计原则

用于提高易用性的界面设计原则有10个:

用户界面适合于软件的功能、容易理解、风格一致、及时反馈信息、出错处理、适应各种用户、国际化、个性化、最短路径,最少操作(操作的最高效率)。

用于提高美观程度的设计原则有:合理的布局、和谐的色彩。

设计原则1:用户界面适合于软件的功能

用户界面的合适性是指界面与软件功能相融洽的程度。软件的功能需要通过用户界面来展现。毫无疑问,用户界面一定要适合于软件的功能,这是最基本的要求。否则用户无法通过这个界面来使用软件,如果连用都不能用,“易用性”根本就无从谈起。

例如,对于一个三维建模软件而言,如果用户不能使用鼠标对模型进行旋转、移动、缩放等操作,那么这个软件的用户界面就不适合于软件的功能。如果不改进用户界面的话,即使软件的内核功能很强(如算法很先进),这个软件也很难卖得出去。

合适性差的界面无疑会混淆软件意图,致使用户产生误解。即使它不损害软件功能与性能,也会使用户产生不该有的情绪波动。

“用户界面适合于软件的功能”是基本的设计原则,它提醒设计者不要片面追求界面外观漂亮而导致华而不实。界面的合适性既提倡外美内秀,又强调恰如其分。

设计原则2:容易理解

如果用户很难理解界面的意图,那么他使用起来肯定很费劲。所以“容易理解”是“容易使用”的前提条件。提高用户界面可理解性的一些规则如下:

界面中的所有元素(如菜单、工具条等)没有错误,也不会让人误解。

所有的界面元素应当提供充分而必要的提示,例如当鼠标移动到工具条上的某个图标按钮时,应当在该图标旁边出现功能提示。

界面结构能够清晰地反映工作流程,以便用户按部就班地操作。

对于复杂的用户界面而言,最好提供界面“向导”,及时让用户知道自己在界面结构中所处的位置。例如对于基于Web的应用软件,应该在界面上显示“当前位置”,否则用户很容易在众多的页面中迷失方向。

设计原则3:风格一致

软件的用户界面中,同类的界面元素应当有相同的视感和相同的操作方式。例如命令按钮是最常见的界面元素,所有命令按钮的形状、色彩以及对鼠标的响应方式都是一致的。

同一类型软件的用户界面应当有一定程度的相似性。例如Microsoft公司的Office家族里有Word、Excel、PowerPoint、Outlook等软件,这些软件提供的“复制、剪切、粘贴”功能的操作方式都是相同的。

对于用户界面而言,风格一致的最大好处就是能够减少用户的记忆量、减少出错几率,并且迅速积累操作经验。所以熟悉Word软件的人基本上不用翻阅手册就能使用PowerPoint软件,可谓“无师自通”。

通用软件产品的界面设计很注重一致性。设计者必须密切注意在相同应用领域中最流行的软件的界面,必须尊重用户使用这些软件的习惯。例如DOS和Windows下的软件习惯于设置F1键为帮助热键,如果某个设计者别出心裁地让F1键成为软件终止的热键,那么在用户渴望得到帮助而伸手击F1键的一刹那,他的工作就此完蛋。相信这个用户会被这另类的F1气疯了。

目前流行的软件开发工具如Visual C++、Visual Basic、Delphi、Java Builder、Power Builder等,都能够快速地开发出非常相似的图形用户界面。在Internet/Intranet领域,浏览器几乎成了唯一的客户端软件,因为Internet用户希望用完全一致的浏览方式来完成千变万化的任务。

设计原则4:及时反馈信息

用户进行某项操作后,如果过了一会儿(几秒钟)用户界面一点反应都没有,这将使用户感到迷茫和不安,因为他不知道是自己操作错了还是软件死机了。所以及时反馈信息很重要,至少要让用户心里有数,知道该任务处理得怎么样了,有什么样的结果。

例如下载一个文件,界面上应当显示“百分比”或相关数字来表示下载的进度,否则人们不知道要等待多少时间。如果某些事务处理不能提供进度等数据,那么至少要给出提示信息如“正在处理,请等待……”,最好是提供合适的动画让用户明白软件正在干活、没有死机。

设计原则5:出错处理

用户在使用软件的过程中,不可避免地会出现一些错误的操作。在设计用户界面时必须考虑出错处理,目的是让用户不必为避免犯错误而提心吊胆、小心翼翼地操作。常见的错误处理方式有:

提供对输入数据进行校验的功能。当用户输入错误的数据时,及时提醒用户改正数据。

对于在某些情况下不应该使用的菜单项和命令按钮,将其“失效”(屏蔽)可以有效防止该项功能被错误地使用。例如:对于某些管理软件,不同的用户有不同的操作权限。如果低权限的用户登录到系统,那些只有高级权限用户才能使用的功能应当被屏蔽(如变成“灰色”不可操作)。

提供Undo功能,用以撤销不期望的操作。

执行破坏性的操作之前,应当获得用户的确认。例如用户删除一个文件时,应当弹出对话框:“真的要删除该文件吗”,当用户确认后才真正删除文件。

设计原则6:适应各种用户

一个软件产品可能有许多类型的用户,例如有些用户对计算机比较外行,有一些用户可能是计算机的行家。在设计用户界面必时应当尽可能多地了解用户的需求和技能水平,努力使用户在操作软件的时候感觉不到差异和麻烦。为了达到这个目标,一般需要提供多种操作途径以适应各种水平的用户。

例如使用Windows下的文件管理器,对于一个初学者来说,他愿意使用鼠标和菜单一步一步地操作;而对于技术专家而言,他也许更愿意使用热键来获取更高的效率。

更了不起的是,一些优秀的软件为患有疾病的人们提供了很好的用户界面。例如全世界的计算机用户中可能有成千上万的人患有色盲或色弱,他们都是正常人,但是当他们面对花花绿绿的软件时会一片茫然。因此通用的软件如浏览器、文字处理软件等都要经过色盲人群的测试。设计者越为用户着想,用户就越喜欢这样的软件。

设计原则7:国际化

中国已经进入了WTO,软件的国际化是大势所趋。为了能够更好地适应国内和国际市场,在设计用户界面的时候应当充分考虑语言和文化的差异。尽可能使用标准的图解方式和国际通行的语言,要求简单易懂,易于翻译,方便于不同母语的用户。

特别要留意下列易变的元素:字体、提示信息、在线帮助;货币、度量单位;数字、日期格式;人的名字、电话号码、通信地址;图标、标签;声音;阅读顺序或习惯;

设计原则8:个性化

用户界面的“个性化”与“一致性”之间存在微妙的矛盾关系。对于一些非常注重安全性的商业软件(如银行软件)而言,用户界面的“一致性”要比“个性化”重要得多,因为一致的界面可以减少用户出错的几率。例如,国内所有银行的自动取款机的用户界面都是非常相似的,谁也不会想着设计一些新花样。

而对于普通的应用软件(尤其是娱乐领域的软件)而言,有个性化的界面自然比泯然于众的界面更具有吸引力。

设计人员应当根据软件的需求以及广大用户的喜好,在使用户界面具备必要的“一致性”的前提下,突出该软件的“个性”。不仅让用户使用起来方便,而且对软件留下深刻的印象。

设计原则9:合理的布局

首先,界面的布局应当符合逻辑,最好能够与工作流程吻合。界面设计人员只有仔细地分析软件的需求,才能提取对界面布局有价值的信息。

其次,界面的布局应当整洁(整齐清爽)。界面元素应当在水平或者垂直方向对齐,行、列的间距保持一致。窗体的尺寸要合适,各种控件不能过分拥挤也不能过分宽松。要善于利用窗体和控件的空白,以及分割用的线条。

设计原则10:和谐的色彩

用户界面是否美观,主要取决于该界面的布局和色彩搭配。对于界面设计人员而言,实现“合理的布局”相对比较容易一些,因为绝大多数的界面元素的形状已经标准化,而且界面元素的组合方式也有约定俗成的规矩可循。然而设计和谐的色彩太困难了,因为色彩的组合千变万化,并且人们对颜色的喜好也极不相同。

对于广大软件开发人员而言,虽然我们没有必要让普通软件的界面漂亮到Windows XP这种程度,但是掌握一些界面色彩的设计原则无疑是非常有益的。

(1)如果不是为了显示真实感的图形和图像,那么应当限制一帧屏幕的色彩数目,因为人们在观察屏幕的时候很难同时记住多种色彩。

(2)应当根据对象的重要性来选择颜色,重要的对象应当用醒目的色彩表示。

(3)使用颜色的时候应当保持一致性,例如错误提示信息用红色表示,正常信息用绿色表示,那么切勿篡用红色和绿色。

(4)在表达信息时,不要过分依赖颜色,因为有些用户是色盲或色弱。

l 用户界面设计流程

图11-6用户界面设计流程

用户界面与品牌。客户通常希望具有用户界面的调整功能,以反映各自公司的品牌风格,因此SaaS应用通常都提供相关特性,以使客户能够更改诸如图形、色彩、字体等相关内容。

外观的配置其实包括的内容很多,但比较核心内容笔者认为是界面元素的多力度模块化,只有实现了这一点,才有可能让用户在多个力度级别上去定义自己想显示什么、以什么样的界面风格去显示。这一点上也一直是笔者认为.Net比较有优势的地方,因为MS的产品一直在构件化上面表现不俗。仅就Asp.net2.0中,已经有Custom Control,User Control,Web Parts,Theme,,Skin, MasterPage等成熟界面技术可以使用;在.Net3.0的WPF(现已更名为SilverLight)中,相信更有很多优秀的模块化界面技术的出现,笔者尚未研究过。这些都需要我们去学习和发现。

另外,如果我们继续采用基于浏览器的软件系统,Web程序的“体验本地化”是必不可少的工作,在这方面AJAX技术已经越来越成熟,MS的AJAX 1.0正式版已经发布。

我们在学习这些界面技术的时候,不仅要学习它们的使用方式,还要明白它们底层的编译模型和运行模型,这样我们才能对每个显示模块对象实例如何以最小的运行成本来完成尽可能多的界面显示和交互响应功能有充分的把握。

l 元数据驱动

理想情况下,我们应该能够分离内容、类型、逻辑和其他层次。为完成这些任务,可以广泛使用元数据。例如,通过模板(也是一种元数据)来显示站点。那么更改模板将改变整个站点的外观显示。然而,该任务涉及的不仅仅是CSS类型的功能。元数据驱动的用户界面(UI)还允许您根据用户角色(例如,销售或开发)、控件布局、设备(例如,智能电话或PDA)、授权方式等自定义屏幕。无需在表示层重新部署组件也是其优点之一,因为这在中央存储库中已经完成。

所有配置信息以及UI信息都保存在一个元数据存储中。这些配置信息包括事件发布/订阅信息、本地化和权限(访问网站各个部分的权限、内容权限、浏览客户信息的权限和管理权限)。目前使用配置文件来保存配置信息;一旦发生更改,必须访问包含这些文件的所有目录来重新设置。丢失其中一个文件就可以(甚至必然)导致部署失败。而中央存储则消除了这种情况的发生,从而大大地提高了灵活性、可管理性、可部署性和安全性。

11.8 自定义业务流程

为了能广泛地向各种潜在客户提供服务,任务关键型SaaS应用必须能够满足不同工作流程的需要。例如,对于跟踪发票流转的应用而言,一家客户可能要求所有发票均由同一名经理批准;另一家客户则要求每张发票都由两名经理先后批准,第三家客户则要求每张发票得到两名经理批准,而不考虑先后。这时,不同客户应能根据需要自行配置应用的工作流程,以满足各自的商业进程要求。

所谓业务流程,其实应该属于经典的工作流(workflow)问题。所以这一方面尽管非常重要与复杂,但研究起来重点却最为突出,无非就是两个:

(1)对工作流方法论的研究。笔者没作过关于工作流的开发项目,在这方面暂时没有发言权,但笔者认为在利用工作流相关的工具和类库进行开发之前,应当在方法论上对工作流有一个比较有度的把握。

(2)对各种现存的工作流工具的研究。工作流是企业开发的重点,相关的产品应该不少,笔者知道的主要工具如下:

a.WF(Microsoft Workflow Foundation),这是.Net3.0新增的三大类库之一,专门用于对工作流技术的支持。

b.BPEL(Business Process Execution Language),这是由IBM牵头搞的一个利用XML来描述业务过程行为的标准,目前在业界也得到了广泛的支持和应用。当然,BPEL并不完全等同于工作流,它对人、角色、工作项目等并没有明确定义,重在刻画一个基于Web服务的业务流程。

自定义业务流程是通过工作流组件实现的,其设计与实现原理见第9章的9.7节。

11.9 自定义报表

大多数供应商缺乏企业级报表的经验,难以理解和解决该领域复杂的技术问题。Actuate高度重视企业级报表,花费数百年时间进行艰难的研究,以开发真正具有扩展性的企业级报表架构。因此,当许多企业级报表架构由于少量的CPU配置而碰壁时,Actuate能轻松扩展至巨大的配置:80块或更多的CPU。

成功的规划是扩展性的规划

不管应用程序的规模大小如何,企业都仅应考虑在公布、公开、详细的基准中证实具有极佳的扩展性和卓越性能的报表解决方案。

如果应用程序不具备扩展性,必将自断其成功之路。随着在不能扩展的系统上的用户数量不断增长时,响应时间将不断延长,以至用户无法接受。更糟糕的是不管增加多少硬件,系统都无法处理更多的用户。事实上,一些企业级报表应用程序平台在添加硬件后性能更为糟糕,这种现象称为“消极扩展性”。

用户数量增长不可避免

如果企业级报表应用程序取得成功,用户的数量必将不断增长,并远远超出原先估计的用户数量。如果企业内部所有用户都已采用程序,大多数组织接着将应用程序向合作伙伴和客户扩展。此外,随着报表应用程序的价值和成功得到越来越广泛的认可,在同一报表基础结构上开发和运行更多的企业级报表应用程序,用户数量则立即大量增加。最后,当今商业环境风云变幻,收购和并购时时发生,因此用户数量将不可避免地增长。

人数增长+不能扩展的报表=灾难

成功的报表应用程序必然导致用户数量不断增长,但如果该应用程序是建立在不能扩展的平台之上,所有这种增长可能会带来极大的麻烦。

在不能扩展的架构中,用户请求相互干扰。随着用户数量的增加,用户请求和作业之间的“冲突”将呈指数的增加,导致用户响应时间增长,服务不稳定,以及糟糕的用户体验。增加硬件可以有限地解决问题,但冲突仍呈指数增加,导致每个增加的CPU使用效率越来越低。最终在某一点,添加再多硬件也不会改变用户响应时间,增加的用户也无法获得支持,这就意味着系统已陷入绝境了。

当报表解决方案陷入绝境时,

l 用户响应时间直线上升

l 用户体验难以忍受

l 用户生产效率直线下降

l 违反《服务水平协定》,常常发生赔偿

l 系统用户总数也许将大幅度和永久地下降

在这种情况下,唯一的措施就是摒弃不能扩展的报表平台,用真正能达到近乎完美的扩展性的企业级报表应用程序平台取而代之,代价将十分昂贵——浪费了努力和金钱,损失了时间并破坏了声誉。

如果一开始就使用真正可扩展的企业级报表应用程序平台,这种情况就可以避免了。

自定义报表是通过报表管理组件实现的,其设计与实现原理见第9章的9.5节。

11.10 通过Ttyu Workflow实现可配置性

今天的行业面临着一个日益严峻的问题:业务逻辑和应用程序数据分散在整个组织的多种软件资产中。其中的许多数据都驻留在数据库、打包的应用程序(如企业资源规划(enterprise resource planning(ERP)系统)或后端系统中。其他的业务逻辑可以在现有的Java和J2EE应用程序中找到。

工作流功能为应用程序开发提供了一种新的、面向服务的方法。使用直观的流程定制工具,您可以利用现有的软件资产并迅速地定义如何在一个新的J2EE应用程序中使用这些资产。例如,可以把来自于已打包的CRM解决方案的客户信息和来自于现有的面向客户应用程序的J2EE代理与新的业务逻辑结合在一起创建一个新的、基于Web的订单输入应用程序。然后,通过将该应用程序作为一个Web服务来发布这个服务。

使用天宇Workflow,开发者可以用可视的方式定制流程提高工作效率,因为天宇Workflow提供标准方法用来组织任意软件资产、并与之有效交互,因此就不必花时间处理不同的接口和低级API,并提供了一个单独的管理和部署环境。

Ttyu Workflow产品由表单定制工具、流程定义工具、工作流引擎、管理监控工具、开发接口等组成。

图11-7 Ttyu Workflow产品

1. 表单设计工具(form designer)

用户可以使用图形化设计方法,开发出动态页面应用,其结果可保存为xml,并具有数据库访问能随需应变Build On Demand力。可针对流程内每一个步骤设计不同的表单,也可数个步骤采用相同表单。通过简单的拖放连结(drag-drop linking),可以轻易地将表单字段与流程电子表单连结。

l 可视化设计界面,简单易用。

l 与流程设计器紧密结合,方便form数据的配置。

l 提供灵活的有效性验证功能

2. 流程设计工具(process designer)

通过图形化操作界面,让开发者用最少的时间设计或修改业务流程。

无需复杂的程序开发即可设计工作流应用程序。

提供流程定义接口,方便与应用数据库整合。

提供系统扩展接口,方便扩展流程功能。

提供丰富的定义接口,可方便准确地选择每个活动执行的参与者。

流程定义文件以XML格式存储,符合XPDL标准。

3. 工作流引擎(workflow engine)

它是应用控制和运行的中心,负责解释、控制并协调各种复杂工作流程的执行并且同步各个客户端的反应。

它使用J2EE与应用数据库以提供事务完整性、安全性、扩展性、冗余与动态负荷分派。因为本工作流完全符合WFMC标准,因此它的强大的流程控制功能可以轻易整合到其它应用程序。这样的设计理念使得本工作流能符合政府或企业内重要任务的工作流自动化需求。

4. 流程监控工具(monitor)

它采用图形化的交互界面,能实时跟踪各项工作的进度,用直观的图形来表示所有工作的执行状况,可以在最短的时间内找到业务执行中所需要的答案。可以确切了解政府或企业内所有工作流程的执行情况、成本、问题。

流程监控工具结构图如图11-8:

图11-8流程监控工具结构图

组件图如图11-9:

图11-9流程监控工具组件图

开发优势

l 降低开发难度,缩短开发周期。

l 与其它应用程序无缝地集成。

l 利于系统的维护和升级。

l 满足用户变化的需求。

l 为应用间的联系提供统一的方式。

l 业务流程管理(BPM)。

l 降低开发风险:业务分析师和开发人员使用相同语言交谈(如状态和动作术语),这意味着开发人员没有必要将用户需求转化成软件设计。

l 集中实现:业务流程经常变化,使用工作流系统的最大好处是:实现不再是散落在各种系统中模糊整合的软件片断。

l 加快应用开发:您的软件不再有在流程中保持与参与者联系的任务,开发更快,代码更容易维护。

l 更好的流程控制:通过标准的工作方法和跟踪审计,提高了业务流程的管理。

l 改进客户服务:流程的一致性,提高了各层次对客户响应的可预见性。

l 灵活性:基于流程的软件控制,使得可以重新设计以符合业务需要的变化。

l 业务流程改进:聚焦业务流程,导致它们的流线性和简化性。

l 改进的迭代开发支持:工作流系统使得新业务流程很容易部署,业务流程软件可以使用迭代方式开发,因此使用工作流系统使开发更有效、风险更低。

技术优势

l 系统参数可调:在系统设计上使系统的运行指标可以调整,方便用户配置自己运行环境。

l XML技术:采用XML技术,使系统具有良好的可扩展性,方便系统升级和客户化。

l 可伸缩性强:采用网络数据库和多层结构的设计,使系统可配置在多种硬件环境中,适用范围广。

l 安全性高:采用EJB开发业务逻辑模块,数据安全性、事务完整性有保障。

l 可维护性强,采用代理化设计,便于系统改进及维护升级。

l 标准化:系统设计完全遵循J2EE和XML规范,可以方便地与其它系统兼容或集成。

l 通用性:系统功能可以应用在有流程的各种场合。

l 跨平台性:由于系统构建在J2EE平台上,具有良好的平台无关性,可以安装在任意一台能够运行Java虚拟机的主机上。

l 支持web服务:通过web服务于其他系统无缝结合,具有连接不同系统最大的灵活性。

产品特性

l 图形化的流程定义工具。灵活设置流程各环节参与者,根据环节自动设置可运行的按钮操作,流程监控,可以对流程的运行进行监控,可以看到所有正在运行的可监控的任务,附加操作,可以用来实现表单上的运算规则,比如计算报销总额之类的功能。

l 图形化的表单定制工具。所见即所得的自定义布局、表单内容、多页、子表单、表单斜划线、定义支持手写表单,支持公共评论,支持相关数据链接,子表单行列可合计。

l 图形化的管理监控工具。管理人员以图形化的方式对流程进行实时的监控。

l 便捷的Web办理客户端。用户只要拥有浏览器即可,减少维护成本。

l 复杂流程的解释能力。

l 稳定的引擎服务器。

l 用户系统可替换,用户只能看到自己的文件。

l 应用程序集成能力。引擎可以调用JAVA、web服务等。

l 系统工具高度集成并可更换。由组织机构管理统一进行用户权限管理,由管理工具统一系统设置。

l 完备的应用开发接口。系统提供了完备的接口;用户可以通过接口对工具和办理客户端进行定制开发。

l 简单易用的实例。系统提供一些应用实例作为用户开发的例子。

l 提供分布式流程。

l 工作流应用系统架构由应用决定。

l 适于组织内部应用与跨组织使用。

l 参照WFMC标准和OMG工作流模型。支持会签、支持提醒、催办、支持任务回调、并发环节支持条件、根据表单内容动态控制流程。

应用领域

工作流管理系统作为一个企业级的应用系统,其主要应用在以下几个领域:

1.实现政企流程自动化的应用平台

WFMS最直接的用途就是和企业业务流程重组BPR(Business Process Reengineering)技术相结合管理政企的各种流程,实现政企流程的自动化。

业务流程重组近几年来在管理领域较为热门,它是管理理论发展的最新阶段,是对政企过程中的核心流程进行根本的重思考和彻底的重设计,以便在现今衡量政企表现的关键如成本、品质、服务和速度等方面获得戏剧性的改善。许多政企对其流程进行了重组,取得了巨大的效果,例如,IBM信贷公司通过实施流程重组,把为顾客提供融资服务的周期减少了90%(由原来的7天压缩为4个小时),而把生产力提高了100倍;柯达公司对新产品开发实施流程重组,结果把35毫米焦距一次性照相机从产品概念到产品生产所需要的开发时间一下子缩短了50%,从原来的38周降低到19周。

2.政企信息系统的开发平台

当前政企信息管理系统从一开始的基于文件系统的应用发展到现在的基于数据库系统的应用,在政府和企业界得到了普遍的认可,许多政企基于数据库管理系统开发了自己的应用系统,许多专业公司也为广大用户开发了一系列成熟的数据库应用系统,如企业资源规划系统ERP(Enterprise ResourcePlanning)、供应链管理系统SCM、客户关系管理系统CRM、产品数据管理系统PDM(Product DataManagement)、计算机辅助工艺管理系统CAPP(Computer Aided Process Planning)、办公自动化系统OA、银行综合业务系统、企业协作环境CPC等等。虽然这些数据库应用系统得到了一定的应用,但是对于大型的管理系统如ERP系统却鲜有实施成功的案例,如2000年Dell公司宣布实施ERP工程失败,就是一个例证。分析这些失败的案例,我们认为除了政企计算机应用水平、管理水平的限制之外,这些计算机应用系统设计存在固有的缺陷,也直接导致了这些基于数据库的信息系统应用的失败。我们认为信息管理系统是信息收集、存储、处理、流转、发布的过程,数据库管理系统适用于信息的收集、存储和检索,而复杂信息管理大量工作都是信息的处理、流转和发布的过程,数据库管理系统对于信息的处理、流转和发布却显得力不从心。为了解决这一问题,传统的解决方法是把这些过程固化在应用系统中,这样就带来了应用系统灵活性不高的缺陷,无法适应各个政企千差万别的业务流程和信息发布形式的需要,必然导致此类应用系统实施失败案例高发的现象。

为了解决以上问题我们提出了新一代柔性信息系统开发构架,应用系统不是单单基于数据库管理系统而是基于DBMS、WFMS和通用报表系统组成的集成开发平台上。DBMS负责信息的存储和检索,WFMS负责信息的流转,通用报表系统负责信息的发布形式的表示和信息的收集,应用系统负责信息的处理,这种模块化的体系结构使信息的收集、存储、处理、流转、发布相分离,即保证了系统的可靠性,又保证了系统的柔性和扩展性,我们相信工作流管理系统必将成为下一代信息系统开发的基础平台和核心技术。

当前WFMS在许多政企信息系统已得到了一定的应用,典型应用如下:

l 图像处理领域:利用WFMS把扫描处理后得到的电子格式的文档按照一定的流程路由到相应处理人员中,这一领域是WFMS最早的应用领域。

l 文档管理系统:文档管理着眼于对文档全生命周期的管理,除了检索和储存功能外,文档管理另一项重大的功能就是如何把各种类型文档按照一定的流程传递给相关人员,许多文档管理系统采用了工作流技术。

l 产品数据管理系统:该系统是一个用于管理政企产品生命周期的设计管理系统,它包括图档管理、过程管理、项目管理、产品配置等等功能,其中过程管理实现对产品图档设计、打印、发放、更改等等的管理,这也属于WFMC应用的范畴。

l 群件系统:群件系统是一个提供组织中个人信息交互和共享功能的应用系统,WFMS可以看作是一个支持结构化异步协作的群体系统,是对支持同步、非结构化协作的群体系统的补充。

l 电子商务领域:应用WFMS作为商业流程处理的有效工具,如基于WFMS的邮件处理系统,能根据政企定义的规则,把不同客户的电子邮件自动路由到相应的部门,做出相应的操作和反应;基于WFMS的客户管理系统,基于WFMS的供应链管理系统,也展示了巨大的商业前景。

l ERP系统:该系统涉及对大量业务流程(销售、订货、订单、人为资源等等)的管理,使用工作流技术可以实现应用系统根据政企的要求自动配置流程,大大提高系统的柔性。

11.11 小结

本章介绍了SaaS应用系统的可配置性。SaaS的可配置性是通过自定义表单来实现。其重点是工作流的应用。实现原理是通过元数据把业务与数据分离并存储。

通过上面讨论如何实现系统的可配置性。用户利用系统的可配置性工具,包括自定义表单、自定义数据模式、自定义工作流、自定义报表来达到SaaS系统的用户个性的需求。不同用户有不同要求,SaaS系统本身是解决共性的问题,按标准和共同功能来满足普遍的用户。但这远远不够,没有个性的东西是难推广和得到用户的认可的。所以您应该在可配置性方面下功夫,让用户自己开发功能,让用户参与进行,变成共同的事业,这种互动性是时代发展的必然趁势。

SaaS模式、技术与案例详解——第11章 可配置性相关推荐

  1. SaaS模式、技术与案例详解——第12章 数据存储

    [本章导读语] 不积跬步,无以至千里. ________<荀子.劝学篇> 信任,或是缺乏充分信任,都是妨碍SaaS推广的首要问题.我们可以说,关于产品.客户.雇员.供应商等的数据是商业运营 ...

  2. SaaS模式、技术与案例详解——第16章 SaaS模式可行性分析

    [本章导读语] 模型可以澄清相互间的关系,识别出关键元素,有意识地减少可能 引起的混淆. ________凯文.福斯伯格,<可视化项目管理> SaaS系统包括SaaS平台及应用系统,Saa ...

  3. SaaS模式、技术与案例详解——第18章 如何做得更好

    [本章导读语] 最好的软件开发人员都知道一个秘密:美的东西比丑的东西创建起来 更廉价,也更快捷. ________Robert C.Martin<软件之美> 18.1 先进的SaaS解决方 ...

  4. SaaS模式、技术与案例详解——第15章 SaaS平台的技术选型

    [本章导读语] "笑嘻嘻的小猫咪,"爱丽斯问道,"请您告诉我,我应该走哪条路 呢?""那取决于您想去何方."小猫回答说. ________路 ...

  5. SaaS模式、技术与案例详解——第9章 SaaS平台基础组件分析与设计

    本章导读语] 所有真正杰出的设计一旦被设计好,看起来都是那么的简单和显而 易见.但是在获得杰出设计的过程中,需要付出令人难以置信的努力 ________Michael Abrash<波斯王子:时 ...

  6. java me基础教程 pdf_Java ME手机应用开发技术与案例详解 PDF

    资源名称:Java ME手机应用开发技术与案例详解 PDF Java ME手机应用开发技术与案例详解基于Java ME,系统描述了Java ME手机应用开发的各个方面.全书按照Java ME程序的开发 ...

  7. Visual C++网络编程经典案例详解 第9章 实用播放器 数据读取与播放控制 识别数据文件信息

    识别数据文件信息主要是指对mp3数据格式识别 定义顺序代码如下 typedef struct mp3_struct //自定义mp3结构体 {char heade[3]; //tag字符标记char ...

  8. Visual C++网络编程经典案例详解 第8章 网络文件传输 使用api函数操作文件 创建文件 CreateFile原型

    使用mfc编程 处理使用CFile类操作文件 还可以使用api函数 有关文件操作的函数进行编程 用户可以使用函数Create()进行创建文件对象 HANDLE CreateFile{LPCTSTR l ...

  9. Visual C++网络编程经典案例详解 第5章 网页浏览器 CHtmlView类 查看源文件

    在菜单 查看源文件 的消息响应函数中实现完整的查看源文件功能 void CMainFrame::OnViewmenu() //查看源代码函数 {char sch[2048]={0};CFile fil ...

最新文章

  1. python网络编程及高并发问题
  2. MIT Molecular Biology 笔记5 转录机制
  3. Thinkphp 3.2中控制页面不缓存
  4. Redis 数据结构的实现
  5. 海洋CMS仿爱美剧网站模板源码
  6. Python+matplotlib绘制散点图模拟心型图案
  7. day17 appium环境搭建
  8. Pytest学习-如何在用例代码中调用fixtrue时传入参数
  9. SqlMapConfig.xml 的配置
  10. 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
  11. 三洋p6系列伺服电机说明书_松下A6系列驱动器电路板坏了维修_常州凌科自动化科技有限公司...
  12. Justinmind使用教程(6)——Justinmind的切换事件toggle
  13. android 侧滑栏教程,Android控件开发——DrawerLayout侧滑菜单的实现
  14. 强大的nginx反向代理异步传输模式(原理)
  15. List集合在遍历时删除数据的问题
  16. android能用svg格式,关于Android SVG图形:Android SVG图形 – 将当前PNG文件转换为svg格式的缺点...
  17. Nacos服务端ip地址修改
  18. 动态网站基本上都是有后台的,静态的网站就是纯HTML的网站的,这样的网站是没有后台的
  19. FPGA零基础学习:基于FPGA的音乐蜂鸣器设计(附代码)
  20. 小黑抱紧沛奇老师课程的大腿,继续学习git的日常积累:沛奇老师git笔记(git命令与分支)

热门文章

  1. 斯坦福NLP名课带学详解 | CS224n 第20讲 - NLP与深度学习的未来(NLP通关指南·完结)
  2. C语言中(a<b<c)的理解
  3. 使用NSIS制作驱动安装包
  4. IFTTT Evernote 自动生成笔记
  5. 使用ESXCLI将ESXi 6.5或6.7升级到ESXi 7.0
  6. Flash MX 2004 编程(AS2.0)教程(一)
  7. C#GPS坐标转百度地图坐标
  8. 一款好看的导航网源码 全静态页面带特效
  9. ros2 foxy 设置publisher与subscription的qos
  10. CATV网发展方向—宽带商业网