uni-app 103退出和解散群聊(一)

uni-app 103退出和解散群聊(一)route.js//删除并退出群聊router.post(‘/group/quit’,controller.group.quit);app/controller/group.js’usestrict’;constController=require(‘egg’).Controller;classGroupControllerextendsController{//获取群聊列表asynclist(){const{ct.

大家好,又见面了,我是你们的朋友全栈君。

route.js

   // 删除并退出群聊
  router.post('/group/quit',controller.group.quit);

app/controller/group.js

'use strict';

const Controller = require('egg').Controller;

class GroupController extends Controller { 
   
  // 获取群聊列表
  async list() { 
   
        const { 
    ctx, app } = this;
        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.Group.findAll({ 
   
            where: { 
   
                status: 1
            },
            include: [{ 
   
                model: app.model.GroupUser,
                where: { 
   
                    user_id: current_user_id
                }
            }]
        });

        return ctx.apiSuccess(rows);
    }
    
  // 创建群聊
  async create() { 
   
    const { 
    ctx,app } = this;
    // 拿到当前用户id
    let current_user_id = ctx.authUser.id;
    // 验证参数
    ctx.validate({ 
   
        ids:{ 
   
            require:true,
            type:'array'
        }
    });
    let { 
    ids } = ctx.request.body;
    // 验证是否是我的好友
    let friends = await app.model.Friend.findAll({ 
   
        where:{ 
   
            user_id:current_user_id,
            friend_id:ids
        },
        include:[{ 
   
            model:app.model.User,
            as:'friendInfo',
            attributes:['nickname','username']
        }]
    });
    if (!friends.length) { 
   
        return ctx.apiFail('请选择需要加入群聊的好友');
    }
    // 创建群聊
    let name = friends.map(item=>item.friendInfo.nickname || item.friendInfo.username);
    name.push(ctx.authUser.nickname || ctx.authUser.username); // 将自己的数据加入
    let group = await app.model.Group.create({ 
   
        name:name.join(','),
        avatar:'',
        user_id:current_user_id
    });
    // 加入群聊用户
    let data = friends.map(item=>{ 
   
         return { 
   user_id:item.friend_id,group_id:group.id}
     });
     data.unshift({ 
   
         user_id:current_user_id,
         group_id:group.id
     });
     await app.model.GroupUser.bulkCreate(data);
    // 消息推送
     let message = { 
   
        id:(new Date()).getTime(), // 唯一id,后端生成唯一id
        from_avatar:ctx.authUser.avatar,// 发送者头像
        from_name:ctx.authUser.nickname || ctx.authUser.username,// 发送者昵称
        from_id:current_user_id, // 发送者id
        to_id:group.id,// 接收人id
        to_name:group.name,// 接收人/群 名称
        to_avatar:group.avatar,// 接收人/群 头像 
        chat_type:'group', // 接收类型
        type:'system', // 消息类型
        data:'创建群聊成功,可以聊天了', // 消息内容
        options:{ 
   }, // 其他参数
        create_time:(new Date()).getTime(),// 创建时间
        isremove:0, // 是否撤回
        group:group
    }
    data.forEach(item =>{ 
   
        ctx.sendAndSaveMessage(item.user_id,message);
    });
    ctx.apiSuccess('ok');
  }
  // 查看群资料
  async info() { 
   
        const { 
    ctx, app } = this;
        let current_user_id = ctx.authUser.id;
        // 验证参数
        ctx.validate({ 
   
            id: { 
   
                required: true,
                type: 'int',
                desc: "群组id"
            }
        });
        let { 
    id } = ctx.params;
        // 群组是否存在
        let group = await app.model.Group.findOne({ 
   
            where: { 
   
                status: 1,
                id
            },
            include: [{ 
   
                model: app.model.GroupUser,
                attributes: ['user_id', 'nickname'],
                include: [{ 
   
                    model: app.model.User,
                    attributes: ['id', 'nickname', 'avatar', 'username']
                }]
            }]
        });

        if (!group) { 
   
            return ctx.apiFail('该群聊不存在或者已被封禁');
        }

        // 当前用户是否是该群成员
        let index = group.group_users.findIndex(item => item.user_id === current_user_id);
        if (index === -1) { 
   
            return ctx.apiFail('你不是该群成员,没有权限');
        }

        ctx.apiSuccess(group);
    }
  // 修改群名称
  async rename(){ 
   
      const { 
    ctx,app } = this;
      let current_user_id = ctx.authUser.id;
      // 参数验证
      ctx.validate({ 
   
          id:{ 
   
              required:true,
              type:'int',
              desc:'群组id'
          },
          name:{ 
   
              required:true,
              type:'string',
              desc:'群名称'
          }
      });
      let { 
    id,name } = ctx.request.body;
      // 是否存在 
      let group = await app.model.Group.findOne({ 
   
          where:{ 
   
              id,
              status:1 
          },
          include:[{ 
   
              model:app.model.GroupUser,
              attributes:['user_id','nickname']
          }]
      });
      if(!group){ 
   
          return ctx.apiFail('该群聊不存在或者已被封禁');
      }
      // 当前用户是否是该群成员
      let index = group.group_users.findIndex(item=>item.user_id === current_user_id);
      if(index === -1){ 
   
          return ctx.apiFail('你不是该群成员');
      }
      // 验证是否是群主
      if(group.user_id !== current_user_id){ 
   
          return ctx.apiFail('你不是管理员,没有权限');
      }
      // 修改群名称
      group.name = name;
      await group.save();
      let from_name = group.group_users[index].nickname || ctx.authUser.nickname || ctx.authUser.username;
      // 消息推送
      let message = { 
   
                id:(new Date()).getTime(), // 唯一id,后端生成唯一id
                from_avatar:ctx.authUser.avatar,// 发送者头像
                from_name,// 发送者昵称
                from_id:current_user_id, // 发送者id
                to_id:group.id,// 接收人id
                to_name:group.name,// 接收人/群 名称
                to_avatar:group.name,// 接收人/群 头像 
                chat_type:'group', // 接收类型
                type:'system', // 消息类型
                data:`${ 
     from_name} 修改群名称为 ${ 
     name}`, // 消息内容
                options:{ 
   }, // 其他参数
                create_time:(new Date()).getTime(),// 创建时间
                isremove:0, // 是否撤回
                group:group
        }
        // 推送消息
        group.group_users.forEach(item=>{ 
   
            ctx.sendAndSaveMessage(item.user_id,message);
        });
        ctx.apiSuccess('ok');
  }
  // 推送群公告
  async remark(){ 
   
      const { 
    ctx,app } = this;
      let current_user_id = ctx.authUser.id;
      // 参数验证
      ctx.validate({ 
   
          id:{ 
   
              required:true,
              type:'int',
              desc:'群组id'
          },
          remark:{ 
   
              required:true,
              type:'string',
              desc:'群公告'
          }
      });
      let { 
    id,remark } = ctx.request.body;
      // 是否存在 
      let group = await app.model.Group.findOne({ 
   
          where:{ 
   
              id,
              status:1 
          },
          include:[{ 
   
              model:app.model.GroupUser,
              attributes:['user_id','nickname']
          }]
      });
      if(!group){ 
   
          return ctx.apiFail('该群聊不存在或者已被封禁');
      }
      // 当前用户是否是该群成员
      let index = group.group_users.findIndex(item=>item.user_id === current_user_id);
      if(index === -1){ 
   
          return ctx.apiFail('你不是该群成员');
      }
      // 验证是否是群主
      if(group.user_id !== current_user_id){ 
   
          return ctx.apiFail('你不是管理员,没有权限');
      }
      // 修改群公告
      group.remark = remark;
      await group.save();
      let from_name = group.group_users[index].nickname || ctx.authUser.nickname || ctx.authUser.username;
      // 消息推送
      let message = { 
   
                id:(new Date()).getTime(), // 唯一id,后端生成唯一id
                from_avatar:ctx.authUser.avatar,// 发送者头像
                from_name,// 发送者昵称
                from_id:current_user_id, // 发送者id
                to_id:group.id,// 接收人id
                to_name:group.name,// 接收人/群 名称
                to_avatar:group.name,// 接收人/群 头像 
                chat_type:'group', // 接收类型
                type:'system', // 消息类型
                data:`[新公告] ${ 
     remark}`, // 消息内容
                options:{ 
   }, // 其他参数
                create_time:(new Date()).getTime(),// 创建时间
                isremove:0, // 是否撤回
                group:group
        }
        // 推送消息
        group.group_users.forEach(item=>{ 
   
            ctx.sendAndSaveMessage(item.user_id,message);
        });
        ctx.apiSuccess('ok');
  }
  
  // 修改我在本群中的昵称
  async nickname(){ 
   
     const { 
    ctx, app, service } = this;
     let current_user_id = ctx.authUser.id;
      // 参数验证
      ctx.validate({ 
   
          id:{ 
   
              required:true,
              type:'int',
              desc:'群组id'
          },
          nickname:{ 
   
              required:true,
              type:'string',
              desc:'昵称'
          }
      });
      let { 
    id,nickname } = ctx.request.body;
      // 是否存在 
      let group = await app.model.Group.findOne({ 
   
          where:{ 
   
              id,
              status:1 
          },
          include:[{ 
   
              model:app.model.GroupUser,
              attributes:['user_id','nickname']
          }]
      });
      if(!group){ 
   
          return ctx.apiFail('该群聊不存在或者已被封禁');
      }
      // 当前用户是否是该群成员
      let index = group.group_users.findIndex(item=>item.user_id === current_user_id);
      if(index === -1){ 
   
          return ctx.apiFail('你不是该群成员');
      }
      // 修改昵称
      let group_user = await app.model.GroupUser.findOne({ 
   
          where:{ 
   
             user_id:current_user_id,
             group_id:group.id
          }
      });
      if(group_user){ 
   
          await group_user.update({ 
   
              nickname
          })
      }
      return ctx.apiSuccess('ok');
   }
   
  // 删除并退出群聊
  async quit(){ 
   
     const { 
    ctx, app, service } = this;
     let current_user_id = ctx.authUser.id;
      // 参数验证
      ctx.validate({ 
   
          id:{ 
   
              required:true,
              type:'int',
              desc:'群组id'
          }
      });
      let { 
    id } = ctx.request.body;
      // 是否存在 
      let group = await app.model.Group.findOne({ 
   
          where:{ 
   
              id,
          },
          include:[{ 
   
              model:app.model.GroupUser,
              attributes:['user_id','nickname']
          }]
      });
      if(!group){ 
   
          return ctx.apiFail('该群聊不存在');
      }
      // 当前用户是否是该群成员
      let index = group.group_users.findIndex(item=>item.user_id === current_user_id);
      if(index === -1){ 
   
          return ctx.apiFail('你不是该群成员');
      }
      
      let from_name = group.group_users[index].nickname || ctx.authUser.nickname || ctx.authUser.username;
      // 组织消息格式
      let message = { 
   
                id:(new Date()).getTime(), // 唯一id,后端生成唯一id
                from_avatar:ctx.authUser.avatar,// 发送者头像
                from_name,// 发送者昵称
                from_id:current_user_id, // 发送者id
                to_id:group.id,// 接收人id
                to_name:group.name,// 接收人/群 名称
                to_avatar:group.avatar,// 接收人/群 头像 
                chat_type:'group', // 接收类型
                type:'system', // 消息类型
                data:``, // 消息内容
                options:{ 
   }, // 其他参数
                create_time:(new Date()).getTime(),// 创建时间
                isremove:0, // 是否撤回
                group:group
      }
      if(group.user_id===current_user_id){ 
   
          // 解散群
          await app.model.Group.destroy({ 
   
              where:{ 
   
                  id:group.id
              }
          });
          message.data = '该群已被解散';
      }else{ 
   
          // 退出群 
          await app.model.GroupUser.destroy({ 
   
              where:{ 
   
                  user_id:current_user_id,
                  group_id:group_id
              }
          });
          message.data = `${ 
     from_name} 退出该群聊`;
      }
      // 推送消息
      group.group_users.forEach(item=>{ 
   
            ctx.sendAndSaveMessage(item.user_id,message);
      });
      return ctx.apiSuccess('ok');
  }
}
module.exports = GroupController;

感谢大家观看,下次我们接着调试

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA之文件操作[通俗易懂]

    JAVA之文件操作[通俗易懂]Console此类包含多个方法,可访问与当前Java虚拟机关联的基于字符的控制台设备(如果有)。虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果此虚拟机具

    2025年7月17日
    0
  • tcpip协议族有哪些

    tcpip协议族有哪些tcpip协议族有哪些有五层应用层运输层网络层数据链路层物理层

    2022年6月22日
    24
  • 学习如何搭建SpringBoot框架

    学习如何搭建SpringBoot框架SpringBoot是一个非常好用的框架,在项目中我们常常会用到它,今天我来分享一下如何来搭建一个SpringBoot框架。第一步:创建项目打开Idea,点击File->New->Project->SpringInitalizr选择依赖:即使不选择依赖也可以在后续pom.xml文件中添加点击Finish,Idea会自动生成一个SpringBoot项目,如此一来项目就创建好了。第二步:配置数据库到resource->application.proper

    2022年8月20日
    7
  • hive like与rlike的区别

    hive like与rlike的区别like与rlike的区别:like不是正则,而是通配符。这个通配符可以看一下SQL的标准,例如%代表任意多个字符。rlike是正则,正则的写法与java一样。’\’需要使用’\\’,例如’\w’需要使用’\\w’hive>select”aaaaa”like”%aaa%”fromtest_structlimit10;Totaljobs=1…OK

    2022年7月26日
    8
  • win7彻底卸载iis

    win7彻底卸载iis

    2021年10月12日
    52
  • springboot实现ajax跨域请求

    springboot实现ajax跨域请求有段时间没写文章了。看到有人提问ajax跨域请求的问题。博主要再次强调,跨域,就是从不同的的IP端口获取数据,比如说,从www.baidu.com获取数据,就叫跨域!那么localhost:8080与localhost:8081之间呢?也叫跨域。如果处理的不好,就会报错,不仅前端报错,后端也会报错。那么如何解决呢?着急的人,请直接往下看,不急的请听我细细道来,一定能解决您的问题。我再此保证

    2022年6月17日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号