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.
dianshang-qianduan/src/views/assessment/five.vue

402 lines
14 KiB
Vue

4 months ago
<template>
<div class="five">
<el-scrollbar :height="`${height - 100}px`">
<div class="caseBacktitle">
<img src="@/assets/images/步骤.png" alt="" />
<span>任务目标</span>
</div>
<p>五维四率是直播电商中用于分析流量转化效率的核心模型,通过拆解用户从“曝光”到“成交”的完整链路,定位直播间运营问题。用户需要掌握该模型各个指标的计算方法,并根据计算结果进行分析诊断。</p>
<div class="caseBacktitle">
<img src="@/assets/images/步骤.png" alt="" />
<span>任务背景</span>
</div>
<div class="df">
<div class="left">
<div class="caseBacktitle">
<span>五维(用户行为维度)</span>
</div>
<p style="padding-left: 10px">
直播间曝光人数:用户刷到直播间的总人数。
<br />
直播间进入人数(场观):实际进入直播间的用户数。
<br />
商品曝光人数:看到商品弹窗或购物车的用户数。
<br />
商品点击人数:点击商品详情页的用户数。
<br />
成交人数:完成支付的用户数
<br />
</p>
<div class="caseBacktitle">
<span>四率(转化率指标)</span>
</div>
<p style="padding-left: 10px">
曝光进入率(观看点击率):场观/曝光人数,反映直播间封面、标题吸引力。
<br />
商品曝光率:商品曝光人数/场观,衡量主播引导兴趣的能力。
<br />
商品点击率:商品点击人数/商品曝光人数,体现商品主图、价格吸引力。
<br />
点击支付率(转化率):成交人数/商品点击人数,反映产品性价比与主播促单能力
<br />
</p>
</div>
<div class="right">
<p>请采用五维四率模型对以下为某女装直播间单场数据进行分析:</p>
<el-table
:data="liveRoomDataWithConversion"
border
style="width: 80%"
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="维度" align="center" prop="dimension"></el-table-column>
<el-table-column label="数值" align="center" prop="value"></el-table-column>
</el-table>
</div>
</div>
<div class="caseBacktitle">
<span>任务要求</span>
</div>
<div class="caseBacktitle">
<span>任务1:计算转化率</span>
</div>
<el-table
:data="liveRoomConversionData"
border
style="width: 60%"
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="维度" align="center" prop="dimension"></el-table-column>
<el-table-column label="数值" align="center" prop="value"></el-table-column>
<el-table-column label="计算方式" align="center" prop="value">
<template #default="scope">
<div class="df">
<el-input v-model="scope.row.numerator"></el-input>
<span class="p10">/</span>
<el-input v-model="scope.row.denominator"></el-input>
</div>
</template>
</el-table-column>
<el-table-column label="转换率" align="center" prop="value">
<template #default="scope">
<div class="df">
<span style="display: block; width: 9vw">{{ scope.row.label }}</span>
<el-input v-model="scope.row.conversionRate">
<template #suffix>%</template>
</el-input>
</div>
</template>
</el-table-column>
</el-table>
<div class="caseBacktitle">
<span>任务2:比较转换率的高低水平</span>
</div>
<el-table
:data="conversionBenchmark"
border
style="width: 40%"
:header-cell-style="{
color: '#fff',
fontSize: '14px',
backgroundColor: '#6A7DE9!important',
}"
>
<el-table-column label="转化率" align="center" prop="metric">
<template #default="scope">
<span>{{ scope.row.metric }}: {{ scope.row.currentRate }}</span>
</template>
</el-table-column>
<el-table-column label="行业参考值" align="center" prop="industryRange"></el-table-column>
<el-table-column label="高低水平" align="center" prop="value">
<template #default="scope">
<el-select v-model="scope.row.value" placeholder="">
<el-option value="高" label="高"></el-option>
<el-option value="低" label="低"></el-option>
<el-option value="中性" label="中性"></el-option>
</el-select>
</template>
</el-table-column>
</el-table>
<div class="caseBacktitle">
<span>任务3:结果分析</span>
</div>
<p style="padding-left: 10px">
1.高点击低成交
<br />
原因:价格偏高、详情页信息不足、主播逼单话术弱。
<br />
优化:增加限时折扣(如“前10单立减50元”)、优化商品好评展示。
<br />
<br />
2.高曝光低进入率
<br />
原因:直播间画面模糊、标题无吸引力、人群标签不精准。
<br />
优化:使用高清灯光设备、标题突出核心福利(如“9.9元秒杀”)。
<br />
<br />
3.商品曝光率高但点击率低
<br />
原因:商品主图不清晰、价格未展示、主播引导不足。
<br />
优化:更换直播间实拍主图、增加“点击查看今日底价”话术
<br />
</p>
</el-scrollbar>
<div class="taskfooter">
<el-button @click="submitTask">提交任务</el-button>
<el-button @click="resetTask">重新实训</el-button>
</div>
</div>
</template>
<script setup>
import useUserStore from "@/store/modules/user";
const userStore = useUserStore();
import * as analysisAPI from "@/api/market-demand-mining.js";
const { proxy } = getCurrentInstance();
const height = ref(800);
const liveRoomDataWithConversion = [
{ dimension: "直播间曝光人数", value: 5709 },
{ dimension: "直播间观看人数", value: 1359 },
{ dimension: "商品曝光人数", value: 1251 },
{ dimension: "商品点击人数", value: 275 },
{ dimension: "成交人数", value: 10 },
];
const conversionBenchmark = ref([
{
metric: "曝光进入率",
currentRate: "23.8%",
industryRange: "15%-20%",
value: "",
isOptimal: true,
},
{
metric: "商品曝光率",
currentRate: "92%",
industryRange: "80%-90%",
value: "",
isOptimal: true,
},
{
metric: "商品点击率",
currentRate: "22%",
industryRange: "25%-30%",
value: "",
},
{
metric: "点击支付率",
currentRate: "3.6%",
industryRange: "5%-10%",
value: "",
},
{
metric: "总转化率",
currentRate: "0.18%",
industryRange: "依类目而定",
value: "",
isSpecialCase: true,
},
]);
const liveRoomConversionData = ref([
{
dimension: "直播间曝光人数",
value: 5709,
numerator: null, // 观看人数作为分子
denominator: null, // 曝光人数作为分母
conversionRate:null,
formula: "1359 ÷ 5709 × 100%",
label: "曝光进入率:",
},
{
dimension: "直播间观看人数",
value: 1359,
numerator: null, // 商品曝光人数作为分子
denominator: null, // 观看人数作为分母
conversionRate: null,
formula: "1251 ÷ 1359 × 100%",
label: "商品曝光率:",
},
{
dimension: "商品曝光人数",
value: 1251,
numerator: null, // 商品点击人数作为分子
denominator: null, // 商品曝光人数作为分母
conversionRate: null,
formula: "275 ÷ 1251 × 100%",
label: "商品点击率:",
},
{
dimension: "商品点击人数",
value: 275,
numerator: null, // 成交人数作为分子
denominator: null, // 商品点击人数作为分母
conversionRate: null,
formula: "10 ÷ 275 × 100%",
label: "点击支付率:",
},
{
dimension: "成交人数",
value: 10,
numerator: null, // 成交人数作为分子
denominator: null, // 总曝光人数作为分母
conversionRate: null,
formula: "10 ÷ 5709 × 100%",
isTotal: true, // 标记为总转化率
label: "总转化率:",
},
]);
const liveConversionFields = {
// 直播间曝光人数
liveExposureNumCalc: 0, // 分子(如实际曝光人数)
liveExposureDenom: 0, // 分母(如潜在曝光总量)
liveExposureRate: 0, // 转化率(liveExposureNumCalc / liveExposureDenom)
// 直播间观看人数
liveViewersCalc: 0, // 分子(如实际观看人数)
liveViewersDenom: 0, // 分母(通常等于liveExposureNumCalc)
liveViewersRate: 0, // 转化率(liveViewersCalc / liveViewersDenom)
// 商品曝光人数
productExposureCalc: 0, // 分子(如实际商品曝光人数)
productExposureDenom: 0, // 分母(通常等于liveViewersCalc)
productExposureRate: 0, // 转化率(productExposureCalc / productExposureDenom)
// 商品点击人数
productClickCalc: 0, // 分子(如实际点击人数)
productClickDenom: 0, // 分母(通常等于productExposureCalc)
productClickRate: 0, // 转化率(productClickCalc / productClickDenom)
// 成交人数
orderCalc: 0, // 分子(如实际成交人数)
orderDenom: 0, // 分母(通常等于productClickCalc)
orderRate: 0, // 转化率(orderCalc / orderDenom)
};
// 高低水平判断
const liveConversionFields1 = {
曝光进入率: "exposureEntryLevel",
商品曝光率: "productExposureRatioLevel",
商品点击率: "productClickRatioLevel",
点击支付率: "clickPaymentRatioLevel",
总转化率: "totalConversionLevel",
};
const levelMappings = {
高: "优秀",
中: "中等",
低: "较差",
优秀: "优秀",
};
const mappings = [
["liveExposureNumCalc", "liveExposureDenom", "liveExposureRate"],
["liveViewersCalc", "liveViewersDenom", "liveViewersRate"],
["productExposureCalc", "productExposureDenom", "productExposureRate"],
["productClickCalc", "productClickDenom", "productClickRate"],
["orderCalc", "orderDenom", "orderRate"],
];
const submitConversionRate = () => {
if (liveRoomConversionData.value.some((item) => !item.conversionRate || !item.numerator || !item.denominator)) {
proxy.$modal.msgWarning("请填写完整的数据");
}
};
function getElementHeight(selector) {
const el = document.querySelector(selector);
if (el) {
// 获取元素的实际高度,包括 padding 但不包括 margin
return el.scrollHeight;
} else {
console.warn(`找不到元素:${selector}`);
return 0;
}
}
const submitTask = () => {
let params = {};
liveRoomConversionData.value.forEach((item, index) => {
if (index < mappings.length) {
const [numKey, denomKey, rateKey] = mappings[index];
liveConversionFields[numKey] = item.numerator;
liveConversionFields[denomKey] = item.denominator;
liveConversionFields[rateKey] = parseFloat(item.conversionRate); // 转换成数字百分比
}
});
const result = {};
conversionBenchmark.value.forEach((item) => {
const fieldKey = liveConversionFields1[item.metric]; // 中文转英文
if (fieldKey) {
result[fieldKey] = item.value;
}
});
params = {
...liveConversionFields,
...result,
userId: userStore.userInfo.userId,
};
analysisAPI.productProblemDiagnosisSubmit(params).then((res) => {
proxy.$modal.msgSuccess("提交成功");
});
};
const resetTask = () => {
analysisAPI.productProblemDiagnosisReTrain({ userId: userStore.userInfo.userId }).then((res) => {
proxy.$modal.msgSuccess("重新实训成功");
liveRoomConversionData.value.forEach((item) => {
item.numerator = '';
item.denominator ='';
item.conversionRate ='';
});
conversionBenchmark.value.forEach((item) => {
item.value = '';
})
});
};
// 回显方法
const echoConversionRate = () => {
analysisAPI.productProblemDiagnosisEcho({ userId: userStore.userInfo.userId }).then((res) => {
if(!res.data) return;
mappings.forEach(([numKey, denomKey, rateKey, label], index) => {
const numerator = res.data[numKey];
const denominator = res.data[denomKey];
const rate = res.data[rateKey];
const item = liveRoomConversionData.value[index];
if (item) {
item.value = numerator;
item.numerator = numerator;
item.denominator = denominator;
item.conversionRate = rate.toFixed(2) + "%";
}
});
conversionBenchmark.value.forEach((item) => {
const fieldKey = liveConversionFields1[item.metric];
console.log(res.data[fieldKey]);
if (fieldKey) {
item.value = res.data[fieldKey];
}
});
});
};
onMounted(() => {
// 监听窗口大小变化
window.addEventListener("resize", () => {
height.value = getElementHeight(".five");
console.log(height.value);
});
echoConversionRate();
});
</script>
<style lang='scss' scoped>
.five {
height: calc(100vh - 230px);
background: #ffffff;
padding: 20px;
border-radius: 8px;
padding-bottom: 0;
.df {
display: flex;
gap: 30px;
.right {
width: 50%;
}
}
}
</style>