uni-app 190扫一扫加入群聊功能(二)

简介: uni-app 190扫一扫加入群聊功能(二)

/pages/chat/scan-add/scan-add.nvue

<template>
  <view class="page">
    <!-- 导航栏 -->
    <free-nav-bar title="加入群聊" showBack :showRight="false"></free-nav-bar>
    
    <view class="p-5">
      <view class="bg-white rounded p-4">
        <view class="flex align-center">
          <free-avatar :src="detail.avatar || '/static/images/demo/demo6.jpg'"></free-avatar>
          <view class="pl-4 flex flex-column">
            <text class="font-md">{{detail.name}}</text>
            <text class="font-sm text-muted" >群成员数:{{detail.users_count}}</text>
          </view>
        </view>
        <view class="flex flex-column align-center justify-center">
          <image :src="src" mode="" style="width: 550rpx;height: 550rpx;" class="bg-secondary mb-4"></image>
          <text class="font text-light-muted">扫一扫上面的二维码,加我的微信</text>
        </view>
      </view>
      
      <view class="py-3 flex align-center justify-center main-bg-color" hover-class="main-bg-hover-color" @click="join"> 
        <text class="font-md text-white">加入群聊</text>
      </view>
      
    </view>
  </view>
</template>
<script>
  import freeNavBar from '@/components/free-ui/free-nav-bar.vue';
  import freeAvatar from '@/components/free-ui/free-avatar.vue';
  import {mapState} from 'vuex';
  import $C from '@/common/free-lib/config.js';
  export default {
    components:{
      freeNavBar,
      freeAvatar
    },
    computed:{
      ...mapState({
        user:state=>state.user.user
      })
    },
    data() {
      return {
        detail:{
          id:0,
          name:"",
          avatar:'',
          users_count:0
        }
      }
    },
    onLoad(e) {
      if(e.params){
        
        this.detail = JSON.parse(decodeURIComponent(e.params));
        
      }
    },
    methods: {
      join(){
        
      }
    }
  }
</script>
<style>
</style>

/components/free-ui/free-nav-bar.vue

<template>
  <view>
    <view :class="getClass">
      <!-- 状态栏 -->
      <view :style="'height:'+statusBarHeight+'px'"></view>
      <!-- 导航 -->
      <view class="w-100 flex align-center justify-between" style="height: 90rpx;">
        <!-- 左边 -->
        <view class="flex align-center">
          <!-- 返回按钮 -->
          <!-- #ifndef MP -->
          <free-icon-button v-if="showBack" @click="back"><text class="iconfont font-md">&#xe60d;</text></free-icon-button>
          <!-- #endif -->
          <!-- 标题 -->
          <slot>
            <text v-if="title" class="font-md ml-3">{{getTitle}}</text>
          </slot>
        </view>
        <!-- 右边 -->
        <view class="flex align-center" v-if="showRight">
          <slot name="right">
            <free-icon-button @click="search"><text class="iconfont font-md">&#xe6e3;</text></free-icon-button>
            <free-icon-button @click="openExtend"><text class="iconfont font-md">&#xe682;</text></free-icon-button>
          </slot>
        </view>
      </view>
    </view>
    <!-- 占位 -->
    <view v-if="fixed" :style="fixedStyle"></view>
    
    <!-- 扩展菜单 -->
    <free-popup v-if="showRight" ref="extend" :bodyWidth="320" :bodyHeight="525"
    bodyBgColor="bg-dark" transformOrigin="right top">
      <view class="flex flex-column" 
      style="width: 320rpx;height: 525rpx;">
        <view class="flex-1 flex align-center" 
        hover-class="bg-hover-dark"
        v-for="(item,index) in menus"
        :key="index"
        @click="clickEvent(item)">
          <text class="iconfont pl-3 pr-2 font-md text-white">{{item.icon}}</text>
          <text class="font-md text-white">{{item.name}}</text>
        </view>
      </view>
    </free-popup>
    
    
  </view>
</template>
<script>
  import freeIconButton from "./free-icon-button.vue"
  import freePopup from "./free-popup.vue"
  export default {
    props: {
      showBack:{
        type:Boolean,
        default:false
      },
      backEvent:{
        type:Boolean,
        default:true
      },
      title: {
        type: [String,Boolean],
        default:false 
      },
      fixed:{
        type:Boolean,
        default:true
      },
      noreadnum:{
        type:[Number,String],
        default:0
      },
      bgColor:{
        type:String,
        default:"bg-light"
      },
      showRight:{
        type:Boolean,
        default:true
      }
    },
    components:{
      freeIconButton,
      freePopup
    },
    data() {
      return {
        statusBarHeight:0,
        navBarHeight:0,
        menus:[
          {
            name:"发起群聊",
            event:"navigateTo",
            path:"/pages/mail/mail/mail?type=createGroup",
            icon:"\ue633"
          },
          {
            name:"添加好友",
            event:"navigateTo",
            path:"/pages/common/search/search",
            icon:"\ue65d"
          },
          // #ifndef H5
          {
            name:"扫一扫",
            event:"scan",
            icon:"\ue614"
          },
          // #endif
          {
            name:"收付款",
            event:"",
            icon:"\ue66c"
          },
          {
            name:"帮助与反馈",
            event:"",
            icon:"\ue66c"
          }
        ],
      }
    },
    mounted() {
      // #ifdef APP-PLUS-NVUE
      this.statusBarHeight = plus.navigator.getStatusbarHeight()
      // #endif
      this.navBarHeight = this.statusBarHeight + uni.upx2px(90)
    },
    computed: {
      fixedStyle() {
        return `height:${this.navBarHeight}px`
      },
      getTitle(){
        let noreadnum = this.noreadnum > 0 ? '('+this.noreadnum+')' : ''
        return this.title + noreadnum
      },
      getClass(){
        let fixed = this.fixed?'fixed-top':''
        return `${fixed} ${this.bgColor}` 
      }
    },
    methods: {
      openExtend() {
        this.$refs.extend.show(uni.upx2px(415),uni.upx2px(150))
      },
      // 返回
      back(){
        if(this.backEvent){
          return uni.navigateBack({
            delta: 1
          });
        }
        this.$emit('back')
      },
      search(){
        uni.navigateTo({
          url: '/pages/common/search/search'
        });
      },
      clickEvent(item){
        this.$refs.extend.hide()
        switch (item.event){
          case 'navigateTo':
          uni.navigateTo({
            url: item.path,
          });
            break;
            case 'scan':
          uni.scanCode({
            success:(res)=>{
              if(res.scanType === 'QR_CODE'){
                let result = JSON.parse(res.result);
                switch(result.type){
                  case 'group':
                  $H.post('/group/checkrelation',{
                    id:parseInt(result.id)
                  }).then(res2=>{
                    if(res2.status){
                      // 已经在群内
                    }else{
                      // 加入群聊
                      uni.navigateTo({
                        url:'/pages/chat/scan-add/scan-add?params='+encodeURIComponent(JSON.stringify(res2.group))
                      });
                    }
                  })
                  break;
                  default:
                  uni.showToast({
                    title: '靓仔,自己发挥',
                    icon: 'none'
                  });
                  break;
                }
              }
            }
          })
          break;
          default:
          uni.showToast({
            title: '靓仔,自己发挥',
            icon: 'none'
          });
            break;
        }
      }
    },
  }
</script>
<style>
</style>

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

目录
相关文章
|
4月前
|
小程序 视频直播 数据安全/隐私保护
如何在1v1视频直播交友APP中实现防录屏防截屏功能?
婚恋交友市场快速增长,1v1社交应用海外投放增86.49%,中东、东南亚及北美需求旺盛。用户偏好私密高效交流,国内“云相亲”兴起。开发需合规备案、实名认证,并防范诈骗。本文详解原生APP防录屏技术:Android通过MediaProjection检测,iOS监听UIScreen状态,结合动态水印、远程销毁等增强防护,平衡体验与安全。
|
4月前
|
JavaScript API 开发工具
如何在原生App中调用Uniapp的原生功能?
如何在原生App中调用Uniapp的原生功能?
754 139
|
5月前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
195 0
|
4月前
|
存储 自然语言处理 算法
参照Yalla、Hawa等主流APP核心功能,开发一款受欢迎的海外语聊需要从哪些方面入手
海外语聊APP开发需结合Yalla、Hawa等主流产品,聚焦多语言支持、实时音视频、社交互动与安全合规。兼顾技术架构、本地化运营与法律风险,避免劣质成品代码,平衡创新与成本,打造差异化出海产品。(239字)
|
6月前
|
存储 Java PHP
轻量化短视频电商直播带货APP源码全解析:核心功能与设计流程​
在电商直播热潮下,开发专属直播带货APP成为抢占市场关键。本文详解原生开发轻量化APP的核心功能与全流程设计,涵盖用户登录、商品浏览、直播互动、购物车、订单及售后功能,并介绍安卓端Java、苹果端Object-C、后台PHP的技术实现,助力打造高效优质的直播电商平台。
|
11月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
581 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
8月前
|
数据库
《仿盒马》app开发技术分享-- 回收订单页功能完善(45)
上一节我们实现了订单的待取件、已取消状态展示,并且成功实现了修改订单状态后的列表刷新,实现了云端数据的修改,这一节我们来实现订单页剩下的两个板块的业务逻辑,分别是运输中、已完成状态下的列表展示以及订单状态的修改
160 1
|
7月前
|
存储 移动开发 监控
App Trace功能实战:一键拉起、快速安装与免提写邀请码的应用实践
App Trace系统通过一键拉起、快速安装和免提写邀请码三大功能,显著提升用户转化率、安装成功率和邀请注册率。结合深度技术实现与优化,助力公司用户增长,成为移动端核心基础设施。
|
8月前
|
UED
《仿盒马》app开发技术分享-- 扫一扫功能(35)
随着app的逐渐完善,我们现在需要在细节处做更多的打磨,在首页我们添加了很多静态的按钮和组件,现在我们开始对这些组件进行功能的添加,这次首先实现的是首页头部的扫一扫功能,扫一扫我们实现扫码后跳转商品详情页
170 0
|
8月前
|
存储 数据库
《仿盒马》app开发技术分享-- 购物车功能完善(14)
上一节我们实现了购物车商品列表的状态切换,已添加商品数量的增减,已添加商品滑动删除,已添加商品在选中情况下的价格计算。这一节我们在这些功能的基础上实现云端记录,因为我们现在只有数据的查询是从云端获取的,其他的操作虽然都实现了相对应的功能,但是当我们操作完,关闭app,再打开不会有对应的记录,有的同学可能会说,那我们把数据用首选项或者数据库的形式存储就可以了吧? 那如果我更换了另一个设备那这些添加的数据是不是就又不能使用了?所以我们的每个操作,最好都是提交到云端,这样我们在其他设备,在退出应用,切换账号这些情况下都能很好的保存我们操作后的购物车状态。
133 0