前言(反思):
同样是基础功能,自己究竟与大牛差在哪里?
在我看来初级程序员考虑的是秀新技术,而真正的大牛则是注重设计。写代码不能只做一竿子买卖。看似繁琐的代码背后则是一劳永逸,看似高速的效率背后可能是无休止的修改完善
很多东西错过了就永远错过了,也有很多东西你学了就永远是你的了
感谢我新哥的代码 么么哒 ╮(╯▽╰)╭
1利用模型事件记录所有发生变化的数据:
所有基础数据的模型统一继承基类,每当模型发生变化生成一份操作日志




2利用laravel定时任务自动执行命令:
利用laravel框架自定义命令中的定时任务,实现每分钟由主项目向子项目推送数据

3 主项目中sync():
将日志表中所有未推送的模型和id发送给需要同步数据的子项目(id拼接成字符串,取变化时间最晚的一条)

进行简单的判断,对每个子项目都进行推送




4 主项目中factory():
工厂模式:返回不同类的实例(配置文件中定义了一个类的标示,对工厂方法传入不同类的标示获取主项目中不同的实例)

5 factory()
不定义标示返回的BaseDataConverter实例:

定义了标识则返回的YarnsConverter实例:

6 send():
上篇已讲解这里不浪费篇幅。(大致意思就是将发生修改的数据所有结构全部推送到子项目的暴露接口中)

7 子项目接收数据:
同样是接收数据,表结构不变的模型直接调用基类的方法

这是一个通用的基类,对主项目传入的数据进行处理(已存在的数据进行修改,已删除的数据进行删除,未存在的数据进行新增)




但是对于表结构已经发生变化的数据,我们需要重写方法(子项目调用传入的回调参数访问主项目的接口来拿数据)


8 最终所有方法已经写好,后续只需要在配置文件中定义模型的映射以及 需要推送的子项目id即可
网友评论