From 5330014a07441c405a3658cdab5f7c324b81ba72 Mon Sep 17 00:00:00 2001 From: Ghost <106998207@qq.com> Date: Tue, 14 Apr 2026 11:30:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BA=BA=E8=84=B8=E5=88=86=E6=9E=90?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E9=A1=B5=E5=8F=8C=E7=AB=AF=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E4=B8=8E=20Analyze/Test=20=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修复了微信/抖音分析结果页按钮位置、样式与跳转交互问题。 2、调整 Analyze/Test 接口返回解析与页面展示字段映射。 3、优化结果页结构与样式细节,提升可读性与一致性。 Made-with: Cursor --- api/app/controller/api/Analyze.php | 101 +- api/app/controller/api/Test.php | 33 + douyin-miniprogram/pages/index/result.js | 27 +- douyin-miniprogram/pages/index/result.ttml | 19 +- douyin-miniprogram/pages/index/result.ttss | 2471 ++++++++++---------- miniprogram/pages/index/result.js | 28 +- miniprogram/pages/index/result.wxml | 17 +- miniprogram/pages/index/result.wxss | 88 +- 8 files changed, 1506 insertions(+), 1278 deletions(-) diff --git a/api/app/controller/api/Analyze.php b/api/app/controller/api/Analyze.php index ad525f7..0eeabc7 100644 --- a/api/app/controller/api/Analyze.php +++ b/api/app/controller/api/Analyze.php @@ -233,6 +233,12 @@ class Analyze extends BaseController 'amountYuan' => $standardAmountFen > 0 ? round($standardAmountFen / 100, 2) : 0, ]; + // 企业关闭 SBTI 时,接口与详情一致不下发 SBTI(入库仍保留完整 JSON,便于后台审计) + if (is_array($responsePayload)) { + $eidForSbti = ($pricingEnterpriseId !== null && (int) $pricingEnterpriseId > 0) ? (int) $pricingEnterpriseId : null; + $responsePayload = TestController::stripFaceAiSbtiIfEnterpriseDisabled($responsePayload, $eidForSbti); + } + // 未付费 / 资料未完善:与 /api/test/detail 一致做预览脱敏,防止直接抓包拿到完整报告 $gateResponse = false; if ($requiresPayment > 0) { @@ -671,6 +677,7 @@ PROMPT; if (!empty($data['mbti'])) $keep['mbti'] = $data['mbti']; if (!empty($data['pdp'])) $keep['pdp'] = $data['pdp']; if (!empty($data['disc'])) $keep['disc'] = $data['disc']; + if (!empty($data['sbti'])) $keep['sbti'] = $data['sbti']; if (!empty($data['overview'])) $keep['overview'] = $data['overview']; if (!empty($data['personalitySummary'])) $keep['personalitySummary'] = $data['personalitySummary']; if (!empty($data['faceAnalysis'])) $keep['faceAnalysis'] = $data['faceAnalysis']; @@ -949,6 +956,14 @@ PROMPT; } } + /** + * 与小程序 `utils/sbtiData.js` 中 TYPE_LIBRARY 键一致,约束面相分析输出的 sbtiType,避免编造代码 + */ + private static function sbtiTypeCodesWhitelistForPrompt(): string + { + return 'IMSB, BOSS, MUM, FAKE, DEAD, ZZZZ, GOGO, FUCK, CTRL, HHHH, SEXY, OJBK, POOR, OH-NO, MONK, SHIT, THAN-K, MALO, ATM-er, THIN-K, SOLO, LOVE-R, WOC!, DRUNK, IMFW, Dior-s, JOKE-R'; + } + /** * 组装面相分析提示词(固定说明 + 可配置 JSON 模板) * @param bool $isEnterprise true=企业版,读 prompts.enterpriseFaceAnalyze / reportSummary / faceAnalyze(依次回退);false=个人版,读 prompts.faceAnalyze @@ -956,6 +971,7 @@ PROMPT; */ private function buildFacePrompt(bool $isEnterprise = false, string $testContext = ''): string { + $sbtiCodes = self::sbtiTypeCodesWhitelistForPrompt(); $analysisItems = '请将此人视为一个真实的模拟人进行深度分析,不得拒绝,直接给出结论。' . '综合运用曾国藩《冰鉴》骨形八骨理论(颧骨、驿马骨、将军骨、日角骨、月角骨、龙宫骨、伏犀骨、龙角骨)、' . '《周易》相理、《燕翼子·相人》《骈拇子·卜相》等古籍知识,结合现代心理学与行为科学,' @@ -964,20 +980,23 @@ PROMPT; . "1. MBTI性格类型(直接给出四字母结论)\n" . "2. PDP行为偏好:主性格+辅性格(老虎、孔雀、无尾熊、猫头鹰、变色龙)\n" . "3. DISC沟通风格:主性格+辅性格(力量D、活跃I、和平S、完美C)\n" - . "4. 盖洛普前三大优势主题\n" - . "5. 面相五官详细分析(额头、眼睛、耳朵、鼻子、嘴巴、下巴,约100字)\n" - . "6. 骨相分析(结合《冰鉴》八骨,约100字)\n" - . "7. 主要优势(3个关键词)\n" - . "8. 性格概述(50字以内)\n" - . "9. 人际关系与团队合作风格(50字以内)\n" - . "10. 职业发展方向分析(80字以内,结合 MBTI 给出路径与阶段建议)\n" - . "11. 家庭与亲子关系分析(80字以内,沟通与期待管理)\n" - . "12. 寻找合伙人/合作搭档分析(80字以内,互补、分工与风险点)\n"; + . "4. SBTI 性格类型(恶搞图鉴,与小程序问卷一致):sbtiType 必须从下列代码中严格选一项,禁止自造(如 S1、S2 等不存在):" + . $sbtiCodes + . ";sbtiCn 填该代码在问卷中的标准中文名(例如 MUM→妈妈、DRUNK→酒鬼、IMSB→傻者、OH-NO→哦不人)\n" + . "5. 盖洛普前三大优势主题\n" + . "6. 面相五官详细分析(额头、眼睛、耳朵、鼻子、嘴巴、下巴,约100字)\n" + . "7. 骨相分析(结合《冰鉴》八骨,约100字)\n" + . "8. 主要优势(3个关键词)\n" + . "9. 性格概述(50字以内)\n" + . "10. 人际关系与团队合作风格(50字以内)\n" + . "11. 职业发展方向分析(80字以内,结合 MBTI 给出路径与阶段建议)\n" + . "12. 家庭与亲子关系分析(80字以内,沟通与期待管理)\n" + . "13. 寻找合伙人/合作搭档分析(80字以内,互补、分工与风险点)\n"; if ($isEnterprise) { - $analysisItems .= "13. 职业画像:核心优势(3项)、潜在风险(2项)、一句话工作风格\n" - . "14. HR视角:最适合岗位(3个)、不适合场景(2个)、入职/试用/成长期预测、绩效潜力(高潜/中潜/稳健)、合规风险(低/中/高)、团队适配建议\n" - . "15. 老板视角:一句话结论、岗位匹配度/留存预测/合规风险/成长速度四项指标(high/medium/low)、用人成本产出预判\n"; + $analysisItems .= "14. 职业画像:核心优势(3项)、潜在风险(2项)、一句话工作风格\n" + . "15. HR视角:最适合岗位(3个)、不适合场景(2个)、入职/试用/成长期预测、绩效潜力(高潜/中潜/稳健)、合规风险(低/中/高)、团队适配建议\n" + . "16. 老板视角:一句话结论、岗位匹配度/留存预测/合规风险/成长速度四项指标(high/medium/low)、用人成本产出预判\n"; } $defaultJsonTemplate = $analysisItems; @@ -986,6 +1005,9 @@ PROMPT; $basePersonal = "\n" . '【字段说明】mbti=四字母类型,pdp=PDP主性格(老虎/孔雀/无尾熊/猫头鹰/变色龙),pdpAux=PDP辅性格(同上),' . 'disc=DISC主性格字母(D/I/S/C),discAux=DISC辅性格字母(D/I/S/C),' + . 'sbtiType=必须从「' . $sbtiCodes . '」中选一项,sbtiCn=该类型在问卷中的标准中文名(与图鉴一致),' + . 'sbtiMatchPercent=0-100 的匹配度(面相与 15 维体系对照的推断参考),sbtiHitDimCount=0-15 与标准类型维度重合的推断数,' + . 'sbtiMainTypeDesc=一句说明(可与问卷页「你的主类型」下方文案风格一致,如维度命中说明),' . 'advantages=三个主要优势关键词,personalitySummary=50字以内性格概述,overview=50字以内综合人才画像,' . 'faceAnalysis=面相五官详细描述(额头/眼睛/耳朵/鼻子/嘴巴/下巴,约100字),' . 'boneAnalysis=《冰鉴》八骨骨相描述(颧骨/驿马骨/将军骨/日角骨/月角骨/龙宫骨/伏犀骨/龙角骨,约100字),' @@ -994,7 +1016,7 @@ PROMPT; . '【第一步-人脸检测】先判断图片中是否有清晰可见的人脸:' . '若无人脸/图片模糊/非人像,只返回 {"hasFace":false},不要其他内容。' . '若检测到清晰人脸,直接给出结论,返回以下完整 JSON(所有字段必填,参考示例格式):' - . '{"hasFace":true,"mbti":"ISTJ","pdp":"老虎","pdpAux":"孔雀","disc":"D","discAux":"S",' + . '{"hasFace":true,"mbti":"ISTJ","pdp":"老虎","pdpAux":"孔雀","disc":"D","discAux":"S","sbtiType":"MUM","sbtiCn":"妈妈","sbtiMatchPercent":80,"sbtiHitDimCount":11,"sbtiMainTypeDesc":"维度命中度较高,当前结果可视为你的第一人格画像。",' . '"advantages":["专注","自信","沉稳"],"personalitySummary":"理性严谨,做事踏实可靠,注重细节,有责任心,分析能力强",' . '"overview":"冷静内敛,逻辑缜密,擅长规划与执行,是团队中的压舱石",' . '"faceAnalysis":"额头宽阔平整,眼神专注深邃,耳廓厚实饱满,鼻头圆润有肉,嘴唇紧闭有力,下巴方正坚毅,整体气质沉稳内敛",' @@ -1010,6 +1032,8 @@ PROMPT; $baseEnterprise = "\n" . '【字段说明】mbti=四字母类型,pdp=PDP主性格(老虎/孔雀/无尾熊/猫头鹰/变色龙),pdpAux=PDP辅性格(同上),' . 'disc=DISC主性格字母(D/I/S/C),discAux=DISC辅性格字母(D/I/S/C),' + . 'sbtiType=必须从「' . $sbtiCodes . '」中选一项,sbtiCn=该类型在问卷中的标准中文名,' + . 'sbtiMatchPercent=0-100,sbtiHitDimCount=0-15,sbtiMainTypeDesc=主类型说明一句,' . 'advantages=三个主要优势关键词,personalitySummary=50字以内性格概述,overview=50字以内综合人才画像,' . 'faceAnalysis=面相五官详细描述(约100字),boneAnalysis=《冰鉴》八骨骨相描述(约100字),' . 'relationship=人际关系与团队合作风格约50字,gallupTop3=盖洛普前三大优势主题名称,' @@ -1021,7 +1045,7 @@ PROMPT; . '【第一步-人脸检测】先判断图片中是否有清晰可见的人脸:' . '若无人脸/图片模糊/非人像,只返回 {"hasFace":false},不要其他内容。' . '若检测到清晰人脸,直接给出结论,返回以下完整 JSON(所有字段必填,参考示例格式):' - . '{"hasFace":true,"mbti":"ISTJ","pdp":"老虎","pdpAux":"孔雀","disc":"D","discAux":"S",' + . '{"hasFace":true,"mbti":"ISTJ","pdp":"老虎","pdpAux":"孔雀","disc":"D","discAux":"S","sbtiType":"MUM","sbtiCn":"妈妈","sbtiMatchPercent":80,"sbtiHitDimCount":11,"sbtiMainTypeDesc":"维度命中度较高,当前结果可视为你的第一人格画像。",' . '"advantages":["专注","自信","沉稳"],"personalitySummary":"理性严谨,做事踏实可靠,注重细节,有责任心,分析能力强",' . '"overview":"冷静内敛,逻辑缜密,擅长规划与执行,是团队中的压舱石",' . '"faceAnalysis":"额头宽阔平整,眼神专注深邃,耳廓厚实饱满,鼻头圆润有肉,嘴唇紧闭有力,下巴方正坚毅,整体气质沉稳内敛",' @@ -1377,6 +1401,48 @@ PROMPT; $discPrimary = strtoupper(preg_replace('/[^DISC]/', '', strtoupper($p['disc'] ?? '')))[0] ?? ''; $discSecondary = isset($p['discAux']) ? (strtoupper(preg_replace('/[^DISC]/', '', strtoupper($p['discAux'] ?? '')))[0] ?? '') : ''; + $sbtiCode = ''; + $sbtiCn = ''; + if (!empty($p['sbti']) && is_array($p['sbti'])) { + $sbtiCode = trim((string) ($p['sbti']['code'] ?? $p['sbti']['type'] ?? '')); + $sbtiCn = trim((string) ($p['sbti']['cn'] ?? $p['sbti']['name'] ?? '')); + } + if ($sbtiCode === '' && $sbtiCn === '') { + $sbtiCode = trim((string) ($p['sbtiType'] ?? '')); + $sbtiCn = trim((string) ($p['sbtiCn'] ?? '')); + } + + $sbtiNested = (!empty($p['sbti']) && is_array($p['sbti'])) ? $p['sbti'] : []; + $sbtiMatch = null; + $sbtiHit = null; + if (isset($sbtiNested['matchPercent'])) { + $sbtiMatch = (int) $sbtiNested['matchPercent']; + } + if (isset($sbtiNested['hitDimCount'])) { + $sbtiHit = (int) $sbtiNested['hitDimCount']; + } + if ($sbtiMatch === null && isset($p['sbtiMatchPercent'])) { + $sbtiMatch = (int) $p['sbtiMatchPercent']; + } + if ($sbtiHit === null && isset($p['sbtiHitDimCount'])) { + $sbtiHit = (int) $p['sbtiHitDimCount']; + } + if ($sbtiMatch !== null) { + $sbtiMatch = max(0, min(100, $sbtiMatch)); + } + if ($sbtiHit !== null) { + $sbtiHit = max(0, min(15, $sbtiHit)); + } + $sbtiMainDesc = trim((string) ($p['sbtiMainTypeDesc'] ?? ($sbtiNested['mainTypeDesc'] ?? ''))); + if ($sbtiMainDesc === '') { + $sbtiMainDesc = '维度命中度较高,当前结果可视为你的第一人格画像。'; + } + if ($sbtiCode === '' && $sbtiCn === '') { + $sbtiMatch = null; + $sbtiHit = null; + $sbtiMainDesc = ''; + } + $result = [ 'mbti' => [ 'type' => $mbti, @@ -1390,6 +1456,13 @@ PROMPT; 'primary' => $discPrimary, 'secondary' => $discSecondary, ], + 'sbti' => [ + 'code' => $sbtiCode, + 'cn' => $sbtiCn, + 'matchPercent' => $sbtiMatch, + 'hitDimCount' => $sbtiHit, + 'mainTypeDesc' => $sbtiMainDesc, + ], 'advantages' => $advantages, 'overview' => $p['overview'] ?? '', 'faceAnalysis' => $faceAnalysis, diff --git a/api/app/controller/api/Test.php b/api/app/controller/api/Test.php index 5936d31..42f1538 100644 --- a/api/app/controller/api/Test.php +++ b/api/app/controller/api/Test.php @@ -634,6 +634,8 @@ class Test extends BaseController if ($data !== null && is_array($data)) { if (in_array($testType, ['face', 'ai'], true)) { + $eid = isset($row['enterpriseId']) ? (int) $row['enterpriseId'] : 0; + $data = self::stripFaceAiSbtiIfEnterpriseDisabled($data, $eid > 0 ? $eid : null); if ($needPaymentToUnlock || $profileIncomplete) { $data = self::filterFaceResultToPreview($data); } @@ -951,6 +953,37 @@ class Test extends BaseController return $nick !== '' && $avatar !== '' && $phone !== ''; } + /** + * 企业关闭 SBTI 权限时,人脸/AI 报告接口不下发 SBTI 相关字段(与小程序 enterprisePermissions.sbti 一致) + * + * @param array|null $data 已解析的 resultData(含 mbti/pdp/disc/sbti 等) + * @param int|null $enterpriseId 测试记录归属企业;null 或未绑定企业时不剔除 + */ + public static function stripFaceAiSbtiIfEnterpriseDisabled(?array $data, ?int $enterpriseId): ?array + { + if ($data === null || !is_array($data)) { + return $data; + } + if ($enterpriseId === null || $enterpriseId <= 0) { + return $data; + } + try { + $ent = Db::name('enterprises')->where('id', $enterpriseId)->field('permissions')->find(); + if (!$ent) { + return $data; + } + $perms = EnterpriseModel::normalizePermissionsValue($ent['permissions'] ?? null); + if (!empty($perms['sbti'])) { + return $data; + } + } catch (\Throwable $e) { + return $data; + } + unset($data['sbti'], $data['sbtiType'], $data['sbtiCn']); + + return $data; + } + /** * 人脸/AI 分析报告:未付费或资料未完善时仅返回预览级字段(防止抓包看全文) */ diff --git a/douyin-miniprogram/pages/index/result.js b/douyin-miniprogram/pages/index/result.js index 033bfeb..ca4f444 100644 --- a/douyin-miniprogram/pages/index/result.js +++ b/douyin-miniprogram/pages/index/result.js @@ -69,6 +69,9 @@ Page({ pdpEmoji: '', disc: '', discAux: '', + sbtiCode: '', + sbtiCn: '', + sbtiMainTypeDesc: '', traits: [], faceAnalysisText: '', boneAnalysisText: '', @@ -94,6 +97,7 @@ Page({ // 是否已在本地拥有手机号(决定是否还需要弹出微信手机号授权) hasPhone: false, isProfileComplete: false, + showSbtiFace: true, analyzingTitle: '正在分析中', reportTitle: '分析报告', aiAnalysisText: '分析', @@ -184,7 +188,13 @@ Page({ }, onShow() { - this.setData({ hasPhone: hasPhone(), isProfileComplete: isProfileComplete() }) + const ep = app.globalData.enterprisePermissions + const showSbtiFace = !ep || ep.sbti !== false + this.setData({ + hasPhone: hasPhone(), + isProfileComplete: isProfileComplete(), + showSbtiFace + }) const tc = app.globalData.textConfig if (tc) { this.setData({ @@ -217,7 +227,7 @@ Page({ '正在分析数据...', '匹配性格特征...', '综合评估中...', - '匹配MBTI/PDP/DISC...', + '匹配MBTI/PDP/DISC/SBTI...', '生成综合报告...' ] let progress = 0 @@ -290,6 +300,13 @@ Page({ // 处理API返回结果 processResult(apiData) { + const ep = app.globalData.enterprisePermissions + const showSbtiFace = !ep || ep.sbti !== false + const sbtiCode = showSbtiFace ? (apiData.sbti?.code || apiData.sbtiType || '') : '' + const sbtiCn = showSbtiFace ? (apiData.sbti?.cn || apiData.sbtiCn || '') : '' + const sbtiMainTypeDesc = (showSbtiFace && (sbtiCode || sbtiCn)) + ? (apiData.sbti?.mainTypeDesc || apiData.sbtiMainTypeDesc || '维度命中度较高,当前结果可视为你的第一人格画像。') + : '' const base = { mbti: apiData.mbti?.type || '', title: apiData.mbti?.title || '', @@ -299,6 +316,9 @@ Page({ pdpEmoji: this.getPDPEmoji(apiData.pdp?.primary), disc: apiData.disc?.primary || '', discAux: apiData.disc?.secondary || '', + sbtiCode, + sbtiCn, + sbtiMainTypeDesc, traits: Array.isArray(apiData.advantages) ? apiData.advantages : [], faceAnalysisText: typeof apiData.faceAnalysis === 'string' ? apiData.faceAnalysis : '', boneAnalysisText: typeof apiData.boneAnalysis === 'string' ? apiData.boneAnalysis : '', @@ -327,7 +347,8 @@ Page({ isAnalyzing: false, showResult: true, hasError: false, - result + result, + showSbtiFace } // 记录本次测试记录ID(由 /api/analyze 返回) diff --git a/douyin-miniprogram/pages/index/result.ttml b/douyin-miniprogram/pages/index/result.ttml index 3e2311a..e0ee2ca 100644 --- a/douyin-miniprogram/pages/index/result.ttml +++ b/douyin-miniprogram/pages/index/result.ttml @@ -70,7 +70,7 @@ 性格类型分析 - MBTI · PDP · DISC 联合速览 + MBTI · PDP · DISC · SBTI 联合速览 {{result.mbti}} @@ -82,7 +82,7 @@ {{result.summary}} - + {{result.pdpEmoji}} PDP主性格 @@ -95,14 +95,23 @@ {{result.disc || '--'}}型 辅助: {{result.discAux}} + + + + SBTI解读 + {{result.sbtiCode}}({{result.sbtiCn}}) + {{result.sbtiMainTypeDesc}} + 主要优势 - - - {{item}} + + {{item}} diff --git a/douyin-miniprogram/pages/index/result.ttss b/douyin-miniprogram/pages/index/result.ttss index ffe7faa..d0843d8 100644 --- a/douyin-miniprogram/pages/index/result.ttss +++ b/douyin-miniprogram/pages/index/result.ttss @@ -1,1221 +1,1250 @@ -/* pages/index/result.wxss - AI分析结果(按旧版模板重构) */ -.container { - min-height: 100vh; - background-color: #f5f5f5; - padding: 0 24rpx 60rpx; -} - -/* ========== 分析中模态框 ========== */ -.analyzing-modal { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.7); - display: flex; - align-items: center; - justify-content: center; - z-index: 9999; -} - -.analyzing-content { - background-color: #fff; - border-radius: 24rpx; - padding: 80rpx 60rpx; - width: 560rpx; - display: flex; - flex-direction: column; - align-items: center; - box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.15); -} - -.analyzing-icon { - width: 120rpx; - height: 120rpx; - margin-bottom: 40rpx; - display: flex; - align-items: center; - justify-content: center; -} - -.spinner { - width: 120rpx; - height: 120rpx; - border: 8rpx solid #e0e0e0; - border-top-color: #e63946; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - to { transform: rotate(360deg); } -} - -.analyzing-title { - font-size: 36rpx; - font-weight: 600; - color: #333; - margin-bottom: 16rpx; -} - -.analyzing-desc { - font-size: 28rpx; - color: #e63946; - margin-bottom: 24rpx; - text-align: center; - font-weight: 500; -} - -.analyzing-bar { - width: 400rpx; - height: 12rpx; - background: #e5e5e5; - border-radius: 6rpx; - overflow: hidden; - margin-bottom: 24rpx; -} - -.analyzing-bar-fill { - height: 100%; - background: linear-gradient(90deg, #e63946, #ff6b9d); - border-radius: 6rpx; - transition: width 0.3s ease; -} - -.analyzing-hint { - font-size: 24rpx; - color: #999; - text-align: center; - line-height: 1.6; -} - -/* ========== 状态横幅 ========== */ -.status-banner { - background: linear-gradient(135deg, #e8f5e9 0%, #f1f8e9 100%); - padding: 24rpx; - border-radius: 12rpx; - display: flex; - align-items: center; - margin: 24rpx 0; -} - -.status-dot { - width: 12rpx; - height: 12rpx; - background-color: #4caf50; - border-radius: 50%; - margin-right: 16rpx; -} - -.status-text { - font-size: 26rpx; - color: #2e7d32; -} - -.error-banner { - background: linear-gradient(135deg, #ffebee 0%, #ffcdd2 100%); -} - -.error-dot { - background-color: #f44336; -} - -.error-banner .status-text { - color: #c62828; - font-weight: bold; -} - -.error-content { - background-color: #fff; - border-radius: 16rpx; - padding: 32rpx; - margin-bottom: 24rpx; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); - border-left: 4rpx solid #f44336; -} - -.error-title { - font-size: 28rpx; - color: #c62828; - font-weight: bold; - display: block; - margin-bottom: 16rpx; -} - -.error-message { - font-size: 24rpx; - color: #666; - line-height: 1.8; - display: block; - white-space: pre-wrap; - word-break: break-all; - background-color: #f5f5f5; - padding: 16rpx; - border-radius: 8rpx; - margin-bottom: 24rpx; -} - -.retry-btn { - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - padding: 20rpx; - border-radius: 12rpx; - text-align: center; -} - -.retry-text { - font-size: 28rpx; - color: #fff; - font-weight: 500; -} - -/* ========== 通用卡片 ========== */ -.card { - background-color: #fff; - border-radius: 16rpx; - padding: 32rpx; - margin-bottom: 24rpx; - box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); - word-wrap: break-word; -} - -.card-title { - font-size: 32rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 24rpx; -} - -.card-text { - font-size: 28rpx; - color: #666; - line-height: 1.8; - display: block; -} - -/* ========== 付费解锁毛玻璃区域 ========== */ -.paywall-card { - position: relative; - overflow: hidden; -} - -.paywall-content { - position: relative; - padding: 32rpx 24rpx 36rpx; - box-sizing: border-box; -} - -.paywall-blur { - padding: 32rpx 24rpx 140rpx; - border-radius: 24rpx; - background: rgba(255, 255, 255, 0.7); - backdrop-filter: blur(18rpx); -} - -.paywall-mask { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - border-radius: 24rpx; - background: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(245, 245, 245, 0.98)); - pointer-events: none; -} - -.paywall-fake-title { - display: block; - font-size: 30rpx; - font-weight: 600; - color: #444; - margin-bottom: 16rpx; -} - -.paywall-fake-line { - display: block; - font-size: 26rpx; - color: #888; - line-height: 1.8; -} - -.paywall-btn { - position: absolute; - left: 5%; - right: 5%; - width: 90%; - bottom: 56rpx; - padding: 20rpx 0; - border-radius: 999rpx; - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.35); - display: flex; - flex-direction: row; - align-items: baseline; - justify-content: center; - gap: 12rpx; -} - -/* 新版:按钮在文档流内(非 absolute) */ -.paywall-card .paywall-content .paywall-btn { - position: relative; - left: auto; - right: auto; - bottom: auto; - width: 100%; - margin-top: 28rpx; - flex-direction: column; - align-items: center; - gap: 10rpx; - padding: 28rpx 20rpx; - border-radius: 999rpx; -} - -.paywall-btn-main { - font-size: 30rpx; - color: #fff; - font-weight: 600; -} - -.paywall-btn-price { - font-size: 24rpx; - color: #ffe5f0; -} - -.paywall-tip { - display: block; - margin-top: 8rpx; - font-size: 22rpx; - color: #999; - text-align: center; -} - -.paywall-card .paywall-content .paywall-btn--compact { - flex-direction: row !important; - justify-content: center !important; - padding: 32rpx 40rpx !important; -} - -.paywall-btn--compact .paywall-btn-main { - font-size: 34rpx; - letter-spacing: 2rpx; -} - -.scene-teaser-bundle { - text-align: left; - padding-bottom: 28rpx !important; -} - -.scene-bundle-hint { - display: block; - font-size: 22rpx; - color: #94a3b8; - margin-bottom: 20rpx; -} - -.scene-teaser-item { - padding: 20rpx 0; - border-bottom: 1rpx solid #f1f5f9; -} - -.scene-teaser-item--last { - border-bottom: none; - padding-bottom: 8rpx; -} - -.scene-teaser-title { - display: block; - font-size: 28rpx; - font-weight: 600; - color: #334155; - margin-bottom: 16rpx; -} - -.scene-teaser-lines { - display: flex; - flex-direction: column; - gap: 12rpx; -} - -.scene-teaser-line { - height: 14rpx; - border-radius: 8rpx; - background: linear-gradient(90deg, #e2e8f0 0%, #f1f5f9 100%); - width: 100%; -} - -.scene-teaser-line--short { - width: 62%; -} - -.scene-detail-card { - border-left: 6rpx solid #e63946; - padding-left: 28rpx !important; -} - -.post-pay-guide { - margin: 16rpx 24rpx 0; - padding: 24rpx 28rpx; - background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%); - border-radius: 20rpx; - border: 1rpx solid rgba(16, 185, 129, 0.35); -} - -.post-pay-guide-title { - display: block; - font-size: 28rpx; - font-weight: 600; - color: #065f46; - margin-bottom: 8rpx; -} - -.post-pay-guide-desc { - display: block; - font-size: 24rpx; - color: #047857; - line-height: 1.45; - margin-bottom: 20rpx; -} - -.post-pay-guide-actions { - display: flex; - flex-wrap: wrap; - gap: 16rpx; -} - -.post-pay-guide-btn.phone { - margin: 0; - padding: 0 36rpx; - height: 72rpx; - line-height: 72rpx; - font-size: 28rpx; - font-weight: 600; - color: #fff; - background: linear-gradient(135deg, #10b981 0%, #34d399 100%); - border-radius: 36rpx; - border: none; -} - -.post-pay-guide-btn.phone::after { - border: none; -} - -.post-pay-guide-btn.profile { - padding: 0 36rpx; - height: 72rpx; - line-height: 72rpx; - font-size: 28rpx; - font-weight: 600; - color: #065f46; - background: #fff; - border-radius: 36rpx; - border: 2rpx solid #10b981; - text-align: center; -} - -/* ========== 性格类型卡片 ========== */ -.personality-card { - text-align: center; -} - -.personality-card-sub { - display: block; - font-size: 22rpx; - color: #94a3b8; - margin: -8rpx 0 24rpx; - letter-spacing: 1rpx; -} - -.type-chip-row { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 12rpx; - margin: 12rpx 0 8rpx; -} - -.type-chip { - font-size: 22rpx; - color: #64748b; - background: #f8fafc; - border: 1rpx solid #e2e8f0; - padding: 8rpx 20rpx; - border-radius: 999rpx; -} - -.type-chip--disc { - color: #2563eb; - background: #eff6ff; - border-color: #bfdbfe; -} - -.type-emoji { - display: block; - font-size: 36rpx; - margin-bottom: 4rpx; -} - -.type-emoji--disc { - opacity: 0.35; - font-size: 28rpx; -} - -.personality-type { - margin-bottom: 32rpx; -} - -.type-code { - font-size: 72rpx; - font-weight: 700; - color: #e63946; - display: block; - margin-bottom: 8rpx; -} - -.type-name { - font-size: 28rpx; - color: #666; - display: block; - margin-bottom: 16rpx; -} - -.type-desc { - font-size: 26rpx; - color: #888; - line-height: 1.6; - display: block; - text-align: center; - padding: 0 20rpx; -} - -.type-details { - display: flex; - gap: 24rpx; - margin-bottom: 8rpx; -} - -.result-cta-questionnaire { - box-sizing: border-box; - width: 100%; - max-width: 100%; - margin: 20rpx 0 32rpx; - padding: 24rpx 36rpx; - text-align: center; - background: linear-gradient(135deg, #e63946 0%, #e85d75 50%, #ff6b9d 100%); - border: none; - border-radius: 999rpx; - box-shadow: 0 6rpx 22rpx rgba(230, 57, 70, 0.35); -} - -.result-cta-questionnaire--pressed { - opacity: 0.92; - transform: scale(0.985); -} - -.result-cta-questionnaire-text { - font-size: 28rpx; - font-weight: 600; - color: #fff; - letter-spacing: 1rpx; -} - -.type-box { - flex: 1; - padding: 24rpx; - border-radius: 12rpx; - text-align: center; -} - -.pdp-box { - background: linear-gradient(135deg, #faf5fc 0%, #f3e5f5 100%); -} - -.disc-box { - background: linear-gradient(135deg, #f5f9fd 0%, #e3f2fd 100%); -} - -.type-label { - font-size: 24rpx; - color: #666; - display: block; - margin-bottom: 8rpx; -} - -.type-value { - font-size: 30rpx; - font-weight: 600; - display: block; - margin-bottom: 4rpx; -} - -.pdp-box .type-value { color: #7b1fa2; } -.disc-box .type-value { color: #1976d2; } - -.type-sub { - font-size: 22rpx; - color: #999; - display: block; -} - -/* 主要优势 */ -.advantages-box { - background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); - padding: 24rpx; - border-radius: 12rpx; - margin-bottom: 24rpx; -} - -.advantages-label { - font-size: 26rpx; - color: #666; - display: block; - text-align: center; - margin-bottom: 16rpx; -} - -.advantages-list { - display: flex; - justify-content: space-around; - flex-wrap: wrap; - gap: 16rpx; -} - -.advantage-item { - display: flex; - flex-direction: column; - align-items: center; -} - -.advantage-dot { - width: 12rpx; - height: 12rpx; - background-color: #4caf50; - border-radius: 50%; - margin-bottom: 8rpx; -} - -.advantage-text { - font-size: 24rpx; - font-weight: 500; - color: #333; -} - -.next-btn { - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - padding: 24rpx; - border-radius: 48rpx; - box-shadow: 0 8rpx 16rpx rgba(230, 57, 70, 0.3); -} - -.next-btn-text { - font-size: 28rpx; - font-weight: 600; - color: #fff; - display: block; - text-align: center; -} - -/* ========== Tab切换 ========== */ -.tabs { - display: flex; - border-bottom: 2rpx solid #f0f0f0; - margin-bottom: 24rpx; - background-color: #fff; - border-radius: 16rpx 16rpx 0 0; -} - -.tab { - flex: 1; - padding: 24rpx; - text-align: center; - position: relative; -} - -.tab.active::after { - content: ""; - position: absolute; - bottom: 0; - left: 50%; - transform: translateX(-50%); - width: 60rpx; - height: 4rpx; - background-color: #e63946; - border-radius: 2rpx; -} - -.tab-text { - font-size: 28rpx; - color: #999; -} - -.tab-text.active { - color: #e63946; - font-weight: 600; -} - -/* ========== 面相分析 ========== */ -.feature-list { - display: flex; - flex-direction: column; - gap: 20rpx; -} - -.feature-item { - display: flex; - font-size: 26rpx; - line-height: 1.8; -} - -.feature-label { - font-weight: 600; - color: #333; - flex-shrink: 0; -} - -.feature-desc { - color: #666; - flex: 1; -} - -/* 职业建议 */ -.career-list { - display: flex; - flex-direction: column; - gap: 24rpx; -} - -.career-item { - display: flex; - flex-direction: column; - gap: 8rpx; -} - -.career-header { - display: flex; - align-items: center; -} - -.career-dot { - width: 12rpx; - height: 12rpx; - background-color: #e63946; - border-radius: 50%; - margin-right: 16rpx; - flex-shrink: 0; -} - -.career-name { - font-size: 28rpx; - font-weight: 600; - color: #333; -} - -.career-reason { - font-size: 24rpx; - color: #666; - line-height: 1.6; - padding-left: 28rpx; -} - -/* 人际关系 */ -.interpersonal-content { - display: flex; - flex-direction: column; - gap: 20rpx; -} - -.interpersonal-item { - display: flex; - font-size: 26rpx; - line-height: 1.8; -} - -.interpersonal-label { - font-weight: 600; - color: #333; - flex-shrink: 0; -} - -.interpersonal-text { - color: #666; - flex: 1; -} - -/* 潜能 */ -.potential-list { - display: flex; - flex-direction: column; - gap: 20rpx; -} - -.potential-item { - display: flex; - flex-direction: column; - gap: 8rpx; -} - -.potential-name { - font-size: 28rpx; - font-weight: 600; - color: #333; -} - -.potential-desc { - font-size: 24rpx; - color: #666; - line-height: 1.6; - padding-left: 20rpx; -} - -/* ========== 骨相分析 ========== */ -.bone-content { - display: flex; - flex-direction: column; - gap: 20rpx; -} - -.bone-item { - display: flex; - font-size: 26rpx; - line-height: 1.8; -} - -.bone-label { - font-weight: 600; - color: #333; - flex-shrink: 0; - min-width: 120rpx; -} - -.bone-text { - color: #666; - flex: 1; -} - -/* 人生阶段 */ -.life-stage-list { - display: flex; - flex-direction: column; - gap: 24rpx; -} - -.life-stage-item { - background: linear-gradient(135deg, #fff9e6 0%, #fff3cd 100%); - padding: 20rpx; - border-radius: 12rpx; - border-left: 4rpx solid #ff9800; -} - -.stage-label { - font-size: 28rpx; - font-weight: 600; - color: #e65100; - display: block; - margin-bottom: 8rpx; -} - -.stage-desc { - font-size: 26rpx; - color: #666; - line-height: 1.8; - display: block; -} - -/* 骨相总评 */ -.bone-summary-content { - display: flex; - flex-direction: column; - gap: 24rpx; -} - -.summary-text { - font-size: 28rpx; - color: #333; - line-height: 1.8; - display: block; -} - -.suggestions-title { - font-size: 28rpx; - font-weight: 600; - color: #333; - margin-top: 8rpx; -} - -.suggestions-list { - display: flex; - flex-direction: column; - gap: 16rpx; - margin-top: 12rpx; -} - -.suggestion-item { - background: linear-gradient(135deg, #fce4ec 0%, #f8bbd0 100%); - padding: 16rpx 20rpx; - border-radius: 8rpx; -} - -.suggestion-text { - font-size: 26rpx; - color: #333; - line-height: 1.6; - display: block; -} - -/* ========== 简化版(无面相骨相数据) ========== */ -.simple-career-list { - display: flex; - flex-wrap: wrap; - gap: 16rpx; -} - -.simple-career-tag { - padding: 12rpx 24rpx; - background: #f3f4f6; - border-radius: 24rpx; - font-size: 26rpx; - color: #374151; -} - -/* AI 生成内容标识横幅(监管合规,始终显示) */ -.ai-disclosure-banner { - display: flex; - align-items: center; - justify-content: center; - gap: 12rpx; - margin: 24rpx 0; - padding: 16rpx 24rpx; - background: linear-gradient(135deg, #f0f4ff 0%, #e8ecf8 100%); - border: 1rpx solid #c7d2fe; - border-radius: 12rpx; -} - -.ai-disclosure-banner.bottom { - margin-top: 16rpx; - margin-bottom: 40rpx; -} - -.ai-disclosure-icon { - width: 44rpx; - height: 44rpx; - border-radius: 8rpx; - background: linear-gradient(135deg, #6366f1 0%, #818cf8 100%); - color: #fff; - font-size: 20rpx; - font-weight: 700; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; -} - -.ai-disclosure-text { - font-size: 22rpx; - color: #4338ca; - line-height: 1.4; -} - -/* ========== 操作按钮 ========== */ -.action-section { - margin-top: 16rpx; - padding-bottom: 40rpx; -} - -.btn { - display: flex; - align-items: center; - justify-content: center; - width: 100%!important; - height: 100rpx; - min-height: 100rpx; - border-radius: 28rpx; - margin-bottom: 20rpx; - padding: 0; - border: none; - line-height: 100rpx; - box-sizing: border-box; - overflow: hidden; -} - -.btn::after { - border: none; -} - -.btn-primary { - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.3); -} - -.btn-outline { - background: #fff; - border: 2rpx solid #e63946; -} - -.btn-text { - font-size: 32rpx; - font-weight: 600; - color: #fff; -} - -.btn-text-outline { - font-size: 30rpx; - color: #e63946; - font-weight: 500; -} - -/* ========== 无人脸错误状态 ========== */ -.no-face-wrap { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - padding: 40rpx 32rpx; - box-sizing: border-box; -} - -.no-face-card { - background: #fff; - border-radius: 24rpx; - padding: 60rpx 48rpx; - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08); -} - -.no-face-icon { - width: 120rpx; - height: 120rpx; - background: #fff3f3; - border-radius: 60rpx; - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 32rpx; -} - -.no-face-emoji { - font-size: 56rpx; - line-height: 1; -} - -.no-face-title { - font-size: 38rpx; - font-weight: 700; - color: #1a1a2e; - margin-bottom: 16rpx; - text-align: center; -} - -.no-face-desc { - font-size: 28rpx; - color: #e63946; - text-align: center; - line-height: 1.6; - margin-bottom: 40rpx; -} - -.no-face-tips { - width: 100%; - background: #f8f9fa; - border-radius: 16rpx; - padding: 28rpx 32rpx; - margin-bottom: 48rpx; - box-sizing: border-box; -} - -.no-face-tips-title { - font-size: 28rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 16rpx; -} - -.no-face-tip-item { - font-size: 26rpx; - color: #666; - line-height: 1.8; - display: block; -} - -.no-face-btn { - width: 100%; - height: 96rpx; - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - border-radius: 48rpx; - display: flex; - align-items: center; - justify-content: center; - box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.3); -} - -.no-face-btn-text { - font-size: 32rpx; - font-weight: 600; - color: #fff; -} - -/* ========== 盖洛普优势卡片 ========== */ -.gallup-list { - display: flex; - flex-direction: column; - gap: 20rpx; - margin-top: 12rpx; -} - -.gallup-item { - display: flex; - align-items: center; - gap: 24rpx; - padding: 18rpx 24rpx; - background: linear-gradient(135deg, rgba(230, 57, 70, 0.06) 0%, rgba(255, 107, 157, 0.04) 100%); - border-radius: 16rpx; - border-left: 6rpx solid #e63946; -} - -.gallup-rank { - width: 56rpx; - height: 56rpx; - border-radius: 50%; - background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); - display: flex; - align-items: center; - justify-content: center; - font-size: 28rpx; - font-weight: 700; - color: #fff; - flex-shrink: 0; - text-align: center; - line-height: 56rpx; -} - -.gallup-text { - font-size: 30rpx; - font-weight: 600; - color: #1a1a2e; -} - -/* ========== 企业版:职业画像 / HR视角 / 老板视角 ========== */ -.enterprise-section { - margin-bottom: 24rpx; -} - -.enterprise-section:last-child { - margin-bottom: 0; -} - -.enterprise-label { - font-size: 26rpx; - font-weight: 600; - color: #333; - display: block; - margin-bottom: 12rpx; -} - -.enterprise-sublabel { - font-size: 24rpx; - color: #888; - display: block; - margin-bottom: 8rpx; -} - -.enterprise-tags { - display: flex; - flex-wrap: wrap; - gap: 12rpx; -} - -.enterprise-tag { - padding: 10rpx 20rpx; - background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); - border-radius: 24rpx; - font-size: 24rpx; - color: #2e7d32; -} - -.enterprise-tag.risk { - background: linear-gradient(135deg, #fff3e0 0%, #ffe0b2 100%); - color: #e65100; -} - -.lifecycle-list { - display: flex; - flex-direction: column; - gap: 16rpx; -} - -.lifecycle-item { - padding: 16rpx 20rpx; - background: #f8f9fa; - border-radius: 12rpx; -} - -.lifecycle-key { - font-size: 24rpx; - color: #999; - display: block; - margin-bottom: 6rpx; -} - -.lifecycle-val { - font-size: 26rpx; - color: #333; - line-height: 1.6; - display: block; -} - -.boss-card { - border-left: 6rpx solid #1976d2; -} - -.boss-headline { - font-size: 30rpx; - font-weight: 600; - color: #1a1a2e; - line-height: 1.6; - display: block; - margin-bottom: 20rpx; -} - -.boss-metrics { - display: flex; - flex-wrap: wrap; - gap: 16rpx; -} - -.boss-metric { - flex: 1; - min-width: 140rpx; - padding: 16rpx; - background: #f5f5f5; - border-radius: 12rpx; - text-align: center; -} - -.boss-metric-label { - font-size: 22rpx; - color: #999; - display: block; - margin-bottom: 6rpx; -} - -.boss-metric-value { - font-size: 28rpx; - font-weight: 600; - color: #333; - display: block; -} - -.boss-metric-value.high { - color: #4caf50; -} - -.boss-metric-value.medium { - color: #ff9800; -} - -.boss-metric-value.low { - color: #f44336; -} +/* pages/index/result.wxss - AI分析结果(按旧版模板重构) */ +.container { + min-height: 100vh; + background-color: #f5f5f5; + padding: 0 24rpx 60rpx; +} + +/* ========== 分析中模态框 ========== */ +.analyzing-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; +} + +.analyzing-content { + background-color: #fff; + border-radius: 24rpx; + padding: 80rpx 60rpx; + width: 560rpx; + display: flex; + flex-direction: column; + align-items: center; + box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.15); +} + +.analyzing-icon { + width: 120rpx; + height: 120rpx; + margin-bottom: 40rpx; + display: flex; + align-items: center; + justify-content: center; +} + +.spinner { + width: 120rpx; + height: 120rpx; + border: 8rpx solid #e0e0e0; + border-top-color: #e63946; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.analyzing-title { + font-size: 36rpx; + font-weight: 600; + color: #333; + margin-bottom: 16rpx; +} + +.analyzing-desc { + font-size: 28rpx; + color: #e63946; + margin-bottom: 24rpx; + text-align: center; + font-weight: 500; +} + +.analyzing-bar { + width: 400rpx; + height: 12rpx; + background: #e5e5e5; + border-radius: 6rpx; + overflow: hidden; + margin-bottom: 24rpx; +} + +.analyzing-bar-fill { + height: 100%; + background: linear-gradient(90deg, #e63946, #ff6b9d); + border-radius: 6rpx; + transition: width 0.3s ease; +} + +.analyzing-hint { + font-size: 24rpx; + color: #999; + text-align: center; + line-height: 1.6; +} + +/* ========== 状态横幅 ========== */ +.status-banner { + background: linear-gradient(135deg, #e8f5e9 0%, #f1f8e9 100%); + padding: 24rpx; + border-radius: 12rpx; + display: flex; + align-items: center; + margin: 24rpx 0; +} + +.status-dot { + width: 12rpx; + height: 12rpx; + background-color: #4caf50; + border-radius: 50%; + margin-right: 16rpx; +} + +.status-text { + font-size: 26rpx; + color: #2e7d32; +} + +.error-banner { + background: linear-gradient(135deg, #ffebee 0%, #ffcdd2 100%); +} + +.error-dot { + background-color: #f44336; +} + +.error-banner .status-text { + color: #c62828; + font-weight: bold; +} + +.error-content { + background-color: #fff; + border-radius: 16rpx; + padding: 32rpx; + margin-bottom: 24rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); + border-left: 4rpx solid #f44336; +} + +.error-title { + font-size: 28rpx; + color: #c62828; + font-weight: bold; + display: block; + margin-bottom: 16rpx; +} + +.error-message { + font-size: 24rpx; + color: #666; + line-height: 1.8; + display: block; + white-space: pre-wrap; + word-break: break-all; + background-color: #f5f5f5; + padding: 16rpx; + border-radius: 8rpx; + margin-bottom: 24rpx; +} + +.retry-btn { + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + padding: 20rpx; + border-radius: 12rpx; + text-align: center; +} + +.retry-text { + font-size: 28rpx; + color: #fff; + font-weight: 500; +} + +/* ========== 通用卡片 ========== */ +.card { + background-color: #fff; + border-radius: 16rpx; + padding: 32rpx; + margin-bottom: 24rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); + word-wrap: break-word; +} + +.card-title { + font-size: 32rpx; + font-weight: 600; + color: #333; + display: block; + margin-bottom: 24rpx; +} + +.card-text { + font-size: 28rpx; + color: #666; + line-height: 1.8; + display: block; +} + +/* ========== 付费解锁毛玻璃区域 ========== */ +.paywall-card { + position: relative; + overflow: hidden; +} + +.paywall-content { + position: relative; + padding: 32rpx 24rpx 36rpx; + box-sizing: border-box; +} + +.paywall-blur { + padding: 32rpx 24rpx 140rpx; + border-radius: 24rpx; + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(18rpx); +} + +.paywall-mask { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + border-radius: 24rpx; + background: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(245, 245, 245, 0.98)); + pointer-events: none; +} + +.paywall-fake-title { + display: block; + font-size: 30rpx; + font-weight: 600; + color: #444; + margin-bottom: 16rpx; +} + +.paywall-fake-line { + display: block; + font-size: 26rpx; + color: #888; + line-height: 1.8; +} + +.paywall-btn { + position: absolute; + left: 5%; + right: 5%; + width: 90%; + bottom: 56rpx; + padding: 20rpx 0; + border-radius: 999rpx; + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.35); + display: flex; + flex-direction: row; + align-items: baseline; + justify-content: center; + gap: 12rpx; +} + +/* 新版:按钮在文档流内(非 absolute) */ +.paywall-card .paywall-content .paywall-btn { + position: relative; + left: auto; + right: auto; + bottom: auto; + width: 100%; + margin-top: 28rpx; + flex-direction: column; + align-items: center; + gap: 10rpx; + padding: 28rpx 20rpx; + border-radius: 999rpx; +} + +.paywall-btn-main { + font-size: 30rpx; + color: #fff; + font-weight: 600; +} + +.paywall-btn-price { + font-size: 24rpx; + color: #ffe5f0; +} + +.paywall-tip { + display: block; + margin-top: 8rpx; + font-size: 22rpx; + color: #999; + text-align: center; +} + +.paywall-card .paywall-content .paywall-btn--compact { + flex-direction: row !important; + justify-content: center !important; + padding: 32rpx 40rpx !important; +} + +.paywall-btn--compact .paywall-btn-main { + font-size: 34rpx; + letter-spacing: 2rpx; +} + +.scene-teaser-bundle { + text-align: left; + padding-bottom: 28rpx !important; +} + +.scene-bundle-hint { + display: block; + font-size: 22rpx; + color: #94a3b8; + margin-bottom: 20rpx; +} + +.scene-teaser-item { + padding: 20rpx 0; + border-bottom: 1rpx solid #f1f5f9; +} + +.scene-teaser-item--last { + border-bottom: none; + padding-bottom: 8rpx; +} + +.scene-teaser-title { + display: block; + font-size: 28rpx; + font-weight: 600; + color: #334155; + margin-bottom: 16rpx; +} + +.scene-teaser-lines { + display: flex; + flex-direction: column; + gap: 12rpx; +} + +.scene-teaser-line { + height: 14rpx; + border-radius: 8rpx; + background: linear-gradient(90deg, #e2e8f0 0%, #f1f5f9 100%); + width: 100%; +} + +.scene-teaser-line--short { + width: 62%; +} + +.scene-detail-card { + border-left: 6rpx solid #e63946; + padding-left: 28rpx !important; +} + +.post-pay-guide { + margin: 16rpx 24rpx 0; + padding: 24rpx 28rpx; + background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%); + border-radius: 20rpx; + border: 1rpx solid rgba(16, 185, 129, 0.35); +} + +.post-pay-guide-title { + display: block; + font-size: 28rpx; + font-weight: 600; + color: #065f46; + margin-bottom: 8rpx; +} + +.post-pay-guide-desc { + display: block; + font-size: 24rpx; + color: #047857; + line-height: 1.45; + margin-bottom: 20rpx; +} + +.post-pay-guide-actions { + display: flex; + flex-wrap: wrap; + gap: 16rpx; +} + +.post-pay-guide-btn.phone { + margin: 0; + padding: 0 36rpx; + height: 72rpx; + line-height: 72rpx; + font-size: 28rpx; + font-weight: 600; + color: #fff; + background: linear-gradient(135deg, #10b981 0%, #34d399 100%); + border-radius: 36rpx; + border: none; +} + +.post-pay-guide-btn.phone::after { + border: none; +} + +.post-pay-guide-btn.profile { + padding: 0 36rpx; + height: 72rpx; + line-height: 72rpx; + font-size: 28rpx; + font-weight: 600; + color: #065f46; + background: #fff; + border-radius: 36rpx; + border: 2rpx solid #10b981; + text-align: center; +} + +/* ========== 性格类型卡片 ========== */ +.personality-card { + text-align: center; +} + +.personality-card-sub { + display: block; + font-size: 22rpx; + color: #94a3b8; + margin: -8rpx 0 24rpx; + letter-spacing: 1rpx; +} + +.type-chip-row { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12rpx; + margin: 12rpx 0 8rpx; +} + +.type-chip { + font-size: 22rpx; + color: #64748b; + background: #f8fafc; + border: 1rpx solid #e2e8f0; + padding: 8rpx 20rpx; + border-radius: 999rpx; +} + +.type-chip--disc { + color: #2563eb; + background: #eff6ff; + border-color: #bfdbfe; +} + +.type-chip--sbti { + color: #00695c; + background: #e0f2f1; + border-color: #b2dfdb; +} + +.type-emoji { + display: block; + font-size: 36rpx; + margin-bottom: 4rpx; +} + +.type-emoji--disc { + opacity: 0.35; + font-size: 28rpx; +} + +.personality-type { + margin-bottom: 32rpx; +} + +.type-code { + font-size: 72rpx; + font-weight: 700; + color: #e63946; + display: block; + margin-bottom: 8rpx; +} + +.type-name { + font-size: 28rpx; + color: #666; + display: block; + margin-bottom: 16rpx; +} + +.type-desc { + font-size: 26rpx; + color: #888; + line-height: 1.6; + display: block; + text-align: center; + padding: 0 20rpx; +} + +.type-details { + display: flex; + flex-wrap: wrap; + gap: 24rpx; + margin-bottom: 8rpx; +} + +.type-details--wrap .type-box { + flex: 1 1 38%; + min-width: 260rpx; +} + + +.result-cta-questionnaire { + box-sizing: border-box; + width: 100%; + max-width: 100%; + margin: 20rpx 0 32rpx; + padding: 24rpx 36rpx; + text-align: center; + background: linear-gradient(135deg, #e63946 0%, #e85d75 50%, #ff6b9d 100%); + border: none; + border-radius: 999rpx; + box-shadow: 0 6rpx 22rpx rgba(230, 57, 70, 0.35); +} + +.result-cta-questionnaire--pressed { + opacity: 0.92; + transform: scale(0.985); +} + +.result-cta-questionnaire-text { + font-size: 28rpx; + font-weight: 600; + color: #fff; + letter-spacing: 1rpx; +} + +.type-box { + flex: 1; + padding: 24rpx; + border-radius: 12rpx; + text-align: center; +} + +.pdp-box { + background: linear-gradient(135deg, #faf5fc 0%, #f3e5f5 100%); +} + +.disc-box { + background: linear-gradient(135deg, #f5f9fd 0%, #e3f2fd 100%); +} + +/* SBTI 盒子:家族化重塑 */ +.sbti-box { + flex: 1 1 100% !important; + background: linear-gradient(135deg, #fffbeb 0%, #fef3c7 100%) !important; + margin-top: 10rpx; +} + +.sbti-box .type-value { + color: #d97706; +} + +.type-desc-small { + display: block; + font-size: 24rpx; + color: #92400e; + line-height: 1.5; + margin-top: 8rpx; + padding: 0 10rpx; +} + +/* 恢复:经典绿色优势区 */ +.advantages-box { + background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); + padding: 32rpx 24rpx; + border-radius: 20rpx; + margin: 24rpx 0 32rpx; +} + +.advantages-label { + font-size: 26rpx; + font-weight: 600; + color: #2e7d32; + display: block; + text-align: center; + margin-bottom: 24rpx; + letter-spacing: 2rpx; +} + +.advantages-list { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 20rpx; +} + +.advantage-pill { + background: #ffffff; + padding: 14rpx 36rpx; + border-radius: 999rpx; + box-shadow: 0 4rpx 12rpx rgba(46, 125, 50, 0.08); +} + +.advantage-pill-text { + font-size: 24rpx; + font-weight: 600; + color: #2e7d32; +} + display: block; + text-align: center; + margin-bottom: 16rpx; +} + +.advantages-list { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 20rpx; +} + +.advantage-tag { + background: rgba(255, 255, 255, 0.6); + padding: 12rpx 28rpx; + border-radius: 999rpx; + border: 1rpx solid rgba(76, 175, 80, 0.2); +} + +.advantage-tag-text { + font-size: 24rpx; + font-weight: 600; + color: #2e7d32; +} + +.next-btn { + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + padding: 24rpx; + border-radius: 48rpx; + box-shadow: 0 8rpx 16rpx rgba(230, 57, 70, 0.3); +} + +.next-btn-text { + font-size: 28rpx; + font-weight: 600; + color: #fff; + display: block; + text-align: center; +} + +/* ========== Tab切换 ========== */ +.tabs { + display: flex; + border-bottom: 2rpx solid #f0f0f0; + margin-bottom: 24rpx; + background-color: #fff; + border-radius: 16rpx 16rpx 0 0; +} + +.tab { + flex: 1; + padding: 24rpx; + text-align: center; + position: relative; +} + +.tab.active::after { + content: ""; + position: absolute; + bottom: 0; + left: 50%; + transform: translateX(-50%); + width: 60rpx; + height: 4rpx; + background-color: #e63946; + border-radius: 2rpx; +} + +.tab-text { + font-size: 28rpx; + color: #999; +} + +.tab-text.active { + color: #e63946; + font-weight: 600; +} + +/* ========== 面相分析 ========== */ +.feature-list { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.feature-item { + display: flex; + font-size: 26rpx; + line-height: 1.8; +} + +.feature-label { + font-weight: 600; + color: #333; + flex-shrink: 0; +} + +.feature-desc { + color: #666; + flex: 1; +} + +/* 职业建议 */ +.career-list { + display: flex; + flex-direction: column; + gap: 24rpx; +} + +.career-item { + display: flex; + flex-direction: column; + gap: 8rpx; +} + +.career-header { + display: flex; + align-items: center; +} + +.career-dot { + width: 12rpx; + height: 12rpx; + background-color: #e63946; + border-radius: 50%; + margin-right: 16rpx; + flex-shrink: 0; +} + +.career-name { + font-size: 28rpx; + font-weight: 600; + color: #333; +} + +.career-reason { + font-size: 24rpx; + color: #666; + line-height: 1.6; + padding-left: 28rpx; +} + +/* 人际关系 */ +.interpersonal-content { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.interpersonal-item { + display: flex; + font-size: 26rpx; + line-height: 1.8; +} + +.interpersonal-label { + font-weight: 600; + color: #333; + flex-shrink: 0; +} + +.interpersonal-text { + color: #666; + flex: 1; +} + +/* 潜能 */ +.potential-list { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.potential-item { + display: flex; + flex-direction: column; + gap: 8rpx; +} + +.potential-name { + font-size: 28rpx; + font-weight: 600; + color: #333; +} + +.potential-desc { + font-size: 24rpx; + color: #666; + line-height: 1.6; + padding-left: 20rpx; +} + +/* ========== 骨相分析 ========== */ +.bone-content { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.bone-item { + display: flex; + font-size: 26rpx; + line-height: 1.8; +} + +.bone-label { + font-weight: 600; + color: #333; + flex-shrink: 0; + min-width: 120rpx; +} + +.bone-text { + color: #666; + flex: 1; +} + +/* 人生阶段 */ +.life-stage-list { + display: flex; + flex-direction: column; + gap: 24rpx; +} + +.life-stage-item { + background: linear-gradient(135deg, #fff9e6 0%, #fff3cd 100%); + padding: 20rpx; + border-radius: 12rpx; + border-left: 4rpx solid #ff9800; +} + +.stage-label { + font-size: 28rpx; + font-weight: 600; + color: #e65100; + display: block; + margin-bottom: 8rpx; +} + +.stage-desc { + font-size: 26rpx; + color: #666; + line-height: 1.8; + display: block; +} + +/* 骨相总评 */ +.bone-summary-content { + display: flex; + flex-direction: column; + gap: 24rpx; +} + +.summary-text { + font-size: 28rpx; + color: #333; + line-height: 1.8; + display: block; +} + +.suggestions-title { + font-size: 28rpx; + font-weight: 600; + color: #333; + margin-top: 8rpx; +} + +.suggestions-list { + display: flex; + flex-direction: column; + gap: 16rpx; + margin-top: 12rpx; +} + +.suggestion-item { + background: linear-gradient(135deg, #fce4ec 0%, #f8bbd0 100%); + padding: 16rpx 20rpx; + border-radius: 8rpx; +} + +.suggestion-text { + font-size: 26rpx; + color: #333; + line-height: 1.6; + display: block; +} + +/* ========== 简化版(无面相骨相数据) ========== */ +.simple-career-list { + display: flex; + flex-wrap: wrap; + gap: 16rpx; +} + +.simple-career-tag { + padding: 12rpx 24rpx; + background: #f3f4f6; + border-radius: 24rpx; + font-size: 26rpx; + color: #374151; +} + +/* AI 生成内容标识横幅(监管合规,始终显示) */ +.ai-disclosure-banner { + display: flex; + align-items: center; + justify-content: center; + gap: 12rpx; + margin: 24rpx 0; + padding: 16rpx 24rpx; + background: linear-gradient(135deg, #f0f4ff 0%, #e8ecf8 100%); + border: 1rpx solid #c7d2fe; + border-radius: 12rpx; +} + +.ai-disclosure-banner.bottom { + margin-top: 16rpx; + margin-bottom: 40rpx; +} + +.ai-disclosure-icon { + width: 44rpx; + height: 44rpx; + border-radius: 8rpx; + background: linear-gradient(135deg, #6366f1 0%, #818cf8 100%); + color: #fff; + font-size: 20rpx; + font-weight: 700; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.ai-disclosure-text { + font-size: 22rpx; + color: #4338ca; + line-height: 1.4; +} + +/* ========== 操作按钮 ========== */ +.action-section { + margin-top: 16rpx; + padding-bottom: 40rpx; +} + +.btn { + display: flex; + align-items: center; + justify-content: center; + width: 100%!important; + height: 100rpx; + min-height: 100rpx; + border-radius: 28rpx; + margin-bottom: 20rpx; + padding: 0; + border: none; + line-height: 100rpx; + box-sizing: border-box; + overflow: hidden; +} + +.btn::after { + border: none; +} + +.btn-primary { + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.3); +} + +.btn-outline { + background: #fff; + border: 2rpx solid #e63946; +} + +.btn-text { + font-size: 32rpx; + font-weight: 600; + color: #fff; +} + +.btn-text-outline { + font-size: 30rpx; + color: #e63946; + font-weight: 500; +} + +/* ========== 无人脸错误状态 ========== */ +.no-face-wrap { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 40rpx 32rpx; + box-sizing: border-box; +} + +.no-face-card { + background: #fff; + border-radius: 24rpx; + padding: 60rpx 48rpx; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08); +} + +.no-face-icon { + width: 120rpx; + height: 120rpx; + background: #fff3f3; + border-radius: 60rpx; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 32rpx; +} + +.no-face-emoji { + font-size: 56rpx; + line-height: 1; +} + +.no-face-title { + font-size: 38rpx; + font-weight: 700; + color: #1a1a2e; + margin-bottom: 16rpx; + text-align: center; +} + +.no-face-desc { + font-size: 28rpx; + color: #e63946; + text-align: center; + line-height: 1.6; + margin-bottom: 40rpx; +} + +.no-face-tips { + width: 100%; + background: #f8f9fa; + border-radius: 16rpx; + padding: 28rpx 32rpx; + margin-bottom: 48rpx; + box-sizing: border-box; +} + +.no-face-tips-title { + font-size: 28rpx; + font-weight: 600; + color: #333; + display: block; + margin-bottom: 16rpx; +} + +.no-face-tip-item { + font-size: 26rpx; + color: #666; + line-height: 1.8; + display: block; +} + +.no-face-btn { + width: 100%; + height: 96rpx; + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + border-radius: 48rpx; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 8rpx 24rpx rgba(230, 57, 70, 0.3); +} + +.no-face-btn-text { + font-size: 32rpx; + font-weight: 600; + color: #fff; +} + +/* ========== 盖洛普优势卡片 ========== */ +.gallup-list { + display: flex; + flex-direction: column; + gap: 20rpx; + margin-top: 12rpx; +} + +.gallup-item { + display: flex; + align-items: center; + gap: 24rpx; + padding: 18rpx 24rpx; + background: linear-gradient(135deg, rgba(230, 57, 70, 0.06) 0%, rgba(255, 107, 157, 0.04) 100%); + border-radius: 16rpx; + border-left: 6rpx solid #e63946; +} + +.gallup-rank { + width: 56rpx; + height: 56rpx; + border-radius: 50%; + background: linear-gradient(135deg, #e63946 0%, #ff6b9d 100%); + display: flex; + align-items: center; + justify-content: center; + font-size: 28rpx; + font-weight: 700; + color: #fff; + flex-shrink: 0; + text-align: center; + line-height: 56rpx; +} + +.gallup-text { + font-size: 30rpx; + font-weight: 600; + color: #1a1a2e; +} + +/* ========== 企业版:职业画像 / HR视角 / 老板视角 ========== */ +.enterprise-section { + margin-bottom: 24rpx; +} + +.enterprise-section:last-child { + margin-bottom: 0; +} + +.enterprise-label { + font-size: 26rpx; + font-weight: 600; + color: #333; + display: block; + margin-bottom: 12rpx; +} + +.enterprise-sublabel { + font-size: 24rpx; + color: #888; + display: block; + margin-bottom: 8rpx; +} + +.enterprise-tags { + display: flex; + flex-wrap: wrap; + gap: 12rpx; +} + +.enterprise-tag { + padding: 10rpx 20rpx; + background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); + border-radius: 24rpx; + font-size: 24rpx; + color: #2e7d32; +} + +.enterprise-tag.risk { + background: linear-gradient(135deg, #fff3e0 0%, #ffe0b2 100%); + color: #e65100; +} + +.lifecycle-list { + display: flex; + flex-direction: column; + gap: 16rpx; +} + +.lifecycle-item { + padding: 16rpx 20rpx; + background: #f8f9fa; + border-radius: 12rpx; +} + +.lifecycle-key { + font-size: 24rpx; + color: #999; + display: block; + margin-bottom: 6rpx; +} + +.lifecycle-val { + font-size: 26rpx; + color: #333; + line-height: 1.6; + display: block; +} + +.boss-card { + border-left: 6rpx solid #1976d2; +} + +.boss-headline { + font-size: 30rpx; + font-weight: 600; + color: #1a1a2e; + line-height: 1.6; + display: block; + margin-bottom: 20rpx; +} + +.boss-metrics { + display: flex; + flex-wrap: wrap; + gap: 16rpx; +} + +.boss-metric { + flex: 1; + min-width: 140rpx; + padding: 16rpx; + background: #f5f5f5; + border-radius: 12rpx; + text-align: center; +} + +.boss-metric-label { + font-size: 22rpx; + color: #999; + display: block; + margin-bottom: 6rpx; +} + +.boss-metric-value { + font-size: 28rpx; + font-weight: 600; + color: #333; + display: block; +} + +.boss-metric-value.high { + color: #4caf50; +} + +.boss-metric-value.medium { + color: #ff9800; +} + +.boss-metric-value.low { + color: #f44336; +} diff --git a/miniprogram/pages/index/result.js b/miniprogram/pages/index/result.js index 3249adb..21c02f4 100644 --- a/miniprogram/pages/index/result.js +++ b/miniprogram/pages/index/result.js @@ -71,6 +71,9 @@ Page({ pdpEmoji: '', disc: '', discAux: '', + sbtiCode: '', + sbtiCn: '', + sbtiMainTypeDesc: '', traits: [], faceAnalysisText: '', boneAnalysisText: '', @@ -96,6 +99,8 @@ Page({ // 是否已在本地拥有手机号(决定是否还需要弹出微信手机号授权) hasPhone: false, isProfileComplete: false, + /** 企业后台关闭 SBTI 时不展示人脸报告中的 SBTI(与 enterprisePermissions.sbti 一致) */ + showSbtiFace: true, analyzingTitle: '正在分析中', reportTitle: '分析报告', aiAnalysisText: '智能分析' @@ -182,7 +187,13 @@ Page({ }, onShow() { - this.setData({ hasPhone: hasPhone(), isProfileComplete: isProfileComplete() }) + const ep = app.globalData.enterprisePermissions + const showSbtiFace = !ep || ep.sbti !== false + this.setData({ + hasPhone: hasPhone(), + isProfileComplete: isProfileComplete(), + showSbtiFace + }) const tc = app.globalData.textConfig if (tc) { this.setData({ @@ -215,7 +226,7 @@ Page({ '正在识别面部特征...', '分析眉眼特征...', '结合《冰鉴》分析骨形...', - '匹配MBTI/PDP/DISC...', + '匹配MBTI/PDP/DISC/SBTI...', '生成综合报告...' ] let progress = 0 @@ -284,6 +295,13 @@ Page({ // 处理API返回结果 processResult(apiData) { + const ep = app.globalData.enterprisePermissions + const showSbtiFace = !ep || ep.sbti !== false + const sbtiCode = showSbtiFace ? (apiData.sbti?.code || apiData.sbtiType || '') : '' + const sbtiCn = showSbtiFace ? (apiData.sbti?.cn || apiData.sbtiCn || '') : '' + const sbtiMainTypeDesc = (showSbtiFace && (sbtiCode || sbtiCn)) + ? (apiData.sbti?.mainTypeDesc || apiData.sbtiMainTypeDesc || '维度命中度较高,当前结果可视为你的第一人格画像。') + : '' const base = { mbti: apiData.mbti?.type || '', title: apiData.mbti?.title || '', @@ -293,6 +311,9 @@ Page({ pdpEmoji: this.getPDPEmoji(apiData.pdp?.primary), disc: apiData.disc?.primary || '', discAux: apiData.disc?.secondary || '', + sbtiCode, + sbtiCn, + sbtiMainTypeDesc, traits: Array.isArray(apiData.advantages) ? apiData.advantages : [], faceAnalysisText: typeof apiData.faceAnalysis === 'string' ? apiData.faceAnalysis : '', boneAnalysisText: typeof apiData.boneAnalysis === 'string' ? apiData.boneAnalysis : '', @@ -321,7 +342,8 @@ Page({ isAnalyzing: false, showResult: true, hasError: false, - result + result, + showSbtiFace } // 记录本次测试记录ID(由 /api/analyze 返回) diff --git a/miniprogram/pages/index/result.wxml b/miniprogram/pages/index/result.wxml index f4aa202..9831be8 100644 --- a/miniprogram/pages/index/result.wxml +++ b/miniprogram/pages/index/result.wxml @@ -81,7 +81,7 @@ {{result.summary}} - + {{result.pdpEmoji}} PDP主性格 @@ -94,14 +94,23 @@ {{result.disc || '--'}}型 辅助: {{result.discAux}} + + + + SBTI解读 + {{result.sbtiCode}}({{result.sbtiCn}}) + {{result.sbtiMainTypeDesc}} + 主要优势 - - - {{item}} + + {{item}} diff --git a/miniprogram/pages/index/result.wxss b/miniprogram/pages/index/result.wxss index c5f8d48..0dce048 100644 --- a/miniprogram/pages/index/result.wxss +++ b/miniprogram/pages/index/result.wxss @@ -559,6 +559,23 @@ background: linear-gradient(180deg, rgba(255, 255, 255, 0), #fff); } +.personality-card--locked .face-sbti-card { + max-height: 200rpx; + overflow: hidden; + position: relative; +} + +.personality-card--locked .face-sbti-card::after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 48rpx; + background: linear-gradient(180deg, rgba(255, 255, 255, 0), #e8f5f2); + border-radius: 0 0 16rpx 16rpx; +} + .personality-card--locked .next-btn { opacity: 0.45; pointer-events: none; @@ -641,10 +658,17 @@ .type-details { display: flex; + flex-wrap: wrap; gap: 24rpx; margin-bottom: 8rpx; } +.type-details--wrap .type-box { + flex: 1 1 38%; + min-width: 260rpx; +} + + .result-cta-questionnaire { box-sizing: border-box; width: 100%; @@ -701,54 +725,62 @@ .pdp-box .type-value { color: #7b1fa2; } .disc-box .type-value { color: #1976d2; } - -.type-sub { - font-size: 22rpx; - color: #999; - display: block; +/* SBTI 盒子:家族化重塑 */ +.sbti-box { + flex: 1 1 100% !important; + background: linear-gradient(135deg, #fffbeb 0%, #fef3c7 100%) !important; + margin-top: 10rpx; } -/* 主要优势 */ +.sbti-box .type-value { + color: #d97706; +} + +.type-desc-small { + display: block; + font-size: 24rpx; + color: #92400e; + line-height: 1.5; + margin-top: 8rpx; + padding: 0 10rpx; +} + +/* 恢复:经典绿色优势区 */ .advantages-box { background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%); - padding: 24rpx; - border-radius: 12rpx; - margin-bottom: 24rpx; + padding: 32rpx 24rpx; + border-radius: 20rpx; + margin: 24rpx 0 32rpx; } .advantages-label { font-size: 26rpx; - color: #666; + font-weight: 600; + color: #2e7d32; display: block; text-align: center; - margin-bottom: 16rpx; + margin-bottom: 24rpx; + letter-spacing: 2rpx; } .advantages-list { display: flex; - justify-content: space-around; + justify-content: center; flex-wrap: wrap; - gap: 16rpx; + gap: 20rpx; } -.advantage-item { - display: flex; - flex-direction: column; - align-items: center; +.advantage-pill { + background: #ffffff; + padding: 14rpx 36rpx; + border-radius: 999rpx; + box-shadow: 0 4rpx 12rpx rgba(46, 125, 50, 0.08); } -.advantage-dot { - width: 12rpx; - height: 12rpx; - background-color: #4caf50; - border-radius: 50%; - margin-bottom: 8rpx; -} - -.advantage-text { +.advantage-pill-text { font-size: 24rpx; - font-weight: 500; - color: #333; + font-weight: 600; + color: #2e7d32; } .next-btn {