项目

一般

简介

小黄条的主要同步逻辑

肥羊6 个月 之前添加

一、时间概念

  • 创建时间:任务创建时间
  • 编辑时间:任务最后一次编辑的时间
  • 完成时间:任务完成时间
  • 置顶时间:任务被设置为置顶的时间

二、操作对任务时间属性的影响

  • 任何对任务进行的操作都会影响编辑时间,编辑时间将作为是否需要更新数据内容的唯一依据;
  • 当服务端的编辑时间晚于客户端的时候,则以服务端的内容覆盖到客户端;
  • 当客户端的编辑时间晚于服务端的时候,则以客户端的内容覆盖到服务端;
  • 同步操作不更新任何时间参数。

  • 创建:写入创建时间和编辑时间,且编辑时间和创建时间一致

  • 编辑:更新任务编辑时间

  • 完成:写入任务完成时间,更新任务编辑时间并清空置顶时间

  • 还原:更新任务创建时间、任务编辑时间并清空置顶时间、清空任务的完成时间

  • 删除:标记删除、修改任务的编辑时间、清空任务的完成时间

  • 置顶:将任务置顶,靠前显示,每次操作更新任务的置顶时间和编辑时间

  • 取消置顶:清空任务的置顶时间,更新任务的编辑时间

其中置顶、取消置顶、编辑可附用同一个接口

三、新增内容

所有未获取listID的任务,视为新增任务,客户端提交任务内容、创建时间、编辑时间、置顶时间、完成时间至后台,后台返回ListID。
请求ListID的时候必须提交任务的所有参数到后台请求ListID,便于未登录情况下产生的内容在登陆后保证客户端和服务端的数据一致性。

如任务本地记录的时间点,晚于服务端当前的时间点+48h时(例如客户端记录的时间是2018年,服务端当前的时间是2017年),则以提交到服务端的时间(服务端当前时间)作为任务的创建时间或编辑时间,只影响服务端时间,不影响客户端时间,因用户手机时间错误导致的同步问题不解决。

四、编辑内容

客户端在完成编辑后,提交ListID、内容、编辑时间、置顶时间(操作+时间,可以为空)至后台。

1、未登录

编辑内容时,在完成编辑后,客户端本地缓存修改的内容,并更新任务的修改时间;

2、已登录

编辑内容时,在完成编辑后,立即将修改后的内容提交到后台,服务端根据内容提交的时间更新本条记录最后一次修改时间。

五、置顶操作(编辑内容的一种)

将未完成的任务置顶,置顶的任务在任务list的最前面,每次操作影响任务的置顶时间和编辑时间。
置顶操作可被取消,被取消置顶的任务需要清空置顶时间,同时再次更新编辑时间。

1、未登录

置顶内容时,在完成操作后,写入本地的置顶时间和更新编辑时间;
取消置顶时,在完成操作后,清空本地的置顶时间和更新编辑时间;

2、已登录

置顶内容时,在完成操作后,写入置顶时间和更新编辑时间,并提交到服务端;
取消置顶时,在完成操作后,清空置顶时间和更新编辑时间,并提交到服务端;

六、完成任务

1、未登录

编辑内容状态时,在完成编辑后,本地缓存内容,并更新任务的修改时间;

2、已登录

编辑内容状态时,在完成编辑后,立即将内容修改后的状态提交到后台,服务端根据客户端提交状态修改的时间,更新本条记录的最后一次修改时间,并将本条记录最后一次修改的时间返回到前端;

通讯内容:listid、最后一次修改时间、任务状态、uid、客户端信息等

七、删除内容

1、未登录

删除内容时,在完成删除后,将该条任务的记录从本地缓存中清除;

2、已登录

删除内容时,在完成删除后(在本地缓存文件删除),立即将删除内容的listid提交到后台,服务端对内容进行标记删除,并更新该条记录最后一次的修改时间;

通讯内容:listid、最后一次修改时间、任务状态、uid、客户端信息

八、登录操作

登陆后,从服务端获取用户的UID,将本地所有listid中不包含UID信息的任务,全部更新成包含uid信息的listid;

九、上传内容

  • 在用户登录、启动、切换页面、手动刷新时,都需要跟服务端进行数据同步,将本地有缓存但服务端无数据的内容进行上传;
  • 未登录状态的任务,在登陆成功并刷新用户的listid后进行上传,创建时间上传本地记录的时间,修改时间在上传成功后由服务端返回;

十、拉取内容

  • 前端在登录、启动、切换页面、手动刷新时,都需要跟服务端进行数据同步,将服务端有而本地没有的数据同步过来,并更新对应任务的状态;
  • 服务端有,但是本地没有的数据,直接获取任务状态、任务正文展示到对应的位置;
  • 服务端有,本地也有的数据,比对服务端最后一次更新时间和本地最后一次更新时间;
  • 如服务端最后一次修改时间(提交数据时,服务端的本地时间)晚于本地最后一次修改时间(本地编辑内容时记录的修改时间),则用服务端的内容和状态替换掉本地的内容和状态;
  • 如服务端最后一次修改时间(提交数据时,服务端的本地时间)早于本地最后一次修改时间(本地编辑内容提交后服务端返回的修改时间),则上传客户端的内容和状态更新服务端的数据;
  • 如服务端最后一次修改时间和本地最后一次修改时间保持一致,则不进行修改。

十一、向服务端提交数据的策略

  • 登录状态下,每次启动App、切换页面、下拉刷新等操作,都需要检测本地是否有未获取ListID的任务,如存在,则需要立即将未获取ListID的任务提交到服务端获取ListID。
  • 所有对任务的单次操作{新增、删除、编辑(包括置顶、取消置顶)、完成、还原任务等},在完成操作后,提交到服务端;
  • 其中未获取ListID的任务带上所有参数,提交到服务端,服务端在写入成功后返回ListID至客户端;
  • 已获取ListID 的任务,在对本地未更新的任务进行编辑后,覆盖服务端的内容。 举例说明: ListID为001的任务,客户端的编辑时间是21:00,服务端的编辑时间是22:00,因客户端未进行同步操作,客户端明显是旧的未更新的内容,此时用户于23:00在客户端对001进行操作,操作后允许覆盖服务端的内容。

十二、同步逻辑

同步触发逻辑:App启动、用户主动下拉刷新
每次同步先提交未获取ListID的任务获取ListID;
每个页面只同步对应的页面的数据;
当服务端的编辑时间晚于客户端的时候,则以服务端的内容覆盖到客户端;
当客户端的编辑时间晚于服务端的时候,则以客户端的内容覆盖到服务端;
Todo页面全量同步;
Done页面,每次同步最近6个月(已创建时间计算)的数据,页面底部可采用文本按钮的方式,再次请求6个月的数据补充道列表末尾,依此类推。

十三、 排序:

App、PC Todo页面优先按照置顶时间排序,置顶时间最晚的在最前面,再按照创建时间排序,创建时间最早的在最前面(上面)。
App、PC Done页面统一按照任务实际完成的时间递归任务,按照完成时间排序,最近完成的在上前;