fix/non-blocking-route-navigation
HeHaonan 2 years ago
parent 87728bc6af
commit 3f2046aeaf

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

@ -522,7 +522,7 @@ onMounted(() => {
}); });
const initCharts = () => { const initCharts = () => {
var chartDom = document.getElementById("echarts"); var chartDom = document.getElementById("echarts");
var myChart = echarts.init(chartDom, "dark"); var myChart = echarts.init(chartDom);
var option; var option;
option = { option = {

@ -579,6 +579,7 @@ const option2 = ref({});
const drawPointNameStep4 = ref(""); const drawPointNameStep4 = ref("");
const drawPointColorStep4 = ref(""); const drawPointColorStep4 = ref("");
const pointInGridStep4 = ref([]); const pointInGridStep4 = ref([]);
const markCenterLineStep4 = ref([]);
//第五步定义数据 //第五步定义数据
const optionStep5 = ref({}); const optionStep5 = ref({});
const drawPointNameStep5 = ref(""); const drawPointNameStep5 = ref("");
@ -724,6 +725,9 @@ const step3EchartInit = () => {
color: drawPointColor.value, color: drawPointColor.value,
}); });
option.value && myChart.setOption(option.value); option.value && myChart.setOption(option.value);
var chartDom2 = document.getElementById("charts2");
var myChart2 = echarts.init(chartDom2);
option2.value && myChart2.setOption(option2.value);
// console.log(); // console.log();
// 所点击点的X轴坐标点所在X轴data的下标 // 所点击点的X轴坐标点所在X轴data的下标
// let xIndex = pointInGrid[0]; // let xIndex = pointInGrid[0];
@ -743,7 +747,24 @@ const step4EchartInit = () => {
var chartDom = document.getElementById("charts2"); var chartDom = document.getElementById("charts2");
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
// var option; // var option;
// 中心线
const centerLine = [
{
name: "y",
xAxis: 5,
},
{
name: "x",
yAxis: 1000,
},
];
// 中心点
const centerMark = [
{
value: "中心点",
coord: [5, 1000],
},
];
option2.value = { option2.value = {
xAxis: { xAxis: {
name: "X", name: "X",
@ -801,14 +822,47 @@ const step4EchartInit = () => {
// // [6, 600], // // [6, 600],
// // [7, 1400], // // [7, 1400],
// ], // ],
data: chart2OptionData.value, data: chart1OptionData.value,
type: "scatter", type: "scatter",
markLine: {
silent: true, // 是否不响应鼠标事件
precision: 2, // 精度
lineStyle: {
type: "solid",
color: "#00aca6",
},
label: {
color: "#00aca6",
position: "end",
formatter: "{b}",
},
data: markCenterLineStep4.value,
},
// 中心点
markPoint: {
symbol: "roundRect",
symbolSize: 15,
itemStyle: {
color: "rgba(234, 85, 6, .8)",
},
label: {
position: "top",
},
// data: pointInGridStep4.value,
data: [
{
value: "中心点",
coord: pointInGridStep4.value,
},
],
},
}, },
], ],
}; };
option2.value && myChart.setOption(option2.value); option2.value && myChart.setOption(option2.value);
myChart.getZr().on("click", function (param) { myChart.getZr().on("click", function (param) {
// markCenterLineStep4.value = [];
if (drawPointNameStep4.value == "") { if (drawPointNameStep4.value == "") {
proxy.$modal.msgError("请选择要绘制的点"); proxy.$modal.msgError("请选择要绘制的点");
return; return;
@ -819,6 +873,7 @@ const step4EchartInit = () => {
chart2OptionData.value.splice(i, 1); chart2OptionData.value.splice(i, 1);
} }
} }
markCenterLineStep4.value.splice(0, 2);
const pointInPixel = [param.offsetX, param.offsetY]; const pointInPixel = [param.offsetX, param.offsetY];
console.log("pointInPixel4", pointInPixel); console.log("pointInPixel4", pointInPixel);
//将偏移值转化为坐标值 //将偏移值转化为坐标值
@ -834,6 +889,18 @@ const step4EchartInit = () => {
name: drawPointNameStep4.value, name: drawPointNameStep4.value,
color: drawPointColorStep4.value, color: drawPointColorStep4.value,
}); });
markCenterLineStep4.value.push(
{
name: "y",
xAxis: pointInGridStep4.value[0],
},
{
name: "x",
yAxis: pointInGridStep4.value[1],
}
);
console.log(markCenterLineStep4.value);
// console.log(markCenterLineStep4.value);
option2.value && myChart.setOption(option2.value); option2.value && myChart.setOption(option2.value);
}); });
}; };

@ -17,7 +17,8 @@
<span>案例背景:</span> <span>案例背景:</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
漏斗分析模型已经广泛应用于流量监控、产品目标转化等日常数据运营与数据分析的工作中。比如一个电商APP,用户登录APP后,会看到广告页。点击广告页后会看到产品详情,如果用户想购买,就点击进去购物车页面,再进入支付页面,完成支付。每一步,用户都有流失的可能,因此两个步骤之间有一定的转化率。<br /> 漏斗分析模型已经广泛应用于流量监控、产品目标转化等日常数据运营与数据分析的工作中。比如一个电商APP,用户登录APP后,会看到广告页。点击广告页后会看到产品详情,如果用户想购买,就点击进去购物车页面,再进入支付页面,完成支付。每一步,用户都有流失的可能,因此两个步骤之间有一定的转化率。
<br />
现有以下某购物APP各个流程节点的用户数据,需要用漏斗模型进行分析: 现有以下某购物APP各个流程节点的用户数据,需要用漏斗模型进行分析:
</span> </span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
@ -31,18 +32,12 @@
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="" align="center" prop="data1"> <el-table-column label="" align="center" prop="data1"></el-table-column>
</el-table-column> <el-table-column label="浏览" align="center" prop="data2"></el-table-column>
<el-table-column label="浏览" align="center" prop="data2"> <el-table-column label="购物车" align="center" prop="data3"></el-table-column>
</el-table-column> <el-table-column label="订单" align="center" prop="data4"></el-table-column>
<el-table-column label="购物车" align="center" prop="data3"> <el-table-column label="支付" align="center" prop="data5"></el-table-column>
</el-table-column> <el-table-column label="完成交易" align="center" prop="data6"></el-table-column>
<el-table-column label="订单" align="center" prop="data4">
</el-table-column>
<el-table-column label="支付" align="center" prop="data5">
</el-table-column>
<el-table-column label="完成交易" align="center" prop="data6">
</el-table-column>
</el-table> </el-table>
<div class="download" @click="downloadData">下载数据</div> <div class="download" @click="downloadData">下载数据</div>
</div> </div>
@ -54,10 +49,14 @@
<span>第一步,转化率计算</span> <span>第一步,转化率计算</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
转化率=下一步人数/上一步人数*100% <br /> 转化率=下一步人数/上一步人数*100%
流失率=1—转化率 <br /> <br />
总体转化率/最终转化率=该步人数/总访问量(浏览量)*100% <br /> 流失率=1—转化率
计算结果保留小数点后一位 <br /> <br />
总体转化率/最终转化率=该步人数/总访问量(浏览量)*100%
<br />
计算结果保留小数点后一位
<br />
</span> </span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
<el-table <el-table
@ -70,66 +69,35 @@
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="" align="center" prop="data1"> <el-table-column label="" align="center" prop="data1"></el-table-column>
</el-table-column>
<el-table-column label="浏览" align="center" prop="data2"> <el-table-column label="浏览" align="center" prop="data2">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-if="scope.$index != 0" v-model="scope.row.params1" placeholder="请输入" style="width: 100px"></el-input>
v-if="scope.$index != 0" <span v-if="scope.$index != 0">%</span>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 100px"
>
</el-input
><span v-if="scope.$index != 0"> %</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="购物车" align="center" prop="data3"> <el-table-column label="购物车" align="center" prop="data3">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-if="scope.$index != 0" v-model="scope.row.params2" placeholder="请输入" style="width: 100px"></el-input>
v-if="scope.$index != 0" <span v-if="scope.$index != 0">%</span>
v-model="scope.row.params2"
placeholder="请输入"
style="width: 100px"
>
</el-input
><span v-if="scope.$index != 0"> %</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单" align="center" prop="data4"> <el-table-column label="订单" align="center" prop="data4">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-if="scope.$index != 0" v-model="scope.row.params3" placeholder="请输入" style="width: 100px"></el-input>
v-if="scope.$index != 0" <span v-if="scope.$index != 0">%</span>
v-model="scope.row.params3"
placeholder="请输入"
style="width: 100px"
>
</el-input
><span v-if="scope.$index != 0"> %</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="支付" align="center" prop="data5"> <el-table-column label="支付" align="center" prop="data5">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-if="scope.$index != 0" v-model="scope.row.params4" placeholder="请输入" style="width: 100px"></el-input>
v-if="scope.$index != 0" <span v-if="scope.$index != 0">%</span>
v-model="scope.row.params4"
placeholder="请输入"
style="width: 100px"
>
</el-input
><span v-if="scope.$index != 0"> %</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="完成交易" align="center" prop="data6"> <el-table-column label="完成交易" align="center" prop="data6">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-if="scope.$index != 0" v-model="scope.row.params5" placeholder="请输入" style="width: 100px"></el-input>
v-if="scope.$index != 0" <span v-if="scope.$index != 0">%</span>
v-model="scope.row.params5"
placeholder="请输入"
style="width: 100px"
>
</el-input
><span v-if="scope.$index != 0"> %</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -142,18 +110,12 @@
<img src="@/assets/images/步骤.png" alt="" /> <img src="@/assets/images/步骤.png" alt="" />
<span>第二步,绘制漏斗图</span> <span>第二步,绘制漏斗图</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">以各个页面节点的人数为统计指标,绘制漏斗图:</span>
以各个页面节点的人数为统计指标,绘制漏斗图:
</span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
<div id="funnel" style="width: 520px; height: 400px"></div> <div id="funnel" style="width: 520px; height: 400px"></div>
<div style="margin-top: 75px"> <div style="margin-top: 75px">
<div> <div>
<el-select <el-select v-model="step2Select1" placeholder="请选择" style="width: 130px; margin-bottom: 28px" @change="selectData($event, 4)">
v-model="step2Select1"
placeholder="请选择"
style="width: 130px; margin-bottom: 28px"
>
<el-option :label="'浏览2071'" :value="'浏览2071'" /> <el-option :label="'浏览2071'" :value="'浏览2071'" />
<el-option :label="'购物车622'" :value="'购物车622'" /> <el-option :label="'购物车622'" :value="'购物车622'" />
<el-option :label="'订单284'" :value="'订单284'" /> <el-option :label="'订单284'" :value="'订单284'" />
@ -162,11 +124,7 @@
</el-select> </el-select>
</div> </div>
<div> <div>
<el-select <el-select v-model="step2Select2" placeholder="请选择" style="width: 130px; margin-bottom: 32px" @change="selectData($event, 3)">
v-model="step2Select2"
placeholder="请选择"
style="width: 130px; margin-bottom: 32px"
>
<el-option :label="'浏览2071'" :value="'浏览2071'" /> <el-option :label="'浏览2071'" :value="'浏览2071'" />
<el-option :label="'购物车622'" :value="'购物车622'" /> <el-option :label="'购物车622'" :value="'购物车622'" />
<el-option :label="'订单284'" :value="'订单284'" /> <el-option :label="'订单284'" :value="'订单284'" />
@ -175,11 +133,7 @@
</el-select> </el-select>
</div> </div>
<div> <div>
<el-select <el-select v-model="step2Select3" placeholder="请选择" style="width: 130px; margin-bottom: 30px" @change="selectData($event, 2)">
v-model="step2Select3"
placeholder="请选择"
style="width: 130px; margin-bottom: 30px"
>
<el-option :label="'浏览2071'" :value="'浏览2071'" /> <el-option :label="'浏览2071'" :value="'浏览2071'" />
<el-option :label="'购物车622'" :value="'购物车622'" /> <el-option :label="'购物车622'" :value="'购物车622'" />
<el-option :label="'订单284'" :value="'订单284'" /> <el-option :label="'订单284'" :value="'订单284'" />
@ -188,11 +142,7 @@
</el-select> </el-select>
</div> </div>
<div> <div>
<el-select <el-select v-model="step2Select4" placeholder="请选择" style="width: 130px; margin-bottom: 30px" @change="selectData($event, 1)">
v-model="step2Select4"
placeholder="请选择"
style="width: 130px; margin-bottom: 30px"
>
<el-option :label="'浏览2071'" :value="'浏览2071'" /> <el-option :label="'浏览2071'" :value="'浏览2071'" />
<el-option :label="'购物车622'" :value="'购物车622'" /> <el-option :label="'购物车622'" :value="'购物车622'" />
<el-option :label="'订单284'" :value="'订单284'" /> <el-option :label="'订单284'" :value="'订单284'" />
@ -201,11 +151,7 @@
</el-select> </el-select>
</div> </div>
<div> <div>
<el-select <el-select v-model="step2Select5" placeholder="请选择" style="width: 130px; margin-bottom: 30px" @change="selectData($event, 0)">
v-model="step2Select5"
placeholder="请选择"
style="width: 130px; margin-bottom: 30px"
>
<el-option :label="'浏览2071'" :value="'浏览2071'" /> <el-option :label="'浏览2071'" :value="'浏览2071'" />
<el-option :label="'购物车622'" :value="'购物车622'" /> <el-option :label="'购物车622'" :value="'购物车622'" />
<el-option :label="'订单284'" :value="'订单284'" /> <el-option :label="'订单284'" :value="'订单284'" />
@ -214,13 +160,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div <div class="submit" style="margin-top: 70px; margin-left: 100px" @click="step2Submit">提交</div>
class="submit"
style="margin-top: 70px; margin-left: 100px"
@click="step2Submit"
>
提交
</div>
</div> </div>
</div> </div>
<div class="line"></div> <div class="line"></div>
@ -229,18 +169,12 @@
<img src="@/assets/images/步骤.png" alt="" /> <img src="@/assets/images/步骤.png" alt="" />
<span>第三步,结果分析</span> <span>第三步,结果分析</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">基于转化率结果计算和图标分析,得出结论:</span>
基于转化率结果计算和图标分析,得出结论:
</span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
<div> <div>
<div> <div>
<span>流失率排第一位的:</span> <span>流失率排第一位的:</span>
<el-select <el-select v-model="step3Select1" placeholder="请选择" style="width: 160px">
v-model="step3Select1"
placeholder="请选择"
style="width: 160px"
>
<el-option :label="'浏览--购物车'" :value="'浏览--购物车'" /> <el-option :label="'浏览--购物车'" :value="'浏览--购物车'" />
<el-option :label="'购物车--订单'" :value="'购物车--订单'" /> <el-option :label="'购物车--订单'" :value="'购物车--订单'" />
<el-option :label="'订单--支付'" :value="'订单--支付'" /> <el-option :label="'订单--支付'" :value="'订单--支付'" />
@ -250,21 +184,14 @@
<br /> <br />
<div> <div>
<span>流失率排第二位的:</span> <span>流失率排第二位的:</span>
<el-select <el-select v-model="step3Select2" placeholder="请选择" style="width: 160px">
v-model="step3Select2"
placeholder="请选择"
style="width: 160px"
>
<el-option :label="'浏览--购物车'" :value="'浏览--购物车'" /> <el-option :label="'浏览--购物车'" :value="'浏览--购物车'" />
<el-option :label="'购物车--订单'" :value="'购物车--订单'" /> <el-option :label="'购物车--订单'" :value="'购物车--订单'" />
<el-option :label="'订单--支付'" :value="'订单--支付'" /> <el-option :label="'订单--支付'" :value="'订单--支付'" />
<el-option :label="'支付--完成交易'" :value="'付--完成交易'" /> <el-option :label="'支付--完成交易'" :value="'付--完成交易'" />
</el-select> </el-select>
</div> </div>
<p> <p>注:实际运用时 ,转化率需要与不同时期比较、与竞争对手、行业平均水平比较,分析的结果相对准确些。</p>
注:实际运用时
,转化率需要与不同时期比较、与竞争对手、行业平均水平比较,分析的结果相对准确些。
</p>
</div> </div>
<div class="submit" @click="step3Submit">提交</div> <div class="submit" @click="step3Submit">提交</div>
@ -276,30 +203,34 @@
<img src="@/assets/images/步骤.png" alt="" /> <img src="@/assets/images/步骤.png" alt="" />
<span>第四步,营销运营改进</span> <span>第四步,营销运营改进</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px">针对转换率较低的环节步骤,制定改善措施:</span>
<br />
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
针对转换率较低的环节步骤,制定改善措施: </span 一、简化购物流程
><br /> <br />
<span style="line-height: 25px; font-size: 14px"> 购物车转化率受到购物流程的影响。如果购物流程复杂或繁琐,消费者可能会因为不方便而放弃购买。因此,简化购物流程是提高购物车转化率的关键。
一、简化购物流程<br /> <br />
购物车转化率受到购物流程的影响。如果购物流程复杂或繁琐,消费者可能会因为不方便而放弃购买。因此,简化购物流程是提高购物车转化率的关键。<br /> 1. 减少步骤:尽量减少购买过程中的步骤和页面数量。消费者希望能够快速完成购买,如果购买过程过于复杂,他们可能会选择放弃。
1. <br />
减少步骤:尽量减少购买过程中的步骤和页面数量。消费者希望能够快速完成购买,如果购买过程过于复杂,他们可能会选择放弃。<br /> 2. 简化表单:简化购买表单,只收集必要的信息。过多的信息收集可能会让消费者感到烦扰,从而影响购买意愿。
2. </span>
简化表单:简化购买表单,只收集必要的信息。过多的信息收集可能会让消费者感到烦扰,从而影响购买意愿。 </span <br />
><br />
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
二、优化产品页面<br /> 二、优化产品页面
产品页面是消费者了解和选择产品的关键环节。优化产品页面可以提高购物车转化率。<br /> <br />
1. 产品页面是消费者了解和选择产品的关键环节。优化产品页面可以提高购物车转化率。
清晰的产品信息:确保产品页面上提供清晰、详细的产品信息,包括产品描述、规格、图片等。消费者需要充分了解产品才能做出购买决策。<br /> <br />
2. 1. 清晰的产品信息:确保产品页面上提供清晰、详细的产品信息,包括产品描述、规格、图片等。消费者需要充分了解产品才能做出购买决策。
强调产品优势和价值:突出产品的独特卖点和优势,让消费者明白购买该产品的价值和好处。<br /> <br />
3. 2. 强调产品优势和价值:突出产品的独特卖点和优势,让消费者明白购买该产品的价值和好处。
用户评价和评级:展示其他消费者的评价和评级可以增加消费者对产品的信任度和购买意愿。<br /> <br />
4. 3. 用户评价和评级:展示其他消费者的评价和评级可以增加消费者对产品的信任度和购买意愿。
清晰的购买按钮:在产品页面上放置清晰、醒目的购买按钮,方便消费者快速添加产品到购物车。<br /> <br />
比如下决心改进广告页,更换了素材,更换了页面布局,最后有了ABC版本,这时候可以观察每个版本效果。如下图,持续改进广告页以后,能看到广告页点击有了提升,最终转化率也提升了。 </span 4. 清晰的购买按钮:在产品页面上放置清晰、醒目的购买按钮,方便消费者快速添加产品到购物车。
><br /> <br />
比如下决心改进广告页,更换了素材,更换了页面布局,最后有了ABC版本,这时候可以观察每个版本效果。如下图,持续改进广告页以后,能看到广告页点击有了提升,最终转化率也提升了。
</span>
<br />
<img src="@/assets/images/u3812.png" alt="" /> <img src="@/assets/images/u3812.png" alt="" />
</div> </div>
@ -325,6 +256,7 @@ import * as echarts from "echarts";
import { downBlobFile } from "@/utils/index.js"; import { downBlobFile } from "@/utils/index.js";
import { onMounted } from "vue"; import { onMounted } from "vue";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const funnelData = ref([223, 235, 284, 622, 2071]);
const dialogVisible = ref(false); const dialogVisible = ref(false);
const step2Select1 = ref(""); const step2Select1 = ref("");
const step2Select2 = ref(""); const step2Select2 = ref("");
@ -596,10 +528,10 @@ const typeData = ref([
// }, // },
// ], // ],
// }; // };
const option = { const option = ref({
title: { title: {
text: '漏斗图', text: "漏斗图",
textStyle: { textStyle: {
color: "#fff", color: "#fff",
}, },
}, },
@ -610,80 +542,67 @@ const option = {
// } // }
}, },
legend: { legend: {
data:[], data: [],
textStyle: { textStyle: {
color: "#fff", color: "#fff",
}, },
}, },
grid: { grid: {
left: '3%', left: "3%",
right: '4%', right: "4%",
bottom: '3%', bottom: "3%",
containLabel: true containLabel: true,
}, },
xAxis: { xAxis: {
show:false show: false,
// type: 'value', // type: 'value',
// boundaryGap: [0, 0.01] // boundaryGap: [0, 0.01]
}, },
yAxis: { yAxis: {
type: 'category', type: "category",
data: ['', '', '', '', ''], data: ["", "", "", "", ""],
position: 'center' position: "center",
}, },
series: [ series: [
{ {
name: '', name: "",
stack: 'one', stack: "one",
type: 'bar', type: "bar",
barWidth: '60%', barWidth: "60%",
data: [1120, 1113, 1090, 920, 220], data: [1120, 1113, 1090, 920, 220],
itemStyle: { itemStyle: {
normal: { normal: {
//这里是重点 //这里是重点
color: function (params) { color: function (params) {
// 颜色设置透明 // 颜色设置透明
var colorList = [ var colorList = ["rgba(0,0,0,0)", "rgba(0,0,0,0)", "rgba(0,0,0,0)", "rgba(0,0,0,0)", "rgba(0,0,0,0)", "rgba(0,0,0,0)"];
'rgba(0,0,0,0)',
'rgba(0,0,0,0)',
'rgba(0,0,0,0)',
'rgba(0,0,0,0)',
'rgba(0,0,0,0)',
'rgba(0,0,0,0)'
];
return colorList[params.dataIndex]; return colorList[params.dataIndex];
} },
} },
} },
}, },
{ {
stack: 'one', stack: "one",
name: '', name: "",
type: 'bar', type: "bar",
barWidth: '60%', barWidth: "60%",
data: funnelData.value,
data: [223, 235, 284, 622, 2071], // data: [223, 235, 284, 622, 2071],
itemStyle: { itemStyle: {
normal: { normal: {
//这里是重点 //这里是重点
color: function (params) { color: function (params) {
// 颜色设置透明 // 颜色设置透明
var colorList = [ var colorList = ["#009FF1", "#003DA3", "#00B869", "#FE8D2A", "#FB54A1"];
'#009FF1',
'#003DA3',
'#00B869',
'#FE8D2A',
'#FB54A1',
];
return colorList[params.dataIndex]; return colorList[params.dataIndex];
} },
}, },
borderColor: "#fff", borderColor: "#fff",
borderWidth: 1, borderWidth: 1,
} },
} },
] ],
} });
const step1Error = ref(0); const step1Error = ref(0);
const step2Error = ref(0); const step2Error = ref(0);
const step3Error = ref(0); const step3Error = ref(0);
@ -698,9 +617,30 @@ onBeforeUnmount(() => {
onMounted(() => { onMounted(() => {
getData(); getData();
var chartDom = document.getElementById("funnel"); var chartDom = document.getElementById("funnel");
var myChart = echarts.init(chartDom,); var myChart = echarts.init(chartDom);
option && myChart.setOption(option); option.value && myChart.setOption(option.value);
}); });
const selectData = (item, index) => {
console.log(item, index);
if (item == "浏览2071") {
funnelData.value[index] = 2071;
}
if (item == "购物车622") {
funnelData.value[index] = 622;
}
if (item == "订单284") {
funnelData.value[index] = 284;
}
if (item == "支付235") {
funnelData.value[index] = 235;
}
if (item == "完成交易223") {
funnelData.value[index] = 223;
}
var chartDom = document.getElementById("funnel");
var myChart = echarts.init(chartDom);
option.value && myChart.setOption(option.value);
};
const moveUp = (index, row) => { const moveUp = (index, row) => {
console.log("上移", index, row); console.log("上移", index, row);
if (index > 0) { if (index > 0) {
@ -726,13 +666,7 @@ const step1Submit = () => {
step1Error.value = 0; step1Error.value = 0;
const step1DataSlice = step1Data.value.slice(1); const step1DataSlice = step1Data.value.slice(1);
for (let i in step1DataSlice) { for (let i in step1DataSlice) {
if ( if (!step1DataSlice[i].params1 || !step1DataSlice[i].params2 || !step1DataSlice[i].params3 || !step1DataSlice[i].params4 || !step1DataSlice[i].params5) {
!step1DataSlice[i].params1 ||
!step1DataSlice[i].params2 ||
!step1DataSlice[i].params3 ||
!step1DataSlice[i].params4 ||
!step1DataSlice[i].params5
) {
proxy.$modal.msgError("请先完成所有填空"); proxy.$modal.msgError("请先完成所有填空");
return; return;
} }
@ -741,11 +675,7 @@ const step1Submit = () => {
if (step1DataSlice[0].params1 && step1DataSlice[0].params1 !== "100") { if (step1DataSlice[0].params1 && step1DataSlice[0].params1 !== "100") {
step1Error.value++; step1Error.value++;
} }
if ( if (step1DataSlice[0].params2 && step1DataSlice[0].params2 !== "30.0" && step1DataSlice[0].params2 !== "30") {
step1DataSlice[0].params2 &&
step1DataSlice[0].params2 !== "30.0" &&
step1DataSlice[0].params2 !== "30"
) {
step1Error.value++; step1Error.value++;
} }
if (step1DataSlice[0].params3 && step1DataSlice[0].params3 !== "45.7") { if (step1DataSlice[0].params3 && step1DataSlice[0].params3 !== "45.7") {
@ -775,11 +705,7 @@ const step1Submit = () => {
if (step1DataSlice[2].params1 && step1DataSlice[2].params1 !== "100") { if (step1DataSlice[2].params1 && step1DataSlice[2].params1 !== "100") {
step1Error.value++; step1Error.value++;
} }
if ( if (step1DataSlice[2].params2 && step1DataSlice[2].params2 !== "30.0" && step1DataSlice[2].params2 !== "30") {
step1DataSlice[2].params2 &&
step1DataSlice[2].params2 !== "30.0" &&
step1DataSlice[2].params2 !== "30"
) {
step1Error.value++; step1Error.value++;
} }
if (step1DataSlice[2].params3 && step1DataSlice[2].params3 !== "13.7") { if (step1DataSlice[2].params3 && step1DataSlice[2].params3 !== "13.7") {
@ -798,13 +724,7 @@ const step1Submit = () => {
}; };
const step2Submit = () => { const step2Submit = () => {
step2Error.value = 0; step2Error.value = 0;
if ( if (step2Select1.value == "" || step2Select2.value == "" || step2Select3.value == "" || step2Select4.value == "" || step2Select5.value == "") {
step2Select1.value == "" ||
step2Select2.value == "" ||
step2Select3.value == "" ||
step2Select4.value == "" ||
step2Select5.value == ""
) {
proxy.$modal.msgError("请先完成选择"); proxy.$modal.msgError("请先完成选择");
return; return;
} }
@ -852,7 +772,7 @@ const downloadData = () => {
// downBlobFile(`案例数据-漏斗模型`, blob); // downBlobFile(`案例数据-漏斗模型`, blob);
// }) // })
// .catch((error) => {}); // .catch((error) => {});
window.open(baseUrl + "/api/downDataByUserPortrait/analysisByFunnelModel"); window.open(baseUrl + "/api/downDataByUserPortrait/analysisByFunnelModel");
}; };
const saveData = () => { const saveData = () => {
const params = { const params = {
@ -957,11 +877,7 @@ const getData = () => {
.catch((error) => {}); .catch((error) => {});
}; };
const submitData = () => { const submitData = () => {
if ( if (!step1AnswerFlag.value || !step2AnswerFlag.value || !step3AnswerFlag.value) {
!step1AnswerFlag.value ||
!step2AnswerFlag.value ||
!step3AnswerFlag.value
) {
proxy.$modal.msgError("请先完成所有步骤!"); proxy.$modal.msgError("请先完成所有步骤!");
return; return;
} }
@ -1038,7 +954,7 @@ defineExpose({
} }
} }
.caseBack { .caseBack {
color:#000; color: #000;
.title { .title {
font-weight: bold; font-weight: bold;
margin-top: 10px; margin-top: 10px;

File diff suppressed because one or more lines are too long

@ -238,7 +238,7 @@
<div class="analysis"> <div class="analysis">
<div class="conclusion">分析结论:</div> <div class="conclusion">分析结论:</div>
<span> <span>
1、7日留存率,只有27%,流失率达到了73%,相对比较低,需要提供用户粘性; 1、7日留存率,只有27%,流失率达到了73%,相对比较低,需要提高用户粘性;
<br /> <br />
2、平缓之后,能够留存下来的客户,是公司的忠诚用户; 2、平缓之后,能够留存下来的客户,是公司的忠诚用户;
<br /> <br />
@ -910,10 +910,10 @@ const step3Data = ref([
const step4Data = ref([ const step4Data = ref([
{ {
name: "平均数", name: "平均数",
data1: "666", data1: "85%",
data2: "A", data2: "73%",
data3: "189", data3: "27%",
data4: "衬衫", data4: "4%",
}, },
]); ]);
const step5Data = ref([ const step5Data = ref([

@ -2,7 +2,7 @@
<div class="content"> <div class="content">
<div class="import" @click="dialogVisible = true"> <div class="import" @click="dialogVisible = true">
<img src="@/assets/images/导入.png" alt="" /> <img src="@/assets/images/导入.png" alt="" />
<span style="color:#fff">任务知识导入</span> <span style="color: #fff">任务知识导入</span>
</div> </div>
<!-- <div v-html="knowledge" v-if="knowledgeFlag"></div> --> <!-- <div v-html="knowledge" v-if="knowledgeFlag"></div> -->
<div> <div>
@ -55,10 +55,16 @@
<el-table-column label="消费金额" align="center" prop="amount"></el-table-column> <el-table-column label="消费金额" align="center" prop="amount"></el-table-column>
<el-table-column label="操作" align="center" prop="opr"> <el-table-column label="操作" align="center" prop="opr">
<template #default="scope"> <template #default="scope">
<el-select v-model="scope.row.params" placeholder="请选择" style="width: 100px"> <div style="display: flex; align-items: center">
<el-option :label="'剔除'" :value="'剔除'" /> <el-select v-model="scope.row.params" placeholder="请选择" style="width: 100px">
<el-option :label="'纳入'" :value="'纳入'" /> <el-option :label="'剔除'" :value="'剔除'" />
</el-select> <el-option :label="'纳入'" :value="'纳入'" />
</el-select>
<div v-if="step1AnswerFlag" style="margin-left:3px">
<span v-if="scope.row.isError" style=" color: red;">X</span>
<span v-if="!scope.row.isError" style="color: #00bb00;">√</span>
</div>
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -701,14 +707,21 @@ const step1Submit = () => {
if (i == 0) { if (i == 0) {
if (fileTable1.value[0].params && fileTable1.value[0].params == "纳入") { if (fileTable1.value[0].params && fileTable1.value[0].params == "纳入") {
stepError1.value++; stepError1.value++;
fileTable1.value[0].isError = true;
}else{
fileTable1.value[0].isError = false;
} }
// console.log(fileTable1.value[0].params); // console.log(fileTable1.value[0].params);
} else { } else {
if (fileTable1.value[i].params && fileTable1.value[i].params == "剔除") { if (fileTable1.value[i].params && fileTable1.value[i].params == "剔除") {
stepError1.value++; stepError1.value++;
fileTable1.value[i].isError = true;
}else{
fileTable1.value[i].isError = false;
} }
} }
} }
console.log(fileTable1.value, "000");
proxy.$modal.msgSuccess("提交成功"); proxy.$modal.msgSuccess("提交成功");
console.log(stepError1.value, "错误次数"); console.log(stepError1.value, "错误次数");
step1AnswerFlag.value = true; step1AnswerFlag.value = true;
@ -929,6 +942,7 @@ const submitData = () => {
userId: JSON.parse(getUserInfo()).userId, userId: JSON.parse(getUserInfo()).userId,
taskName: "RFM分析", taskName: "RFM分析",
numberOfErrors: errorNum.value, numberOfErrors: errorNum.value,
subState:1,
}) })
.then((res) => { .then((res) => {
proxy.$modal.msgSuccess("提交成功"); proxy.$modal.msgSuccess("提交成功");
@ -1156,7 +1170,7 @@ const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
width: 945px; width: 945px;
height: 26px; height: 26px;
// background: #003b75; // background: #003b75;
background: #FFF8EE; background: #fff8ee;
border-radius: 10px; border-radius: 10px;
// border: 1px solid #0052a3; // border: 1px solid #0052a3;
font-size: 12px; font-size: 12px;
@ -1182,7 +1196,7 @@ const tableSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
/* 将悬停背景色改为红色 */ /* 将悬停背景色改为红色 */
::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td { ::v-deep .el-table--enable-row-hover .el-table__body tr:hover > td {
background-color: #F5F7FA !important; background-color: #f5f7fa !important;
} }
::v-deep .el-dialog { ::v-deep .el-dialog {

@ -22,16 +22,24 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
<span>案例背景:</span> <span>案例背景:</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
用户粘性分析是一种衡量用户对产品或服务的忠诚度和黏性程度的分析方法。它帮助企业了解用户的行为习惯、使用频率和留存率,以评估用户对产品或服务的依赖程度和忠诚度。用户粘性分析模型通常包括以下指标:活跃用户数、留存率、使用频率、用户转化率、用户流失率。<br /> 用户粘性分析是一种衡量用户对产品或服务的忠诚度和黏性程度的分析方法。它帮助企业了解用户的行为习惯、使用频率和留存率,以评估用户对产品或服务的依赖程度和忠诚度。用户粘性分析模型通常包括以下指标:活跃用户数、留存率、使用频率、用户转化率、用户流失率。
留存率、用户转化率、用户流失率,前面模型已经单独分析过,本实验项目重点分析用户活跃情况。<br /> <br />
常见的用户活跃度统计一段时间内活跃用户的分布情况,如使用了几次、使用了几天、使用了多长时间等。比如一周内用户使用产品的天数分布,使用了 留存率、用户转化率、用户流失率,前面模型已经单独分析过,本实验项目重点分析用户活跃情况。
2 天以上的用户占比,连续使用 7 天的用户人数等。<br /> <br />
在用户粘性分析的指标中,DAU/MAU就是最频繁使用的指标。日活跃用户占月活跃用户的比例越高,表明用户对App的使用粘性越高。<br /> 常见的用户活跃度统计一段时间内活跃用户的分布情况,如使用了几次、使用了几天、使用了多长时间等。比如一周内用户使用产品的天数分布,使用了 2 天以上的用户占比,连续使用 7 天的用户人数等。
日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。<br /> <br />
周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。<br /> 在用户粘性分析的指标中,DAU/MAU就是最频繁使用的指标。日活跃用户占月活跃用户的比例越高,表明用户对App的使用粘性越高。
月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。<br /> <br />
用户粘性通常用DAU/MAU的公式来计算,还有一个公式是每月用户平均活跃天数。DAU即日活跃用户数,MAU即月活跃用户数。<br /> 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。
比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。<br /> <br />
周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
<br />
月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
<br />
用户粘性通常用DAU/MAU的公式来计算,还有一个公式是每月用户平均活跃天数。DAU即日活跃用户数,MAU即月活跃用户数。
<br />
比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。
<br />
下表为某APP用户的登录日志,假设所有用户共计10名。 下表为某APP用户的登录日志,假设所有用户共计10名。
</span> </span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
@ -45,26 +53,12 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="用户ID" align="center" prop="id1"> <el-table-column label="用户ID" align="center" prop="id1"></el-table-column>
</el-table-column> <el-table-column label="登录时间" align="center" prop="time1"></el-table-column>
<el-table-column label="登录时间" align="center" prop="time1"> <el-table-column label="登录时长(分钟)" align="center" prop="duration1"></el-table-column>
</el-table-column> <el-table-column label="用户ID" align="center" prop="id2"></el-table-column>
<el-table-column <el-table-column label="登录时间" align="center" prop="time2"></el-table-column>
label="登录时长(分钟)" <el-table-column label="登录时长(分钟)" align="center" prop="duration2"></el-table-column>
align="center"
prop="duration1"
>
</el-table-column>
<el-table-column label="用户ID" align="center" prop="id2">
</el-table-column>
<el-table-column label="登录时间" align="center" prop="time2">
</el-table-column>
<el-table-column
label="登录时长(分钟)"
align="center"
prop="duration2"
>
</el-table-column>
</el-table> </el-table>
<div class="download" @click="downloadData">下载数据</div> <div class="download" @click="downloadData">下载数据</div>
</div> </div>
@ -76,10 +70,12 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
<span>第一步,日活跃用户分析</span> <span>第一步,日活跃用户分析</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。分析近一个月日活跃用户变动情况,包括变动率。这个时候统计活跃用户需要进行去重,一天活跃多次的只保留一条记录。<br /> 日活跃用户(DAU):每天使用产品或服务的独立用户数量。这个指标可以反映产品的日常使用情况。分析近一个月日活跃用户变动情况,包括变动率。这个时候统计活跃用户需要进行去重,一天活跃多次的只保留一条记录。
<br />
日活跃率 = 去重后的日活跃用户数量 / 历史累计去重后的用户数量*100% 日活跃率 = 去重后的日活跃用户数量 / 历史累计去重后的用户数量*100%
<br /> <br />
日活跃平均时长=登录时长/活跃用户数,计算结果保留小数点后两位 <br /> 日活跃平均时长=登录时长/活跃用户数,计算结果保留小数点后两位
<br />
</span> </span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
<el-table <el-table
@ -92,69 +88,29 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="登录时间" align="center" prop="date"> <el-table-column label="登录时间" align="center" prop="date"></el-table-column>
</el-table-column> <el-table-column label="日活跃用户(个)" align="center" prop="addNum">
<el-table-column
label="日活跃用户(个)"
align="center"
prop="addNum"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params1" placeholder="请输入" style="width: 90px" size="small"></el-input>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 90px"
size="small"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="日活跃率(%)" align="center" prop="day2"> <el-table-column label="日活跃率(%)" align="center" prop="day2">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params2" placeholder="请输入" style="width: 90px" size="small"></el-input>
v-model="scope.row.params2" %
placeholder="请输入"
style="width: 90px"
size="small"
>
</el-input
>%
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="日活跃平均时长(分钟)" align="center" prop="day3" width="180">
label="日活跃平均时长(分钟)"
align="center"
prop="day3"
width="180"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params3" placeholder="请输入" style="width: 90px" size="small"></el-input>
v-model="scope.row.params3"
placeholder="请输入"
style="width: 90px"
size="small"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div> <div>
<div <div class="draw" style="padding-left: 15px; margin-left: 20px" @click="drawEcharts">绘制图表</div>
class="draw"
style="padding-left: 15px; margin-left: 20px"
@click="drawEcharts"
>
绘制图表
</div>
<div id="echartsDom" style="width: 750px; height: 500px"></div> <div id="echartsDom" style="width: 750px; height: 500px"></div>
<div class="analysisConclusion">分析结论</div> <div class="analysisConclusion">分析结论</div>
<el-input <el-input v-model="analysisConclusionStep1" style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px" :rows="12" type="textarea" placeholder="请输入" />
v-model="analysisConclusionStep1"
style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px"
:rows="12"
type="textarea"
placeholder="请输入"
/>
<div class="submit" @click="step1Submit">提交</div> <div class="submit" @click="step1Submit">提交</div>
</div> </div>
</div> </div>
@ -166,7 +122,8 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
<span>第二步,周活跃用户分析</span> <span>第二步,周活跃用户分析</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">
周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。<br /> 周活跃用户(WAU):每周使用产品或服务的独立用户数量。这个指标可以反映产品的周活跃情况。
<br />
周活跃率 = 去重后的周活跃用户数量 / 历史累计去重后的用户数量*100% 周活跃率 = 去重后的周活跃用户数量 / 历史累计去重后的用户数量*100%
</span> </span>
@ -181,49 +138,23 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="周数" align="center" prop="week"> <el-table-column label="周数" align="center" prop="week"></el-table-column>
</el-table-column> <el-table-column label="日期间隔" align="center" prop="interval"></el-table-column>
<el-table-column label="日期间隔" align="center" prop="interval"> <el-table-column label="周活跃用户(个)" align="center" prop="description">
</el-table-column>
<el-table-column
label="周活跃用户(个)"
align="center"
prop="description"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params1" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 90px"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="周活跃率(%)" align="center" prop="description">
label="周活跃率(%)"
align="center"
prop="description"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params2" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params2" %
placeholder="请输入"
style="width: 90px"
>
</el-input
>%
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div style="width: 650px"> <div style="width: 650px">
<div class="analysisConclusion">分析结论</div> <div class="analysisConclusion">分析结论</div>
<el-input <el-input v-model="analysisConclusionStep2" style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px" :rows="8" type="textarea" placeholder="请输入" />
v-model="analysisConclusionStep2"
style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px"
:rows="8"
type="textarea"
placeholder="请输入"
/>
<div class="submit" @click="step2Submit">提交</div> <div class="submit" @click="step2Submit">提交</div>
</div> </div>
</div> </div>
@ -234,9 +165,7 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
<img src="@/assets/images/步骤.png" alt="" /> <img src="@/assets/images/步骤.png" alt="" />
<span>第三步,月活跃用户分析</span> <span>第三步,月活跃用户分析</span>
</div> </div>
<span style="line-height: 25px; font-size: 14px"> <span style="line-height: 25px; font-size: 14px">月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。</span>
月活跃用户(MAU):每月使用产品或服务的独立用户数量。这个指标可以反映产品的长期使用情况。
</span>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
<el-table <el-table
:data="step3Data" :data="step3Data"
@ -248,47 +177,22 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="月份" align="center" prop="month"> <el-table-column label="月份" align="center" prop="month"></el-table-column>
</el-table-column> <el-table-column label="月活跃用户(个)" align="center" prop="description">
<el-table-column
label="月活跃用户(个)"
align="center"
prop="description"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params1" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 90px"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="月活跃率(%)" align="center" prop="description">
label="月活跃率(%)"
align="center"
prop="description"
>
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params2" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params2" %
placeholder="请输入"
style="width: 90px"
>
</el-input
>%
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div style="width: 650px"> <div style="width: 650px">
<div class="analysisConclusion">分析结论</div> <div class="analysisConclusion">分析结论</div>
<el-input <el-input v-model="analysisConclusionStep3" style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px" :rows="8" type="textarea" placeholder="请输入" />
v-model="analysisConclusionStep3"
style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px"
:rows="8"
type="textarea"
placeholder="请输入"
/>
<div class="submit" @click="step3Submit">提交</div> <div class="submit" @click="step3Submit">提交</div>
</div> </div>
</div> </div>
@ -304,25 +208,14 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
<div>比率指标1- DAU/MAU</div> <div>比率指标1- DAU/MAU</div>
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span>通过用户粘性指标定义为过去一天的比过去30天的</span> <span>通过用户粘性指标定义为过去一天的比过去30天的</span>
<img <img src="@/assets/images/u5627.png" alt="" style="margin-left: 10px" />
src="@/assets/images/u5627.png"
alt=""
style="margin-left: 10px"
/>
</div> </div>
</div> </div>
<div style="font-size: 14px"> <div style="font-size: 14px">
<div>比率指标2 - 月平均活跃天数</div> <div>比率指标2 - 月平均活跃天数</div>
<div style="display: flex; align-items: center"> <div style="display: flex; align-items: center">
<span <span>分子可理解为过去30天用户的总活跃天数,分母为过去30天活跃用户数 ,分子/分母 即为 过去30天的人均活跃天数</span>
>分子可理解为过去30天用户的总活跃天数,分母为过去30天活跃用户数 <img src="@/assets/images/u5626.png" alt="" style="margin-left: 10px" />
,分子/分母 即为 过去30天的人均活跃天数</span
>
<img
src="@/assets/images/u5626.png"
alt=""
style="margin-left: 10px"
/>
</div> </div>
</div> </div>
<div style="margin-top: 10px; display: flex"> <div style="margin-top: 10px; display: flex">
@ -336,16 +229,10 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="用户ID" align="center" prop="id"> <el-table-column label="用户ID" align="center" prop="id"></el-table-column>
</el-table-column>
<el-table-column label="活跃天数" align="center" prop="data1"> <el-table-column label="活跃天数" align="center" prop="data1">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params1" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 90px"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -359,39 +246,40 @@ https://blog.csdn.net/kevin1993best/article/details/106329573"
backgroundColor: '#6A7DE9!important', backgroundColor: '#6A7DE9!important',
}" }"
> >
<el-table-column label="比率指标" align="center" prop="id"> <el-table-column label="比率指标" align="center" prop="id"></el-table-column>
</el-table-column>
<el-table-column label="数值" align="center" prop="data1"> <el-table-column label="数值" align="center" prop="data1">
<template #default="scope"> <template #default="scope">
<el-input <el-input v-model="scope.row.params1" placeholder="请输入" style="width: 90px"></el-input>
v-model="scope.row.params1"
placeholder="请输入"
style="width: 90px"
>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div style="width: 650px"> <div style="width: 650px">
<div class="analysisConclusion">分析结论</div> <div class="analysisConclusion">分析结论</div>
<el-input <el-input v-model="analysisConclusionStep4" style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px" :rows="8" type="textarea" placeholder="请输入" />
v-model="analysisConclusionStep4"
style="margin-left: 20px; margin-top: 20px; margin-bottom: 20px"
:rows="8"
type="textarea"
placeholder="请输入"
/>
<div class="submit" @click="step4Submit">提交</div> <div class="submit" @click="step4Submit">提交</div>
</div> </div>
</div> </div>
</div> </div>
<div class="line"></div> <div class="line"></div>
<div>
<span style="line-height: 25px; font-size: 14px; color: #000">
DAU/MAU比值越趋近于1表明用户活跃度越高,在比值低于0.2时,应用的传播性和互动性将会很弱。对于常见的App,用户粘性的取值范围就是3%~100%,不同领域的App也会有不同的基准值,例如移动游戏会以20%为基线,而工具类App会以40%为基线。
<br />
例子1: 从极限的角度看,如果每天活跃都是同样的用户,例如每天都是1万DAU,那么30天内每天都是这1万用户在活跃,MAU也是1万,于是DAU/MAU就是100%,用户粘性达到上限,微信就是接近100%的例子。
<br />
例子2: 另一个极端的例子,如果每天活跃用户都不相同,例如每天1万DAU,那么30天内每天的活跃用户都不同,MAU就是30万,于是DAU/MAU就是1/30,用户完全没有粘性。
<br />
在日常的项目和产品运营工作中, 单日的DAU/MAU的数值往往受到周期(工作日/周末)、版本更新和活动的影响,用户粘性在短期内的波动较大。所以通常要采用长期的均值作参考,例如一个月、两个大版本之间。eg:以某客户App为例,DAU/MAU的数值在工作日约50%,而在周末和假期的数值则在20%左右。那么谈到用户粘性的时候,通常采用每天DAU/MAU的平均值39.37%。
</span>
</div>
<div class="line"></div>
</div> </div>
<pop-modal :showModel="dialogVisible" @closePop="dialogVisible = false"> <pop-modal :showModel="dialogVisible" @closePop="dialogVisible = false">
<template v-slot:content> <template v-slot:content>
<div v-html="knowledgeHtml"> <div v-html="knowledgeHtml"></div>
</div>
</template> </template>
</pop-modal> </pop-modal>
</div> </div>
@ -1313,18 +1201,7 @@ const step2RightAnswer = ref([
ratio: "60", ratio: "60",
}, },
]); ]);
const step4RightAnswer = ref([ const step4RightAnswer = ref(["6", "10", "11", "13", "2", "5", "3", "5", "1", "4"]);
"6",
"10",
"11",
"13",
"2",
"5",
"3",
"5",
"1",
"4",
]);
onMounted(() => { onMounted(() => {
getData(); getData();
}); });
@ -1424,22 +1301,7 @@ const draw = () => {
}, },
xAxis: { xAxis: {
type: "category", type: "category",
data: [ data: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"],
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
],
}, },
yAxis: { yAxis: {
type: "value", type: "value",
@ -1460,11 +1322,7 @@ const draw = () => {
const drawEcharts = () => { const drawEcharts = () => {
for (let i in step1Data.value) { for (let i in step1Data.value) {
console.log(step1Data.value[i]); console.log(step1Data.value[i]);
if ( if (!step1Data.value[i].params1 || !step1Data.value[i].params2 || !step1Data.value[i].params3) {
!step1Data.value[i].params1 ||
!step1Data.value[i].params2 ||
!step1Data.value[i].params3
) {
proxy.$modal.msgError("请完成所有填空数据"); proxy.$modal.msgError("请完成所有填空数据");
return; return;
} }
@ -1575,11 +1433,7 @@ const step1Submit = () => {
step1Error.value = 0; step1Error.value = 0;
for (let i in step1Data.value) { for (let i in step1Data.value) {
// console.log(fileTable1.value[i]); // console.log(fileTable1.value[i]);
if ( if (!step1Data.value[i].params1 || !step1Data.value[i].params2 || !step1Data.value[i].params3) {
!step1Data.value[i].params1 ||
!step1Data.value[i].params2 ||
!step1Data.value[i].params3
) {
proxy.$modal.msgError("请先完成所有填空"); proxy.$modal.msgError("请先完成所有填空");
return; return;
} }
@ -1747,16 +1601,10 @@ const getData = () => {
}) })
.then((res) => { .then((res) => {
for (let i in res.data.stuMachineLearningInfoDTOList) { for (let i in res.data.stuMachineLearningInfoDTOList) {
if ( if (res.data.stuMachineLearningInfoDTOList[i].loginTime == step1Data.value[i].date) {
res.data.stuMachineLearningInfoDTOList[i].loginTime == step1Data.value[i].params1 = res.data.stuMachineLearningInfoDTOList[i].activeUser;
step1Data.value[i].date step1Data.value[i].params2 = res.data.stuMachineLearningInfoDTOList[i].activeUserRate;
) { step1Data.value[i].params3 = res.data.stuMachineLearningInfoDTOList[i].activeUserTime;
step1Data.value[i].params1 =
res.data.stuMachineLearningInfoDTOList[i].activeUser;
step1Data.value[i].params2 =
res.data.stuMachineLearningInfoDTOList[i].activeUserRate;
step1Data.value[i].params3 =
res.data.stuMachineLearningInfoDTOList[i].activeUserTime;
} }
} }
step2Data.value[0].params1 = res.data.stepFiveA; step2Data.value[0].params1 = res.data.stepFiveA;
@ -1820,17 +1668,11 @@ const downloadData = () => {
window.open(baseUrl + "/api/downDataByUserPortrait/analysisByStickiness"); window.open(baseUrl + "/api/downDataByUserPortrait/analysisByStickiness");
}; };
const submitData = () => { const submitData = () => {
if ( if (!step1AnswerFlag.value || !step2AnswerFlag.value || !step3AnswerFlag.value || !step4AnswerFlag.value) {
!step1AnswerFlag.value ||
!step2AnswerFlag.value ||
!step3AnswerFlag.value ||
!step4AnswerFlag.value
) {
proxy.$modal.msgError("请先完成所有步骤!"); proxy.$modal.msgError("请先完成所有步骤!");
return; return;
} }
errorNum.value = errorNum.value = step1Error.value + step2Error.value + step3Error.value + step4Error.value;
step1Error.value + step2Error.value + step3Error.value + step4Error.value;
console.log(errorNum.value, "总错误次数"); console.log(errorNum.value, "总错误次数");
portraitModel portraitModel
.submit({ .submit({

Loading…
Cancel
Save