uni-app 133好友申请实时通知
Posted 2019ab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uni-app 133好友申请实时通知相关的知识,希望对你有一定的参考价值。
/app/controller/apply.js
'use strict';
const Controller = require('egg').Controller;
class ApplyController extends Controller
// 申请添加好友
async addFriend()
const ctx,app = this;
// 拿到当前用户id
let current_user_id = ctx.authUser.id;
// 验证参数
ctx.validate(
friend_id:type: 'int', required: true,desc: '好友id',
nickname:type: 'string', required: false, desc: '昵称',
lookme:type: 'int', required: true, range:in:[0,1],desc: '看我',
lookhim:type: 'int', required: true,range:in:[0,1], desc: '看他',
);
let friend_id,nickname,lookme,lookhim = ctx.request.body;
// 不能添加自己
if(current_user_id === friend_id)
ctx.throw(400,'不能添加自己');
// 对方是否存在
let user = await app.model.User.findOne(
where:
id:friend_id,
status:1
)
if(!user)
ctx.throw(400,'该用户不存在或者已经被禁用');
// 之前是否申请过了
if(await app.model.Apply.findOne(
where:
user_id:current_user_id,
friend_id,
status:['pending','agree']
))
ctx.throw(400,'你之前已经申请过了');
// 创建申请
let apply = await app.model.Apply.create(
user_id:current_user_id,
friend_id,
lookhim,
lookme,
nickname
);
if(!apply)
ctx.throw(400,'申请失败');
ctx.apiSuccess(apply);
// 消息推送 在线的话推送不在线不需要
if(app.ws.user && app.ws.user[friend_id])
app.ws.user[friend_id].send(JSON.stringify(
msg:'updateApplyList'
));
// 获取好友申请列表
async list()
const ctx,app = this;
// 拿到当前用户id
let current_user_id = ctx.authUser.id;
let page = ctx.params.page ? parseInt(ctx.params.page) : 1;
let limit = ctx.query.limit ? parseInt(ctx.query.limit) : 10;
let offset = (page-1)*limit;
let rows = await app.model.Apply.findAll(
where:
friend_id:current_user_id
,
include:[
model:app.model.User,
attributes:['id','username','nickname','avatar']
],
offset,
limit,
order:[
['id','DESC']
]
)
let count = await app.model.Apply.count(
where:
friend_id:current_user_id,
status:'pending'
);
ctx.apiSuccess(rows,count);
// 处理好友申请
async handle()
const ctx,app = this;
// 拿到当前用户id
let current_user_id = ctx.authUser.id;
let id = parseInt(ctx.params.id);
// 验证参数
ctx.validate(
nickname:type: 'string', required: false, desc: '昵称',
status:type: 'string', required: true,range:in:['refuse','agree','ignore'], desc: '处理结果',
lookme:type: 'int', required: true, range:in:[0,1],desc: '看我',
lookhim:type: 'int', required: true,range:in:[0,1], desc: '看他',
);
// 查询改申请是否存在
let apply = await app.model.Apply.findOne(
where:
id,
friend_id:current_user_id,
status:'pending'
);
if(!apply)
ctx.throw('400','该记录不存在');
let status,nickname,lookhim,lookme = ctx.request.body;
let transaction;
try
// 开启事务
transaction = await app.model.transaction();
// 设置该申请状态
await apply.update(
status
, transaction );
// apply.status = status;
// apply.save();
// 同意,添加到好友列表
if (status == 'agree')
// 加入到对方好友列表
await app.model.Friend.create(
friend_id: current_user_id,
user_id: apply.user_id,
nickname: apply.nickname,
lookme: apply.lookme,
lookhim: apply.lookhim,
, transaction );
// 将对方加入到我的好友列表
await app.model.Friend.create(
friend_id: apply.user_id,
user_id: current_user_id,
nickname,
lookme,
lookhim,
, transaction );
// 提交事务
await transaction.commit();
// 消息推送
return ctx.apiSuccess('操作成功');
catch (e)
// 事务回滚
await transaction.rollback();
return ctx.apiFail('操作失败');
module.exports = ApplyController;
/common/free-lib/chat.js
import $U from "./util.js";
import $H from './request.js';
import $store from '@/store/index.js';
class chat
constructor(arg)
this.url = arg.url
this.isOnline = false
this.socket = null
// 获取当前用户相关信息
let user = $U.getStorage('user');
this.user = user ? JSON.parse(user) : ,
// 初始化聊天对象
this.TO = false;
// 连接和监听
if (this.user.token)
this.connectSocket()
// 连接socket
connectSocket()
console.log(this.user);
this.socket = uni.connectSocket(
url: this.url + '?token=' + this.user.token,
complete: () =>
)
// 监听连接成功
this.socket.onOpen(() => this.onOpen())
// 监听接收信息
this.socket.onMessage((res) => this.onMessage(res))
// 监听断开
this.socket.onClose(() => this.onClose())
// 监听错误
this.socket.onError(() => this.onError())
// 监听打开
onOpen()
// 用户状态上线
this.isOnline = true;
console.log('socket连接成功');
// 获取用户离线消息
this.getMessage();
// 获取离线消息
getMessage()
$H.post('/chat/getmessage');
// 获取聊天记录
getChatDetail(key = false)
key = key ? key : `chatDetail_$this.user.id_$this.TO.chat_type_$this.TO.id`
return this.getStorage(key)
// 监听关闭
onClose()
// 用户下线
this.isOnline = false;
this.socket = null;
console.log('socket连接关闭');
// 监听消息
onMessage(data)
console.log('监听消息', data);
let res = JSON.parse(data.data)
// console.log('监听接收消息',res)
// 错误
switch (res.msg)
case 'fail':
return uni.showToast(
title: res.data,
icon: 'none'
);
break;
case 'recall': // 撤回消息
this.handleOnRecall(res.data)
break;
case 'updateApplyList': // 新的好友申请
$store.dispatch('getApply');
break;
case 'moment': // 朋友圈更新
this.handleMoment(res.data)
break;
default:
// 处理消息
this.handleOnMessage(res.data)
break;
// 监听撤回处理
async handleOnRecall(message)
// 通知聊天页撤回消息
uni.$emit('onMessage',
...message,
isremove: 1
)
// 修改聊天记录
let id = message.chat_type === 'group' ? message.to_id : message.from_id
// key值:chatDetail_当前用户id_会话类型_接收人/群id
let key = `chatDetail_$this.user.id_$message.chat_type_$id`
// 获取原来的聊天记录
let list = this.getChatDetail(key)
// 根据k查找对应聊天记录
let index = list.findIndex(item => item.id === message.id)
if (index === -1) return;
list[index].isremove = 1
// 存储
this.setStorage(key, list)
// 当前会话最后一条消息的显示
this.updateChatItem(
id,
chat_type: message.chat_type
, (item) =>
item.data = '对方撤回了一条消息'
item.update_time = (new Date()).getTime()
return item
)
// 处理消息
async handleOnMessage(message)
// 添加消息记录到本地存储中
let
data
= this.addChatDetail(message, false)
// 更新会话列表
this.updateChatList(data, false)
// 全局通知
uni.$emit('onMessage', data)
// 消息提示
// this.messageNotice()
// 监听连接错误
onError()
// 用户下线
this.isOnline = false;
this.socket = null;
console.log('socket连接错误');
// 关闭连接
close()
this.socket.close()
// 创建聊天对象
createChatObject(detail)
this.TO = detail;
console.log('创建聊天对象', this.TO)
// 销毁聊天对象
destoryChatObject()
this.TO = false
// 组织发送信息格式
formatSendData(params)
return
id: 0, // 唯一id,后端生成,用于撤回指定消息
from_avatar: this.user.avatar, // 发送者头像
from_name: this.user.nickname || this.user.username, // 发送者昵称
from_id: this.user.id, // 发送者id
to_id: params.to_id || this.TO.id, // 接收人/群 id
to_name: params.to_name || this.TO.name, // 接收人/群 名称
to_avatar: params.to_avatar || this.TO.avatar, // 接收人/群 头像
chat_type: params.chat_type || this.TO.chat_type, // 接收类型
type: params.type, // 消息类型
data: params.data, // 消息内容
options: params.options ? params.options : , // 其他参数
create_time: (new Date()).getTime(), // 创建时间
isremove: 0, // 是否撤回
sendStatus: params.sendStatus ? params.sendStatus : "pending" // 发送状态,success发送成功,fail发送失败,pending发送中
// 发送信息
send(message, onProgress = false)
return new Promise(async (result, reject) =>
// 添加消息历史以上是关于uni-app 133好友申请实时通知的主要内容,如果未能解决你的问题,请参考以下文章