You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

306 lines
8.0 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script setup lang="ts">
import { useRouter } from "vue-router";
import { reactive, ref } from "vue";
import cheackImg from "@/assets/svg/live/check.svg";
import starImg from "@/assets/svg/live/star.svg";
import plusImg from "@/assets/svg/live/plus.svg";
import emptyImg from "@/assets/live/empty.png";
import tipsImg from "@/assets/svg/live/tips.svg";
import { FormInstance } from "element-plus/es/components";
import { getSalespitch } from "@/api/chat";
import { Delete } from "@element-plus/icons-vue";
const ruleFormRef = ref<FormInstance>();
const salespitchList = ref([]);
import { message } from "@/utils/message";
const router = useRouter();
const formData = reactive({
productName: "",
detail: "",
script: "",
specifications: [
{
size: "",
//价格
price: ""
}
]
});
const loading = ref(false);
const rules = {
script: [{ required: true, message: "请输入", trigger: "change" }]
};
const handlePriceInput = item => {
item.price = item.price
.replace(/[^\d.]/g, "")
.replace(/^\./g, "")
.replace(/(\.\d*)\./g, "$1")
.replace(/(\d+\.\d{2}).*/g, "$1");
};
const buttonText = ref("生成AI话术");
const addNorms = () => {
formData.specifications.push({
size: "",
price: ""
});
};
const generateScript = async () => {
loading.value = true;
buttonText.value = "正在生成";
const res = await getSalespitch({
productName: formData.productName,
specifications: formData.specifications,
detail: formData.detail
});
loading.value = false;
buttonText.value = "生成AI话术";
if (res.code === 200) {
salespitchList.value = res.data;
// await window.electronAPI.clearSystemMessages();
const result = await window.electronAPI.bulkInsertSystemMessages(res.data);
if (result.success) {
message("生成成功!", { type: "success", showClose: true });
}
}
};
</script>
<template>
<div class="GoodsManage">
<div class="ai-script">
<div class="script-title">
<starImg />
<span class="name">AI直播讲品话术</span>
<cheackImg />
<span class="desc">生成/修改内容将自动保存</span>
</div>
<div v-if="salespitchList.length === 0" class="script-empty">
<img :src="emptyImg" alt="" />
<span>暂无AI讲品话术~</span>
</div>
<div v-else class="script-content">
<div class="tip">
<tipsImg />
<span>以下内容由AI自动生成</span>
</div>
<div
v-for="(item, index) in salespitchList"
:key="index"
class="speech-item"
>
{{ item }}
</div>
</div>
</div>
<div class="main-content">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-position="top"
>
<el-form-item label="商品名称" prop="productName">
<el-input size="large" v-model="formData.productName" />
</el-form-item>
<el-form-item label="商品规格" prop="specifications">
<div
class="norms-list"
v-for="(item, index) in formData.specifications"
:key="index"
>
<el-input
class="norms-item"
size="large"
v-model="item.size"
placeholder="请输入商品规格"
/>
<el-input
class="norms-item"
size="large"
v-model="item.price"
placeholder="请输入商品价格"
@input="handlePriceInput(item)"
/>
<el-icon
v-show="index === formData.specifications.length - 1"
@click="formData.specifications.splice(index, 1)"
role="img"
style="
font-size: 18px;
color: rgba(234, 42, 42, 1);
cursor: pointer;
"
><Delete
/></el-icon>
</div>
</el-form-item>
<div class="add-norms-btn" @click="addNorms">
<plusImg />
<span>添加规格</span>
</div>
<el-form-item label="商品详情" prop="detail">
<el-input
:rows="8"
type="textarea"
placeholder="请输入"
v-model="formData.detail"
/>
</el-form-item>
<!-- <el-form-item label="AI生成直播讲品话术" prop="script">
<el-input
:rows="8"
type="textarea"
placeholder="请输入根据商品信息需要AI主要主要讲解的内容如重点突出商品的特殊工艺和无污染适应各种场景"
v-model="formData.script"
/>
</el-form-item> -->
<div class="tips">
<tipsImg />
<span
>AI商品讲解话术由大模型基于上述内容自动生成还能结合直播时长和商品特点生成适配的A!数字人口播内容。</span
>
</div>
<div class="footer-btns">
<el-button class="reset" @click="ruleFormRef.resetFields()"
>重置</el-button
>
<el-button :loading="loading" type="primary" @click="generateScript">
{{ buttonText }}</el-button
>
</div>
</el-form>
</div>
</div>
</template>
<style lang="scss" scoped>
.GoodsManage {
margin-left: 16px;
flex: 1;
display: flex;
flex-direction: row-reverse;
background: #ffffff;
box-shadow: 0px 4px 8px 0px rgba(46, 128, 250, 0.1);
.ai-script {
width: 453px;
display: flex;
flex-direction: column;
border-left: 1px solid rgba(46, 128, 250, 0.1);
.script-title {
height: 54px;
border-bottom: 1px solid rgba(46, 128, 250, 0.1);
display: flex;
align-items: center;
padding-left: 16px;
.name {
font-weight: bold;
font-size: 16px;
color: #1d2129;
margin-left: 8px;
margin-right: 12px;
}
.desc {
font-weight: 500;
font-size: 14px;
color: #86909c;
margin-left: 4px;
}
}
.script-content {
padding: 16px;
overflow: auto;
height: calc(100vh - 210px);
.tip {
display: flex;
align-items: center;
margin-bottom: 8px;
span {
font-weight: 500;
font-size: 14px;
color: #4e5969;
margin-left: 8px;
}
}
.speech-item {
font-weight: 500;
font-size: 14px;
color: #1d2129;
background: #f3f4fc;
border-radius: 4px 4px 4px 4px;
padding: 8px 12px;
margin-bottom: 20px;
}
}
.script-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
font-weight: 500;
font-size: 16px;
color: #86909c;
img {
width: 222px;
height: 138px;
}
}
}
.main-content {
flex: 1;
padding: 16px;
position: relative;
.norms-list {
display: flex;
width: 100%;
align-items: center;
margin-bottom: 12px;
.norms-item {
width: calc(50% - 24px);
margin-right: 16px;
}
}
.add-norms-btn {
margin: 12px 0 16px 0;
display: flex;
width: 96px;
height: 32px;
border-radius: 4px 4px 4px 4px;
border: 1px solid #2e80fa;
cursor: pointer;
align-items: center;
font-size: 14px;
color: #2e80fa;
justify-content: center;
}
.tips {
display: flex;
height: 32px;
line-height: 32px;
background: #fff7e8;
font-weight: 400;
font-size: 14px;
color: #1d2129;
padding-left: 12px;
align-items: center;
width: 739px;
span {
margin-left: 8px;
}
}
.footer-btns {
position: absolute;
bottom: 32px;
right: 16px;
.reset {
width: 94px;
height: 32px;
border-radius: 4px 4px 4px 4px;
border: 1px solid #2e80fa;
}
}
}
}
</style>