diff --git a/src/App.vue b/src/App.vue index 6d99f4f..8efdd62 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,16 +13,42 @@ \ No newline at end of file + if (cache.session.getJSON("sessionObj") === undefined) { + removeToken(); + removeUserInfo(); + } + queueStepNameTitleRefresh(); + stepNameObserver = new MutationObserver(queueStepNameTitleRefresh); + stepNameObserver.observe(document.body, { childList: true, subtree: true }); +}); + +onBeforeUnmount(() => stepNameObserver?.disconnect()); + diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss index 8ab8f1a..b4be8c9 100644 --- a/src/assets/styles/element-ui.scss +++ b/src/assets/styles/element-ui.scss @@ -107,3 +107,11 @@ .el-loading-text { color: #d7f8ff; } + +// Keep textarea character counts readable on the application's dark training surfaces. +// Element Plus uses a light fill by default, which appears as a white mask in the lower-right corner. +.el-input__count, +.el-input__count-inner { + color: #ffffff !important; + background: transparent !important; +} diff --git a/src/assets/styles/student-training.scss b/src/assets/styles/student-training.scss index 8d8dda9..5e867d1 100644 --- a/src/assets/styles/student-training.scss +++ b/src/assets/styles/student-training.scss @@ -654,6 +654,31 @@ background: linear-gradient(95deg, #0a6b9e, #0a5c86) !important; } +// Keep long step names inside the navigation rail. Their complete name remains +// available through the native title tooltip applied by App.vue. +.student-training-shell .step-tab .step-copy, +.legacy-training-page .step-tab .step-copy, +.step-tabs .step-tab .step-copy, +.step-indicator .step-tab .step-copy { + min-width: 0 !important; + overflow: hidden; +} + +.student-training-shell .step-tab .step-copy > strong, +.student-training-shell .step-tab .step-copy > b, +.legacy-training-page .step-tab .step-copy > strong, +.legacy-training-page .step-tab .step-copy > b, +.step-tabs .step-tab .step-copy > strong, +.step-tabs .step-tab .step-copy > b, +.step-indicator .step-tab .step-copy > strong, +.step-indicator .step-tab .step-copy > b { + display: block !important; + min-width: 0; + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + @media (max-width: 1100px) { #app .studentLayout .app-main:has(.student-training-shell) .student-training-shell, #app .teacherLayout .app-main:has(.student-training-shell) .student-training-shell { diff --git a/src/views/assessment/diagnosis.vue b/src/views/assessment/diagnosis.vue index cbaca82..5332304 100644 --- a/src/views/assessment/diagnosis.vue +++ b/src/views/assessment/diagnosis.vue @@ -5,40 +5,35 @@

产品问题诊断与迭代

{{ currentStep === 1 ? '全链路转化漏斗诊断' : currentStep === 2 ? '用户评论根因分析' : 'AB 测试验证方案' }}

- +
@@ -96,13 +91,40 @@ onMounted(async () => { try { taskConfig.value = (await getTrainingTaskByKey(TAS diff --git a/src/views/test/promotion.vue b/src/views/test/promotion.vue index f41a94e..508ebbc 100644 --- a/src/views/test/promotion.vue +++ b/src/views/test/promotion.vue @@ -65,7 +65,6 @@ 当前渠道预算占比合计{{ displayMoney(budgetPercentageTotal) }}%{{ displayMoney(rowBudgetTotal) }}预算金额由总预算 × 预算占比自动计算 -

预算占比由学生填写,各渠道占比合计必须等于 100%。预算金额由系统按“试错预算总额 × 占比”自动计算;每个渠道的冷启动期、增长期和稳定期投放预算合计必须等于该渠道预算金额。默认显示一行,保存并进入下一步时至少填写两行、最多五行;渠道仅可从产品发布渠道评估已填写的渠道中选择。

尚未读取到产品发布渠道评估的渠道数据。请先完成并保存该模块的渠道数据。

@@ -89,7 +88,6 @@ -

渠道由第一步自动同步,不可手动编辑;冷启动期、增长期、稳定期固定。每个“阶段 × 渠道”必须填写两项不重复的投放策略。策略池是参考内容,也可在下拉框中输入符合渠道实际情况的策略。

@@ -131,7 +129,6 @@
-

该表渠道与第一步一致,合计行为固定最后一行。点击率 = 点击量 ÷ 曝光量 × 100%;实际 ROI = 成交额 ÷ 推广花费。合计行的曝光量、点击量、成交额和推广花费必须为各渠道数据合计,点击率和实际 ROI 均按合计值重新计算。

上一步保存当前进度保存并校验
@@ -157,7 +154,6 @@ -

渠道和 ROI 从前序步骤自动同步。ROI 不低于保本 ROI 即为达标;学生自行选择达标结果,系统提交时校验。达标渠道的问题诊断和优化动作可不填,未达标渠道必须填写。

(二)优化决策

结合整体 ROI 与各渠道达标情况,总结本方案是否需要调整、调整方向,以及优先调整的渠道。