Open JavanTang opened 2 years ago
@uiuing 这是初步设计API版本,抽时间讨论后再调整
@uiuing 这是初步设计API版本,抽时间讨论后再调整
收到🫡
更新时间: 2022-10-27
用户行为有:新建房间, 进入房间, 新建形状, 更新形状, 删除形状, 更新用户设置,执行权限行为
对上面行为,应该在每次json数据中带上一个type类型,这样更加方便后台处理这些行为 | 行为 | type |
---|---|---|
新建房间 | create | |
进入房间 | join | |
新建形状 | shape_new | |
更新形状 | shape_update | |
删除形状 | shape_delete | |
更新用户设置 | user_update | |
执行权限行为 | gm_update |
Input
一次性给全部数据: 影响速度
{
"type":"create"
}
Output
{
"room_member_setting": [{ # 房间成员设置
"default_color": "#000000",
"name": "",
"type": ""
}],
"room_content": [ # 房间具体内容
]
}
Input
{
"type":"join"
}
output 新用户
{
"room_member_setting": [{ # 房间成员设置
"default_color": "#000000",
"name": "",
"type": ""
}],
"room_content": [ # 房间具体内容
]
}
其他房间成员
{
"type":"join",
"res":{
"room_member_setting": [{ # 房间成员设置
"default_color": "#000000",
"name": "",
"type": ""
}],
"room_content": [ # 房间具体内容
]
}
}
Input
{
"type":"shape_new",
"content":{
%%具体操作内容%%
}
}
Output
{
"type":"shape_new",
"content":{
%%具体操作内容%%
"shape_id": 1235lk1j23 %%这个是这个形状的唯一编码%%
}
}
Input
{
"type":"shape_update",
"content":{
"shape_id": 1235lk1j23
%%具体操作内容%%
}
}
Output
{
"type":"shape_update",
"content":{
"shape_id": 1235lk1j23
%%具体操作内容%%
}
}
Input
{
"type":"shape_delete",
"content":{
"shape_id": 1235lk1j23
}
}
Output
{
"type":"shape_delete",
"content":{
"shape_id": 1235lk1j23
}
}
MODE
PUT
Input
base64
Output
{
"img_id":"asdflkjflfasdf"
}
MODE
GET
Input
images?q=tbn:ANd9GcRhMwruSVd3amTYdRfv9STKaZ48MDaB4LO2DQLx74GRfQ&s
@uiuing 上面是今天思考的API,有空看看,也不一定是最终版,只是每天有点新心得(狗头~)
@uiuing 上面是今天思考的API,有空看看,也不一定是最终版,只是每天有点新心得(狗头~)
好的嘞,收到🫡 ,预计底层API最晚29号完成
更新时间: 2022-10-27
1. 长连接(WebSocket操作)
用户行为有:新建房间, 进入房间, 新建形状, 更新形状, 删除形状, 更新用户设置,执行权限行为
对上面行为,应该在每次json数据中带上一个type类型,这样更加方便后台处理这些行为
| 行为 | type |
| ------------ | ------------ |
| 新建房间 | create |
| 进入房间 | join |
| 新建形状 | shape_new |
| 更新形状 | shape_update |
| 删除形状 | shape_delete |
| 更新用户设置 | user_update |
| 执行权限行为 | gm_update |
1.1 新建房间
Input
一次性给全部数据: 影响速度 { "type":"create" }
Output
{ "room_member_setting": [{ # 房间成员设置 "default_color": "#000000", "name": "", "type": "" }], "room_content": [ # 房间具体内容 ] }
1.2 进入房间
Input
{ "type":"join" }
output
新用户
{ "room_member_setting": [{ # 房间成员设置 "default_color": "#000000", "name": "", "type": "" }], "room_content": [ # 房间具体内容 ] }
其他房间成员
{ "type":"join", "res":{ "room_member_setting": [{ # 房间成员设置 "default_color": "#000000", "name": "", "type": "" }], "room_content": [ # 房间具体内容 ] } }
1.3 新建形状
Input
{ "type":"shape_new", "content":{ %%具体操作内容%% } }
Output
{ "type":"shape_new", "content":{ %%具体操作内容%% "shape_id": 1235lk1j23 %%这个是这个形状的唯一编码%% } }
1.3 更新形状
Input
{ "type":"shape_update", "content":{ "shape_id": 1235lk1j23 %%具体操作内容%% } }
Output
{ "type":"shape_update", "content":{ "shape_id": 1235lk1j23 %%具体操作内容%% } }
1.4 删除形状
Input
{ "type":"shape_delete", "content":{ "shape_id": 1235lk1j23 } }
Output
{ "type":"shape_delete", "content":{ "shape_id": 1235lk1j23 } }
2. 短连接
2.1 上传图片信息
MODE
PUT
Input
base64
Output
{ "img_id":"asdflkjflfasdf" }
2.2 获取图片信息
MODE
GET
Input
images?q=tbn:ANd9GcRhMwruSVd3amTYdRfv9STKaZ48MDaB4LO2DQLx74GRfQ&s
对于内容的增删改,就采用这个API格式怎么样,如果可以我就开始写数据更新的监听/设置了,后台转发即可
关于数据同步流程,只是初步设想,后期根据需求修改
更新时间: 2022-10-31
用户行为有:新建房间, 进入房间, 新建形状, 更新形状, 删除形状, 更新用户设置,执行权限行为
对上面行为,应该在每次json数据中带上一个type类型,这样更加方便后台处理这些行为 | 行为 | type | 完成情况 |
---|---|---|---|
新建房间 | create_room | 完成 | |
进入房间 | join_room | 完成 | |
新建形状 | new_shape | 完成 | |
更新形状 | update_shape | 完成 | |
删除形状 | delete_shape | 完成 | |
更新用户设置 | user_update | 未完成 | |
执行权限行为 | gm_update | 没完成 |
Input
{
"type":"create_room", %%创建房间%%
"room_name":"默认", %%用户名称%%
"room_type":0, %%0为公开, 1 为私人%%
"room_owner_avatar":0 %%默认头像%%
}
Output
{
"status": 200,
"msg": "创建房间成功",
"data": {
"room_id": "fb871334-56c2-11ed-b8f2-e526f1815a4c",
"room_name": "默认",
"room_type": 0,
"room_status": 0,
"room_members": [
"127.0.0.1"
],
"room_member_setting": {
"127.0.0.1": {
"default_color": "#000000",
"name": "1",
"type": ""
}
},
"room_content": [
]
}
}
Input
{
"room_id":"fb871334-56c2-11ed-b8f2-e526f1815a4c",
"type":"join_room",
"room_member_setting": { # 房间成员设置
"default_color": "#000000",
"name": "",
"type": "",
"room_owner_avatar":0
}
}
output 新用户
{
"room_member_setting": [{ # 房间成员设置
"default_color": "#000000",
"name": "",
"type": ""
}],
"room_content": [ # 房间具体内容
]
}
其他房间成员
{
"type":"join",
"res":{
"room_member_setting": [{ # 房间成员设置
"default_color": "#000000",
"name": "",
"type": ""
}],
"room_content": [ # 房间具体内容
]
}
}
Input
{
"type":"new_shape",
"content":{
"shape_id":"123"
}
}
Output
{
"type":"new_shape",
"content":{
"shape_id": "123" %%这个是这个形状的唯一编码%%
}
}
Input
{
"type":"update_shape",
"content":{
"shape_id": 1235lk1j23
}
}
Output
{
"type":"update_shape",
"content":{
"shape_id": 1235lk1j23
}
}
(用户操作回滚,后台需要及时响应) Input
{
"type":"delete_shape",
"content":{
"shape_id": 1235lk1j23
}
}
Output
{
"type":"delete_shape",
"content":{
"shape_id": 1235lk1j23
}
}
MODE
PUT
Input
base64
Output
{
"img_id":"asdflkjflfasdf"
}
MODE
GET
Input
images?q=tbn:ANd9GcRhMwruSVd3amTYdRfv9STKaZ48MDaB4LO2DQLx74GRfQ&s
{
"nodes":[
{
"id":"jskdjbuiew",
......
},
......
],
"state":{
"readonly":true,
.....
}
}
对象有两种大类,一个是更改 state
,一个是更改 nodes
更改 state
所有 type 的类型:update-state
更改 nodes
所有 type 的类型:update
、delete-all
、cover-all
、add
、delete
update-state
更新 state通过
object[key] = nowObject[key]
覆盖
{
"type": "update-state",
"state":{
"更新的key":"更新的数据"
.......
}
}
update
更新 nodes找到id后,通过
object[key] = nowObject[key]
覆盖
{
"type": "update",
"nodes":[
{
"id":"aaaaaa"
"更新的key":"更新的数据"
.......
}
{
"id":"bbbb"
"更新的key":"更新的数据"
.......
}
]
}
delete-all
删除全部 nodes{
"type": "delete-all"
}
cover-all
覆盖全部 nodes直接覆盖在代码的执行逻辑上....... 貌似这种情况不会发生,保留是为了避免错误
{
"type": "cover-all",
"nodes":[ ..... ]
}
add
新增 node可以新增多个,所以nodes对象是个数组,追加到末尾,尽量保留原顺序
{
"type": "add",
"nodes":[
{
.......
},
{
.......
}
]
}
delete
删除 node可以删除多个,所以nodes对象是个数组,根据id删除,尽量保留原顺序
{
"type": "delete",
"nodes":[
{
"id":"aaa"
},
{
"id":"bbb"
}
]
}
@JavanTang
还需要:进入房间需要昵称和颜色和房间id,相同昵称去除
每个容器一个id,可以在此容器基础上创建会议,所有数据前端提供。
{
"type": "create_meeting", // 传输数据类型
"whiteboard":{
"id":"xxxxxxxxxxx", // 容器唯一识别
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":false // 这里是全局的是否只读状态
},
"user":{
"id":"xxxxxxxxxxx", // 用户唯一识别
"name":"xxxx", // 用户昵称
"color":"xxx", // 用户默认颜色
}
}
{
"status": 200,
"msg": "创建房间成功",
}
创建会议之后将数据上传,后台提供 redis 缓存,(在作者断开之后也不清除)(保存初始数据和作者id)
类似这样
key: creat-xxxxxxxx (creat-容器id)
value: {
"author_id": "xxxxx",
"whiteboard":{
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":false // 这里是全局的是否只读状态
},
}
先要有接口判断会议是否存在,即判断缓存是否有id,并且获取权限
{
"type": "check_meeting",
"whiteboard":{
"id":"xxxxxxxxxxx", // 容器唯一识别
},
}
{
"status":200
"whiteboard":{
"name": "未命名文件1", // 容器名称
"readonly":true // 这里是全局的是否只读状态
},
}
{
"status":404
}
容器是否只读由 章节:“二、检查会议” 获取,前端判断。
{
"type": "join_meeting",
"whiteboard":{
"id":"xxxxxxxxxxx", // 容器唯一识别
},
}
{
"type": "join_meeting",
"whiteboard":{
"id":"xxxxxxxxxxx", // 容器唯一识别
},
"user":{
"id":"xxxxxxxxxxx", // 用户唯一识别
"name":"aaa", // 用户昵称 (加入的时候会判断,是否已经存在该用户昵称,存在则反馈)
"color":"xxx", // 用户默认颜色
}
}
这里和创建会议时缓存里的的作者id对比
a. 加入的是作者,则响应
如果加入的是作者,则为:
{
"whiteboard":{
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":true // 这里是全局的是否只读状态
},
"user_rights":"author" // 用户类型
}
b. 加入的是贡献者,则响应
加入的不是作者,则是:
{
"whiteboard":{
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":true // 这里是全局的是否只读状态
},
"user_rights":"contributor" // 用户类型
}
c. 转发给其他成员
无
a. 加入的是作者,则响应
如果加入的是作者,则为:
{
"whiteboard":{
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":false // 这里是全局的是否只读状态
},
"user_rights":"author", // 用户类型
"cooperation_users": [ // 已在线协作用户数据
{
"name": "aaa",
"color": "xxx",
"rights": "contributor"
}
.....
],
}
b. 加入的是贡献者,则响应
加入的不是作者,则是:
{
"whiteboard":{
"name": "未命名文件1", // 容器名称
"nodes":[], // 初始容器数据
"readonly":false // 这里是全局的是否只读状态
},
"user_rights":"contributor", // 用户类型
"cooperation_users": [ // 已在线协作用户数据
{
"name": "aaa",
"color": "xxx",
"rights": "contributor"
}
.....
],
}
c. 转发给其他成员
{
"type": "join_meeting",
"join_user":{
"name":"aaa", // 用户昵称 (加入的时候会判断,是否已经存在该用户昵称,存在则反馈)
"color":"xxx", // 用户默认颜色
}
}
{
"type": "quit_meeting",
"user":{
"name":"xxxxx" // 用户昵称
}
}
{
"type": "quit_meeting",
"user":{
"name":"xxxxx" // 用户昵称
}
}
只有作者可以关闭,同样判断id是否和缓存里的id是否相同,关闭之后则删除缓存
{
"type": "close_meeting",
"user":{
"id":"xxxxxxxxxxx", // 用户唯一识别
}
}
只有作者有权限,修改之后,redis中的缓存数据也会修改
{
"type": "change_meeting", // 传输数据类型
"whiteboard":{
"name": "修改文件1", // 容器名称 // 这个可以修改
"readonly":true // 这里是全局的是否只读状态 // 这个可以修改
}
}
{
"status": 200,
"msg": "成功",
}
{
"type": "change_meeting", // 传输数据类型
"whiteboard":{
"name": "修改文件1", // 容器名称
"readonly":true // 这里是全局的是否只读状态
},
}
readonly 为 true 的时候,只有作者可以修改,当然前端也不会发送数据。
后端对redis中的缓存同样进行更新,之后再转发给其它人
"whiteboard":{
"name": "未命名文件1",
"nodes":[], // 👈这里
"readonly":false
},
update
更新 nodes找到id后,通过
node[key] = newNode[key]
覆盖
输入
{
"type": "nodes-update",
"nodes":[
{
"id":"aaaaaa"
"更新的key":"更新的数据"
.......
},
{
"id":"bbbb"
"更新的key":"更新的数据"
.......
}
]
}
输出
{
"type": "nodes-update",
"nodes":[
{
"id":"aaaaaa"
"更新的key":"更新的数据"
.......
},
{
"id":"bbbb"
"更新的key":"更新的数据"
.......
}
]
}
add
新增 node可以新增多个,所以nodes对象是个数组,追加到末尾,尽量保留原顺序
输入
{
"type": "add",
"nodes":[
{
.......
},
{
.......
}
]
}
输出
{
"type": "add",
"nodes":[
{
.......
},
{
.......
}
]
}
delete
删除 node可以删除多个,所以nodes对象是个数组,根据id删除,尽量保留原顺序
输入
{
"type": "delete",
"nodes":[
{
"id":"aaa"
},
{
"id":"bbb"
}
]
}
输出
{
"type": "delete",
"nodes":[
{
"id":"aaa"
},
{
"id":"bbb"
}
]
}
delete-all
删除全部 nodes输入
{
"type": "nodes-delete-all"
}
cover-all
覆盖全部 nodes直接覆盖在代码的执行逻辑上....... 貌似这种情况不会发生,保留是为了避免错误
输入
{
"type": "cover-all",
"nodes":[ ..... ]
}
鼠标按下去的时候传输位置并显示
TODO
更新时间: 2022-10-25
1. 更新用户操作
MODE
UPDATE
Input2. 获取当前房间所有信息
GET
Inputoutput
3. 上传图片信息
MODE
PUT
Inputbase64
Output4. 获取图片信息
MODE
GET
Inputimages?q=tbn:ANd9GcRhMwruSVd3amTYdRfv9STKaZ48MDaB4LO2DQLx74GRfQ&s