This commit is contained in:
van
2026-03-11 21:26:01 +08:00
parent 9f18f13607
commit 60c921ea28
2 changed files with 226 additions and 0 deletions

View File

@@ -27,3 +27,12 @@ export function generateComplete(data) {
})
}
// 闲鱼文案(手动):根据标题+可选型号生成代下单、教你下单文案
export function generateXianyuWenan(data) {
return request({
url: '/jarvis/social-media/xianyu-wenan/generate',
method: 'post',
data: data
})
}

View File

@@ -0,0 +1,217 @@
<template>
<div class="xianyu-wenan-container">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span class="card-title">
<i class="el-icon-edit-outline"></i>
闲鱼文案(手动)
</span>
<el-button
style="float: right; padding: 3px 0"
type="text"
@click="showHelp = !showHelp">
{{ showHelp ? '隐藏帮助' : '显示帮助' }}
</el-button>
</div>
<el-collapse-transition>
<div v-show="showHelp" class="help-section">
<el-alert
title="使用说明"
type="info"
:closable="false"
show-icon>
<div slot="default">
<p><strong>功能说明</strong></p>
<ul>
<li>不依赖 JD 接口手动输入标题即可生成闲鱼文案用于接口限流时的应急</li>
<li>一键生成代下单教你下单两种文案</li>
<li>标题和型号会自动清洗敏感词以旧政府换新等</li>
<li>支持可选备注型号会拼在标题后参与生成</li>
</ul>
</div>
</el-alert>
</div>
</el-collapse-transition>
<div class="input-section">
<el-form :model="form" label-width="100px" class="main-form">
<el-form-item label="商品标题" required>
<el-input
v-model="form.title"
type="textarea"
:rows="2"
placeholder="请输入商品标题(必填)"
clearable />
</el-form-item>
<el-form-item label="型号/备注">
<el-input
v-model="form.remark"
placeholder="选填,如型号、规格等,会拼在标题后"
clearable />
</el-form-item>
<el-form-item>
<el-button
type="primary"
:loading="generating"
@click="handleGenerate">
生成闲鱼文案
</el-button>
</el-form-item>
</el-form>
</div>
<div v-if="result.daixiadan || result.jiaonixiadan" class="result-section">
<el-row :gutter="20">
<el-col :span="12">
<el-card shadow="hover" class="result-card">
<div slot="header" class="clearfix">
<span>代下单一键代下</span>
<el-button
type="text"
style="float: right; padding: 0"
@click="copyResult('daixiadan')">
<i class="el-icon-document-copy"></i> 复制
</el-button>
</div>
<div class="result-content">{{ result.daixiadan }}</div>
</el-card>
</el-col>
<el-col :span="12">
<el-card shadow="hover" class="result-card">
<div slot="header" class="clearfix">
<span>教你下单</span>
<el-button
type="text"
style="float: right; padding: 0"
@click="copyResult('jiaonixiadan')">
<i class="el-icon-document-copy"></i> 复制
</el-button>
</div>
<div class="result-content">{{ result.jiaonixiadan }}</div>
</el-card>
</el-col>
</el-row>
</div>
</el-card>
</div>
</template>
<script>
import { generateXianyuWenan } from '@/api/jarvis/socialMedia'
export default {
name: 'XianyuWenan',
data() {
return {
showHelp: false,
form: {
title: '',
remark: ''
},
result: {
daixiadan: '',
jiaonixiadan: ''
},
generating: false
}
},
methods: {
async handleGenerate() {
const title = (this.form.title || '').trim()
if (!title) {
this.$message.warning('请输入商品标题')
return
}
this.generating = true
try {
const res = await generateXianyuWenan({
title: title,
remark: (this.form.remark || '').trim() || undefined
})
if (res.code === 200 && res.data) {
const data = res.data
if (data.success) {
this.result.daixiadan = data.daixiadan || ''
this.result.jiaonixiadan = data.jiaonixiadan || ''
this.$message.success('生成成功')
} else {
this.$message.error(data.error || '生成失败')
}
} else {
this.$message.error(res.msg || '生成失败')
}
} catch (error) {
console.error('生成失败', error)
this.$message.error('生成失败:' + (error.message || '未知错误'))
} finally {
this.generating = false
}
},
copyResult(type) {
const text = this.result[type]
if (!text) {
this.$message.warning('暂无内容可复制')
return
}
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(() => {
this.$message.success('已复制到剪贴板')
}).catch(() => {
this.fallbackCopy(text)
})
} else {
this.fallbackCopy(text)
}
},
fallbackCopy(text) {
const ta = document.createElement('textarea')
ta.value = text
ta.style.position = 'fixed'
ta.style.left = '-9999px'
document.body.appendChild(ta)
ta.select()
try {
document.execCommand('copy')
this.$message.success('已复制到剪贴板')
} catch (e) {
this.$message.error('复制失败,请手动选择复制')
}
document.body.removeChild(ta)
}
}
}
</script>
<style lang="scss" scoped>
.xianyu-wenan-container {
padding: 10px;
}
.box-card {
max-width: 1200px;
}
.card-title {
font-size: 16px;
font-weight: 500;
}
.help-section {
margin-bottom: 16px;
}
.input-section {
margin-bottom: 20px;
}
.result-section {
margin-top: 20px;
}
.result-card {
margin-bottom: 16px;
}
.result-content {
white-space: pre-wrap;
word-break: break-all;
font-size: 13px;
line-height: 1.6;
max-height: 400px;
overflow-y: auto;
}
</style>