White Rose设计与架构的想法分享

news2024/12/23 23:51:07

在七牛云校园黑客马拉松中,一款设计优秀、逻辑清晰的白板作品脱颖而出,获得第二名的好成绩,这就是来自郑州大学Since团队的White Rose白板,以下是他们的设计和架构分享。

一、前言

White Rose是参加七牛云hackathon比赛的作品,赛题的主要内容是开发一个「多人协作白板」,旨在鼓励在校大学生用编程创造价值。

赛题核心需求包含三个:

  1. 多人可以加入一个房间,同时进行绘画(尽可能多的形状随意绘制)
  2. 所有操作可以撤销和恢复
  3. 可以创建不同页面,支持只读模式(页面锁定后,所有人不可编辑)

二、产品设计

(1)愿景

基于hackathon的比赛要求,我调研了一些白板软件,这些软件不乏有一些「操作困难」「功能繁杂」等问题。所以,我定下一个产品愿景:「做一款从两岁到八十岁都能用的白板」

(2)追求

基于以上愿景我也设立了几条产品追求:「功能一键即达」「界面极致简洁」「内容高度自由」

作为乔布斯的粉丝,印象中乔布斯当年设计iphone时,要求工程师所有的功能操作不能超过3步,而对于白板一个单独的软件来说「进入」一步,「功能选择」一步,所以留给我的只有一步了。

(3)界面

为了让界面足够简洁,我将所有「扩展」功能全部放到了「上下左右」四个隐藏菜单里,从而让整个页面除了四个「必要数据」外,就只有一块“纯粹的白板”。

  • 对于两岁的小朋友来说进入就可以直接随意的涂鸦。
  • 对于八十岁老教授来说,这用起来跟教室的黑板一样。

下面分别是整体的界面效果。

无论多大的屏幕,什么形状的屏幕,都会无失真的自动扩张,因为它本质是一个高宽100%的矢量图。

因为不同屏幕的大小限制,这样的设计可能回导致小屏幕的人看到的内容没有大屏幕的「完整」。

对于有些软件的处理可能会有利用「拖拽页面」功能来确保每个人所能接收到的数据一致,这将意味着,用户的每次触屏操作,软件都要区分用户是想「拖拽页面」还是想「绘画」,而用户也需要在两个功能间频繁切换。

而我的理解:“白板”本质是一个大号的草稿纸,当我们给一群人讲一些内容的时候,「演讲者」可能随手会在白板上写下他讲的关键词「power point」,一般作为「演讲者」会写在一个大家都能看到的地方,这对「演讲者」不会增加太大负担,而对于「听众」一边听内容,还要一边还要拖拽页面去确认演讲者写在那里,这个负担更大。

回想一下我们在教室上课的时候,老师会尽量把内容写在中间靠上的位置,而不是底部,因为前排同学会挡到内容。

所以我摒弃了「拖拽页面」的功能。

当然「缩放」也不乏是另外一种解决方案,但是也会徒增操作者(缩放)的使用负担,并且还会引入另外一个问题就是「失真」。

关于颜色:

其实在选择白板的底色的时候,可能就是一个白色,但是其实白色也是五彩斑斓的,该用什么呢?

我想到一个词「青红皂白」,索性我就用「青红」和「皂白」调制了一个对眼睛更加柔和的 「青红皂白色」作为白板的底色。

(4)拓展功能

设计好了整个页面,接下来就是功能设计,我在设计界面的时候,预留了4个隐藏菜单栏来放拓展白板功能,为了让所有功能「一键即达」,并且更简单的使用,我采用了icon + 文字描述的方式,让用户更易理解。

整体展开如下图所示:

为什么是这样的摆放呢?

1、功能分类

根据赛题要求的功能,我将所有功能分为了四类。

  1. 形状拓展:用户可以选择圆、长方形、菱形、三角形、直线等形状。
  2. 颜色拓展:用户可以修改所有形状轨迹的颜色。
  3. 大小拓展:图形的大小和线条的粗细可以切换。
  4. 页面拓展:页面可以添加删除和切换,另外页面的内容支持撤销和恢复。

2、何处安放

我在想这个问题的时候,想象了在一张纸上作画的场景。

  • 一般我们习惯在桌子右侧放上各式各样的水彩笔,方便我们切换颜色,所以我将「颜色拓展」放在了右侧。
  • 我们习惯在桌子的上方和左侧放尺子、圆规之类的用来拓展图形和丰富绘画形状的工具,所以我将「形状拓展」「大小拓展」放在了左侧和上侧。
  • 当我们要做翻书、撕页等页面操作时,一般会从右下角开始,所以我将所有的「页面拓展」放置到了下侧,同时右下角有一个对应页面的页码,也因为大多数书的页码在这个位置。

(5)自由布局

上面讲到,我根据我个人的想法将各个功能进行了分类,并且按照我所理解的「更方便的布局」进行了排放,但在实际操作过程可能并不符合一些其他用户的操作习惯,比如:左撇子。

因此我将每个功能做了集成,并且可以随意的改变不同功能所在的位置,也就是所有的功能布局,用户可以根据自己的想法进行布局上的DIY。

三、架构设计

因为本次开发的周期只有21天,另外工作日的白天还需要上班,非常紧迫。所以需要采用非常简单且高效的架构设计,当然也需要考虑一些后续扩展的可能。

(1)整体架构

为了更好的「持续集成」我们采用自建的gitlab管理代理,并使用gitlab-runner完成自动化部署。

整体架构图如下图所示:

(2)交互模型

对于后端来说,为了更加高效的沟通,我将整个交互模型,定义为一个群聊,群内所有人的消息统一发给服务端,然后服务端再统一转发给其他人。

后端只需要确认三点:1.谁发的消息。2.发到那个群里的。3.消息类型。

整体交互结构如下:

{
"type": 1234,  // 操作类型
"fromId": 123, // 发送人id
"roomId": 1234,// 所在房间
"time": 152150025421564 //时间戳,前端不需要发送
"data": {} // 操作内容
} 

这样做的两个好处:

  1. 所有消息有一个统一的时序(即服务端时间)
  2. 后端完全无需关注「data」的具体内容。只根据type区分「接收」「分发」「存储」操作。

(3)data模型

data模型主要是前端所发送的和接收到的message里的data结构。

data里面该放什么?我将用户的所有操作定义为option,将用户的所有option放到data里面完成用户操作的转发。option的结构如下:

interface Op {
type: number // 页面操作or图形操作
graph?: {
op: number // 添加、旋转、缩放、平移
type?: string // 图形类别
key?: string // 图形所对应的key
page?: number // 图形所对应的页面
content?: any // 图形内容
}
page?: {
op: number //添加、删除、切换页面
key?: number // 页面对应的key
content?: any // 页面对应的内容
}
} 

这样的每个option,我们都会存放到操作栈里面,结合另外一个缓存栈,即可实现撤销和恢复。

(4)多人协同

对于多人的操作,其实是多个人对多个图形的操作,人与当前所操作的图形是一一对应的。

所以我通过一个令牌集的概念,来存放「所有的用户id」,以及每个用户当前「所操作的图形id」,这样就确定下来个每个用户正在操作什么。

不同用户的操作通过以下流程完成:

  1. 操作者设定当前所操作图形的id,并更新令牌集。
  2. 接收者同步更新令牌集。
  3. 操作者发送操作数据(option)。
  4. 接收者根据用户信息从令牌集中确定所操作的图形,再根据option修改具体的svg数据。

整体白板从产品的设计到架构的设计就结束了。

欢迎体验:http://whiterose.cf.since88.cn

前端代码:https://lab.since88.cn/whiterose/frontend

后端代码:https://lab.since88.cn/whiteros

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【】Fate单机部署及代码调试全流程ongoing

这里写自定义目录标题Fate单机部署及代码调试全流程一、安装Linux系统或者虚拟机-Linux系统1、先装虚拟机2、在虚拟机上安装Ubuntu系统二、FATE单机部署并PyCharm如何连接远程服务器的docker容器进行运行和调试代码【整体未成功,可跳过】三、Ubuntu系统上安装anacon…

谈谈什么是才是InnoDB解决幻读的最佳方案

本文会分享一下MySQL的InnoDB引擎下的事务幻读问题与解决方案--LBCC&MVCC。经过好几天的熬夜通宵,终于把这部分的内容捋清楚了。至于为什么说是InnoDB呢?因为MyISAM引擎是不支持事务的。 事务 概念 一个事情由n个单元组成,这n个单元在…

Apache 虚拟主机里的 ServerName 指令

术语虚拟主机(Virtual host)是指在一台机器上运行多个网站(例如 company1.example.com 和 company2.example.com)的做法。 虚拟主机可以是“基于 IP”的,这意味着每个网站都有不同的 IP 地址,也可以是“基于名称的”,…

Springboot集成Neo4j

一、概述 1.为什么图形数据库? 生活在一个互联的世界中,大多数领域需要处理丰富的连接集以了解真正发生的事情。通常,我们发现项目之间的联系与项目本身一样重要。 虽然现有的关系数据库可以存储这些关系,但它们通过昂贵的JOIN操作…

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.3 消费者消息确认

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.3 消费者消息确认50.3.1 消费者确认50 消息可靠性 50.3 消费者消息确认 50…

OTA前装搭载率逼近50%,哪些供应商正在领跑细分赛道

智能汽车的OTA,正在进入新发展周期。 早期的OTA,主要围绕座舱信息娱乐、T-BOX及少部分车内其他ECU,主要目的是修复软件Bug以及改进用户体验,降低整车的召回成本。这个阶段,OTA对应的整车电子架构还是以传统的分布式EC…

前端上传文件或者上传文件夹

文档 https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/input 上传文件夹&#xff0c;主要的参数webkitdirectory 浏览器上传文件夹&#xff0c;浏览器会弹出询问窗口 兼容性 https://caniuse.com/?searchwebkitdirectory 代码如下 <!-- 选择文件 -->…

【Anime.js】——Anime.js源码之引擎的理解

一、Anime.js整体结构 Anime.js的强大之处在于代码量非常少&#xff0c;但功能却非常强大。让我们一起来探索Anime.js源码的核心吧~ Anime.js之所以能如此强大主要是因为它的代码结构设计的非常巧妙合理&#xff0c;所以我们想要掌握Anime.js的核心&#xff0c;首先我们要了解…

CUDA入门和网络加速学习(四)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. Cublas概念 cuBLAS是一个BLAS的实现&#xff0c;…

低代码常见场景【下】|行业示例

全文 3131 字 阅读时间约 9 分钟 本文首发于码匠技术博客 目录 低代码的行业示例 低代码在业务用例中的优势 关于码匠 阅读完上一篇文章后&#xff08;低代码用例【上】&#xff5c;如何解决业务问题&#xff09;&#xff0c;想必您已经对低代码的通用用例以及低代码如何解…

PolarDB-X源码解读:DDL的一生(下)

概述 在《DDL的一生&#xff08;上&#xff09;》中&#xff0c;我们以添加全局二级索引为例&#xff0c;从DDL开发者的视角介绍了如何在DDL引擎框架下实现一个逻辑DDL。在本篇&#xff0c;作者将从DDL引擎的视角出发&#xff0c;向读者介绍DDL引擎的架构、实现&#xff0c;以…

应用于高速收发模块的并行光学WDM波分光学技术

光模块的传输距离分为短距、中距、长距。通常短距离传输是指2km以下的传输距离&#xff0c;中距为10-20km。≥30km的则为长距离传输。根据不同的传输距离&#xff0c;光模块类型分为SR&#xff08;100m&#xff09;、DR&#xff08;500m&#xff09;、FR&#xff08;2km&#x…

实战三十二:基于knn算法的用户购物消费预测代码+数据

K近邻算法通过计算被分类对象与训练集对象之间的距离,确定其k个临近点,然后使用这k个临近点中最多的分类作为分类结果。 如上图,当K=3时,它会被分类为 Class B。因为K=3时,3个临近点里有2个是B类的。 同理,K=7时它会被分类为 Class A,因为K=7时,7个临近点里4个是A类的…

Clion开发stm32之下载程序记录

Clion开发stm32之下载程序 前提条件 安装openocd安装clion安装arm-gcc环境安装 MinGW(或Mysys2) 注意事项 !!! 开发路径必须要选择英文路径(中文路径会编译不通过的) 说明 这里为了在之后的项目里面使用配置文件。我们需要到openocd提供的board目录下添加自己的配置信息(…

gcc编译

gcc编译可执行程序有4个步骤&#xff1a;预处理、编译、汇编、链接。编译阶段消耗时间、系统资源最多。 从源文件hello.c到目标可执行文件hello&#xff0c;可以按照下面的执行命令&#xff0c;一步一步生成。 gcc -E hello.c -o hello.i gcc -S hello.i -o hello.s gcc -c he…

信息采编功能扩展开发心得

AEAI Portal门户为前端页面集成层而设计&#xff0c;在使用上简单、便捷&#xff0c;即使是非技术人员&#xff0c;通过操作文档也能够很好地将网站配置出来&#xff0c;不需要自身有很强的代码能力。同时门户平台搭配数通畅联的其他产品和组合方案&#xff0c;能够帮助企业快速…

nodejs+vue080大学社团管理系统

本系统主要有社团成员&#xff0c;社团团长和管理人员三个角色。 社团成员可以查看。新闻公告招新信息&#xff0c;并可在招新信息中申请加入喜欢的社团。可以在社团活动中申请自己想要参加的社团活动。 社团团长可以对自己所负责的社团内容进行管理。 管理人员可以对整个系统进…

kafka 的使用原理及通过spring-kafka 自定义封装包的原理

目录&#xff1a; Kafka 封装包接入 1.Kafka 工作原理2.Spring Kafka 介绍3. kafka封装包的设计及使用 Kafka 封装包接入 1.Kafaka 工作原理 1).kafka 的定义&#xff1a; 消息队列的两种模式&#xff1a; 1).点对点模式&#xff08;一对一&#xff0c;消费者主动拉取数据&…

Arduino框架下联盛德W801开发环境搭建教程

Arduino框架下联盛德W801开发环境搭建教程联盛德W801拥有自己的SDK集成开发工具&#xff0c;能做到这一点非常令人敬佩和了不起。国内好多芯片厂商都需要依托第三方开发工具集来实现对自己产品的开发。多元化开发方式可以满足不同层次开发人员的需求。对于芯片本身来说&#xf…

机器学习100天(十一):011 回归模型评估指标

机器学习100天,今天讲的是:线性回归评估指标! 一、哪个模型更好? 我们之前已经对房价预测的问题构建了线性模型,并对测试集进行了预测。 如图所示,横坐标是地区人口,纵坐标是房价,红色的点是实际样本分布。 使用不同的算法或策略构建了两个线性回归模型,如图,分别是…