feat: 深度优化自媒体发布系统及修复关键BUG

This commit is contained in:
钟停为止
2026-03-05 10:12:40 +08:00
parent ab2dbb0de6
commit 23ee8d014f
11 changed files with 440 additions and 689 deletions
+86 -114
View File
@@ -296,6 +296,15 @@
</el-radio-group>
</div>
<!-- 原创声明 -->
<div class="original-section">
<el-checkbox
v-model="tab.isOriginal"
label="声明原创"
class="original-checkbox"
/>
</div>
<!-- 草稿选项 (仅在视频号可见) -->
<div v-if="tab.selectedPlatform === 2" class="draft-section">
<el-checkbox
@@ -411,27 +420,6 @@
</template>
</el-dialog>
<!-- 标签 (仅在抖音可见) -->
<div v-if="tab.selectedPlatform === 3" class="product-section">
<h3>商品链接</h3>
<el-input
v-model="tab.productTitle"
type="text"
:rows="1"
placeholder="请输入商品名称"
maxlength="200"
class="product-name-input"
/>
<el-input
v-model="tab.productLink"
type="text"
:rows="1"
placeholder="请输入商品链接"
maxlength="200"
class="product-link-input"
/>
</div>
<!-- 定时发布 -->
<div class="schedule-section">
<h3>定时发布</h3>
@@ -509,6 +497,7 @@ import { ElMessage } from 'element-plus'
import { useAccountStore } from '@/stores/account'
import { useAppStore } from '@/stores/app'
import { materialApi } from '@/api/material'
import { http } from '@/utils/request'
// API base URL
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL || 'http://localhost:5409'
@@ -565,7 +554,8 @@ const defaultTabInit = {
startDays: 0, // 从今天开始计算的发布天数,0表示明天,1表示后天
publishStatus: null, // 发布状态,包含message和type
publishing: false, // 发布状态,用于控制按钮loading效果
isDraft: false // 是否保存为草稿,仅视频号平台可见
isDraft: false, // 是否保存为草稿,仅视频号平台可见
isOriginal: false // 是否标记为原创
}
// helper to create a fresh deep-copied tab from defaultTabInit
@@ -663,7 +653,6 @@ const handleUploadSuccess = (response, file, tab) => {
}))]
ElMessage.success('文件上传成功')
console.log('上传成功:', fileInfo)
} else {
ElMessage.error(response.msg || '上传失败')
}
@@ -672,7 +661,6 @@ const handleUploadSuccess = (response, file, tab) => {
// 处理文件上传失败
const handleUploadError = (error) => {
ElMessage.error('文件上传失败')
console.error('上传错误:', error)
}
// 删除已上传文件
@@ -774,102 +762,77 @@ const cancelPublish = (tab) => {
const confirmPublish = async (tab) => {
// 防止重复点击
if (tab.publishing) {
return Promise.reject(new Error('正在发布中,请稍候...'))
throw new Error('正在发布中,请稍候...')
}
tab.publishing = true // 设置发布状态为进行中
return new Promise((resolve, reject) => {
// 数据验证
if (tab.fileList.length === 0) {
ElMessage.error('请先上传视频文件')
tab.publishing = false // 重置发布状态
reject(new Error('请先上传视频文件'))
return
}
if (!tab.title.trim()) {
ElMessage.error('请输入标题')
tab.publishing = false // 重置发布状态
reject(new Error('请输入标题'))
return
}
if (!tab.selectedPlatform) {
ElMessage.error('请选择发布平台')
tab.publishing = false // 重置发布状态
reject(new Error('请选择发布平台'))
return
}
if (tab.selectedAccounts.length === 0) {
ElMessage.error('请选择发布账号')
tab.publishing = false // 重置发布状态
reject(new Error('请选择发布账号'))
return
}
// 数据验证
if (tab.fileList.length === 0) {
ElMessage.error('请先上传视频文件')
tab.publishing = false
throw new Error('请先上传视频文件')
}
if (!tab.title.trim()) {
ElMessage.error('请输入标题')
tab.publishing = false
throw new Error('请输入标题')
}
if (!tab.selectedPlatform) {
ElMessage.error('请选择发布平台')
tab.publishing = false
throw new Error('请选择发布平台')
}
if (tab.selectedAccounts.length === 0) {
ElMessage.error('请选择发布账号')
tab.publishing = false
throw new Error('请选择发布账号')
}
// 构造发布数据,符合后端API格式
const publishData = {
type: tab.selectedPlatform,
title: tab.title,
tags: tab.selectedTopics, // 不带#号的话题列表
fileList: tab.fileList.map(file => file.path), // 只发送文件路径
accountList: tab.selectedAccounts.map(accountId => {
const account = accountStore.accounts.find(acc => acc.id === accountId)
return account ? account.filePath : accountId
}), // 发送账号的文件路径
enableTimer: tab.scheduleEnabled ? 1 : 0, // 是否启用定时发布,开启传1,不开启传0
videosPerDay: tab.scheduleEnabled ? tab.videosPerDay || 1 : 1, // 每天发布视频数量,1-55
dailyTimes: tab.scheduleEnabled ? tab.dailyTimes || ['10:00'] : ['10:00'], // 每天发布时间点
startDays: tab.scheduleEnabled ? tab.startDays || 0 : 0, // 从今天开始计算的发布天数,0表示明天,1表示后天
category: 0, //表示非原创
productLink: tab.productLink.trim() || '', // 商品链接
productTitle: tab.productTitle.trim() || '', // 商品名称
isDraft: tab.isDraft // 是否保存为草稿,仅视频号平台使用
}
// 构造发布数据,符合后端API格式
const publishData = {
type: tab.selectedPlatform,
title: tab.title,
tags: tab.selectedTopics, // 不带#号的话题列表
fileList: tab.fileList.map(file => file.path), // 只发送文件路径
accountList: tab.selectedAccounts.map(accountId => {
const account = accountStore.accounts.find(acc => acc.id === accountId)
return account ? account.filePath : accountId
}), // 发送账号的文件路径
enableTimer: tab.scheduleEnabled ? 1 : 0,
videosPerDay: tab.scheduleEnabled ? tab.videosPerDay || 1 : 1,
dailyTimes: tab.scheduleEnabled ? tab.dailyTimes || ['10:00'] : ['10:00'],
startDays: tab.scheduleEnabled ? tab.startDays || 0 : 0,
category: tab.isOriginal ? 1 : 0, // 1表示原创,0表示非原创
productLink: tab.productLink.trim() || '',
productTitle: tab.productTitle.trim() || '',
isDraft: tab.isDraft
}
// 调用后端发布API
fetch(`${apiBaseUrl}/postVideo`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...authHeaders.value
},
body: JSON.stringify(publishData)
})
.then(response => response.json())
.then(data => {
if (data.code === 200) {
tab.publishStatus = {
message: '发布成功',
type: 'success'
}
// 清空当前tab的数据
tab.fileList = []
tab.displayFileList = []
tab.title = ''
tab.selectedTopics = []
tab.selectedAccounts = []
tab.scheduleEnabled = false
resolve()
} else {
tab.publishStatus = {
message: `发布失败:${data.msg || '发布失败'}`,
type: 'error'
}
reject(new Error(data.msg || '发布失败'))
}
})
.catch(error => {
console.error('发布错误:', error)
tab.publishStatus = {
message: '发布失败,请检查网络连接',
type: 'error'
}
reject(error)
})
.finally(() => {
tab.publishing = false // 重置发布状态
})
})
// 调用后端发布API(使用统一的http封装)
try {
const data = await http.post('/postVideo', publishData)
tab.publishStatus = {
message: '发布成功',
type: 'success'
}
// 清空当前tab的数据
tab.fileList = []
tab.displayFileList = []
tab.title = ''
tab.selectedTopics = []
tab.selectedAccounts = []
tab.scheduleEnabled = false
} catch (error) {
console.error('发布错误:', error)
tab.publishStatus = {
message: `发布失败:${error.message || '请检查网络连接'}`,
type: 'error'
}
throw error
} finally {
tab.publishing = false
}
}
// 显示上传选项
@@ -1324,6 +1287,15 @@ const batchPublish = async () => {
margin: 10px 0;
}
}
.original-section {
margin: 10px 0 20px;
.original-checkbox {
display: block;
margin: 10px 0;
}
}
}
}
}