436 lines
11 KiB
Vue
436 lines
11 KiB
Vue
|
|
<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>
|