uni-app 69发送消息接口开发-单聊

Posted 2019ab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uni-app 69发送消息接口开发-单聊相关的知识,希望对你有一定的参考价值。

app/controller/chat.js

// app/controller/chat.js
const Controller = require('egg').Controller;

class ChatController extends Controller {
    // 连接socket
    async connect() {
        const { ctx, app } = this;
        if (!ctx.websocket) {
            ctx.throw(400,'非法访问');
        }

        // console.log(`clients: ${app.ws.clients.size}`);

        // 监听接收消息和关闭socket
        ctx.websocket
        .on('message', msg => {
            // console.log('接收消息', msg);
        })
        .on('close', (code, reason) => {
            // 用户下线
            console.log('用户下线', code, reason);
            let user_id = ctx.websocket.user_id;
            if (app.ws.user && app.ws.user[user_id]) {
              delete app.ws.user[user_id];
            }
        });

  }
    // 发送消息
    async send(){
        const {ctx,app,service} = this;
        // 用户id
        let current_user_id = ctx.authUser.id;
        // 验证参数
        ctx.validate({
            to_id:{
                type:'int',
                require:true,
                desc:'接收人/群id'
            },
            chat_type:{
                type:'string',
                require:true,
                range:{in:['user','group']},
                desc:'接收类型'
            },
            type:{
                type:'string',
                require:true,
                range:{in:['text','image','video','audio']},
                desc:'消息类型'
            },
            data:{
                type:'string',
                require:true,
                desc:'消息内容'
            }
        });
        // 获取参数
        let {to_id,chat_type,type,data} = ctx.request.body;
        // 单聊
        if(chat_type=='user'){
            // 验证好友是否存在,并且对方没有把你拉黑
            let Friend = await app.model.Friend.findOne({
                where:{
                    user_id:to_id,
                    friend_id:current_user_id,
                    isblack:0
                },
                include:[{
                    model:app.model.User,
                    as:'userInfo'
                },{
                    model:app.model.User,
                    as:'friendInfo'
                }]
            });
            if(!Friend){
                return ctx.apiFail('对方不存在或者已把你拉黑');
            }
            // 验证好友是否被禁用
            if(!Friend.userInfo.status){
                return ctx.apiFail('对方已经被禁用');
            }
            // 构建消息格式
            let from_name = Friend.friendInfo.nickname ? Friend.friendInfo.nickname : Friend.friendInfo.username;
            if(Friend.nickname){
                from_name = Friend.nickname;
            }
            let message = {
                id:(new Date()).getTime(), // 唯一id,后端生成唯一id
                from_avatar:Friend.friendInfo.avatar,// 发送者头像
                from_name,// 发送者昵称
                from_id:current_user_id, // 发送者id
                to_id,// 接收人id
                to_name:Friend.userInfo.nickname ? Friend.userInfo.nickname : Friend.userInfo.username,// 接收人/群 名称
                to_avatar:Friend.userInfo.avatar,// 接收人/群 头像 
                chat_type:'user', // 接收类型
                type, // 消息类型
                data, // 消息内容
                options:{}, // 其他参数
                create_time:(new Date()).getTime(),// 创建时间
                isremove:0 // 是否撤回
            }
            // 拿到当前的socket
            let  socket = app.ws.user[to_id];
            // 验证对方是否在线,不在线记录到待接收消息队列中 在线:消息推送 存储到对方的聊天记录中 chatlog_对方用户id_user_当前用户id
            if(!socket){
                service.cache.setList('getmessage_'+to_id,message);
            }else{
                // 消息推送
                socket.send(JSON.stringify({
                    msg:'ok',
                    data:message
                }))
                // 存到历史记录中
                service.cache.setList(`chatlog_${to_id}_user_${current_user_id}`,message);
            }
            // 存储到自己的聊天记录中
            service.cache.setList(`chatlog_${current_user_id}_user_${to_id}`,message);
            // 返回成功
            return ctx.apiSuccess(message);
        }
        // 验证
    }
}
module.exports = ChatController;

以上是关于uni-app 69发送消息接口开发-单聊的主要内容,如果未能解决你的问题,请参考以下文章

钉钉单聊/群聊机器人实现思路

钉钉单聊/群聊机器人实现思路

钉钉单聊/群聊机器人实现思路

商业化IM 客户端接口设计分析

使用环信提供的uni-app Demo,快速实现一对一单聊

使用环信提供的uni-app Demo,快速实现一对一单聊