uni-app 158发布朋友圈-上传短视频

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

下图是我测试截图

在这里插入图片描述

/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">
			<text slot="right" class="font-md">位置</text>
		</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 $H from '@/common/free-lib/request.js'
	export default {
		components:{
			freeNavBar,
			freeMainButton,
			freeListItem,
			freeUploadImage
		},
		data() {
			return {
				content:'',
				type:'image',
				imageList:[],
				video:false
			}
		},
		onLoad(e) {
			this.type=e.type;
		},
		methods: {
			// 发布
			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>

/components/free-ui/free-moment-list.vue

<template>
	<view class="p-3 flex align-start border-bottom border-light-secondary">
		<free-avater :src="item.avatar" size="80"></free-avater>
		<view class="pl-2 flex-1 flex flex-column">
			<!-- 昵称 -->
			<text class="font-md text-hover-primary mb-1">{{item.user_name}}</text>
			<!-- 内容 -->
			<text v-if="item.content" class="font-md text-dark mb-1">{{item.content}}</text>
			<!-- 图片 -->
			<view v-if="item.image.length" class="py-2 flex flex-wrap">
				<block v-for="(image,imageIndex) in item.image"
				:key="imageIndex">
					<!-- 单图 -->
					<free-image v-if="item.image.length === 1" :src="image" imageClass="rounded bg-secondary" @click="preview(image)"></free-image>
					<!-- 多图 -->
					<image v-else :src="image" mode="aspectFill" style="height: 180rpx;width: 180rpx;" class="bg-secondary mr-2 mb-2 rounded" @click="preview(image)"></image>
				</block>
			</view>
			<!-- 视频 -->
			<view v-if="item.video" class="py-2">
				<video :src="item.video.src" :poster="item.video.poster" controls style="height: 300rpx;width: 500rpx;" loop></video>
			</view>
			<!-- 时间|操作 -->
			<view class="flex align-center justify-between">
				<text class="font-sm text-light-muted">{{item.created_at|formatTime}}</text>
				<view class="rounded p-1 bg-light" @click="$emit('action',{item,index})">
					<text class="text-hover-primary iconfont font">&#xe62a;</text>
				</view>
			</view>
			<!-- 点赞列表|评论列表 -->
			<view class="bg-light mt-2" v-if="item.likes.length || item.comments.length">
				<!-- 点赞 -->
				<view v-if="item.likes.length" class="border-bottom flex align-start p-2">
					<text class="flex-shrink iconfont font text-hover-primary">&#xe637;</text>
					<view class="flex flex-1 flex-wrap ml-1">
						<text v-for="(s,si) in item.likes" :key="si" class="font text-hover-primary ml-1">{{s.name}}</text>
					</view>
				</view>
				<!-- 评论 -->
				<view v-if="item.comments.length" class="flex align-start p-2">
					<text class="flex-shrink iconfont font-md text-hover-primary">&#xe64e;</text>
					<view class="flex flex-column flex-1 ml-2">
						<view class="flex" 
						v-for="(c,ci) in item.comments"
						:key="ci" :index='index'>
							<text v-if="!c.reply" class="text-hover-primary font">{{c.user.name}}</text>
							<view v-else class="flex align-center">
								<text class="text-hover-primary font">{{c.user.name}} </text>
								<text class="text-muted font-sm">回复</text>
								<text class="text-hover-primary font">{{c.reply.name}}</text>
							</view>
							<text class="font text-dark flex-1"
							@click="$emit('reply',{
								item,
								index,
								reply:c.user
							})">{{c.content}}</text>
						</view>
					</view>
				</view>
			</view>
			
		</view>
	</view>
</template>

<script>
	import freeAvater from '@/components/free-ui/free-avater.vue';
	import freeImage from '@/components/free-ui/free-image.vue';
	import $T from '@/common/free-lib/time.js';
	export default {
		components: {
			freeAvater,
			freeImage
		},
		props: {
			item: Object,
			index:Number
		},
		filters: {
			formatTime(value) {
				return $T.gettime(value);
			}
		},
		methods: {
			// 查看大图
			preview(src) {
				uni.previewImage({
					current:src,
					urls:this.item.image 
				})
			}
		},
	}
</script>

<style>
</style>

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2019ab

你的鼓励就是我的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值