From 8f1b6ecdfb790c77b30249ad2eedb73735d75067 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Wed, 12 Aug 2026 01:01:03 +0800 Subject: [PATCH] feat: add value proposition canvas --- src/api/studentTrainingAnswer.js | 26 +++ src/views/product/differentiation.vue | 286 ++++++++++++++++++++++++-- 2 files changed, 295 insertions(+), 17 deletions(-) diff --git a/src/api/studentTrainingAnswer.js b/src/api/studentTrainingAnswer.js index 05a30c0..81238b7 100644 --- a/src/api/studentTrainingAnswer.js +++ b/src/api/studentTrainingAnswer.js @@ -447,3 +447,29 @@ export function checkProductValuePositioningStepOne(payload) { headers: { repeatSubmit: false }, }); } + +export function checkProductValuePositioningStepTwo(payload) { + const customerProfile = payload?.customerProfile || {}; + const valueMap = payload?.valueMap || {}; + if (isStudentDemo()) { + const requiredValues = [ + customerProfile.jobs, customerProfile.pains, customerProfile.gains, + valueMap.products, valueMap.painRelievers, valueMap.gainCreators, + payload?.canvasUrl, + ]; + const valid = requiredValues.every((item) => Boolean(String(item || "").trim())); + return Promise.resolve({ + code: 200, + data: { + valid, + message: valid ? "价值主张画布填写完整。" : "请完整填写用户档案、产品价值地图并上传产品价值主张画布。", + }, + }); + } + return request({ + url: "/api/student-training-answers/product-value-positioning/step-2/validate", + method: "post", + data: payload, + headers: { repeatSubmit: false }, + }); +} diff --git a/src/views/product/differentiation.vue b/src/views/product/differentiation.vue index 5d1b690..feb1ece 100644 --- a/src/views/product/differentiation.vue +++ b/src/views/product/differentiation.vue @@ -82,20 +82,64 @@

{{ activeStepName }}

-
-