From 037f9cc33c3472d93d41a209e6763fdb7b0e13d1 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Tue, 11 Aug 2026 17:37:25 +0800 Subject: [PATCH] feat: add target user rfm charts --- src/api/studentTrainingAnswer.js | 19 ++ src/views/demand/people.vue | 321 +++++++++++++++++++++++++------ 2 files changed, 286 insertions(+), 54 deletions(-) diff --git a/src/api/studentTrainingAnswer.js b/src/api/studentTrainingAnswer.js index de78009..bebac14 100644 --- a/src/api/studentTrainingAnswer.js +++ b/src/api/studentTrainingAnswer.js @@ -356,3 +356,22 @@ export function checkTargetUserProfileStepOne(payload) { headers: { repeatSubmit: false }, }); } + +export function checkTargetUserProfileStepTwo(payload) { + const charts = Array.isArray(payload?.charts) ? payload.charts : []; + const expectedTypes = ["segment-share", "average-spend", "score-heatmap"]; + if (isStudentDemo()) { + const submitted = new Set(charts.map((chart) => chart?.type)); + const invalid = charts.find((chart) => !String(chart?.url || "").trim() || !/\.(png|jpe?g|webp)$/i.test(String(chart?.name || ""))); + if (charts.length !== expectedTypes.length || expectedTypes.some((type) => !submitted.has(type)) || invalid) { + return Promise.reject(new Error("请上传客户分层占比饼图、平均消费对比柱状图和 RFM 分数分布热力图")); + } + return Promise.resolve({ code: 200, data: { valid: true, message: "校验通过" } }); + } + return request({ + url: "/api/student-training-answers/target-user-profile/step-2/validate", + method: "post", + data: { charts }, + headers: { repeatSubmit: false }, + }); +} diff --git a/src/views/demand/people.vue b/src/views/demand/people.vue index 913b7c1..659dfd9 100644 --- a/src/views/demand/people.vue +++ b/src/views/demand/people.vue @@ -93,64 +93,41 @@

- 重点用户画像,开发团队已经访谈了3位重点用户,并撰写了访谈记录,请根据访谈记录,从用户的行为特征、需求痛点、消费心理等三个维度,进行重点用户画像。 + 基于步骤一的 RFM 分析结果,制作可视化图表,包括客户分层占比饼图、各客户分层平均消费对比柱状图、RFM 分数分布热力图。

-
- -
- -