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;


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

热门文章

最新文章

  • 1
    MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
  • 2
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
  • 6
    1688APP 原数据 API 接口的开发、应用与收益
  • 7
    PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
  • 8
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 9
    语音app系统软件源码开发搭建新手启蒙篇
  • 10
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 1
    【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作
    12
  • 2
    【02】微信支付商户申请下户到配置完整流程-微信开放平台申请APP应用-微信商户支付绑定appid-公众号和小程序分别申请appid-申请+配置完整流程-优雅草卓伊凡
    17
  • 3
    【Azure App Service】App Service 是否支持HostName SNI 证书?
    18
  • 4
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    14
  • 5
    2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
    23
  • 6
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    28
  • 7
    通过外部链接启动 Flutter App(详细介绍及示例)
    23
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40