roamfuding-xcx/page_user/caozuo/fadongtai.vue

436 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page">
<u-navbar title="发布动态" :border-bottom="false" :background="bgc" back-icon-color="#262B37" title-color='#262B37'
title-size='36' height='46' id="navbar">
</u-navbar>
<view class="topcont">
<view class="title">
<input type="text" v-model="title" placeholder="添加标题"/>
</view>
<textarea class="cont" name="" v-model="cont" placeholder="写下自己的感受,分享给更多的人" id="" cols="30" rows="10"></textarea>
<view class="imglist">
<view class="mediaitem" v-for="(item,index) in mediaList" :key="index">
<!-- 图片预览 -->
<image v-if="item.type === 'image'" class="media-preview" :src="item.url" mode="aspectFill" @click="previewMedia(index)"></image>
<!-- 视频预览 -->
<video v-else-if="item.type === 'video'" class="media-preview" :src="item.url" :poster="item.poster" controls="true" :show-play-btn="true" :show-center-play-btn="true" :enable-progress-gesture="true" :enable-fullscreen="true" @click="previewMedia(index)">
<!-- <cover-view class="play-icon" @click.stop="previewMedia(index)">▶</cover-view> -->
</video>
<!-- 删除按钮 -->
<view class="delete-btn" @click="deleteMedia(index)">
<text class="delete-icon">×</text>
</view>
</view>
<view class="upload-btn" @click="btnsc">
<image class="sc" src="https://api.ccttiot.com/smartmeter/img/static/u3z28zohbXoJ5kWcR6X1" mode=""></image>
</view>
</view>
</view>
<view class="weizhi">
<view class="lt" @click="btnweizhi">
<image src="https://api.ccttiot.com/smartmeter/img/static/u89SQe8SWGXW1jH3VghJ" mode=""></image> <text v-if="xqdz == ''">你在哪里 </text>
<input v-if="xqdz == ''" style="width: 400rpx;" type="text" :disabled="true" v-model="xqdz" placeholder="(必填.越详细越易被推荐)" value="" />
<input v-else type="text" :disabled="true" v-model="xqdz" placeholder="(必填.越详细越易被推荐)" value="" />
</view>
<view class="rt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uP31r333Y9Uu7hsl05TB" mode=""></image>
</view>
</view>
<view class="botanniu">
<view class="an" @click="btnfb">
发布
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bgc: {
backgroundColor: "#fff",
},
title:'',
cont:'',
token:'',
mediaList:[] ,// 改为媒体列表,包含图片和视频
xqdz:'',
latitude:'',
longitude:''
}
},
onLoad() {
this.getqiniuyun()
},
methods: {
// 点击发布动态
btnfb(){
let picture = []
this.mediaList.forEach(item =>{
picture.push(item.url)
})
let data = {
picture:picture,
content:this.cont,
title:this.title,
latitude:this.latitude,
longitude:this.longitude,
location:this.xqdz
}
this.$u.post("/app/feed/add",data).then((res) => {
if (res.code == 200) {
uni.showToast({ title: '发布成功', icon: 'success',duration:3000 })
setTimeout(()=>{
uni.navigateBack()
},1500)
}else{
uni.showToast({ title: res.msg, icon: 'none',duration:3000 })
}
})
},
// 点击选择位置
btnweizhi(){
uni.chooseLocation({
success: (res) => {
this.latitude = res.latitude
this.longitude = res.longitude
this.xqdz = res.name
},
fail: function(err) {
console.log('选择位置失败', err)
},
complete: (res) => {
if (res.errMsg === 'chooseLocation:ok') {} else if (res.errMsg.indexOf('chooseLocation:cancel') === 0) {
uni.showToast({
title: '您取消了位置选择',
icon: 'none',
duration:3000
})
}
}
})
},
// 获取七牛云上传token
getqiniuyun(){
this.$u.get("/common/qiniuToken").then((res) => {
if (res.code == 200) {
this.token = res.data
}
})
},
// 点击上传媒体文件
btnsc(){
if(this.mediaList.length >= 9){
return uni.showToast({ title: '最多选择九张图片或视频', icon: 'none',duration:3000 })
}
let _this = this
// 使用 uni.chooseMedia 从手机相册选择图片和视频
uni.chooseMedia({
count: 9 - this.mediaList.length, // 剩余可选择的数量
mediaType: ['image', 'video'], // 允许选择图片和视频
sourceType: ['album', 'camera'], // 允许从相册和相机选择
camera: 'back', // 默认后置摄像头
success(res) {
const tempFiles = res.tempFiles
tempFiles.forEach(file => {
wx.uploadFile({
url: 'https://up-z2.qiniup.com',
name: 'file',
filePath: file.tempFilePath, //文件路径
formData: {
token: _this.token, //后端返回的token
key: _this.getUploadFileName(file.tempFilePath) //传的文件名称
},
success: function(res) {
let str = JSON.parse(res.data)
let fileUrl = 'https://api.ccttiot.com/' + str.key
// 根据文件后缀名判断类型
let fileType = _this.getFileType(file.tempFilePath)
// 添加到媒体列表
_this.mediaList.push({
url: fileUrl,
type: fileType,
poster: fileType === 'video' ? null : null // 视频不设置poster避免加载失败
})
}
})
})
},
fail(err) {
console.log('选择媒体失败:', err)
uni.showToast({
title: '选择失败',
icon: 'none',
duration: 3000
})
}
})
},
// 获取上传的文件名
getUploadFileName(fileName) {
return fileName.slice(fileName.lastIndexOf("/") + 1, fileName.length);
},
// 根据文件路径判断文件类型
getFileType(filePath) {
const extension = filePath.toLowerCase().split('.').pop()
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
const videoExtensions = ['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm', 'mkv']
if (imageExtensions.includes(extension)) {
return 'image'
} else if (videoExtensions.includes(extension)) {
return 'video'
} else {
return 'image' // 默认当作图片处理
}
},
// 预览媒体文件 - 图文混合预览
previewMedia(index) {
const media = this.mediaList[index]
console.log('预览媒体:', media)
console.log('当前索引:', index)
// 统一在微信小程序端使用 previewMedia 实现图文混合预览
// #ifdef MP-WEIXIN
const sources = this.mediaList.map((item) => {
if (item.type === 'video') {
return {
url: item.url,
type: 'video',
poster: item.poster || ''
}
}
return {
url: item.url,
type: 'image'
}
})
console.log('预览源数据:', sources)
uni.previewMedia({
current: index,
sources,
success: (res) => {
console.log('预览成功:', res)
},
fail: (err) => {
console.error('预览失败:', err)
uni.showToast({
title: '预览失败',
icon: 'none',
duration:3000
})
}
})
return
// #endif
// 其他平台回退为仅图片可预览
if (media.type === 'video') {
// 视频全屏播放
this.playVideo(index)
return
}
// 图片预览
const urls = this.mediaList.filter(item => item.type === 'image').map(item => item.url)
if (!urls.length) return
uni.previewImage({
urls: urls,
current: media.url
})
},
// 播放视频
playVideo(index) {
const media = this.mediaList[index]
console.log(media);
if (media.type == 'video') {
// 使用uni.previewVideo进行全屏播放
uni.previewVideo({
sources: [{
src: media.url,
type: 'mp4'
}],
autoplay: true,
loop: false,
defaultMuted: false,
showPlayBtn: true,
showCenterPlayBtn: true,
enableProgressGesture: true,
showFullscreenBtn: true,
showMuteBtn: true
})
}
},
// 删除媒体文件
deleteMedia(index) {
uni.showModal({
title: '确认删除',
content: '确定要删除这个文件吗?',
success: (res) => {
if (res.confirm) {
this.mediaList.splice(index, 1)
}
}
})
},
}
}
</script>
<style lang="scss">
::v-deep .u-iconfont,
::v-deep .u-title{
padding-bottom: 22rpx !important;
}
.botanniu{
width: 750rpx;
height: 152rpx;
background: #FFFFFF;
border-radius: 0rpx 0rpx 0rpx 0rpx;
position: fixed;
left: 0;
bottom: 0;
padding-top: 34rpx;
.an{
width: 698rpx;
height: 86rpx;
background: #1EC28B;
border-radius: 12rpx 12rpx 12rpx 12rpx;
font-weight: 600;
font-size: 36rpx;
color: #FFFFFF;
margin: auto;
text-align: center;
line-height: 86rpx;
}
}
.weizhi{
width: 698rpx;
height: 112rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
margin: auto;
margin-top: 24rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 40rpx;
box-sizing: border-box;
.lt{
display: flex;
align-items: center;
text{
margin-left: 10rpx;
margin-right: 10rpx;
}
image{
width: 40rpx;
height: 40rpx;
}
input{
width: 530rpx;
}
}
.rt{
image{
width: 36rpx;
height: 36rpx;
margin-top: 4rpx;
}
}
}
.topcont{
width: 698rpx;
max-height: 2580rpx;
background: #FFFFFF;
border-radius: 20rpx 20rpx 20rpx 20rpx;
margin: auto;
margin-top: 24rpx;
padding-top: 20rpx;
padding-bottom: 40rpx;
box-sizing: border-box;
.imglist{
display: flex;
width: 620rpx;
margin: auto;
gap: 32rpx;
flex-wrap: wrap;
margin-top: 30rpx;
.upload-btn{
.sc{
width: 180rpx;
height: 180rpx;
border-radius: 20rpx;
border: 2rpx dashed #E0E0E0;
}
}
.mediaitem{
position: relative;
width: 180rpx;
height: 180rpx;
border-radius: 20rpx;
.media-preview{
width: 100%;
height: 100%;
border-radius: 20rpx;
object-fit: cover;
}
.play-icon{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 60rpx;
height: 60rpx;
background: rgba(0, 0, 0, 0.6);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 24rpx;
font-weight: bold;
}
.delete-btn{
position: absolute;
top: -8rpx;
right: -8rpx;
width: 32rpx;
height: 32rpx;
background: #ff4757;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
.delete-icon{
color: #fff;
font-size: 20rpx;
font-weight: bold;
line-height: 1;
}
}
}
}
.cont{
width: 644rpx;
margin: auto;
margin-top: 24rpx;
}
.title{
input{
width: 644rpx;
height: 100rpx;
font-size: 36rpx;
border-bottom: 1px dashed #D8D8D8;
margin: auto;
}
}
}
page {
background: #F6F6F6;
padding-bottom:500rpx;
}
</style>