uni-app 160提醒谁看功能

简介: uni-app 160提醒谁看功能

/pages/mail/mail/mail.vue

<template>
  <view>
    
    <!-- 导航栏 -->
    <free-nav-bar title="选择" showBack :showRight="true">
      <free-main-button :name="buttonText" slot="right" @click="submit"></free-main-button>
    </free-nav-bar>
    
    <!-- 通讯录列表 -->
    <scroll-view scroll-y="true" 
    :style="'height:'+scrollHeight+'px;'"
    :scroll-into-view="scrollInto">
      
      <template v-if="type === 'see'">
        <free-list-item v-for="(item,index) in typeList"
        :key="item.key" :title="item.name" 
        :showRightIcon="false" showRight
        @click="typeIndex = index">
          <view slot="right"
          style="width: 40rpx;height: 40rpx;"
          class="border rounded-circle flex align-center justify-center mr-4">
            <view v-if="typeIndex === index" 
            style="width: 30rpx;height: 30rpx;"
            class="main-bg-color rounded-circle"></view>
          </view>
        </free-list-item>
      </template>
    
    
      <template v-if="type !== 'see' || (type === 'see' && (typeIndex === 1 || typeIndex === 2)) ">
        <view v-for="(item,index) in list" :key="index"
        :id="'item-'+item.title">
          <view v-if="item.list.length" 
          class="py-2 px-3 border-bottom bg-light">
            <text class="font-md text-dark">{{item.title}}</text>
          </view>
          <free-list-item v-for="(item2,index2) in item.list" 
          :key="index2" :title="item2.name" 
          :cover="item2.avatar || '/static/images/userpic.png'"
          :showRightIcon="false" showRight
          @click="selectItem(item2)">
            <view slot="right"
            style="width: 40rpx;height: 40rpx;"
            class="border rounded-circle flex align-center justify-center mr-4">
              <view v-if="item2.checked" 
              style="width: 30rpx;height: 30rpx;"
              class="main-bg-color rounded-circle"></view>
            </view>
          </free-list-item>
        </view>
      </template>
      
    </scroll-view>
    
    <!-- 侧边导航条 -->
    <view class="position-fixed right-0 bottom-0 bg-light flex flex-column" :style="'top:'+top+'px;'" style="width: 50rpx;" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
      <view class="flex-1 flex align-center justify-center"
      v-for="(item,index) in list" :key="index">
        <text class="font-sm text-muted">{{item.title}}</text>
      </view>
    </view>
    <view class="position-fixed rounded-circle bg-light border flex align-center justify-center" v-if="current"
    style="width: 150rpx;height: 150rpx;left: 300rpx;"
    :style="'top:'+modalTop+'px;'">
      <text class="font-lg">{{current}}</text>
    </view>
  </view>
</template>
<script>
  import freeNavBar from "@/components/free-ui/free-nav-bar.vue"
  import freeListItem from "@/components/free-ui/free-list-item.vue"
  import freeMainButton from '@/components/free-ui/free-main-button.vue';
  import { mapState } from 'vuex'
  import $H from '@/common/free-lib/request.js';
  export default {
    components: {
      freeNavBar,
      freeListItem,
      freeMainButton
    },
    data() {
      return {
        typeIndex:0,
        typeList:[{
          name:"公开",
          key:"all"
        },{
          name:"谁可以看",
          key:"only"
        },{
          name:"不给谁看",
          key:"except"
        },{
          name:"私密",
          key:"none"
        }],
        
        top:0,
        scrollHeight:0,
        scrollInto:'',
        current:'',
        
        selectList:[],
        
        type:"",
        
        limit:9,
        
        id:0
      }
    },
    onLoad(e) {
      let res = uni.getSystemInfoSync()
      this.top = res.statusBarHeight + uni.upx2px(90)
      this.scrollHeight = res.windowHeight - this.top
      
      if(e.type){
        this.type = e.type
      }
      if(e.limit){
        this.limit = parseInt(e.limit)
      }
      if(e.id){
        this.id = e.id
        if(e.type === 'inviteGroup'){
          this.limit = 1
        }
      }
      this.$store.dispatch('getMailList')
    },
    computed: {
      ...mapState({
        list:state=>state.user.mailList
      }),
      buttonText(){
        let text = '发送'
        if(this.type === 'createGroup'){
          text = '创建群组'
        }
        return text + ' ('+this.selectCount+')'
      },
      modalTop(){
        return (this.scrollHeight - uni.upx2px(150)) / 2
      },
      // 每个索引的高度
      itemHeight() {
        let count = this.list.length
        if(count < 1){
          return 0
        }
        return this.scrollHeight /  count
      },
      // 选中数量
      selectCount(){
        return this.selectList.length
      }
    },
    methods: {
      touchstart(e){
        this.changeScrollInto(e)
      },
      touchmove(e){
        this.changeScrollInto(e)
      },
      touchend(e){
        this.current = ''
      },
      // 联动
      changeScrollInto(e){
        let Y = e.touches[0].pageY
        // #ifdef MP
        Y = Y - this.top
        // #endif
        let index = Math.floor(Y / this.itemHeight)
        let item = this.list[index]
        if(item){
          this.scrollInto = 'item-'+item.title
          this.current = item.title
        }
      },
      // 选中/取消选中
      selectItem(item){
        if(!item.checked && this.selectCount === this.limit){
          // 选中|限制选中数量
          return uni.showToast({
            title: '最多选中 '+this.limit+' 个',
            icon: 'none'
          });
        }
        item.checked = !item.checked
        if(item.checked){ // 选中
          this.selectList.push(item)
        } else { // 取消选中
          let index = this.selectList.findIndex(v=> v === item)
          if(index > -1){
            this.selectList.splice(index,1)
          }
        }
      },
      submit(){
        if(this.type !== 'see' && this.selectCount === 0){
          return uni.showToast({
            title: '请先选择',
            icon: 'none'
          });
        }
        switch (this.type){
          case 'createGroup': // 创建群组
          $H.post('/group/create',{
            ids:this.selectList.map(item=>item.user_id)
          }).then(res=>{
            // 见鬼这里跳转不行啊
            uni.navigateTo({
              url:'../../tabbar/index/index'
            });
            uni.showToast({
              title: '创建群聊成功',
                duration: 200
            });
          })
            break;
          case 'sendCard':
          let item = this.selectList[0]
          uni.$emit('sendItem',{
            sendType:"card",
            data:item.name,
            type:"card",
            options:{
              avatar:item.avatar,
              id:item.user_id
            }
          })
          uni.navigateBack({
            delta: 1
          });
            break;
          case 'remind':
          uni.$emit('sendResult',{
            type:"remind",
            data:this.selectList
          })
          uni.navigateBack({
            delta: 1
          });
            break;
          case 'see':
          let k = this.typeList[this.typeIndex].key
          if(k !== 'all' && k!== 'none' && !this.selectCount){
            return uni.showToast({
              title: '请先选择',
              icon: 'none'
            });
          }
          uni.$emit('sendResult',{
            type:"see",
            data:{
              k,
              v:this.selectList
            }
          })
          uni.navigateBack({
            delta: 1
          });
            break;
          case 'inviteGroup':
          console.log(this.selectList);
          $H.post('/group/invite',{
            id:this.id,
            user_id:this.selectList[0].user_id
          }).then(res=>{
            uni.showToast({
              title: '邀请成功',
              icon: 'none'
            });
            uni.navigateBack({
              delta: 1
            });
          })
            break;
        }
      }
    }
  }
</script>
<style>
</style>

/pages/find/add-moment/add-moment.vue

<template>
  <view class="px-3">
    <!-- 导航栏 -->
    <free-nav-bar showBack :showRight="true">
      <free-main-button name="发表" slot="right" @click="submit"></free-main-button>
    </free-nav-bar>
    <!-- 文字 -->
    <textarea value="" placeholder="这一刻的想法" v-model="content" class="font-md mb-3" />
    <!-- 图文 -->
    <free-upload-image :data="imageList" v-if="type==='image'" @update='uploadImage'></free-upload-image>
    <!-- 视频 -->
    <block v-if="type==='video'">
      <view v-if="!video" class="flex align-center justify-center  bg-light rounded" style="height: 350rpx;"
        hover-class="bg-hover-light" @click="uploadVideo">
        <text class="text-muted" style="font-size:100rpx;">+</text>
      </view>
      <video v-if="type === 'video' && video && video.src" :src="video.src" :poster="video.poster"
        controls></video>
      <view v-if="type === 'video' && video && video.src" class="my-3 flex align-center justify-center bg-light"
        hover-class="bg-hover-light" style="height:100rpx;" @click="uploadVideo">
        <text class="font-md text-muted">点击切换视频</text>
      </view>
    </block>
    <free-list-item title="所在位置" showRight :showLeftIcon="false">
      <text slot="right" class="font-md">位置</text>
    </free-list-item>
    <free-list-item title="提醒谁看" showRight :showLeftIcon="false" @click="openRemind">
      <view slot="right" class="flex">
        <view class="ml-1" v-for="(item,index) in remindList" :key="index">
          <free-avatar :src="item.avatar" size="50">
          </free-avatar>
        </view>
      </view>
    </free-list-item>
    <free-list-item title="谁可以看" showRight :showLeftIcon="false">
      <text slot="right" class="font-md">位置</text>
    </free-list-item>
  </view>
</template>
<script>
  import freeNavBar from '@/components/free-ui/free-nav-bar.vue';
  import freeMainButton from '@/components/free-ui/free-main-button.vue';
  import freeListItem from "@/components/free-ui/free-list-item.vue";
  import freeUploadImage from '@/components/free-ui/free-upload-image.vue';
  import freeAvatar from '@/components/free-ui/free-avatar.vue';
  import $H from '@/common/free-lib/request.js'
  export default {
    components: {
      freeNavBar,
      freeMainButton,
      freeListItem,
      freeUploadImage,
      freeAvatar
    },
    data() {
      return {
        content: '',
        type: 'image',
        imageList: [],
        video: false,
        remindList: []
      }
    },
    onLoad(e) {
      this.type = e.type;
      uni.$on('sendResult', this.sendResult);
    },
    destroyed() {
      uni.$off('sendResult', this.sendResult);
    },
    methods: {
      sendResult(e) {
        if (e.type === 'remind') {
          this.remindList = e.data
        }
      },
      openRemind() {
        uni.navigateTo({
          url: '../../mail/mail/mail?type=remind'
        })
      },
      openSee() {
        uni.navigateTo({
          url: '../../mail/mail/mail?type=see'
        })
      },
      // 发布
      submit() {
        $H.post('/moment/create', {
          content: this.content,
          image: this.imageList.join(','),
          video: this.video ? JSON.stringify(this.video) : '',
          type: this.type,
          location: '',
          remind: '',
          see: ''
        }).then(res => {
          uni.showToast({
            title: '发布成功',
            icon: 'none'
          });
          uni.navigateBack({
            delta: 1
          })
        })
      },
      // 上传图片
      uploadImage(list) {
        this.imageList = list;
      },
      // 上传视频
      uploadVideo() {
        uni.chooseVideo({
          maxDuration: 10,
          success: (e) => {
            // this.video = e.tempFilePath;
            $H.upload('/upload', {
              filePath: e.tempFilePath
            }, (progress) => {
              console.log('上传进度', progress);
            }).then(url => {
              this.video = {
                src: url,
                poster: url +
                  '?x-oss-process=video/snapshot,t_10,m_fast,w_300,f_png'
              }
            })
          }
        })
      }
    }
  }
</script>
<style>
</style>

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

目录
相关文章
|
14天前
|
安全 定位技术 API
婚恋交友系统匹配功能 婚恋相亲软件实现定位 语音社交app红娘系统集成高德地图SDK
在婚恋交友系统中集成高德地图,可实现用户定位、导航及基于地理位置的匹配推荐等功能。具体步骤如下: 1. **注册账号**:访问高德开放平台,注册并创建应用。 2. **获取API Key**:记录API Key以备开发使用。 3. **集成SDK**:根据开发平台下载并集成高德地图SDK。 4. **配置功能**:实现定位、导航及基于位置的匹配推荐。 5. **注意事项**:保护用户隐私,确保API Key安全,定期更新地图数据,添加错误处理机制。 6. **测试优化**:完成集成后进行全面测试,并根据反馈优化功能。 通过以上步骤,提升用户体验,提供更便捷的服务。
|
18天前
|
PHP
全新uniapp小说漫画APP小说源码/会员阅读/月票功能
价值980的uniapp小说漫画APP小说源码/会员阅读/月票功能
71 20
|
14天前
|
前端开发 数据库 UED
uniapp开发,前后端分离的陪玩系统优势,陪玩app功能特点,线上聊天线下陪玩,只要4800
前后端分离的陪玩系统将前端(用户界面)和后端(服务器逻辑)分开开发,前者负责页面渲染与用户交互,后者处理数据并提供接口。该架构提高开发效率、优化用户体验、增强可扩展性和稳定性,降低维护成本,提升安全性。玩家可发布陪玩需求,陪玩人员发布服务信息,支持在线聊天、预约及线下陪玩功能,满足多样化需求。[演示链接](https://www.51duoke.cn/games/?id=7)
|
16天前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
91 3
|
16天前
|
小程序 安全 网络安全
清晰易懂!陪玩系统源码搭建的核心功能,陪玩小程序、陪玩app的搭建步骤!
陪玩系统源码包含多种约单方式、实时语音互动、直播间与聊天室、大神申请与抢单、动态互动与社交及在线支付与评价等核心功能。搭建步骤包括环境准备、源码上传与解压、数据库配置、域名与SSL证书绑定、伪静态配置及后台管理。注意事项涵盖源码安全性、二次开发、合规性和技术支持。确保平台安全、合规并提供良好用户体验是关键。
|
2月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码服务器环境配置及app功能
一对一直播源码阿里云服务器环境配置及要求
|
2月前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
2月前
|
机器人
布谷直播App系统源码开发之后台管理功能详解
直播系统开发搭建管理后台功能详解!
|
4月前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
117 12
|
5月前
|
Java PHP
【应用服务 App Service】 App Service Rewrite 实例 - 反向代理转发功能
【应用服务 App Service】 App Service Rewrite 实例 - 反向代理转发功能
【应用服务 App Service】 App Service Rewrite 实例 - 反向代理转发功能