259 lines
5.3 KiB
Vue
259 lines
5.3 KiB
Vue
|
<template>
|
|||
|
<s-layout title="发布动态" :bgStyle="{ color: '#fff' }">
|
|||
|
<view class="container">
|
|||
|
<view class="media-section">
|
|||
|
<view class="media-btn" @click="chooseImage">
|
|||
|
<image v-if="imageUrl" :src="imageUrl" class="preview-img" mode="aspectFill" />
|
|||
|
<view v-else class="media-placeholder">
|
|||
|
<text>添加图片</text>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<button class="media-btn" @click="chooseVideo">
|
|||
|
<!-- <image src="/static/icon-video.png" class="icon" /> -->
|
|||
|
<text>添加视频</text>
|
|||
|
</button>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="tips">
|
|||
|
<text>填写标题会有更多赞噢~</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<textarea class="textarea" v-model="content" placeholder="分享使用体验和心得,获得更多点赞和关注哦~(600字内)" maxlength="600"
|
|||
|
auto-height></textarea>
|
|||
|
|
|||
|
<view class="hashtag">
|
|||
|
<text>#话题</text>
|
|||
|
</view>
|
|||
|
|
|||
|
<view class="options">
|
|||
|
<view class="option" @click="chooseItems">
|
|||
|
<text>🔗 添加宝贝({{ items.length }})</text>
|
|||
|
<text class="right">请选择 ></text>
|
|||
|
</view>
|
|||
|
<view class="option" @click="chooseCategory">
|
|||
|
<text>📂 内容分类</text>
|
|||
|
<text class="right">{{ category || '请选择 >' }}</text>
|
|||
|
</view>
|
|||
|
<view class="option">
|
|||
|
<text>💬 是否禁止评论</text>
|
|||
|
<switch :checked="disableComments" @change="disableComments = !disableComments" />
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
|
|||
|
<button class="submit-btn" @click="submitPost">发布</button>
|
|||
|
</view>
|
|||
|
</s-layout>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import SeedApi from '@/sheep/api/seedComm/seedComm.js';
|
|||
|
import FileApi from '@/sheep/api/infra/file';
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
content: '',
|
|||
|
imageUrl: '', // 上传后图片 URL
|
|||
|
items: [],
|
|||
|
category: '',
|
|||
|
disableComments: false
|
|||
|
};
|
|||
|
},
|
|||
|
methods: {
|
|||
|
chooseImage() {
|
|||
|
uni.chooseImage({
|
|||
|
count: 1,
|
|||
|
success: async (res) => {
|
|||
|
const tempFilePath = res.tempFilePaths[0];
|
|||
|
|
|||
|
try {
|
|||
|
// ✅ 正确调用方式,只传路径字符串
|
|||
|
const uploadRes = await FileApi.uploadFile(tempFilePath);
|
|||
|
|
|||
|
this.imageUrl = uploadRes.data;
|
|||
|
|
|||
|
uni.showToast({
|
|||
|
title: '图片上传成功',
|
|||
|
icon: 'success'
|
|||
|
});
|
|||
|
} catch (err) {
|
|||
|
console.error('上传失败', err);
|
|||
|
uni.showToast({
|
|||
|
title: '图片上传失败',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
fail: () => {
|
|||
|
uni.showToast({
|
|||
|
title: '图片选择失败',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
chooseVideo() {
|
|||
|
uni.chooseVideo({
|
|||
|
success: (res) => {
|
|||
|
console.log('选中视频:', res.tempFilePath);
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
chooseItems() {
|
|||
|
console.log('添加宝贝');
|
|||
|
},
|
|||
|
chooseCategory() {
|
|||
|
console.log('选择分类');
|
|||
|
},
|
|||
|
submitPost() {
|
|||
|
if (!this.content) {
|
|||
|
return uni.showToast({
|
|||
|
title: '请填写内容',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
}
|
|||
|
if (!this.imageUrl) {
|
|||
|
return uni.showToast({
|
|||
|
title: '请添加图片',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
const payload = {
|
|||
|
content: this.content,
|
|||
|
picUrl: this.imageUrl
|
|||
|
};
|
|||
|
|
|||
|
SeedApi.createSeed(payload)
|
|||
|
.then((res) => {
|
|||
|
uni.showToast({
|
|||
|
title: '发布成功',
|
|||
|
icon: 'success'
|
|||
|
});
|
|||
|
|
|||
|
setTimeout(() => {
|
|||
|
// 回到上一个页面
|
|||
|
const pages = getCurrentPages();
|
|||
|
const prevPage = pages[pages.length - 2]; // 上一个页面
|
|||
|
|
|||
|
// 如果有 onLoad 或其他刷新函数,可以手动调用
|
|||
|
if (prevPage && typeof prevPage.onLoad === 'function') {
|
|||
|
// 传参数给上一个页面时需要用 options
|
|||
|
prevPage.onLoad(prevPage.options);
|
|||
|
}
|
|||
|
|
|||
|
uni.navigateBack(); // 返回上一个页面
|
|||
|
}, 800);
|
|||
|
})
|
|||
|
.catch((err) => {
|
|||
|
console.error('发布失败', err);
|
|||
|
uni.showToast({
|
|||
|
title: '发布失败',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped>
|
|||
|
.container {
|
|||
|
padding: 20rpx;
|
|||
|
background-color: #f5f5f5;
|
|||
|
}
|
|||
|
|
|||
|
.media-section {
|
|||
|
display: flex;
|
|||
|
justify-content: space-around;
|
|||
|
margin-bottom: 20rpx;
|
|||
|
}
|
|||
|
|
|||
|
.media-btn {
|
|||
|
width: 45%;
|
|||
|
height: 200rpx;
|
|||
|
background-color: #fff;
|
|||
|
border-radius: 12rpx;
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
}
|
|||
|
|
|||
|
.icon {
|
|||
|
width: 60rpx;
|
|||
|
height: 60rpx;
|
|||
|
margin-bottom: 10rpx;
|
|||
|
}
|
|||
|
|
|||
|
.tips {
|
|||
|
padding: 10rpx 0;
|
|||
|
color: #666;
|
|||
|
}
|
|||
|
|
|||
|
.textarea {
|
|||
|
background: #fff;
|
|||
|
padding: 20rpx;
|
|||
|
border-radius: 12rpx;
|
|||
|
min-height: 200rpx;
|
|||
|
/* margin-bottom: 10rpx; */
|
|||
|
margin: 10rpx auto;
|
|||
|
/* 上下10rpx边距,左右自动居中 */
|
|||
|
display: block;
|
|||
|
/* 确保居中生效 */
|
|||
|
max-width: 90%;
|
|||
|
/* 限制最大宽度,适应不同屏幕 */
|
|||
|
}
|
|||
|
|
|||
|
.hashtag {
|
|||
|
padding: 10rpx;
|
|||
|
color: #666;
|
|||
|
}
|
|||
|
|
|||
|
.options {
|
|||
|
background: #fff;
|
|||
|
border-radius: 12rpx;
|
|||
|
margin: 20rpx 0;
|
|||
|
}
|
|||
|
|
|||
|
.option {
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
padding: 30rpx 20rpx;
|
|||
|
border-bottom: 1rpx solid #eee;
|
|||
|
}
|
|||
|
|
|||
|
.option:last-child {
|
|||
|
border-bottom: none;
|
|||
|
}
|
|||
|
|
|||
|
.right {
|
|||
|
color: #999;
|
|||
|
}
|
|||
|
|
|||
|
.submit-btn {
|
|||
|
background-color: #e64340;
|
|||
|
color: #fff;
|
|||
|
border-radius: 50rpx;
|
|||
|
height: 90rpx;
|
|||
|
font-size: 34rpx;
|
|||
|
margin-bottom: 30rpx;
|
|||
|
}
|
|||
|
|
|||
|
.preview-img {
|
|||
|
width: 100%;
|
|||
|
height: 100%;
|
|||
|
border-radius: 12rpx;
|
|||
|
object-fit: cover;
|
|||
|
}
|
|||
|
|
|||
|
.media-placeholder {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
align-items: center;
|
|||
|
justify-content: center;
|
|||
|
height: 100%;
|
|||
|
color: #999;
|
|||
|
}
|
|||
|
</style>
|