基于Uni-APP多端「h5+小程序+App」高仿抖音小视频|直播|聊天实例

uni-ttLive 基于uni-app+uView-ui跨端开发短视频+直播聊天实例。

全新研发的一款多端仿制抖音短视频+直播+聊天项目,基于uniApp+Vue.js+Vuex+Nvue+uViewUI+uaPopup等技术开发而成。支持播放/暂停/上下滑动切换、全屏沉浸式体验。

在这里插入图片描述

功能特点

  • 导航条+底部菜单透明式全屏模式
  • 流畅的滑动切换体验
  • mini短视频时间进度条
  • 支持小视频播放/暂停,上下滑动切换
  • 全屏沉浸式支持Nvue页面短视频

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一款集成了小视频、直播、聊天及朋友圈于一体的跨设备uniapp应用。

项目结构/编译

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

入口main.js配置

import Vue from 'vue'
import App from './App'import uView from 'uview-ui'
Vue.use(uView)import API from '@/common/request'
Vue.prototype.$api = API// 引入状态管理
import Store from './store'
Vue.prototype.$store = StoreVue.config.productionTip = false
App.mpType = 'app'// #ifdef APP-PLUS
plus.navigator.closeSplashscreen()
// #endifconst app = new Vue({...App
})
app.$mount()

由于视频及直播页面使用了Nvue编写,Nvue页面不支持prototype方式挂载的函数。
所有使用了globalData来实现全局获取导航条/状态栏高度。

<script>export default {globalData: {// 全局设置状态栏和导航栏高度statusBarH: 0,customBarH: 0,},onLaunch: function() {uni.getSystemInfo({success: (e) => {// 获取手机状态栏高度let statusBar = e.statusBarHeightlet customBar// #ifndef MPcustomBar = statusBar + (e.platform == 'android' ? 50 : 45)// #endif// #ifdef MP-WEIXIN// 获取胶囊按钮的布局位置信息let menu = wx.getMenuButtonBoundingClientRect()// 导航栏高度 = 胶囊下距离 + 胶囊上距离 - 状态栏高度customBar = menu.bottom + menu.top - statusBar// #endif// #ifdef MP-ALIPAYcustomBar = statusBar + e.titleBarHeight// #endif// 兼容nvue写法(H5/小程序/APP/APP-Nvue)this.globalData.statusBarH = statusBarthis.globalData.customBarH = customBar}})},onShow: function() {console.log('App Show')},onHide: function() {console.log('App Hide')}}
</script>

自定义导航条+底部tabbar

项目中的顶部导航栏和底部菜单栏采用自定义组件实现功能。支持Nvue页面悬浮video上面、全屏沉浸式透明模式。
在这里插入图片描述

<template><view class="ua__navbar"><view class="ua__navbar-wrap" :class="{'custom': custom, 'fixed': fixed || transparent}":style="{'height': customBarH + 'px', 'padding-top': (custom ? statusBarH : 0) + 'px', 'background': bgcolor, 'color': color, 'z-index': zIndex}"><!-- //左侧 (返回) --><view class="action navbar-action__left" v-if="back && back!='false'" @click="onBack"><template v-if="$slots.back"><slot name="back" /></template><template v-else><text class="iconfont nvuefont":style="{'color': color}">{{'\ue84c'}}</text></template><slot name="backText" /></view><slot name="left" /><!-- //标题 --><view v-if="!search" class="navbar-title" :class="{'center': center}"><template v-if="$slots.title"><slot name="title" /></template><template v-else><text :style="{'color': color}">{{title}}</text></template></view><!-- //搜索框 --><view v-if="search" class="action navbar-action__search"><slot name="search" /></view><view class="action navbar-action__right"><slot name="right" /></view></view></view>
</template>

目前两个插件已经上传至uniapp插件市场,感兴趣的可以去看下。
https://ext.dcloud.net.cn/plugin?id=5593
https://ext.dcloud.net.cn/plugin?id=5592

uniapp升级版弹窗uaPopup组件

该插件是针对这个项目特意开发的一款多端弹窗插件,支持h5+小程序+App+Nvue端。
在这里插入图片描述
项目中所有的弹窗均是使用这个uaPopup组件实现功能,亲测效果非常OK。

使用非常简单,hbuilderx2.5起支持easycom自动引入,支持函数式+组件式两种方式调用。

<ua-popup v-model="isVisibleConfirm" shadeClose="false" title="标题" xclose z-index="1001"content="<div style='color:#ff557f;padding:20px 40px;'>预测未来的最好办法是自己亲手创造未来!</div>":btns="[{text: '取消', click: handleCancel},{text: '确定', style: 'color:#00aa00;', click: handleOk},]"
/>

函数式支持多级嵌套调用。

<script>
export default {methods: {handleOk() {let $ua = this.$refs.uapopup$ua.open({content: '人生漫漫,且行且珍惜',customStyle: {'background-color': 'rgba(170, 0, 127, 0.6)', 'color': '#fff'},time: 3,onClose() {$ua.open({type: 'android',content: '<div style="color:#aa007f">不要等待机会,而要创造机会</div>',customStyle: {'width': '210px'},btns: [{text: '关闭',click() {$ua.close()}},{text: '确定',style: 'color:#00aa00;',click() {// ...}}]})}})}}
}
</script>

拥有20+自定义参数,多种弹窗类型及动画模式。
https://blog.csdn.net/yanxinyun1990/article/details/118633711

uniapp短视频+直播

项目中的小视频及直播页面分为顶部导航区+视频区+底部菜单区三个大模块。
在这里插入图片描述
在这里插入图片描述

<view v-if="currentTab == 2" class="ua__tabcnt-recommend"><swiper class="ua__vdplayer-swiper flex1" :current="currentVideo" vertical @change="handleSwipeVertical"><swiper-item v-for="(item, index) in videoList" :key="index"><!-- 视频模块 --><view class="ua__vdplayer-video flex1"><video class="vdplayer" :id="'vdplayer' + index" :ref="'vdplayer' + index" :src="item.src":controls="false" :loop="true" :show-center-play-btn="false" object-fit="fill":autoplay="index == currentVideo"@play="isPlaying=true" @timeupdate="handleTimeUpdate":style="{'width': winWidth, 'height': winHeight}"></video><view class="ua__vdplayer-playwrap" @click="handleVideoClicked"><view v-if="!isPlaying" class="ua__vdplayer-playbtn"><text class="iconfont">{{`\ue607`}}</text></view></view></view><!-- 信息模块 --><view class="ua__vdplayer-info flexbox flex-col"><view class="flexbox flex-row flex-alignb"><!-- //左侧信息 --><view class="vdinfo__left flex1"><view class="ltitem uavatar flexbox flex-row"><navigator url="#" class="flexbox flex-alignc flex-row"><image class="uimg" :src="item.avatar" /><text class="uname">{{item.author}}</text></navigator><view class="flexbox btn" :class="{'actived': item.isFollow}" @click="handleFollow(index)"><text class="btn-text">{{item.isFollow ? '已关注' : '关注'}}</text></view></view><view v-if="item.topic" class="ltitem flexbox flex-row"><view class="kw" v-for="(kw, index2) in item.topic" :key="index2"><text class="lbl">#{{kw}}</text></view></view><view class="ltitem"><text class="desc">{{item.desc}}</text></view></view><!-- //右侧按钮 --><view class="vdinfo__right flexbox flex-col"><view class="rtitem ball" v-if="item.goods&&item.goods.length > 0" @click="handleShowGoodsPopup(item.goods)"><text class="icon iconfont">{{`\ue734`}}</text></view><view class="rtitem" :class="{'isliked': item.isLike}" @click="handleLiked(index)"><text class="icon iconfont">{{`\ue635`}}</text><text class="num">{{item.likeNum+(item.isLike ? 1 : 0)}}</text></view><view class="rtitem" @click="showReplyPopup = true"><text class="icon iconfont">{{`\ue632`}}</text><text class="num">{{item.replyNum}}</text></view><view class="rtitem" @click="showSharePopup = true"><text class="icon iconfont">{{`\ue63b`}}</text><text class="num">{{item.shareNum}}</text></view></view></view></view></swiper-item></swiper><!-- 底部播放进度条 --><view class="ua__vdplayer-progress"><view class="bar" :style="{'width': progressBar+'px'}"></view></view>
</view>

小视频底部还新增了一个时间播放进度条,显示当前视频播放进度。
在这里插入图片描述

// 播放进度变化时触发
handleTimeUpdate(e) {let { currentTime, duration } = e.detailthis.progressBar = parseInt((currentTime / duration).toFixed(2) * parseInt(this.winWidth))
},

小视频支持播放/暂停,上下滑动切换效果。

<script>const app = getApp()import videoJSON from '@/mock/videolist.js'export default {data() {return {// 导航栏高度customBarHeight: app.globalData.customBarH,navbarBgcolor: '#21252b',tabbarBgcolor: '#21252b',tabNavLs: [{label: '附近动态', badge: 5, lists: []},{label: '关注', lists: []},{label: '推荐', dot: true, lists: []},],// 当前选项卡currentTab: 0,// 当前视频索引currentVideo: 0,// 视频数据videoList: videoJSON,// 视频是否播放中isPlaying: false,// 点击次数clickNum: 0,// 视频播放进度条progressBar: 0,clickTimer: null,// 屏幕宽高winWidth: '',winHeight: '',popupGoodsList: [],showGoodsPopup: false,showReplyPopup: false,showSharePopup: false,}},watch: {currentTab(val) {this.changeTabPanel(val)}},computed:{customBarMargin() {return `margin-top: ${this.customBarHeight}px`}},created() {// 引入iconfont字体// #ifdef APP-NVUEconst domModule = weex.requireModule('dom')domModule.addRule('fontFace', {fontFamily: "nvueIcon",'src': "url('/static/fonts/iconfont.ttf')"});// #endiflet wW = uni.getSystemInfoSync().windowWidthlet wH = uni.getSystemInfoSync().windowHeightthis.winWidth = `${wW}px`this.winHeight = `${wH}px`},methods: {// 长按动态handleDynamicMenu(e) {let points// #ifndef APP-NVUEpoints = [e.touches[0].clientX, e.touches[0].clientY]// #endif// #ifdef APP-NVUEpoints = [e.touches[0].screenX, e.touches[0].screenY]// #endifthis.$refs.uapopup.open({type: 'contextmenu',follow: points,btns: [{text: '不感兴趣'},{text: '复制'},{text: '举报',style: 'color:#f00;',click: () => {this.$refs.uapopup.close()}},],})},/* ++++++++++ { 视频播放模块 } ++++++++++ */getVideoCtx() {// return this.$refs['vdplayer' + this.currentVideo][0]return uni.createVideoContext('vdplayer'+ this.currentVideo, this)},// 垂直滑动视频handleSwipeVertical(e) {let index = e.detail.currentthis.progressBar = 0this.isPlaying = falselet video = this.getVideoCtx()if(!video) returnvideo.pause()// 重新开始video.seek(0)this.currentVideo = index// 自动播放this.handlePlay()},handlePlay() {let video = this.getVideoCtx()if(!video) returnvideo.play()this.isPlaying = true},handlePause() {let video = this.getVideoCtx()if(!video) returnvideo.pause()this.isPlaying = false},// 点击视频(单击/双击)handleVideoClicked() {this.clickTimer && clearTimeout(this.clickTimer)this.clickNum++this.clickTimer = setTimeout(() => {if(this.clickNum >= 2) {console.log('你双击了')}else {console.log('你单击了')if(this.isPlaying) {this.handlePause()}else {this.handlePlay()}}this.clickNum = 0}, 250)},...}}
</script>

以上就是uniapp开发仿抖音/快手短视频+直播实例。后续还会分享一些项目实战案例。

最后附上两个项目实例
◆ Vue3+Electron13+ElementPlus仿macui桌面管理平台
https://blog.csdn.net/yanxinyun1990/article/details/118187205

◆ Vue3+electron11+antdv仿制QQ聊天实例
https://blog.csdn.net/yanxinyun1990/article/details/114162969

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10339.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新抖音娱乐测评小程序源码 Thinkphp后端 抖音引流小程序

最新抖音娱乐测评小程序源码 thinkphp后端 抖音引流小程序 附搭建教程 测试环境 NginxPHP7.0MySQL5.6 网站运行目录设置为 /web 数据库配置文件 \source\application\database.php 后台登录地址 http://你的域名/index.php?s/admin/passport/login

谷歌广告账号注册很难?请收下这篇谷歌账号注册指南

做跨境电商这一行业的&#xff0c;相信都会去了解谷歌广告账户。Google广告是Google的广告平台&#xff0c;一般在用户使用引擎搜索的时候推送。为什么大家都要去开通Google广告账户呢&#xff1f;因为Google广告能够快速提升品牌曝光度&#xff0c;特别是当用户使用谷歌浏览器…

谷歌登录登录

一、下载 https://pan.tencent.com/web/share/5b2b9738edeee25803d8ec22ad8967c6 二、打开谷歌 点点点 -- > 更多工具 -- > 扩展程序 点击已解压的扩展程序&#xff0c;添加下载的文件夹 三、然后就能打开啦

Google登录授权详细过程

前言 这篇文章包含了google登录授权从API创建、到使用Java代码完成登录的一个完整demo。 主要为了实现google关联用户的服务&#xff0c;如google merchant center等。 如果仅仅需要使用google邮箱登录&#xff0c;建议由前端实现google登录&#xff1a; 1&#xff0c;国内网…

换IP软件如何使用,一起来看下换IP软件的使用教程

现在的互联网趋势&#xff0c;越多越多的人需要使用动态IP&#xff0c;像爬虫采集、微信用户、网络营销、博客互动、SEO优化等等&#xff0c;都需要使用动态IP去隐藏自身的IP地址去操作&#xff0c;这个使用可以使用换IP软件。其实现在市面上很多换IP软件都支持动态静态线路&am…

如何屏蔽所有国外ip,禁止国外IP访问网站

众说周知一般的CC攻击DDOS攻击等大范围的网络攻击都来自境外&#xff0c;但是如何能大批量的屏蔽国外ip&#xff0c;禁止国外IP访问网站应该怎么做&#xff0c;相信大家都会说加黑名单啊&#xff0c;但是很多人可能还不知道怎么添加黑名单&#xff0c;黑名单的操作也是比较麻烦…

如何换IP?换IP最简单的方法在这里!

许多朋友在日常生活和工作过程中都会遇到需要换IP的情况&#xff0c;因为一个IP频繁的操作就会导致IP被封掉&#xff0c;比如说需要投票&#xff0c;薅羊毛&#xff0c;网络推广等等。更换IP的方式有很多&#xff0c;今天就来给大家介绍一下IP是什么&#xff0c;并且我们应该怎…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层&#xff1a;虚拟专用网VPN和网络地址转换NAT 笔记来源&#xff1a; 湖科大教书匠&#xff1a;虚拟专用网VPN和网络地址转换NAT 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

如何修改IP地址?

1.使用cmd的ipconfig 2.查到ip 3.找到网络与Internet设置 4.找到高级网络设置 5.找到连接的网络选择属性 6.编辑IP分配 7.将IP地址设置为手动 8.更改地址 9.修改DNS 10.保存后重新查询为新的ip地址 11.注意事项&#xff1a;在使用前ping下ip地址确保为空闲&#xff0c;类似第二…

如何更换IP?最简单的换IP方法

许多人在工作生活中经常需要用到换IP&#xff0c;比如帮朋友投票&#xff0c;刷单&#xff0c;做网络推广等等。大量的工作需要换IP&#xff0c;单单靠手动切换IP的方法比较耗时间&#xff0c;效果也不好&#xff0c;那么如何更换IP呢&#xff1f;今天黑洞代理为大家整理了几种…

看TAP如何让当代银行与加密交易相融合

支付解决方案是比特币和其他代币颠覆的一大关键领域。总体而言&#xff0c;加密货币的出现有希望解决银行业现有的问题。 尽管加密货币行业茁壮发展&#xff0c;但为了充分发挥其潜力&#xff0c;这项技术必须适应现有系统。 银行卡支付和电子银行已成为最常用的支付结算方式…

ChatGPT中国赛开卷!互联网大佬自掏5000万美元入局

来源&#xff1a;新智元 ChatGPT&#xff0c;已经炸醒了国内创投圈。去年圈内躺平一整年&#xff0c;今年巨头纷纷ALL IN。 连已退休三年的美团网创始人王慧文&#xff0c;都被炸出来了。 如同一声惊雷&#xff0c;王慧文昨晚22:12在朋友圈发表的一条复出创业宣言&#xff0c;炸…

区块链:IOTA 交易,确认和共识 (DAG)

Tangle 初始状态 与区块链技术不同&#xff0c;IOTA 并不是一条有着时间序列概念&#xff0c;每个区块前后相连的链&#xff0c;链中的每个块包含一些交易。在 IOTA 中&#xff0c;每笔交易都可以其他交易连接&#xff08;所谓连接&#xff0c;就是验证其他交易&#xff09;&am…

非同质化代币(NFT)概述

非同质化代币&#xff08;NFT&#xff09;概述 前言一、NFT是什么&#xff1f;同质化——Fungible非同质化——Non-Fungible区别分析代码分析ERC20可选函数必要函数事件 ERC721事件必要函数可选函数于ERC721Metadata接口下的于ERC721Enumerable接口下的 二、历史与发展起源1993…

简析Starcoin在新一代公链方向的探索

文章来源&#xff1a;币圈百科 作者&#xff1a;一棵杨树X 据悉&#xff0c;Starcoin主网即将上线&#xff0c;项目方日前发起了为期一个月的《Starcoin区块链安全赏金计划》&#xff08;3.24-4.24&#xff09;&#xff0c;为部署主网上线做最后一公里的检验与冲刺。&#xff…

中银国际在以太坊上发行代币化票据?三种可能,扑朔迷离!

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在“刘教链Pro”发表了一篇内参文章&#xff0c;《内参&#xff1a;对币本位高抛低吸策略的一点儿思考》&#xff08;次条&#xff09;&#xff0c;以及一篇原创文章《他提案将SEC主席Gary Gensler撤职》&#xff08;…

DAO概念板块代币大盘点,你又把握了几个?

你的认知决定你能够走多远! ​​ 大家好我是小哲,你的认知决定你能够走多远,元宇宙的火爆已成定局,下面就来聊聊DAO模块。你又认识多少呢? 火爆的dao大家应该都有听到过DAO这个概念,但是可能对于DAO具体是什么还不太了解。说白了,其实DAO很好理解,他是一个去中心…

Paradigm联合创始人2017年神文:区块链是元宇宙的基础层

这是一篇看完让我毛骨悚然&#xff0c;汗毛直立的文章。 作者Paradigm联合创始人Fred Ehrsam 发表于2017年2月&#xff0c;写的却是4年后当下的流行&#xff1a;元宇宙、区块链、Crypto、VR…… 这认知差距&#xff0c;远超我的想象&#xff0c;2017年2月&#xff0c;大多数人…

三款软件,让你的文字转语音更简单

文字转语音软件我使用过很多&#xff0c;其中也有我觉得非常好的&#xff0c;那我就从中挑选三个我觉得使用性、实用性都非常好的软件推荐给你们。 1&#xff1a;nopapp 这是一款在线文字转语音软件&#xff0c;只能网页端进行使用。 里面有四种类型的声音&#xff0c;女性&…