shenzaixin 85566f8202 增加视频通信相关的处理逻辑 | 5 lat temu | |
---|---|---|
doc | 8 lat temu | |
docker | 8 lat temu | |
src | 5 lat temu | |
test | 7 lat temu | |
.gitignore | 7 lat temu | |
readme.md | 7 lat temu |
此项目是家庭医生的消息服务器,含医生端与患者端。医生端使用REST API收发消息,患者端使用Web Socket收发消息。
项目代码使用git管理,请安装git客户端并fork代码再下载修改。
数据库设计是将消息按通道分开:系统消息,个人消息及群消息。
对Windows环境,可以预先安装Node.js。对Linux环境,代码包中包含Node.js程序,第一次部署需要使用chmod为此增加执行权限:
chmod +x node
之后通过以下命令启动消息服务器:
node app.armour.js
启动成功将出现如下日志:
[INFO] app.js(125,5): Starting IM server, version 1.0.5.20161107, running on port 3000, 2016-11-22 16:00:17
[INFO] app.js(126,5): Configuration profile: dev
测试框架使用mocha。REST客户端使用supertest。should模块提供断言测试。测试用例位于test目录,并根据模块划分。
部署服务之前需要配置环境变量IM_PROFILE,Windows平台直接在系统中配置,Linux平台在profile中配置:
export IM_PROFILE=prod
IM_PROFILE值将决定应用加载的配置文件,配置文件位于src/resources/config。IM_PROFILE值为prod, test, dev中的一个。若配置错误服务将无法运行。若未配置此参数则默认使用dev配置。
为保证服务正常运行,当服务异常退出时自动重启服务,IM服务器使用app.armour.js脚本,对进程添加保护:进程异常退出时,自动重启。为实现此目标,部署时通过appArmour启动服务即可实现进程的守护功能。
未完工
未完工
IM提供了开发SDK,一个JS脚本。客户端可以通过引用此脚本或将此脚本打包到资源中。此外,脚本使用jQuery作为基础环境,因此客户端需要预先引用jQuery脚本。客户端通过以下链接引用SDK文件
<script src='http://host:port/sdk/im.client.js'></script>
应用根据MVC模式设计。但REST API只用到Model与Controller两部分,与页面相关的会使用到View层。Model层代码位于model,View层代码位于views,Controller层分两处存放:
实时与延时
Node.js支持同步与异步调用,也导致了异常错误处理与众不同。一个给定的函数,它处理异常的方式要么是同步(用 throw方式)要么是异步的(用 callback 或者 EventEmitter),不会两者兼具。 用户可以在回调函数里处理错误,也可以使用 try/catch捕获异常 ,但是不能一起用。
实际上,使用throw并且期望调用者使用 try/catch 是很罕见的,因为 NodeJS里的同步函数通常不会产生运行失败(主要的例外是类似于JSON.parse的用户输入验证函数)。
本节将简要描述服务所提供的API,包括消息收发,运行状态及成员维护等。API分为两种:REST与WebSocket。
REST API遵循REST最佳实践,规范命名URL中的每个部分。注意POST请求是将数据作为请求体发送。下文中的host:port分别表示服务所在的主机地址及端口。
Application: {
Base: '/api/v2/application',
BadgeNo: '/badge_no' //获取角标
},
Users: {
Base: '/api/v2/users',
Login: '/login', //用户登录
Logout: '/logout', //用户登出
User: '/:user_id', //获取用户信息
UserStatus: '/:user_id/status',//用户状态
UserConsultTime:'/:user_id/consult/time'//用户咨询时间
},
Sessions: {
Base: '/api/v2/sessions',
Session: '/:session_id/session',
SessionSticky: '/:session_id/sticky', // 会话置顶,置顶使用PUT,取消置顶使用DELETE
SessionStatus: '/:session_id/status', //更新状态
RecentSessions: '/recent', // 最近会话,使用类型过滤出'患者'或'医生'会话
Topics: '/:topic_id/topics',
Topic: '/topics/:topic_id', // 议题,指定ID的议题将返回其信息
TopicEnded: '/:session_id/topics/:topic_id/ended', // 议题是否已结束,若top_id为current,则检查最后一个议题的状态
TopicList:'/topics',
TopicReplyCount:"/topics/count/reply",
TopicMessages:'/topic/:topic_id/messages',
Messages: '/:session_id/messages', // 会话消息
MessagesByTopic: '/:session_id/topics/:topic_id/messages', // 议题消息
Message: '/:session_id/messages/:message_id', // 单条消息
SessionsUnreadMessageCount: '/unread_message_count', // 所有会话的未读消息数
SessionUnreadMessageCount: '/:session_id/unread_message_count', // 指定会话的未读消息数
SessionUnreadMessages: '/:session_id/messages/unread', // 会话未读消息
ParticipantUpdate:'/:session_id/participant/update',//更新成员=删除旧成员,新增新成员
Participants: '/:session_id/participants', // 会话所有成员
ParticipantsAvatar: '/:session_id/participants/avatars', // 会话所有成员头像
Participant: '/:session_id/participants/:participant_id', // 会话单个成员
ParticipantAvatar: '/:session_id/participants/:participant_id/avatars' // 会话单个成员头像
}
**消息类型**:
muc_messsges,p2p_messages,group_messages,system_messages表对应的type字段
0、系统消息
1、文本消息
2、图片消息
3、语音消息
4、文章消息
5、跳转消息
6、议题开始
7、议题结束
8、转发的消息
9、转发的图片
10、议题结束发送的消息
11、预留
12、小视频消息
13、预留
**会话类型**
sessions的type字段
a、type =1 消息保存muc_messsges、患者的三师、家庭咨询会话
b、type=2 消息保存p2p_messages、患者的名医咨询,医生间的p2p、名医咨询会话
c、type =3 消息保存group_messages、行政团队聊天会话
d、type =0 消息保存system_messages 系统聊天会话
sessions的business_type字段
a、business_type =1 此会话不包含患者
b、business_type =2 此会话包含患者
sessions的status字段
**此字段只针对议题的会话有效**
标示当前会话是否有活跃的议题
**议题相关**
议题的ID就是wlyy库的wlyy_consult 的code字段可以关联wlyy_consult_team 查询对应的咨询行政团队信息,和签约医生信息,及咨询医生信息
目前有wlyy_consults的视图做关联,可根据实际业务逻辑拓展相关字段。
议题topics status及type字段讲解
status =0 reply = 0 新增的咨询
status = 0 reply =1 医生已经回复的咨询
status = 10 reply = 0 医生未回复就结束掉的咨询,PS:目前统计要求这部分数据不纳入未回复的咨询,请知悉
status = 10 reply = 1 医生已经回复,且已经结束的咨询
Web Socket提供页面内长连接,并且能够通过Web Socket收发消息。
Web Socket 客户端类型包含患者、医生
Web Socket 客户端登录需带上对应的会话ID用作于区分推送对象
Web Socket 客户端在线在推送消息的时候会更新用户的活跃时间用作于消息统计
微信模板消息:结合Web Socket 当用户的sockt的连接不存在,则通过微信模板推送给予患者信息提醒,由于患者咨询只能存在一个,所以在推送的时候没有添加会话是否同一个的校验。后期出现多个需增加客户端的会话ID是否相同做校验。
-- 查询会话对象 select * from sessions s; -- 查询成员对象 select * from participants p where session_id='4d5be29f8ba0413d8658441902b958ff_c7a121954a3a4fae84852fd5668b590d_2'; -- 查询咨询消息 select * from muc_messages m; -- 查询单聊消息 select * from p2p_messages; -- 查询群组消息 select * from group_messages; -- 查看系统消息 select * from system_messages; -- 查看议题对象 select * from topics;
-- 查询讨论组的医生信息 select s.id,p.participant_id,d.* from participants p,sessions s,doctors d where s.id='4d5be29f8ba0413d8658441902b958ff_c7a121954a3a4fae84852fd5668b590d_2' and s.id = p.session_id and (d.id = p.participant_id);
-- 查询会话中的患者信息 select s.id,p.participant_id,d.* from participants p,sessions s,patients d where s.id = p.session_id and (d.id = p.participant_id);
-- 查询咨询信息 select t.* from topics t,sessions s where t.session_id = s.id and s.business_type = 2 and s.type = 1;
-- 查询未读消息数量P2P GROUP 相同只是查询的对象不一致
select * from muc_messages m,(select p.last_fetch_time,p.session_id from participants p where p.session_id ='4d5be29f8ba0413d8658441902b958ff_c7a121954a3a4fae84852fd5668b590d_2' and p.participant_id='D2016008240003') t where m.session_id ='4d5be29f8ba0413d8658441902b958ff_c7a121954a3a4fae84852fd5668b590d_2' and m.session_id = t.session_id and m.timestamp
> t.last_fetch_time;
-- 查询某个人的所有会话 select GROUP_CONCAT(p1.participant_id) as 会话的成员集合,s.* from participants p,sessions s,participants p1 where p1.session_id = s.id and p.session_id = s.id and p.participant_id='D2016008240003' GROUP BY s.id;
-- 查询某个议题的消息
select w.* from muc_messages w ,(
select m.timestamp
as begin_date,m2.timestamp
as end_date,t.session_id from topics t,muc_messages m, muc_messages m2 where m.id = t.start_message_id and m2.id = t.end_message_id and t.session_id = '4d5be29f8ba0413d8658441902b958ff_c7a121954a3a4fae84852fd5668b590d_2'
) s where w.session_id = s.session_id and w.timestamp
>= s.begin_date and w.timestamp
<=s.end_date;
###更改NODE插件数据源在安装完成NODE及配置完成环境变量后执行
npm config set registry https://registry.npm.taobao.org
设置完成后执行npm install 即可安装相对于的插件。