|
|
<template>
|
|
|
<div class="animate-card animate-card-50" :class="{ 'active': showForm }" :style="{ height: componentHeight }"
|
|
|
style="width: 100%;">
|
|
|
<!-- 下拉按钮 -->
|
|
|
<el-button class="animate-card__layer" type="primary" @click="toggleForm">
|
|
|
<el-icon v-if="showForm">
|
|
|
<ArrowUp />
|
|
|
</el-icon>
|
|
|
<div v-else>
|
|
|
<el-icon>
|
|
|
<ArrowDown />
|
|
|
</el-icon>
|
|
|
发帖
|
|
|
</div>
|
|
|
</el-button>
|
|
|
|
|
|
<!-- 表单部分,使用 v-show 控制显示 -->
|
|
|
<div class="animate-card__sublayer" style="align-items: center; width: 100%;">
|
|
|
<el-form v-show="showForm" :model="form" ref="formRef" class="form-container">
|
|
|
<el-form-item label="内容" prop="content" :rules="[{ required: true, message: '请输入内容', trigger: 'blur' }]"
|
|
|
style="width: 80%;">
|
|
|
<el-input v-model="form.content" type="textarea" placeholder="有什么新鲜事..." rows=4 />
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
<div>
|
|
|
<el-upload action="#" list-type="picture" :auto-upload="false" :limit="1" :on-exceed="handleExceed" ref="postimage"
|
|
|
style="position: fixed; left: 12%;display: flex; align-items: center;" @change="handleFileChange" >
|
|
|
<!-- @success="handleUploadSuccess" -->
|
|
|
|
|
|
|
|
|
<el-icon size="30px">
|
|
|
<Picture />
|
|
|
</el-icon>图片
|
|
|
<br>
|
|
|
|
|
|
|
|
|
</el-upload>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<el-radio-group v-model="radio" fill="#FE4E96" size="small" >
|
|
|
<el-radio-button label="日常动态" ></el-radio-button>
|
|
|
<el-radio-button label="家族故事" ></el-radio-button>
|
|
|
</el-radio-group>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="button-container">
|
|
|
<el-button type="primary" @click="submitPost" :disabled="!form.content.trim()"
|
|
|
style="position:fixed; right:11% ;background-color:#FE4E96">发布</el-button>
|
|
|
</div>
|
|
|
|
|
|
</el-form>
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import { defineComponent } from 'vue';
|
|
|
import axios from 'axios';
|
|
|
import {getUserId} from '@/token/auth';
|
|
|
|
|
|
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'PostForm',
|
|
|
components: {
|
|
|
|
|
|
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
userid:0,
|
|
|
showForm: false, // 控制表单是否显示
|
|
|
radio: '日常动态',
|
|
|
form: {
|
|
|
content: ''
|
|
|
},
|
|
|
fileList: [],
|
|
|
imageUrl: '',
|
|
|
componentHeight: '3%'
|
|
|
};
|
|
|
},
|
|
|
methods: {
|
|
|
handleFileChange(file) {
|
|
|
// 当文件被选中时触发
|
|
|
if (file.raw) {
|
|
|
// 创建预览图片的URL
|
|
|
this.imageUrl = URL.createObjectURL(file.raw);
|
|
|
}
|
|
|
},
|
|
|
handleExceed()
|
|
|
{
|
|
|
this.$message.error("目前仅支持添加一张图片");
|
|
|
},
|
|
|
// 切换表单显示/隐藏
|
|
|
toggleForm() {
|
|
|
this.showForm = !this.showForm;
|
|
|
if (this.componentHeight == '3%')
|
|
|
this.componentHeight = '25%';
|
|
|
else
|
|
|
this.componentHeight = '3%';
|
|
|
},
|
|
|
beforeUpload(file) {
|
|
|
const isImage = file.type === 'image/jpeg' || file.type === 'image/png';
|
|
|
if (!isImage) {
|
|
|
this.$message.error('只能上传JPG/PNG格式的图片');
|
|
|
}
|
|
|
return isImage;
|
|
|
},
|
|
|
handleUploadSuccess(response, file, fileList) {
|
|
|
|
|
|
this.imageUrl = URL.createObjectURL(file.raw); // 创建临时 URL 以预览图片
|
|
|
this.$message("创建图片"+this.imageUrl);
|
|
|
this.fileList = fileList;
|
|
|
},
|
|
|
handleRemove(file, fileList) {
|
|
|
this.imageUrl = ''; // 删除时清空图片预览
|
|
|
this.fileList = fileList;
|
|
|
},
|
|
|
async submitPost() {
|
|
|
this.$refs.postimage.submit();
|
|
|
if (!this.form.content.trim()) {
|
|
|
this.$message.error('内容不能为空');
|
|
|
return;
|
|
|
}
|
|
|
const newPost = {
|
|
|
userid:getUserId(),
|
|
|
username: '用户',
|
|
|
avatarurl: 'https://via.placeholder.com/50',
|
|
|
timestamp: new Date().toLocaleString(),
|
|
|
content: this.form.content,
|
|
|
imageurl: this.imageUrl,
|
|
|
likecount: 0,
|
|
|
commentcount: 0,
|
|
|
isfamilystory: this.radio === '家族故事' ? true : false,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
const response = await axios.post('http://localhost:8082/loveforest/posts/addpost', newPost, {
|
|
|
headers: {
|
|
|
'Content-Type': 'application/json',
|
|
|
'Accept': 'application/json'
|
|
|
}
|
|
|
});
|
|
|
if(response.data==="增加动态成功!")
|
|
|
{
|
|
|
this.$message.success("增加动态成功!");
|
|
|
this.$emit('post-submitted', newPost);
|
|
|
|
|
|
this.form.content = '';
|
|
|
this.imageUrl = '';
|
|
|
this.fileList = [];
|
|
|
|
|
|
}
|
|
|
else{
|
|
|
this.$message.error(response.data);
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
console.error('发布动态失败:', error);
|
|
|
this.$message.error('发布动态失败,请刷新后再试');
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
}
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
/* 覆盖选中时的颜色 */
|
|
|
.el-radio.is-checked .el-radio__inner {
|
|
|
border-color: #FE4E96 !important;
|
|
|
}
|
|
|
|
|
|
.el-radio.is-checked .el-radio__label {
|
|
|
color: #FE4E96 !important;
|
|
|
}
|
|
|
|
|
|
.el-radio .el-radio__inner {
|
|
|
border-color: #FE4E96 !important;
|
|
|
}
|
|
|
|
|
|
.el-radio .el-radio__label {
|
|
|
color: #FE4E96 !important;
|
|
|
}
|
|
|
.form-container {
|
|
|
width: 100%;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
|
|
|
}
|
|
|
|
|
|
.el-upload-list__item-thumbnail {
|
|
|
width: 60px;
|
|
|
/* 修改为你想要的缩略图宽度 */
|
|
|
height: 60px;
|
|
|
/* 修改为你想要的缩略图高度 */
|
|
|
object-fit: cover;
|
|
|
/* 保证缩略图不会变形 */
|
|
|
}
|
|
|
|
|
|
|
|
|
.el-form-item {
|
|
|
margin-bottom: 15px;
|
|
|
}
|
|
|
|
|
|
.upload-demo {
|
|
|
margin-top: 10px;
|
|
|
}
|
|
|
|
|
|
.animate-card {
|
|
|
position: relative;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
|
|
|
.animate-card-50 {
|
|
|
display: flex;
|
|
|
height: 10%;
|
|
|
justify-content: center;
|
|
|
/* 横向居中 */
|
|
|
transition: height 0.7s ease-in-out;
|
|
|
}
|
|
|
|
|
|
.animate-card__layer {
|
|
|
height: 16px;
|
|
|
width: 7%;
|
|
|
font-size: 14px;
|
|
|
background-color: #FE4E96;
|
|
|
border: none;
|
|
|
}
|
|
|
|
|
|
.animate-card__layer:hover {
|
|
|
transform: translateY(50%);
|
|
|
background-color: #FEB2D7;
|
|
|
}
|
|
|
|
|
|
.animate-card-50 .animate-card__sublayer {
|
|
|
position: absolute;
|
|
|
left: 0;
|
|
|
top: 0;
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
|
|
|
transform: translateY(-100%);
|
|
|
text-align: center;
|
|
|
background-color: #fff;
|
|
|
color: #000;
|
|
|
opacity: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
/* 点击后触发动画 */
|
|
|
.animate-card-50.active .animate-card__layer {
|
|
|
position: relative;
|
|
|
transform: scale(0.9) translateY(800%);
|
|
|
border: 6px solid rgba(255, 255, 255, 0.9);
|
|
|
z-index: 9;
|
|
|
}
|
|
|
|
|
|
.animate-card-50.active .animate-card__sublayer {
|
|
|
transform: translateY(0px);
|
|
|
opacity: 1;
|
|
|
}
|
|
|
</style> |