Role

Product Designer

Timeline

2023/6 - 2023/8

Tool

Figma

Field

UI/UX,Interaction Design

项目背景

虚拟机是 CloudTower 运维管理平台的核心资源之一,它一直承载着不同行业客户的各类重要业务。因此,虚拟机相关功能的用户体验对于 SmartX 核心产品力至关重要。在 Tower 3.0 的产品周期内,我们收到了一线同事关于用户使用批量创建虚拟机功能的优化反馈。

用户需求与痛点

实际生产环境中,客户通常会使用虚拟机 IP 地址来命名虚拟机,包含连续的 IP Range 和独立编辑虚拟机名称两类场景。然而当前的虚拟机批量创建方式为两段式,命名方式上缺少一定的灵活性,难以满足用户的实际需求。

用户目标

需求点

灵活的 IP Range 命名

IP 独立编辑

产品现状

功能点

连续固定的 IP Range 命名

不支持独立编辑

核心问题:产品已有功能不能满足用户对于更灵活的命名方式的使用诉求。

具体来说,某些金融客户的虚拟机命名规范是:IP 地址 + 主机名,创建虚拟机时会将 IP 地址一起进行分配。已有的批量命名方式是,前半部分固定,后半部分依次顺延,然而客户的命名习惯却是前半部分顺延,后半部分固定。

其次,生产环境中分配到的静态 IP 通常不是连续的,而是哪个 IP 空出来了,就拿来分配给某个应用使用。因此,除了需要快速构建出连续的 IP Range 外,客户还存在自行填写或独立编辑某一个或某几个虚拟机名称的需求。

已有批量命名方式:前半部分固定 + 后半部分顺延

用户预期的命名方式:IP 地址顺延 + 独立编辑

设计目标

本次的设计目标是探索新的交互方式或流程,使用户能够根据自己命名习惯灵活快速地创建虚拟机,从而提高日常运维效率,降低操作成本。功能上需要达到以下 2 点:

  • 支持灵活批量自定义虚拟机名称;

  • 支持批量创建时独立编辑虚拟机名称。

概念设计

设计思路上,为了满足用户更加灵活快速地批量创建虚拟机的需求,新版方案中引入了一种「高级模式」交互,支持使用表达式来灵活自定义虚拟机名称,旧版方案的交互模式保留为「简单模式」。体验旧版交互流程

设计思路上,为了满足用户更加灵活快速地批量创建虚拟机的需求,新版方案中引入了一种「高级模式」交互,支持使用表达式来灵活自定义虚拟机名称,旧版方案的交互模式保留为「简单模式」。体验旧版交互流程

设计方案探索

以上述思路为核心,概念设计初期探索了以下 2 种方案:

方案 1:高级模式 + 逐个编辑。用户可以在批量编辑和单个编辑之间切换。优点是不会复杂化简单创建虚拟机的体验,缺点是会让整体的交互变得更加复杂。

方案 2:高级模式 + 直接编辑。直接展示所有虚拟机名称。优点是交互简单,状态少,缺点是会让界面变得很长。

以上述思路为核心,概念设计初期探索了以下 2 种方案:

方案 1:高级模式 + 逐个编辑。用户可以在批量编辑和单个编辑之间切换。优点是不会复杂化简单创建虚拟机的体验,缺点是会让整体的交互变得更加复杂。

方案 2:高级模式 + 直接编辑。直接展示所有虚拟机名称。优点是交互简单,状态少,缺点是让界面变得很长。

用户反馈与「方案 3」

对于上述的两种方案,我个人更倾向于方案 2:设计上更直观,也可以满足较复杂的需求。但从一线同事的反馈中收获了不同视角的见解。

在此基础上,我继续探索,力求拿出一个两全其美的方案:既保留方案 1 和 2 优点,又可以规避两者的缺点。于是便有了下面的方案 3 。

创建虚拟机

使用表达式灵活创建虚拟机

以从模板创建虚拟机为例。新版方案中引入了一种「高级模式」,支持使用表达式来灵活自定义虚拟机名称,旧版方案的交互模式保留为「简单模式」。

创建虚拟机

使用表达式灵活创建虚拟机

以从模板创建虚拟机为例。新版方案中引入了一种「高级模式」,支持使用表达式来灵活自定义虚拟机名称,旧版方案的交互模式保留为「简单模式」。

创建虚拟机

使用表达式灵活创建虚拟机

以从模板创建虚拟机为例。新版方案中引入了一种「高级模式」,支持使用表达式来灵活自定义虚拟机名称,旧版方案的交互模式保留为「简单模式」。

1

基本信息

2

计算资源

3

虚拟盘

4

虚拟网卡

5

其他配置

从模板创建虚拟机

位置

集群

cluster-name

主机

动调度至合适的主机

基本信息

虚拟机模板

template

创建个数

10

(1 ~ 10)

虚拟机名称 起始

示例虚拟机名称-

01

切换至高级模式

虚拟机名称 結束

示例虚拟机名称-10

描述(选填)

虚拟机组

ziruitest

取消

下一步

位置

集群:cluster-name

主機:自动调度至合适的主机

信息

虚拟机模板:template

创建个数:10

名稱:

描述:

虛擬機組:

計算資源

vCPU 分配 : 1 vCPU

内存分配 : 4 GiB

存儲資源

1 虚拟卷,共 40 GiB

1 CD-ROM

可用性

高可用(HA : 启用

引導選項

固件:BIOS

配置規格

简单模式仅支持简单的「名称 + 数字」的 序列命名,无法满足用户批量灵活命名虚拟机的需求。批量创建虚拟机场景(包括从模板创建虚拟机和克隆虚拟机 2 类流程)新增「高级模式」交互流。

插入表达式

虚拟机名称 表达式

10.10.22.{{20+i}}

帮助

20

切换至简单模式

起始

10.10.22.21

展开

结束

10.10.22.30

Help Tip

使用表达式灵活自定义虚拟机名称

  1. 表达式支持递增的变量 ,代表第几个虚拟机。

  2. 支持对变量 进行数学运算(+,-,*,),写在表达式中形如 。

示例

10 个虚拟机,名称中包含连续的 IP 地址和主机名,虚拟机名称表达式填入:

192.168.17.{{ 17 + i }}-hostname{{ i }}

获得的虚拟机名称为:

  • 192.168.17.18-hostname1

  • 192.168.17.19-hostname2

...

  • 192.168.17.27-hostname10

插入 {{i}}

{{ i - 1 }}

{{ 20 + i }}

{{i}}

{{i}}

高级模式支持表达式来批量命名虚拟机。

展开状态

1

10.10.22.22

收起

已修改

2

10.10.22.35

已修改

3

10.10.22.23

5

10.10.22.40

已修改

收起状态

虚拟机名称 表达式

10.10.22.{{20+i}}

帮助

20

切换至简单模式

起始

10.10.22.21

展开

结束

10.10.22.30

已修改 2 项

独立编辑:onChange 状态下,输入框中的值不符合表达式时,展示「已修改」状态。

二次编辑

虚拟机名称 表达式

10.10.22.{{20+i}}-Oracle

帮助

20

切换至简单模式

1

10.10.22.21-Oracle

收起

2

3

4

5

6

7

8

9

10

二次编辑:批量命名完成后,若对父级输入框的值进行二次修改,先前的修改项会被刷新,虚拟机名称展示为新的递增序列。

简单模式

虚拟机名称 起始

abc{{i-1}-Oracle

05

切换至高级模式

虚拟机名称 結束

abc{{i-1}-Oracle14

高级模式

虚拟机名称 表达式

abc{{i-1-Oracle{{i+4}}

帮助

20

切换至简单模式

起始

abc{{i-1-Oracle5

展开

结束

abc{{i-1-Oracle14

简单模式

虚拟机名称 起始

abc{{i-1}-Oracle

05

切换至高级模式

虚拟机名称 結束

abc{{i-1}-Oracle14

高级模式切换到简单模式时,虚拟机名称后缀值会继承到简单模式。

模式切换:从简单模式切换到高级模式时,高级模式虚拟机名称末尾根据简单模式起始值自动转换成对应的变量 {{i}} 形式。

Error Validation

交互的约束与限制

简单模式与高级模式转换的过程涉及到许多错误校验。这里的方案设计上借鉴了 JavaScript 中的保留字概念,即保留字指变量 {{i}} 和对其进行的数学运算形式(+,-,*)。

Error Validation

交互的约束与限制

简单模式与高级模式转换的过程涉及到许多错误校验。这里的方案设计上借鉴了 JavaScript 中的保留字概念,即保留字指变量 {{i}} 和对其进行的数学运算形式(+,-,*)。

Error Validation

交互的约束与限制

简单模式与高级模式转换的过程涉及到许多错误校验。这里的方案设计上借鉴了 JavaScript 中的保留字概念,即保留字指变量 {{i}} 和对其进行的数学运算形式(+,-,*)。

虚拟机名称 起始

abc{{i-1}}

01

虚拟机名称不支持变量 {{i}} 及其数学运算(+,-,*)形式的输入。

切换至高级模式

虚拟机名称 結束

abc{{i-1}}10

简单模式下,为了简化复杂场景的处理,若用户输入了保留字,则禁止切换到高级模式。

虚拟机名称 表达式

abc{{i-1-Oracle{{i-1}}

帮助

20

高级模式下,虚拟机名称表达式末尾的运算结果不能为负值或 0。

切换至简单模式

起始

abc{{i-1-Oracle0

展开

结束

abc{{i-1-Oracle9

虚拟机名称 表达式

abc{{i-1-Oracle

帮助

20

高级模式下,虚拟机名称表达式需要包含变量 {{i}} 或其数学运算(+,-,*)的形式。

切换至简单模式

起始

abc{{i-1-Oracle

展开

结束

abc{{i-1-Oracle

虚拟机名称 表达式

abc{{i-1-Oracle{{i*+4}}

帮助

20

变量 {{i}} 仅支持加减乘(+,-,*)的数学运算。

切换至简单模式

起始

abc{{i-1-Oracle5

展开

结束

abc{{i-1-Oracle14

虚拟机名称 表达式

abc{{i*3}}{{i-1-Oracle{{i+3}}

帮助

20

切换至简单模式

起始

abc3{{i-1-Oracle4

展开

结束

abc30{{i-1-Oracle13

高级模式下,虚拟机名称表达式的开头或中间部分插入表达式变量时,不支持切换到简单模式。

高级模式场景下,输入的虚拟机名称为以下情况时,禁止切换到简单模式。

  • 末尾的表达式值为「 0 或负数」;

  • 不含任何表达式;

  • 开头或中间含复杂 {{i}} 变量运算时。

虚拟机名称 表达式

10.10.22.{{20+i}}

帮助

20

虚拟机名称 10.10.22.21、10.10.22.23 已被使用。第 1、3、4 号虚拟机命名冲突。第 5、6 号虚拟机命名冲突。

切换至简单模式

1

10.10.22.21

收起

与第 3、4 号虚拟机命名冲突。

2

10.10.22.22

3

与第 1、4 号虚拟机命名冲突。

4

与第 1、3 号虚拟机命名冲突。

5

10.10.22.25

与第 6 号虚拟机命名冲突。

6

与第 5 号虚拟机命名冲突。

7

8

9

10

简单模式和高级模式通用

虚拟机名称 起始 & 虚拟机名称 表达式

根据起始和表达式计算出来的所有虚拟机名称中,是否存在与集群已有虚拟机重名的。

验证机制

Submit

提示方式

Inline

错误信息(单个)

虚拟机名称 %name% 已被使用。

错误信息(多个)

虚拟机名称 %name1%、%name2% 10.10.22.23 已被使用。

标红

虚拟机名称 起始 / 表达式 输入框

仅高级模式适用

虚拟机名称 表达式

根据表达式计算或手动修改后,虚拟机名称之间存在冲突。

验证机制

Blur + Onchange

提示方式

Inline:模板 & 具体的输入框

错误信息(模板)

第 X、Y 号虚拟机命名冲突。

错误信息(具体:两个冲突)

与第 X 号虚拟机命名冲突。

错误信息(具体:多个冲突)

与第 X、Y、Z 号虚拟机命名冲突。

虚拟机重名校验。

从模板创建虚拟机

CPU 架构兼容性交互优化

SMTX ELF 6.0 项目周期中,研发同学反馈了「从模板创建虚拟机」场景的一个历史遗留问题。「从模板创建虚拟机」先前的实现是,选择了某种 CPU 架构的集群或模版后,不支持切换到另一种 CPU 架构的集群或模板,即选择集群,与集群 CPU 架构不兼容的模板会被禁用;选择模板,与模板 CPU 架构不兼容的集群会被隐藏。

从模板创建虚拟机

CPU 架构兼容性交互优化

SMTX ELF 6.0 项目周期中,研发同学反馈了「从模板创建虚拟机」场景的一个历史遗留问题。「从模板创建虚拟机」先前的实现是,选择了某种 CPU 架构的集群或模版后,不支持切换到另一种 CPU 架构的集群或模板,即选择集群,与集群 CPU 架构不兼容的模板会被禁用;选择模板,与模板 CPU 架构不兼容的集群会被隐藏。

从模板创建虚拟机

CPU 架构兼容性交互优化

SMTX ELF 6.0 项目周期中,研发同学反馈了「从模板创建虚拟机」场景的一个历史遗留问题。「从模板创建虚拟机」先前的实现是,选择了某种 CPU 架构的集群或模版后,不支持切换到另一种 CPU 架构的集群或模板,即选择集群,与集群 CPU 架构不兼容的模板会被禁用;选择模板,与模板 CPU 架构不兼容的集群会被隐藏。

设计上,支持在不同 CPU 架构的集群和模板之间来回切换,降低了用户的操作成本。

位置

集群

os-cluster-3

仅支持与所选虚拟机模板的 CPU 架构兼容的集群。

VM-Template-a

存储于虚拟机所属集群

VM-Template-b

与所属集群 CPU 架构不兼容

VM-Template-ffn

与所属集群 CPU 架构不兼容

VM-Template-c

存储于虚拟机所属集群

只展示存储于虚拟机所属集群的模板

Before

集群

os-cluster-3

与所选虚拟机模板的 CPU 架构不兼容。

虚拟机模板

VM-Template-c

与所选集群的 CPU 架构不兼容。

After

改动 1:移除了集群隐藏和模板禁用的限制,使用统一的 Error Info 校验,给予用户在选择模板和集群时更大的操作自由度,避免了用户需要离开当前页面重新操作的尴尬。

优化 1:移除了集群隐藏和模板禁用的限制,使用统一的 Error Info 校验,给予用户在选择模板和集群时更大的操作自由度,避免了用户需要离开当前页面重新操作的尴尬。

Search…

elf-cluster-1

ELF

6.0.0

193.168.82.91

x86_64

elf-cluster-2

ELF

6.0.0

193.168.82.92

x86_64

os-cluster-3

OS

5.0.5

193.168.82.99

AArch64

集群 Select Menu

搜索集群…

1-VM-Template

存储于 3 个集群

x86_64

2-VM-Template

存储于 3 个集群

x86_64

3-VM-Template

Cloud-init

存储于 1 个集群

AArch64

模板 Select Menu

改动 2:为了方便用户识别出相同 CPU 架构的集群或模板,防止用户选择 CPU 架构不兼容的 Item,集群和模板 Menu 中都新增了 CPU 架构信息的展示,降低用户操作时的出错率。

优化 2:为了方便用户识别出相同 CPU 架构的集群或模板,防止用户选择 CPU 架构不兼容的 Item,集群和模板 Menu 中都新增了 CPU 架构信息的展示,降低用户操作时的出错率。