2025-04-21 17:35:54 +08:00
|
|
|
|
<template>
|
|
|
|
|
<scroll-view
|
|
|
|
|
class="prpage"
|
|
|
|
|
scroll-y="true"
|
|
|
|
|
>
|
|
|
|
|
<view class="line"></view>
|
|
|
|
|
<!-- 进度条 -->
|
|
|
|
|
<view
|
|
|
|
|
class="progress"
|
|
|
|
|
v-if="percentCompleted != 100"
|
|
|
|
|
>
|
|
|
|
|
<progress
|
|
|
|
|
:percent="percentCompleted"
|
|
|
|
|
stroke-width="3"
|
|
|
|
|
activeColor="#ef274d"
|
|
|
|
|
backgroundColor="#F1F1F1"
|
|
|
|
|
/>
|
|
|
|
|
<text class="progress-text">视频上传中,请耐心等待~~</text>
|
|
|
|
|
<image
|
|
|
|
|
class="progress-img"
|
|
|
|
|
mode="aspectFit"
|
|
|
|
|
src="/static/images/loading-4.gif"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 发布主体内容 -->
|
|
|
|
|
<view
|
|
|
|
|
class="main-body"
|
|
|
|
|
v-if="percentCompleted == 100"
|
|
|
|
|
>
|
|
|
|
|
<image
|
|
|
|
|
class="main-body-img-m"
|
|
|
|
|
v-if="tempCover"
|
|
|
|
|
:src="tempCover"
|
|
|
|
|
mode="widthFix"
|
|
|
|
|
/>
|
|
|
|
|
<image
|
|
|
|
|
class="main-body-img-m"
|
|
|
|
|
v-if="!tempCover"
|
|
|
|
|
src="/static/images/loading-4.gif"
|
|
|
|
|
mode="aspectFit"
|
|
|
|
|
/>
|
|
|
|
|
<view class="main-body-content">
|
|
|
|
|
<view
|
|
|
|
|
class="preplay-wrapper"
|
|
|
|
|
@click="preview"
|
|
|
|
|
@touchstart="touchstartPreplay"
|
|
|
|
|
@touchend="touchendPreplay"
|
|
|
|
|
>
|
|
|
|
|
<image
|
|
|
|
|
class="preplay-icon"
|
|
|
|
|
src="/static/images/btn-play.png"
|
|
|
|
|
/>
|
|
|
|
|
<text class="preplay-text">预览视频</text>
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
class="choose-cover"
|
|
|
|
|
@click="chooseCover"
|
|
|
|
|
>
|
|
|
|
|
<text class="choose-cover-text">选择封面</text>
|
|
|
|
|
</view>
|
2025-03-28 15:46:11 +08:00
|
|
|
|
</view>
|
2025-04-21 17:35:54 +08:00
|
|
|
|
<textarea
|
|
|
|
|
class="vlog-content"
|
|
|
|
|
placeholder-style="color: #9798a0;"
|
2025-04-25 18:10:54 +08:00
|
|
|
|
placeholder="添加合适的描述内容~最多60个字符"
|
2025-04-21 17:35:54 +08:00
|
|
|
|
:value="title"
|
|
|
|
|
:model="title"
|
|
|
|
|
maxlength="60"
|
|
|
|
|
@input="typingContent"
|
|
|
|
|
confirm-type="done"
|
|
|
|
|
></textarea>
|
|
|
|
|
<view
|
|
|
|
|
class="mbtn"
|
|
|
|
|
:class="{
|
|
|
|
|
'btn-publish': !publishTouched,
|
|
|
|
|
'btn-publish-touched': publishTouched
|
|
|
|
|
}"
|
|
|
|
|
@touchstart="touchstartPublish"
|
|
|
|
|
@touchend="touchendPublish"
|
|
|
|
|
@click="doPublich"
|
|
|
|
|
>
|
|
|
|
|
<text class="btn-text">发布视频</text>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</scroll-view>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import storage from '@/utils/storage.js'; //缓存
|
|
|
|
|
// import {
|
|
|
|
|
// graceNumber
|
|
|
|
|
// } from '@/utils/tools.js'
|
|
|
|
|
import api from '@/config/api.js';
|
|
|
|
|
export default {
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
2025-04-30 14:28:07 +08:00
|
|
|
|
upFlage: true,
|
2025-04-21 17:35:54 +08:00
|
|
|
|
publishTouched: false,
|
|
|
|
|
preplayTouched: false,
|
|
|
|
|
tempFilePath: '',
|
|
|
|
|
videoUrl: '',
|
|
|
|
|
tempCover: '', // 视频封面
|
|
|
|
|
title: '',
|
|
|
|
|
width: 0,
|
|
|
|
|
height: 0,
|
2025-05-12 14:51:35 +08:00
|
|
|
|
localFile: '',
|
2025-04-21 17:35:54 +08:00
|
|
|
|
percentCompleted: 0 // 进度
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
onLoad(params) {
|
2025-04-30 14:28:07 +08:00
|
|
|
|
this.upFlage = false;
|
2025-04-21 17:35:54 +08:00
|
|
|
|
let me = this;
|
|
|
|
|
let vlogInfo = storage.getVlogUserInfo();
|
|
|
|
|
// 上个页面传过来的文件事件对象, 其中包含了相册中选择的视频内容
|
|
|
|
|
let fileObjectEvent = JSON.parse(params.fileObjectEvent);
|
2025-05-12 14:51:35 +08:00
|
|
|
|
console.log(fileObjectEvent);
|
|
|
|
|
this.localFile = fileObjectEvent.tempFilePath;
|
2025-04-21 17:35:54 +08:00
|
|
|
|
let times = new Date().getTime();
|
|
|
|
|
var userId = vlogInfo.id;
|
|
|
|
|
let nickname = vlogInfo.nickname;
|
|
|
|
|
|
|
|
|
|
let serverUrl = api.vlog;
|
|
|
|
|
const uploadTask = uni.uploadFile({
|
|
|
|
|
filePath: fileObjectEvent.tempFilePath,
|
|
|
|
|
url: serverUrl + '/upload',
|
|
|
|
|
name: 'file',
|
|
|
|
|
formData: {
|
|
|
|
|
filetype: 'video'
|
|
|
|
|
},
|
|
|
|
|
header: {
|
|
|
|
|
headerUserId: userId,
|
|
|
|
|
headerUserToken: storage.getVlogToken()
|
|
|
|
|
},
|
|
|
|
|
success: (f) => {
|
|
|
|
|
console.log(f);
|
|
|
|
|
let jsondata = f.data;
|
|
|
|
|
let data = JSON.parse(jsondata);
|
|
|
|
|
let videoUrl = data.data;
|
|
|
|
|
me.videoUrl = videoUrl;
|
|
|
|
|
me.width = fileObjectEvent.width;
|
|
|
|
|
me.height = fileObjectEvent.height;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
uploadTask.onProgressUpdate((res) => {
|
|
|
|
|
console.log('上传进度' + res.progress);
|
|
|
|
|
// console.log('已经上传的数据长度' + res.totalBytesSent);
|
|
|
|
|
// console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend);
|
|
|
|
|
// 显示进度
|
|
|
|
|
// let percentCompleted = Math.round(
|
|
|
|
|
// (res.progress * 100) / res.total
|
|
|
|
|
// );
|
|
|
|
|
me.percentCompleted = res.progress;
|
2025-04-30 14:28:07 +08:00
|
|
|
|
if (res.progress == 100) {
|
|
|
|
|
me.upFlage = true;
|
|
|
|
|
}
|
2025-04-21 17:35:54 +08:00
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
typingContent(e) {
|
|
|
|
|
let event = e;
|
|
|
|
|
this.title = e.detail.value;
|
|
|
|
|
},
|
|
|
|
|
doPublich() {
|
2025-04-30 14:28:07 +08:00
|
|
|
|
if (!this.upFlage) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-04-21 17:35:54 +08:00
|
|
|
|
if (this.title.length < 5) {
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: '请输入5个字以上的标题!',
|
|
|
|
|
icon: 'none'
|
|
|
|
|
});
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-04-30 14:28:07 +08:00
|
|
|
|
this.upFlage = false;
|
|
|
|
|
uni.showLoading({
|
|
|
|
|
title: '请稍等'
|
|
|
|
|
});
|
2025-04-21 17:35:54 +08:00
|
|
|
|
let me = this;
|
|
|
|
|
let vlogInfo = storage.getVlogUserInfo();
|
|
|
|
|
let userId = vlogInfo.id;
|
|
|
|
|
let vlog = {
|
|
|
|
|
vlogerId: userId,
|
|
|
|
|
url: me.videoUrl,
|
|
|
|
|
cover: me.tempCover || '',
|
|
|
|
|
title: me.title,
|
|
|
|
|
width: me.width,
|
|
|
|
|
height: me.height,
|
|
|
|
|
cityCode: storage.getCityCode()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 发布视频
|
|
|
|
|
let serverUrl = api.vlog;
|
|
|
|
|
uni.request({
|
|
|
|
|
method: 'POST',
|
|
|
|
|
header: {
|
|
|
|
|
headerUserId: userId,
|
|
|
|
|
headerUserToken: storage.getVlogToken()
|
|
|
|
|
},
|
|
|
|
|
url: serverUrl + '/vlog/publish',
|
|
|
|
|
data: vlog,
|
|
|
|
|
success(result) {
|
2025-05-02 17:22:45 +08:00
|
|
|
|
console.log(result);
|
|
|
|
|
uni.switchTab({
|
|
|
|
|
url: '/pages/me/me'
|
|
|
|
|
});
|
|
|
|
|
// if (result.data.status == 200) {
|
|
|
|
|
// // uni.showToast({
|
|
|
|
|
// // title: result.data.msg,
|
|
|
|
|
// // icon: 'none',
|
|
|
|
|
// // duration: 2000
|
|
|
|
|
// // });
|
2025-04-21 17:35:54 +08:00
|
|
|
|
|
2025-05-02 17:22:45 +08:00
|
|
|
|
// uni.switchTab({
|
|
|
|
|
// url: '/pages/me/me'
|
|
|
|
|
// });
|
|
|
|
|
// } else {
|
|
|
|
|
// uni.showToast({
|
|
|
|
|
// title: result.data.msg,
|
|
|
|
|
// icon: 'none',
|
|
|
|
|
// duration: 3000
|
|
|
|
|
// });
|
|
|
|
|
// }
|
2025-04-30 14:28:07 +08:00
|
|
|
|
},
|
|
|
|
|
complete() {
|
|
|
|
|
this.upFlage = true;
|
|
|
|
|
uni.hideLoading();
|
2025-04-21 17:35:54 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
preview() {
|
|
|
|
|
uni.navigateTo({
|
2025-05-12 14:51:35 +08:00
|
|
|
|
url: '/pages/publish/preview?videoUrl=' + this.videoUrl + '&width=' + this.width + '&height=' + this.height + '&localFile=' + this.localFile,
|
2025-04-21 17:35:54 +08:00
|
|
|
|
animationType: 'slide-in-bottom',
|
|
|
|
|
animationDuration: 500
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
touchstartPreplay() {
|
|
|
|
|
this.preplayTouched = true;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
touchendPreplay() {
|
|
|
|
|
this.preplayTouched = false;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
touchstartPublish() {
|
|
|
|
|
this.publishTouched = true;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
touchendPublish() {
|
|
|
|
|
this.publishTouched = false;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
chooseCover() {
|
|
|
|
|
let me = this;
|
|
|
|
|
let vlogInfo = storage.getVlogUserInfo();
|
|
|
|
|
let userId = vlogInfo.id;
|
|
|
|
|
uni.chooseImage({
|
|
|
|
|
count: 1,
|
|
|
|
|
sizeType: 'original',
|
|
|
|
|
sourceType: ['album'],
|
|
|
|
|
success(e) {
|
|
|
|
|
me.tempCover = e.tempFilePaths[0]; //先在本地回显
|
|
|
|
|
// 上传封面
|
|
|
|
|
let serverUrl = api.vlog;
|
|
|
|
|
uni.uploadFile({
|
|
|
|
|
filePath: e.tempFilePaths[0],
|
|
|
|
|
url: serverUrl + '/upload',
|
|
|
|
|
formData: {
|
|
|
|
|
filetype: 'video'
|
|
|
|
|
},
|
|
|
|
|
header: {
|
|
|
|
|
headerUserId: userId,
|
|
|
|
|
headerUserToken: storage.getVlogToken()
|
|
|
|
|
},
|
|
|
|
|
name: 'file',
|
|
|
|
|
success(result) {
|
|
|
|
|
let res = JSON.parse(result.data);
|
|
|
|
|
console.log(res);
|
|
|
|
|
if (res.status == 200) {
|
|
|
|
|
let imageUrl = res.data;
|
|
|
|
|
me.tempCover = imageUrl;
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: res.msg,
|
|
|
|
|
duration: 2000
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
uni.showToast({
|
|
|
|
|
title: res.msg,
|
|
|
|
|
icon: 'none',
|
|
|
|
|
duration: 3000
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.prpage {
|
|
|
|
|
position: absolute;
|
|
|
|
|
left: 0;
|
|
|
|
|
right: 0;
|
|
|
|
|
top: 0;
|
|
|
|
|
bottom: 0;
|
|
|
|
|
background-color: #181b27;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.main-body-img-m {
|
|
|
|
|
min-height: 400rpx;
|
|
|
|
|
/* width: 750rpx; */
|
|
|
|
|
border: 2rpx solid #545456;
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.choose-cover-text {
|
|
|
|
|
color: #ffffff;
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.choose-cover {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
margin-left: 100rpx;
|
|
|
|
|
margin-top: 10px;
|
|
|
|
|
width: 200rpx;
|
|
|
|
|
height: 100rpx;
|
|
|
|
|
position: relative;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.preplay-icon {
|
|
|
|
|
width: 22rpx;
|
|
|
|
|
height: 22rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.preplay-text {
|
|
|
|
|
color: #e6e6e6;
|
|
|
|
|
font-size: 28rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
margin-left: 15rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.preplay-wrapper {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
padding: 6rpx 16rpx;
|
|
|
|
|
width: 200rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.main-body-content {
|
|
|
|
|
/* display: flex; */
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
justify-content: flex-start;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.vlog-content {
|
|
|
|
|
margin-top: 30rpx;
|
|
|
|
|
height: 200rpx;
|
|
|
|
|
color: #000000;
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
background-color: #ffffff;
|
|
|
|
|
padding-left: 20rpx;
|
|
|
|
|
padding-top: 20rpx;
|
|
|
|
|
padding-right: 20rpx;
|
|
|
|
|
padding-bottom: 20rpx;
|
|
|
|
|
border-radius: 20rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.btn-text {
|
|
|
|
|
color: #e6e6e6;
|
|
|
|
|
font-size: 36rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.mbtn {
|
|
|
|
|
margin-top: 30rpx;
|
|
|
|
|
height: 90rpx;
|
|
|
|
|
/* display: flex; */
|
|
|
|
|
justify-content: center;
|
|
|
|
|
align-items: center;
|
|
|
|
|
border-radius: 40rpx;
|
|
|
|
|
border: transparent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.btn-publish {
|
|
|
|
|
background-color: #ef274d;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.btn-publish-touched {
|
|
|
|
|
background-color: #de6981;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.main-body {
|
|
|
|
|
margin-top: 20rpx;
|
|
|
|
|
padding: 0 20rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.line {
|
|
|
|
|
height: 1rpx;
|
|
|
|
|
background-color: #393a41;
|
|
|
|
|
width: 750rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.progress {
|
|
|
|
|
margin-top: 60rpx;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
width: 750rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.progress-text {
|
|
|
|
|
color: #f1f1f1;
|
|
|
|
|
font-size: 32rpx;
|
|
|
|
|
text-align: center;
|
|
|
|
|
margin-top: 40rpx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.progress-img {
|
|
|
|
|
width: 600rpx;
|
|
|
|
|
height: 600rpx;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
</style>
|