# 角色

> 用户页面的角色根节点、带着权限范围条的角色列表，以及设置一个角色的名称、说明和权限开关的那块角色面板，包括那两个固定角色。

**角色**根节点底下每个角色一个节点。一个角色就是一组有名字的权限开关；用户绑定到它上面，改动它就一下子改动了持有它的每一个用户。工作站出厂时带六个角色。两个是固定的：**未登录**（有人登录之前生效的那个角色）和 **Admin**（完全访问）。四个是普通的、可以编辑也可以删除的建议：**Viewer**、**Operator**、**Maintainer** 和 **Developer**。

和用户根节点一样，这个根节点和它的子节点属于这条回路上的管理员（管理本地用户）。别的人看到的是没有子节点的根，以及它背后那条叫人以管理员身份登录的通知。在一台还没有用户的工作站上，那条通知写的是另一句：“角色已经预置好了，但修改角色需要管理员，而本工作站还没有管理员。请先设置本地用户：第一个就是主管理员。”

## 角色列表 {#the-role-list}

打开这个根节点，看到的是**角色**卡片，上面写着“每个角色都能触及这些功能区，深度由它那一条显示。修改一个角色，会改变持有它的每一位用户；修改第一个角色，则改变有人登录之前任何屏幕可以做什么。”，每个角色一行，顺序是固定的：

| 行 | 标记 | 副行 |
| --- | --- | --- |
| 未登录 | 一个走路小人的字形，加上**登录之前生效**这个小块。 | 它的说明，“任何人不登录就能在这台工作站上做的事。” |
| Admin | 一个锁的字形，加上**完全访问 · 已锁定**这个小块。 | 它的说明，“对每一个区域的完全访问，外加管理用户。” |
| 其他每一个角色 | | 设了说明时是它的说明；否则是它够到多深的一份实时摘要（“可以改动 6 个功能区中的 {n} 个”“仅查看”或者“无权限”），于是空着的说明绝不会让这一行留白，过时的说明也绝不会赖着不走。 |

可编辑的角色按这一行显示的名字排序，不分大小写，于是新建或改名的角色会落在它们中间该在的位置。栏里和用户面板中的角色下拉列表也按同样的顺序列出角色。

每一行后面都跟着它那条紧凑的权限范围条，六个刻点，到处都是同一个顺序，于是这些角色读起来是一把梯子，而不是一串名字。一个可编辑的角色也不剩时，卡片写着“本工作站上只有‘未登录’和管理员这两个角色。用‘新建角色’为这张试验台实际要做的工作建一个。”

点一行就打开那个角色的节点。在栏里，每个角色节点后面也跟着同一条紧凑的范围条；未登录那个节点在一串钥匙当中戴着那个走路小人的字形。

## 出厂角色 {#the-factory-roles}

| 角色 | 出厂时的说明 | 它持有什么 |
| --- | --- | --- |
| 未登录 | 任何人不登录就能在这台工作站上做的事。 | 除了管理本地用户和远程访问（局域网）之外的一切。 |
| Admin | 对每一个区域的完全访问，外加管理用户。 | 每一项权限；固定。 |
| Viewer | 对整台工作站只读。 | 查看仪表画面、查看 Connector、查看模型、查看历史、查看 Logic、查看验证、查看事件、远程访问（局域网）。 |
| Operator | 日常跑这条线。操作仪表画面和 Logic，运行流程。 | Viewer 再加上操作仪表画面、操作 Logic、运行流程。 |
| Maintainer | Operator，再加上校准和配置 Connector、导出数据，以及管理已记录的运行。 | Operator 再加上校准点位、配置 Connector、导出/导入历史、管理历史。 |
| Developer | 搭画面、搭逻辑、搭流程：除了工作站管理之外的一切。 | Maintainer 再加上编辑仪表画面、配置 Logic、管理 Process（它会把编辑配方与判定一起带上）。 |

这把梯子是一个建议，不是一份合同：Viewer、Operator、Maintainer 和 Developer 都可以重命名、编辑和删除。这份预置只跑一次，跑在角色表为空的工作站上；删掉的预置不会回来。未登录在设计上就是宽松的，于是一台新工作站在没有人登录时也完全能用，而把它收紧是一个刻意的动作。

上面这六个名称和六条说明，没有一条是存下来的字：工作站给每一个存的是一把钥匙，再按界面语言把它读出来，于是这份清单读起来和屏幕上其余部分一样。给其中一个重命名，或者写上你自己的说明，工作站就把你键入的内容存下来：从那时起，无论界面是哪一种语言，那个角色都读作同一句。

## 角色面板 {#the-role-panel}

一个角色的面板边做边保存：名称和说明在离开字段时保存，开关在拨动的那一刻保存。选中的角色刚被另一幅界面删掉时，面板写着“该角色已经不在本工作站上。请在左栏另选一个。”运行时停止期间，这块面板根本不在：和除了[账户](account)之外的每一块屏幕一样，本页被那条暂停通知顶替（见[用户](users#what-the-page-does-not-do)）。

### 抬头、名称和说明 {#head-name-and-description}

抬头带着这个角色的行在栏里所戴的那个字形（一把钥匙，未登录上则是那个走路小人）、角色的名字，以及名字底下说明这个角色是什么的一行。Admin 带着**完全访问 · 已锁定**这个小块。未登录带着一个小块，写出这台工作站对没有登录的人敞开到什么程度，而它的那一行就是跟着这个小块的那句话：

| 小块 | 什么时候 | 那句话 |
| --- | --- | --- |
| 开放 | 有三个或更多功能区处在操作或者管理级。 | “不登录时，站在本工作站前的任何人都可以操作或配置 6 个功能区中的 {n} 个。把下面的开关关掉即可收紧。” |
| 受限 | 有一两个功能区处在操作或者管理级。 | “不登录时，站在本工作站前的任何人都可以改动 6 个功能区中的 {n} 个；其余的只能查看或者完全关闭。” |
| 仅查看 | 没有哪个功能区高于查看级。 | “不登录时，站在本工作站前的任何人都可以查看下面这一条显示的内容，但什么都改不了。” |

在其他每一个角色上（Admin 也在内），那一行是这个角色的说明，读法和列表一样：出厂角色的说明用界面语言显示，管理员写下的说明照原样显示。没有说明的角色在那里显示“一组权限，由持有它的每一位用户带着。”，而它在列表里的那一行则显示权限范围的摘要。

| 字段 | 它是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| 角色名称 | 栏里、列表里和用户挑选器里所用的那个名字。 | 最多 60 个字符；新角色一开始叫**新建角色**；名字留空就保留原来的。在未登录和 Admin 上是锁着的。 | 在离开字段时提交；操作记录条报出“已把该角色重命名为‘{name}’。” |
| 说明 | 这个角色在列表里的副行，也是抬头里名字底下的那一行。 | 最多 200 个字符，占位文字“这个角色是做什么的”。在未登录上隐藏；在 Admin 上只读。 | 在离开字段时提交；操作记录条报出“已保存‘{name}’的说明。” |

名称字段下面，那两个固定角色带着一句说明：“管理员角色是固定的。它始终拥有完全访问，并且可以管理本地用户。”以及“‘未登录’是没有人登录时生效的角色。它的权限可以修改；角色本身不能重命名、不能删除，也不能指派给用户。”说明字段的提示写着“显示在角色名称下面。修改角色能做什么时，请一并更新它。”

字段下面，卡片实时读出这个角色够到多深：那句摘要、**由下面的开关决定**这几个字，以及带标签的范围条。每拨一次开关它就重新成形，早于写入返回。它从不用来编辑：系统那个功能区混着彼此独立的开关，所以一个刻点没法反过来对应到其中某一个。

### 权限 {#permissions}

**权限**卡片以三句开场白之一开头：

- Admin：“管理员角色始终拥有完全访问，因此它的开关是固定的。它就是可以管理用户的那个角色，本工作站始终保留一个。”
- 未登录：“每个开关一改就立即生效，作用于每一块没有人登录的屏幕。”
- 其他每一个角色：“每个开关一改就立即生效，作用于这个角色以及持有它的每一位用户。”

接着每个功能区一组，抬头是这个功能区的字形、它的名称和一个计数，“{total} 项中的 {on} 项”：仪表画面（3）、Connector（3）、Process（4）、历史（3）、Logic（3）、验证（1）和系统（5）。每一行是一个标签、一句说明和一个开关。完整的目录，连同每一个标签和说明逐字照写，写在[权限](users-permissions)页面上。

一个开关在四种情况下是锁着的、拨不动：

| 锁着的开关 | 为什么 | 它读起来是什么样 |
| --- | --- | --- |
| Admin 上的每一个开关 | Admin 那份掩码是固定的。 | 打开、变灰、不带标记。 |
| 其他每一个角色上的管理本地用户 | 这是 Admin 独有的。 | 关闭、变灰。 |
| 查看仪表画面 | 那个下限；它永远收不回。 | 打开、变灰、标着**必需**。 |
| 依赖它的那个开关正打开着的前置项 | 打开那个依赖它的开关时把它一并打开，并且一直按着它。 | 打开、变灰、标着**必需**。 |

把一个开关拨开，也会把它所需要的那些一并打开（操作仪表画面会打开查看仪表画面；管理 Process 会打开编辑配方与判定、运行流程和查看模型）。把一个开关拨关，也会把需要它的一切一并关掉（关掉查看 Connector，会把校准点位和配置 Connector 一起带走）。这些规则列在[权限](users-permissions#implication-rules)页面上。每拨一次都把整个角色一次写下去，操作记录条报出“{Label}：已为“{role}”开启。”或者“{Label}：已为“{role}”关闭。”；工作站拒绝的写入会把开关退回到它实际持有的样子，并报出“未能保存该角色：{reason}”。

工作站还会把存下来的东西规范化：非 Admin 的角色绝不保留管理本地用户，而每一份存下来的掩码都带着它的那些前置项，于是一个角色总是自洽的。

### 对谁生效，或者谁持有 {#in-force-for-or-held-by}

最后那张卡片，在这个走进来就用的角色和其他每一个角色之间是不一样的：

- 在未登录上，**适用范围**写着“每一块没有人登录的屏幕，包括本工作站自己的和任何查看它的设备。没有人会被指派这个角色；它是在有人登录之前一直适用的东西，登录之后就换成那位用户自己的角色。”以及“因为本工作站依赖它存在，这个角色始终保留：它的权限由你设定，它的名称和它的存在则不由你定。”
- 在其他每一个角色上，**持有者**列出持有它的那些用户的显示名，并写着“你在这里改动的每一个开关，都会改变他们所有人可以做什么。”没有人持有它时，它写着“还没有用户持有这个角色。请在‘用户’下某位用户自己的页面上指派它。”

## 创建和删除一个角色 {#creating-and-deleting-a-role}

栏底部的**新建角色**创建一个从下限起步的角色：查看仪表画面和向 Ganter 发送反馈打开，其余一律关闭，说明为空。新角色不会被打开：它的那一行在角色列表里突出显示并滚动到可见处，按这一行就打开它。请刻意地一点点加上它够得到的东西；注意一个空白角色并不持有查看事件，而每一个出厂角色都有这一项。详情栏上的**删除角色**会问“要删除角色‘{name}’吗？此操作无法撤销。”，并在下列情况下被拒绝、变灰并写出理由：在那两个固定角色上（“{Name} 是固定角色：本工作站依赖它存在。”），以及还有用户持有它时（“有用户持有这个角色。请先把他们改到别的角色。”）。

## 一次改动怎么到达每一个人 {#how-a-change-reaches-everyone}

这些角色住在整台工作站都在读的同一个服务里。拨动一个开关，会一下子到达每一条连接上持有这个角色的每一个用户：工作站窗口、每一个浏览器、每一个已登录的操作员。界面在每一次按下时重新检查角色，所以一个角色刚失去某项权限的操作员，即使界面早就画好了，下一次按下时命令也会被拒绝。角色在脚底下被删掉的用户，会落到那个下限上。一幅在**可见角色**清单里点名了被删角色的仪表画面，会把那一条当作静止的，于是这幅仪表画面绝不会变得谁也够不着。

## 这块面板不做什么 {#what-the-panel-does-not-do}

- 它不分配用户。那是每个用户页面上的角色挑选器，在[用户](users-local-users#role)底下。
- 它不改动 Admin：不改它的开关，不改它的名字，也不改它的存在。
- 它不给未登录重命名，也不删除它，而且不在任何用户的角色挑选器里提供它。
- 运行时停止期间，无论在工作站窗口还是在任何浏览器里，它都不画出来：本页被那条暂停通知顶替，所以在运行时重新启动之前，既不能创建、重命名、描述或删除角色，也不能拨动它的开关。
- 它没法把管理本地用户授予 Admin 之外的任何角色，也没法从任何角色手里收回查看仪表画面。
