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

简介: 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;


目录
相关文章
|
8月前
uni-app 70聊天类封装(五)-发送消息
uni-app 70聊天类封装(五)-发送消息
102 1
|
8月前
uni-app 68 egg.js发送消息接口开发-单聊(一)
uni-app 68 egg.js发送消息接口开发-单聊(一)
57 7
|
8月前
uni-app 72聊天类封装(七)-完善发送消息状态
uni-app 72聊天类封装(七)-完善发送消息状态
65 3
|
8月前
uni-app 71聊天类封装(六)-组织发送消息格式
uni-app 71聊天类封装(六)-组织发送消息格式
34 2
|
8月前
|
移动开发 数据库
uni-app 群聊发送消息相关(84-92)
uni-app 群聊发送消息相关(84-92)
98 0
|
XML JSON 缓存
PHP:APP接口开发
PHP:APP接口开发
106 0
|
XML JSON 缓存
PHP:APP接口开发
PHP:APP接口开发
173 0
|
Web App开发 JSON API
示例浅谈PHP与手机APP开发,即API接口开发
API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(https://www.
1810 0