diff --git a/src/views/assessment/diagnosis.vue b/src/views/assessment/diagnosis.vue index 0e868d3..b73884b 100644 --- a/src/views/assessment/diagnosis.vue +++ b/src/views/assessment/diagnosis.vue @@ -8,10 +8,14 @@ @@ -24,11 +28,11 @@ @@ -49,6 +53,19 @@ import { analyzeProductDiagnosisIterationStepTwo, getStudentTrainingAnswer, save import { parseTrainingArray } from "@/views/training/taskKeyMap"; import { isStudentDemo } from "@/utils/studentDemo"; +const NODE_GUIDE_URL = "/file/training-materials/product-diagnosis-iteration/23.%E5%AE%9E%E8%AE%AD%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E1.docx"; +const NODE_TEMPLATE_URL = "/file/training-materials/product-diagnosis-iteration/23.Excel%E6%A8%A1%E7%89%881.xlsx"; +const FUNNEL_GUIDE_URL = "/file/training-materials/product-diagnosis-iteration/23.%E5%AE%9E%E8%AE%AD%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E2.docx"; +const FUNNEL_TEMPLATE_URL = "/file/training-materials/product-diagnosis-iteration/23.Excel%E6%A8%A1%E7%89%882.xlsx"; +const AB_TEST_GUIDE_URL = "/file/training-materials/product-diagnosis-iteration/23.%E5%AE%9E%E8%AE%AD%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E3.docx"; +const AB_TEST_TEMPLATE_URL = "/file/training-materials/product-diagnosis-iteration/23.Excel%E6%A8%A1%E7%89%883.xlsx"; +function downloadBuiltInFile(url) { window.open(url, "_blank", "noopener"); } +function downloadNodeGuide() { downloadBuiltInFile(NODE_GUIDE_URL); } +function downloadNodeTemplate() { downloadBuiltInFile(NODE_TEMPLATE_URL); } +function downloadFunnelGuide() { downloadBuiltInFile(FUNNEL_GUIDE_URL); } +function downloadFunnelTemplate() { downloadBuiltInFile(FUNNEL_TEMPLATE_URL); } +function downloadAbGuide() { downloadBuiltInFile(AB_TEST_GUIDE_URL); } +function downloadAbTemplate() { downloadBuiltInFile(AB_TEST_TEMPLATE_URL); } const TASK_KEY = "product-diagnosis-iteration"; const nodes = ["曝光-点击", "点击-加购", "加购-下单", "下单-好评", "好评-复购"]; const channels = [{ key: "tmall", label: "天猫" }, { key: "jd", label: "京东" }, { key: "douyin", label: "抖音" }, { key: "pinduoduo", label: "拼多多" }]; const rateFields = [...channels.map((item) => item.key), "industryAverage"]; const { proxy } = getCurrentInstance(); const taskConfig = ref(null); const currentStep = ref(1); const saving = ref(false); const uploading = ref(false); const analyzing = ref(false); const chartInput = ref(null); const commentInput = ref(null); const abChartInput = ref(null); const wordCloudRef = ref(null); let wordCloudChart = null; const conversionRates = ref(createConversionRates()); const anomalyRows = ref([createAnomalyRow()]); const funnelChart = ref({ url: "", name: "" }); const analysisResult = ref(null); const commentPreview = ref({ fileName: "", totalComments: 0, comments: [] }); const wordCloud = ref([]); const topIssues = ref(["", "", ""]); const sentiments = ref(createSentiments()); const rootCauseAnalysis = ref(""); const abTestPlan = ref(""); const abRows = ref(createAbRows()); const abChart = ref({ url: "", name: "" }); const iterationRecommendation = ref(""); @@ -72,5 +89,7 @@ onMounted(async () => { try { taskConfig.value = (await getTrainingTaskByKey(TAS diff --git a/src/views/assessment/optimization.vue b/src/views/assessment/optimization.vue index 28244ac..8202424 100644 --- a/src/views/assessment/optimization.vue +++ b/src/views/assessment/optimization.vue @@ -110,6 +110,20 @@
+
+
+

参考方法及工具如下:

+
    +
  1. 下载案例数据表,使用 Excel 计算各品类占比、累计占比并进行 ABC 分层判定,绘制帕累托图。
  2. +
  3. 下载 Excel 模板,填写关键数据,完成帕累托图绘制。
  4. +
  5. 也可导出数据表并使用通用 AI 工具辅助完成计算与可视化。
  6. +
+
+
+ + +
+
上传校验说明

帕累托图必须根据步骤二已完成的ABC分层数据绘制;未上传图片时,不能进入下一步或提交任务。

@@ -181,6 +195,8 @@ import { parseTrainingArray } from "@/views/training/taskKeyMap"; import { isStudentDemo } from "@/utils/studentDemo"; const TASK_KEY = "category-optimization"; +const PARETO_GUIDE_URL = "/file/training-materials/category-optimization/20.实训操作说明.docx"; +const PARETO_TEMPLATE_URL = "/file/training-materials/category-optimization/20.帕累托绘制自动化模版.xlsx"; const MAX_ROWS = 30; const taskConfig = ref(null); const activeStep = ref(1); @@ -291,6 +307,16 @@ async function handleParetoUpload(event) { } catch (error) { ElMessage.error(error?.message || "帕累托图上传失败,请重试"); } finally { uploadingPareto.value = false; } } function removeParetoImage() { if (paretoImage.value.url.startsWith("blob:")) URL.revokeObjectURL(paretoImage.value.url); paretoImage.value = { url: "", name: "" }; } +function downloadParetoGuide() { downloadBuiltInFile(PARETO_GUIDE_URL, "20.实训操作说明.docx"); } +function downloadParetoTemplate() { downloadBuiltInFile(PARETO_TEMPLATE_URL, "20.帕累托绘制自动化模版.xlsx"); } +function downloadBuiltInFile(url, fileName) { + const link = document.createElement("a"); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +} function handleProductChange() { if (stepFour.value.recommendedClassification === selectedProduct.value?.abcClassification) stepFour.value.recommendedClassification = ""; } async function validateStepFour() { try { @@ -359,6 +385,7 @@ onMounted(async () => { .category-step{padding:24px}.instruction{margin:0 0 20px;color:#d8edf5;font-size:15px;line-height:1.75}.table-toolbar{display:flex;justify-content:space-between;gap:14px;margin-bottom:12px;color:var(--muted);font-size:13px}.action-button--muted{border-color:rgba(158,192,207,.35);background:rgba(75,101,112,.25)}.category-table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:12px}.category-table{width:100%;min-width:1260px;border-collapse:collapse}.category-table th,.category-table td{padding:10px;border-right:1px solid var(--line);border-bottom:1px solid var(--line);text-align:center}.category-table th{color:#e6f9ff;background:rgba(23,112,150,.42);font-size:13px;white-space:nowrap}.category-table td{background:rgba(2,18,28,.32)}.category-table tr:last-child td{border-bottom:0}.category-table th:last-child,.category-table td:last-child{border-right:0}.empty-cell{height:88px;color:var(--muted)}.abc-table{min-width:900px}.abc-table :deep(.el-select){width:100%;min-width:180px} .rule-notice{margin-top:20px;padding:16px 18px;border:1px solid rgba(255,112,112,.46);border-radius:12px;background:rgba(126,31,35,.15);color:#ffd5d5}.rule-notice strong{color:#ff9292}.rule-notice p{margin:8px 0 0;line-height:1.65}.analysis-step{padding:24px}.analysis-tabs{display:flex;gap:10px;margin-bottom:18px}.analysis-tabs button{padding:9px 14px;border:1px solid var(--line);border-radius:8px;color:var(--muted);background:transparent;font:inherit;cursor:pointer}.analysis-tabs button.active{color:white;border-color:#71dfff;background:rgba(12,114,159,.48)}.business-workspace{overflow:hidden;border:1px solid var(--line);border-radius:14px}.step-navigation{justify-content:center;padding:20px 24px 0}.nav-button--save,.nav-button--primary{border-color:#71dfff;background:linear-gradient(100deg,#0d80b7,#09638f)}.training-actions{justify-content:center;gap:28px;padding:26px 24px}.training-actions :deep(.training-action){min-width:160px;height:50px;border-color:#2c83aa;color:#dff7ff;background:rgba(13,64,88,.62);font-size:17px;font-weight:800} .pareto-upload-panel{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;min-height:330px;padding:26px;border:1px dashed rgba(113,223,255,.7);border-radius:16px;background:linear-gradient(135deg,rgba(5,47,69,.7),rgba(4,23,35,.58));text-align:center}.file-input{display:none}.upload-icon{font-size:42px;color:#71dfff}.pareto-upload-panel>strong{font-size:20px}.pareto-upload-panel>span,.upload-file-meta span{color:var(--muted);font-size:13px}.pareto-preview{width:min(100%,760px);height:270px;border:1px solid var(--line);border-radius:10px;background:rgba(0,10,18,.65);cursor:zoom-in}.upload-file-meta{display:grid;gap:5px;max-width:100%;word-break:break-all}.pareto-actions{display:flex;flex-wrap:wrap;justify-content:center;gap:10px}.danger-action{border-color:rgba(255,145,145,.6);color:#ffd7d7;background:rgba(130,43,43,.23)} +.pareto-materials{display:flex;align-items:center;justify-content:space-between;gap:22px;margin-top:20px;padding:18px 20px;border-left:3px solid var(--accent);border-radius:0 14px 14px 0;background:rgba(11,79,109,.22);color:#d8edf5}.pareto-materials h3{margin:0 0 8px;font-size:16px}.pareto-materials ol{margin:0;padding-left:20px;line-height:1.8}.pareto-materials__actions{display:grid;flex:0 0 178px;gap:10px}.action-button--primary{border-color:#71dfff;background:linear-gradient(100deg,#0d80b7,#09638f)} .strategy-step{display:grid;gap:16px}.subsection-heading{margin:8px 0 0;font-size:18px}.subsection-copy{margin:-8px 0 0;color:var(--muted);line-height:1.6}.category-matrix{position:relative;width:min(100%,820px);height:430px;margin:12px auto 22px;padding:38px 52px 52px 78px}.matrix-grid{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;width:100%;height:100%;border-left:2px solid rgba(185,240,255,.82);border-bottom:2px solid rgba(185,240,255,.82);background:linear-gradient(135deg,rgba(24,169,209,.12),rgba(3,25,38,.16))}.matrix-cell{display:grid;place-content:center;gap:7px;padding:18px;border-right:1px solid rgba(185,240,255,.65);border-bottom:1px solid rgba(185,240,255,.65);text-align:center}.matrix-cell:nth-child(2n){border-right:0}.matrix-cell:nth-child(n+3){border-bottom:0}.matrix-cell strong{font-size:18px}.matrix-cell small{color:#8dddf5}.matrix-y-title,.matrix-x-title,.matrix-y-high,.matrix-y-low,.matrix-x-high,.matrix-x-low{position:absolute;color:#d9f8ff;font-weight:800}.matrix-y-title{top:5px;left:78px}.matrix-x-title{right:0;bottom:15px}.matrix-y-high{top:63px;left:39px}.matrix-y-low{bottom:61px;left:39px}.matrix-x-low{bottom:29px;left:79px}.matrix-x-high{right:44px;bottom:29px}.matrix-inputs{display:grid;grid-template-columns:minmax(210px,.42fr) 1fr;gap:16px}.matrix-inputs label{display:grid;gap:8px;color:#d9f8ff;font-weight:700}.strategy-table{min-width:1120px}.strategy-table td{vertical-align:top}.strategy-table :deep(.el-select){width:100%;min-width:160px}.strategy-table :deep(.el-textarea__inner){min-height:78px}.current-classification{display:inline-block;padding:8px 10px;border-radius:8px;color:#a5efff;background:rgba(17,126,178,.24);white-space:nowrap} .operations-table{min-width:1050px}.operations-table th{color:#fff;background:linear-gradient(100deg,#08a6df,#098bc1);font-size:16px}.operations-table td{vertical-align:middle}.operations-table td:first-child{width:17%;font-weight:800}.operations-table td:nth-child(2){width:34%}.operations-table td:nth-child(3){width:25%}.operations-table td:last-child{width:24%}.operations-table :deep(.el-textarea__inner){min-height:86px;text-align:left}.operations-table :deep(.el-select){width:100%;min-width:160px}.layer-cell{color:#dff8ff;font-size:16px;background:rgba(15,103,137,.18)!important} :deep(.el-input__wrapper){background:rgba(1,15,25,.76);box-shadow:0 0 0 1px rgba(94,213,245,.28) inset}:deep(.el-input__inner){color:#fff;text-align:center}@media(max-width:1100px){.optimization{grid-template-columns:1fr}}@media(max-width:720px){.optimization{padding:12px}.training-core{padding:16px;border-radius:20px}.workbench-head,.table-toolbar{flex-direction:column;align-items:stretch}.workbench-actions,.table-toolbar>div,.step-navigation,.training-actions{justify-content:stretch}.workbench-actions>*,.action-button,.nav-button,.training-actions :deep(.training-action){flex:1;width:100%}.category-step,.analysis-step{padding:16px}} diff --git a/src/views/channel/index.vue b/src/views/channel/index.vue index b762b46..0ee1b27 100644 --- a/src/views/channel/index.vue +++ b/src/views/channel/index.vue @@ -154,6 +154,7 @@ import codemirror from "@/components/codemirror/index.vue"; import popModel from "@/views/components/popModal.vue"; const { proxy } = getCurrentInstance(); const TASK_KEY = "purchase-demand-forecast"; +const PURCHASE_DEMAND_FORECAST_GUIDE_URL = "/file/training-materials/purchase-demand-forecast/18.实训操作说明.docx"; const taskConfig = ref(null); const activeStep = ref(1); const saving = ref(false); @@ -537,14 +538,15 @@ const drawForecastChart = () => { window.addEventListener("resize", () => myChart.resize()); }; function downloadPracticeGuide() { - const content = "采购需求预测实训操作说明\n\n1. 根据案例给出的 12 个月销量数据,使用 FORECAST.LINEAR(WPS 可使用 FORECAST)函数预测 t=13、t=14、t=15。\n2. 将每个月的预测结果取整后,填写到预测表中。\n3. 将已知 12 个月销量和未来 3 个月预测值制作成散点图,并添加趋势线。\n4. 导出图形后上传至第 2 步,确认图中能清晰呈现历史销量、预测值和整体走势。"; - const blob = new Blob([content], { type: "text/plain;charset=utf-8" }); - const url = URL.createObjectURL(blob); + downloadBuiltInFile(PURCHASE_DEMAND_FORECAST_GUIDE_URL, "18.实训操作说明.docx"); +} +function downloadBuiltInFile(url, fileName) { const link = document.createElement("a"); link.href = url; - link.download = "采购需求预测-实训操作说明.txt"; + link.download = fileName; + document.body.appendChild(link); link.click(); - URL.revokeObjectURL(url); + document.body.removeChild(link); } function clearDemandForecastChart() { const imageUrl = String(demandForecastChart.value?.url || ""); diff --git a/src/views/demand/consumer-behavior.vue b/src/views/demand/consumer-behavior.vue index 6ddd57e..8ba7a81 100644 --- a/src/views/demand/consumer-behavior.vue +++ b/src/views/demand/consumer-behavior.vue @@ -163,6 +163,19 @@ 已编辑 {{ form.questionnaireQuestions.length }} 题;{{ form.questionnaireImport?.name ? "已导入 1 份 Word 问卷,可随时预览。" : "也可导入已完成的 .docx 问卷。" }}

+
+
+
推荐工具及方法如下,自行选择:
+

1. 使用本系统问卷编辑器,自行编辑问卷。

+

2. 下载参考问卷 Word 模板,在本地修改后上传导入。

+

3. 也可使用 AI 辅助生成,问卷应包含基本信息、购买行为、需求偏好与开放建议。

+
+ + + 下载模板 + +
+

请覆盖基本信息、购买行为、需求偏好和开放建议四部分;需求偏好至少设置一题 Likert 五级量表。

@@ -279,6 +292,7 @@ import { parseTrainingArray } from "@/views/training/taskKeyMap"; import { checkConsumerBehaviorStepOne, checkConsumerBehaviorStepTwo, checkConsumerBehaviorStepThree, checkConsumerBehaviorStepFour, getStudentTrainingAnswer, previewConsumerBehaviorQuestionnaireWord, saveStudentTrainingAnswer, uploadStudentTrainingFile } from "@/api/studentTrainingAnswer"; const TASK_KEY = "consumer-behavior"; +const QUESTIONNAIRE_TEMPLATE_URL = "/file/training-materials/consumer-behavior/9.问卷调查报告模板.docx"; const KANO_NEED_LIMIT = 20; let questionnaireQuestionSequence = 0; const { proxy } = getCurrentInstance(); @@ -882,16 +896,21 @@ function surveyReportContentPlaceholder(index) { return ["说明本次问卷调研的背景、目标用户与调研目的。", "说明样本数量、调研时间、调研渠道与数据来源。", "结合问卷数据,分析影响用户购买决策的核心因素。", "比较不同人群在需求、价格、渠道或购买场景上的差异。", "总结调研结论,并提出产品功能、定价或营销建议。"][index] || "请输入报告内容"; } -function downloadSurveyReportTemplate() { - const rows = Array.from({ length: 5 }, (_, index) => `${surveyReportTitlePlaceholder(index)}${surveyReportContentPlaceholder(index)}`).join(""); - const html = `消费者需求调研报告模板

消费者需求调研报告

请将步骤三设计的调查问卷导入在线问卷调查平台开展调研,并基于收集到的数据完成本报告。

${rows}
报告模块标题内容
`; - const blob = new Blob([html], { type: "application/msword;charset=utf-8" }); - const url = URL.createObjectURL(blob); +function downloadBuiltInFile(url, fileName) { const link = document.createElement("a"); link.href = url; - link.download = "消费者需求调研报告模板.doc"; + link.download = fileName; + document.body.appendChild(link); link.click(); - URL.revokeObjectURL(url); + document.body.removeChild(link); +} + +function downloadQuestionnaireTemplate() { + downloadBuiltInFile(QUESTIONNAIRE_TEMPLATE_URL, "9.问卷调查报告模板.docx"); +} + +function downloadSurveyReportTemplate() { + downloadBuiltInFile(QUESTIONNAIRE_TEMPLATE_URL, "9.问卷调查报告模板.docx"); } @@ -1572,6 +1591,41 @@ function downloadSurveyReportTemplate() { font-size: 13px; } +.questionnaire-template-guide { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + margin-top: 22px; + padding: 18px 20px; + border-left: 3px solid #25cfff; + border-radius: 0 14px 14px 0; + color: #c7e7f3; + background: rgba(15, 104, 145, 0.18); + + h5, + p { + margin: 0 0 5px; + line-height: 1.72; + } + + h5 { + color: #ffffff; + font-size: 15px; + } +} + +.questionnaire-template-action { + flex: 0 0 auto; + min-width: 132px; + height: 42px; + border: 1px solid rgba(93, 218, 255, 0.68); + border-radius: 10px; + color: #ffffff; + background: linear-gradient(95deg, #0b84bd, #096491); + font-weight: 800; +} + :deep(.questionnaire-editor-dialog .el-dialog), :deep(.questionnaire-preview-dialog .el-dialog) { overflow: hidden; @@ -2210,13 +2264,15 @@ function downloadSurveyReportTemplate() { .questionnaire-design-head, .questionnaire-editor-launcher, + .questionnaire-template-guide, .questionnaire-editor-dialog__intro { align-items: stretch; flex-direction: column; } .questionnaire-import-action, - .questionnaire-editor-launcher__action { + .questionnaire-editor-launcher__action, + .questionnaire-template-action { width: 100%; } @@ -2309,4 +2365,3 @@ function downloadSurveyReportTemplate() { border-bottom: 0; } - diff --git a/src/views/demand/consumer-scenario.vue b/src/views/demand/consumer-scenario.vue index 60b18b5..0939dde 100644 --- a/src/views/demand/consumer-scenario.vue +++ b/src/views/demand/consumer-scenario.vue @@ -266,6 +266,7 @@ import { checkConsumerScenarioStepOne, checkConsumerScenarioStepTwo, checkConsum import { isStudentDemo } from "@/utils/studentDemo"; const TASK_KEY = "consumer-scenario"; +const JOURNEY_TEMPLATE_URL = "/file/training-materials/consumer-scenario/10.用户购买旅程模版.pptx"; const { proxy } = getCurrentInstance(); const defaultRequirement = @@ -818,25 +819,16 @@ async function ensureJourneyOptimizationValid() { } function downloadJourneyMapTemplate() { - const escapeCsvValue = (value) => `"${String(value || "").replaceAll('"', '""')}"`; - const header = ["序号", "旅程阶段", "用户行为描述", "关键触点", "情感体验", "关键决策因素", "痛点标记", "机会点标记"]; - const rows = form.value.journeyAnalysis.map((row, index) => [ - index + 1, - stageTitle(row.stageId), - row.behaviorDescription, - row.keyTouchpoints, - row.emotionExperience, - row.decisionFactors, - "", - "", - ]); - const csv = [header, ...rows].map((row) => row.map(escapeCsvValue).join(",")).join("\r\n"); - const url = URL.createObjectURL(new Blob([`\uFEFF${csv}`], { type: "text/csv;charset=utf-8" })); + downloadBuiltInFile(JOURNEY_TEMPLATE_URL, "10.用户购买旅程模版.pptx"); +} + +function downloadBuiltInFile(url, fileName) { const link = document.createElement("a"); link.href = url; - link.download = "用户购买旅程图模板.csv"; + link.download = fileName; + document.body.appendChild(link); link.click(); - URL.revokeObjectURL(url); + document.body.removeChild(link); } function buildOutcome() { @@ -2274,4 +2266,3 @@ function exportOutcome() { } - diff --git a/src/views/demand/people.vue b/src/views/demand/people.vue index 489aeed..eba1b44 100644 --- a/src/views/demand/people.vue +++ b/src/views/demand/people.vue @@ -69,6 +69,15 @@

仅支持 .xls、.xlsx 文件,上传后可预览首个工作表的表头和前 20 行数据。

+
+

推荐工具及方法如下,自行选择:

+

1. 使用 Excel/WPS 完成 RFM 用户分层分析,可参考《实训操作说明》。

+

2. 下载 Excel 模板,填写案例数据并完成计算与可视化。

+
+ 下载实训操作说明 + 下载 Excel 模板 +
+
@@ -334,6 +343,8 @@ import { parseTrainingArray } from "@/views/training/taskKeyMap"; import { checkTargetUserProfileStepFive, checkTargetUserProfileStepFour, checkTargetUserProfileStepOne, checkTargetUserProfileStepThree, checkTargetUserProfileStepTwo, getStudentTrainingAnswer, saveStudentTrainingAnswer, uploadStudentTrainingFile } from "@/api/studentTrainingAnswer"; const TASK_KEY = "target-user-profile"; +const RFM_INSTRUCTIONS_URL = "/file/training-materials/target-user-profile/8.实训操作说明.docx"; +const RFM_TEMPLATE_URL = "/file/training-materials/target-user-profile/8.Excel计算与可视化模版.xlsx"; const RFM_CHARTS = [ { id: "segment-share", index: 1, title: "客户分层占比饼图", buttonText: "上传客户分层占比饼图" }, { id: "average-spend", index: 2, title: "客户分层平均消费对比柱状图", buttonText: "上传客户分层平均消费对比柱状图" }, @@ -700,6 +711,23 @@ function triggerFileSelect() { fileInputRef.value?.click(); } +function downloadBuiltInFile(url, fileName) { + const link = document.createElement("a"); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +} + +function downloadRfmInstructions() { + downloadBuiltInFile(RFM_INSTRUCTIONS_URL, "8.实训操作说明.docx"); +} + +function downloadRfmTemplate() { + downloadBuiltInFile(RFM_TEMPLATE_URL, "8.Excel计算与可视化模版.xlsx"); +} + function setChartInputRef(chartId, element) { if (element) { chartFileInputRefs.value[chartId] = element; @@ -1852,6 +1880,28 @@ function exportOutcome() { line-height: 1.7; } +.step-one-materials { + margin-top: 18px; + padding: 16px 18px; + border-left: 3px solid #21c5ff; + border-radius: 0 12px 12px 0; + color: #c8e6f2; + background: rgba(14, 91, 128, 0.18); + font-size: 14px; + line-height: 1.75; + + p { + margin: 0 0 4px; + } +} + +.step-one-materials__actions { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-top: 12px; +} + .excel-preview-meta { margin-bottom: 12px; color: #52687a; @@ -2427,4 +2477,3 @@ function exportOutcome() { border-bottom: 0; } - diff --git a/src/views/foundation/product-development-process.vue b/src/views/foundation/product-development-process.vue index a4f9e58..8d83913 100644 --- a/src/views/foundation/product-development-process.vue +++ b/src/views/foundation/product-development-process.vue @@ -163,7 +163,6 @@