uni-app 107群二维码生成(一)

142 篇文章 4 订阅
139 篇文章 1 订阅

router.js

  // 生成群二维码
  router.get('/group_qrcode/:id',controller.group.qrcode);

extend/content.js

// app/extend/context.js
var qr = require('qr-image');
module.exports = {
  // 成功提示
  apiSuccess(data = '', msg = 'ok', code = 200) {
    this.body = { msg, data };
    this.status = code;
  },
  // 失败提示
  apiFail(data = '', msg = 'fail', code = 400) {
    this.body = { msg, data };
    this.status = code;
  },
  // 生成token
  getToken(value) {
        return this.app.jwt.sign(value, this.app.config.jwt.secret);
  },
  // 验证token
  checkToken(token) {
        return this.app.jwt.verify(token, this.app.config.jwt.secret);
  },
  // 发送或者存到消息队列中
  sendAndSaveMessage(to_id,message){
      const { app,service } = this;
      let current_user_id = this.authUser.id;
       // 拿到当前的socket
    //   let  socket = app.ws.user[to_id];
       // 验证对方是否在线,不在线记录到待接收消息队列中 在线:消息推送 存储到对方的聊天记录中 chatlog_对方用户id_user_当前用户id
            
            if(app.ws.user && app.ws.user[to_id]){
                // 消息推送
                app.ws.user[to_id].send(JSON.stringify({
                    msg:'ok',
                    data:message
                }))
                // 存到历史记录中
                service.cache.setList(`chatlog_${to_id}_${message.chat_type}_${current_user_id}`,message);
            }else{
                service.cache.setList('getmessage_'+to_id,message);
                
            }
  },
  // 生成唯一id
  qrcode(url){
      var img = qr.image(url,{size:10});
      this.response.type = 'image/png';
      this.body = img;
  }
};

middleware/auth.js

module.exports=(option,app)=>{
    return async (ctx,next)=>{
        //1. 获取 header 头token
        // const { token } = ctx.header;
        let token = ctx.header.token || ctx.query.token;
        // console.log(ctx.header);
        if (!token) {
            ctx.throw(400, '您没有权限访问该接口!');
        }
        //2. 根据token解密,换取用户信息
        let user = {};
        try {
            user = ctx.checkToken(token);
        } catch (error) {
            let fail = error.name === 'TokenExpiredError' ? 'token 已过期! 请重新获取令牌' : 'Token 令牌不合法!';
            ctx.throw(400, fail);
        }
        //3. 判断当前用户是否登录
        let t = await ctx.service.cache.get('user_' + user.id);
        if (!t || t !== token) {
            ctx.throw(400, 'Token 令牌不合法!');
        }

        //4. 获取当前用户,验证当前用户是否被禁用
        user = await app.model.User.findByPk(user.id);
        if (!user || user.status == 0) {
            ctx.throw(400,'用户不存在或已被禁用');
        }
        // 5. 把 user 信息挂载到全局ctx上
        ctx.authUser = user;

        await next();
    }
}

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:id
              }
          });
          message.data = `${from_name} 退出该群聊`;
      }
      // 推送消息
      group.group_users.forEach(item=>{
            ctx.sendAndSaveMessage(item.user_id,message);
      });
      return ctx.apiSuccess('ok');
  }
  
  // 生成群二维码
  async qrcode(){
      const {ctx,app} = this;
      ctx.qrcode(JSON.stringify({
          id:1
      }));
  }
}
module.exports = GroupController;

接口测试如下图所示

在这里插入图片描述
感谢大家观看,我们下次见

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
uni-app中生成二维码可以使用第三方库qrcode.js。以下是生成二维码的步骤: 1. 首先,通过npm将qrcode.js安装到你的uni-app项目中。打开命令行工具,切换到你的项目根目录下,执行以下命令: ```shell npm install qrcode.js --save ``` 2. 在需要生成二维码的页面中引入qrcode.js。打开你需要使用的页面的vue文件,添加以下代码: ```javascript import QRCode from 'qrcodejs2' export default { mounted() { // 在mounted钩子函数中调用生成二维码的方法 this.generateQRCode() }, methods: { generateQRCode() { // 获取二维码容器DOM元素 const qrcodeContainer = this.$refs.qrcodeContainer // 创建一个qrcode实例 const qrcode = new QRCode(qrcodeContainer, { text: 'https://www.csdn.net', // 二维码的内容 width: 200, // 二维码的宽度 height: 200 // 二维码的高度 }) // 或者你也可以通过动态数据传递给二维码的内容 // const qrcode = new QRCode(qrcodeContainer, { // text: this.dynamicData, // width: 200, // height: 200 // }) // 可以根据需要自定义二维码的样式 qrcodeContainer.children[0].style.margin = '10px' } } } ``` 3. 在页面的模板中添加一个用于渲染二维码的容器。在你的页面模板中,添加以下代码: ```html <template> <view> <canvas ref="qrcodeContainer"></canvas> </view> </template> ``` 这样,当你访问该页面时,就会生成一个指定内容的二维码并渲染在页面上。 以上就是在uni-app中生成二维码的方法,希望能帮到你!如果有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2019ab

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值