app/controller/apply.js

'use strict';const Controller = require('egg').Controller;class ApplyController extends Controller {// 申请添加好友async addFriend() {const { ctx,app } = this;// 拿到当前用户idlet 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;// 拿到当前用户idlet 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;// 拿到当前用户idlet 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'},include:[{model:app.model.User}]});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();// 消息推送if(status == 'agree'){let message = {id:(new Date()).getTime(), // 唯一id,后端生成唯一idfrom_avatar:ctx.authUser.avatar, // 发送者头像from_name:ctx.authUser.nickname || ctx.authUser.username,// 发送者昵称from_id:current_user_id,// 发送者idto_id:apply.user_id, // 接收人、群 id to_name:nickname || apply.user.nickname || apply.user.username, // 接收人、群 名称to_avatar:apply.user.avatar, // 接收人、群 头像 chat_type:'user', // 接收类型type:'system',// 消息类型data:'你们已经是好友了,可以开始聊天了', // 消息内容options:{}, // 其他参数create_time:(new Date()).getTime(), // 创建时间isremove:0, // 是否撤回}ctx.sendAndSaveMessage(apply.user_id,message);message.from_avatar = apply.user.avatar;message.from_name = nickname || apply.user.nickname || apply.user.username;message.from_id = apply.user.id;message.to_avatar = ctx.authUser.avatar;message.to_name = apply.nickname || ctx.authUser.nickname || ctx.authUser.username;message.to_id = current_user_id;ctx.sendAndSaveMessage(current_user_id, { ...message });}// 消息推送return ctx.apiSuccess('操作成功');} catch (e) {// 事务回滚await transaction.rollback();return ctx.apiFail('操作失败');}}
}module.exports = ApplyController;

下图是我测试的截图


感谢大家观看,我们下次见

uni-app 134同意添加好友实时通知相关推荐

  1. uni.app H5(微信公众号定位) uni.getLocation

    最近在开发公众号,由于之前经常使用uni,app写APP,索性就用uni.app来开发公众号了, 不过也遇到了一个问题,就是在公众号的首页要获取用户的定位.我看了看官网的API 有个uni.getLo ...

  2. ios pusher使用_如何使用Pusher向Laravel添加实时通知

    ios pusher使用 现代网络用户希望了解应用程序内发生的所有事情. 您不希望成为一个没有通知下拉列表的网站,不仅在所有社交媒体网站中找到,而且在如今的所有其他地方也都找不到. 幸运的是,使用La ...

  3. 切换 uniapp_万能前端框架uni app初探03:底部导航开发

    前言 本节我们使用uni app的底部导航功能,点击不同tab会显示不同页面,这个功能在实际项目开发中几乎是必备的. 一.基础知识 1.tabBar 如果应用是一个多 tab 应用,可以通过 tabB ...

  4. Rtx 实时通知实现

    RTX 实时通知实现 //require_once('./lib/nusoap.php'); //$client = new soapclient('http://web11.99mr.com:801 ...

  5. uni app map 地图 漂浮问题及方案

    uni app map 地图 漂浮问题及方案 文章页有图片导致的问题,图片没加载出来,导致文章内容高度不固定,如果图片没加载出来,高度就是0,如果此时开始加载map,那么map就在那里加载,map原生 ...

  6. 数据采集 - 获取【码市】最新发布需求,并实时通知用户 案例二

    背景 有个朋友计划拓展业务渠道,准备在众包平台上接单,他的主营产品是微信小程序,因此他想第一时间收到客户发出的需求信息,然后第一时间联系客户,这样成交率才能够得到保障,否则单早都被其他同行接完了,他的 ...

  7. HBuilder X ——Uni app 学习笔记(一)

    HBuilder X --Uni app 学习笔记(一) 1.pages.json配置 *pages数组中第一项表示应用启动页,数组中其他项为项目中所有页面路径. enablePullDownRefr ...

  8. uni app中使用图表

    关于在uni app中运用图表 今天写项目,需要在uni app中使用图表,我使用的是ucharts. 具体操作如下 1.下载 ucharts可以直接在uni app的插件市场下载安装. 先在插件市场 ...

  9. uni app 自动化索引列表

    uni app 自动化索引列表,官方推荐的第三方插件 https://ext.dcloud.net.cn/plugin?id=375 [{"letter": "A&quo ...

最新文章

  1. NR 5G 安全与秘钥简述
  2. python基础教程是什么语言-0编程基础,什么语言也没学过,请问学Python怎样入门?...
  3. 学python找工作有用吗-为什么我不建议你通过 Python 去找工作?
  4. hdu 2009 求数列的和(c语言)
  5. 绝地求生测试服画面优化软件,绝地求生大逃杀 画质优化补丁
  6. Python中replace()函数
  7. Android近场通信---NFC基础(三)
  8. 关于批处理的学习之二[显示篇]
  9. 程序员:站在自学鄙视链顶端的王者(太真实!)
  10. 洛谷P2147[SDOI2008]洞穴勘测
  11. C typedef用途小结
  12. UILabel实现自适应宽高需要注意的地方(三)
  13. 孔板流量计计算公式_带你全面了解各种流量计!
  14. mysql 数据字典导出_MySQL导出数据字典
  15. 计算机专业职业规划英语小作文,关于职业规划的英语作文
  16. 全网最简单的方法QQ透明头像设置方法(小白教程)几分钟搞定
  17. phpstorm注册码 激活 授权码 License server
  18. java计算月份所在的季度
  19. matlab针对电阻和电源电动势为r1,第三章 电力电子与MATLAB应用技术
  20. Python MyQR 生成不一样的二维码

热门文章

  1. iPhone 11 Pro上手:亚光玻璃手感好,拍照真快
  2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.elk.elkweb.mapp
  3. 为什么程序员都喜欢用这样的头像?求解!
  4. 使用git push推送到远程仓库发生Authentication failed错误
  5. WORD不能粘贴内容 文字 图片 Office word 2010 装Mathtype之后
  6. 一键批量剪辑视频,把横屏视频改竖屏
  7. Ampere 又放大招,推出自研192 核AmpereOne 系列处理器,已投产
  8. 推荐电影:金基德的《春去春又来》
  9. 网络攻击的危害有哪些
  10. Microsoft.SqlServer.Management.Sdk.Sfc, Version=12.0.0.0, Culture=neutral, .....