Popush源代码学习报告

@肖剑楠 2011013223

Popush采用NodeJS架构,网络通信使用了Socket.IO,同时基于Backbone.js实现了MVC架构。与Mongodb进行数据交互的部分封装成为Model,位于/models文件夹下;定义表层交互方式的部分封装为View,位于/static/js/views文件夹下,另外/static/js/room下的代码实现了代码编辑、实时聊天(尚不完整)等功能,/static/js/router.js定义了服务器的路由,根目录下的app.js完成了服务器的启动以及事件监听的处理。

C/S架构交互方式

前面提到Popush的网络通信基于Socket.IO。在app.js使用node启动时,服务器开始监听socket连接,当连接之后,会自动处理客户端发送的version,register,relogin等请求,对相应请求的处理如以下方式定义

socket.on(‘request_name‘, function(data) {/* do something */});

当客户端发出请求时,依照如下方式

app.socket.emit(‘request_name‘, {para1: value1, ...});

View模块

在/static/index.html(561-572)中,引用了一系列*-view.js文件

<script type="text/javascript" src="js/views/login-view.js"></script>
<script type="text/javascript" src="js/views/register-view.js"></script>
......

在这些文件中,都有相似的一句代码

app.views[‘register‘] = new app.RegisterView();
OR app.views[‘account‘] = new app.AccountView();

这句代码的作用在于将所有的页面初始化,并存储在全局变量appviews属性中,方便之后的及时调用。 app.*View的定义由以下几个部分构成events, initialize,...,其中events定义了该页面上的响应事件,initialize定义了页面的初始化逻辑,另外还有一些其他的方法,主要用于定义事件的处理逻辑。

Model模块

与Mongodb的数据直接交互定义在/models/*DAO.js文件中,共有两个文件docDAO.js和userDAO.js,分别实现了用户信息和文档内容的增、删、查、更新等功能的支持。 与数据库相关的所有操作由变量db完成,db通过require数据库的配置来得到类似于connection的变量,通过调用该变量的insert,findOne,find,update等方法,即可实现与数据库的交互。由于Mongodb为对象型数据库,只需将查找条件以JSON格式作为参数传递进去即可,不需要编写复杂的SQL语句。

业务实现逻辑举例分析

以文件分享为例:

  1. 客户端请求 file-view.js(13),在events中定义了a.file-go-share的点击事件处理函数为share

    app.views.shares.shareModel = this.model; // 获取对model的引用 app.collections[‘shares‘].set(this.model.get(‘members‘)); // 获取该文件的成员列表 $(‘#share‘).modal(‘show‘); // 显示share对话框

  2. 值得一提的是,SharerlistView对应的是app.collections[‘share‘],同时SharerlistView中的el属性定义了在html中绑定的元素位置#share,即为file-view.js中函数share所调用的#share,可以理解的是,*-view.js文件通过定义一系列的绑定事件,并在此之前已经在html中动态生成了对应的标签及id等属性,其他函数只需通过jQuery的selector访问即可。
  3. 在share对话框中,用户选择一个用户之后,点击分享按钮,触发share函数,该绑定在sharerlist-view.js(9)中定义,然后获取参数,校验之后,调用app.socket.emit(‘share‘, {/* params */})将请求发送给服务器。
  4. 服务器监听share请求,在app.js(346)中定义,如果会话失效,则返回‘unauthorized‘,否则,调用docDAOaddMember函数将该记录添加到数据库中,并返回‘share‘响应,如果未出现异常,则将该信息广播至所有正在访问该文件的其他用户。客户端在收到‘share‘响应后,会调用detach函数执行相关处理。
时间: 2024-07-30 17:18:21

Popush源代码学习报告的相关文章

igmpproxy源代码学习——igmpProxyInit()

igmpproxy源代码学习--igmpProxyInit()函数详解,igmpproxy初始化 在运行igmpproxy的主程序igmpproxyRun()之前需要对igmpproxy进行一些配置,这些配置都是在igmpProxyInit()中完成的. 要进行的配置主要有: 信号处理配置 物理网络接口配置加载 配置文件的加载 虚拟网络设备初始化 路由向量表初始化 定时器初始化 信号处理配置 首先进行信号处理配置: sigemptyset(&sa.sa_mask); sigaction(SIGT

nginx源代码学习资源(不断更新)

nginx源代码学习是一个痛苦又快乐的过程,以下列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源代码,能够从nginx官方站点下载一份最新的. 看了nginx源代码,发现这是一份全然没有凝视,全然没有配置文档的代码. 如今你最希望要的是一份凝视版的nginx源代码,能够从以下的链接中下载一份: https://github.com/jianfengye/nginx-1.0.14_comment 这份凝视版源代码会不断进行更新的 好了,第一个问题, nginx的main函数在

tablib源代码学习

tablib简介 ----------- Tablib is a format-agnostic tabular dataset library, written in Python. Tablib 是一个格式未知的表格操作库,使用python编写,目前(2014-06-11)支持如下格式:Excel .JSON .YAML .HTML.TSV .CSV的导入/导出,及修改操作.实现方法是使用各种数据格式的python支持库(大多是各种格式的有明支持库)导入数据成list(列表,python 内

Linux内核分析第一次学习报告

Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU来解释和执行这些指令. API:应用程序编程接口(程序员与计算机的接口界面) ABI:二进制接口,指令编码(程序员与CPU的接口界面) 2.X86汇编 1.寄存器 (1)通用寄存器 (2)段寄存器: (3)标志寄存器 2.计算机的汇编指令 (1)movl指令: 寄存器寻址,寄存器模式,以%开头的寄存

分布式事务处理学习报告

1.什么是事务? 事务通俗说就是一个事情分为多个步骤完成: 比如: 2.事务的ACID四大属性: 原子性(Atomicity):意为:即一事务的操作要么全部执行,要么全部不执行.当事务非正常终止时,其中间结果将被取消. 一致性(Consistence):指的是保证数据在变化中只存在一个完整状态.比如修改一个人的信息(姓名,性别,年龄),在更新过程中发生错误,则所做的修改要么全没了,要么全保留. 隔离性(Isolation):一个未完成事务不能在提交前就把其中间结果提供给其它事务使用. 持久性(D

struts2源代码学习之初始化(一)

看struts2源代码已有一段时日,从今天開始,就做一个总结吧. 首先,先看看怎么调试struts2源代码吧,主要是下面步骤: 使用Myeclipse创建一个webproject 导入struts2须要的jar包 如图: 让jar包关联源文件 在上图中的jar包右键,选择properties->java source attach,假设关联成功,双击jar包下的某个class文件就会显示java源码了. 双击.class文件,在源码关键地方设置断点 部署project到Tomcat Tomcat

Cocos2dx学习报告2

记录二:创建项目,其名曰DFJ(仿照微信打飞机) 上一个记录我们说到开发环境的配置以及怎样去建立自己的项目.现在我们就通过之前说所的方法来建立一个项目.这里我就不再截图了. 建立了自己的项目之后,我们就可以开始动工编写自己的代码了.这里我不对已有的HelloWorldScene的文件做修改.我们自己建立自己的场景来开始我们自己的游戏之旅. 首先在这里说明一下,由于后面多是代码编写的工作,所以后面的记录多数会用代码的形式展示给大家,需要记录的地方我会通过注释来向大家说明. ----------本次

[Java] LinkedList / Queue - 源代码学习笔记

简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口的笔记,可以参考上一篇博文 List / ArrayList - 源代码学习笔记 Queue 1. 继承 Collection 接口,并提供了额外的插入.提取和查看元素的方法.新增的方法都有两种形式:当操作失败时,抛出异常或者返回一个特殊值.特殊值可以是 null 或者 false ,这取决于方法本

JDK源代码学习系列04----ArrayList

                                                                         JDK源代码学习系列04----ArrayList 1.ArrayList简单介绍 ArrayList是基于Object[] 数组的,也就是我们常说的动态数组.它能非常方便的实现数组的添加删除等操作. public class ArrayList<E> extends AbstractList<E> implements List<