Files
----/前端源码/uni-app/components/screens/CompanyNamingDetail.vue

2329 lines
78 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="company-detail" :class="{ 'company-detail--desktop': desktopLayout }">
<!-- Starry Background -->
<view class="starry-bg">
<view v-for="star in stars" :key="star.id" class="star" :style="{
top: star.top,
left: star.left,
width: star.size + 'px',
height: star.size + 'px',
animationDuration: star.duration + 's',
animationDelay: star.delay + 's',
}"></view>
<view class="glow-top"></view>
<view class="glow-bottom"></view>
</view>
<!-- Header -->
<view class="detail-header">
<view class="detail-header-back" @click="handleBack">
<text class="back-icon"></text>
<text class="back-text">返回</text>
</view>
<text class="detail-header-title">商号详解</text>
<view class="detail-header-favorite" @click="toggleFavorite">
<text class="favorite-icon" :class="{ 'favorite-icon-active': isFavorited }">{{ isFavorited ? '❤' : '♡'
}}</text>
</view>
</view>
<!-- Content -->
<scroll-view scroll-y class="detail-content" :class="{ 'detail-content--desktop': desktopLayout }">
<view class="detail-content-inner" :class="{ 'detail-content-inner--desktop': desktopLayout }">
<!-- 1. 总分卡片 -->
<view class="score-card" @click="openModal('zonghe')">
<view class="score-corner score-corner-tl"></view>
<view class="score-corner score-corner-tr"></view>
<view class="score-corner score-corner-bl"></view>
<view class="score-corner score-corner-br"></view>
<view class="score-label">TOTAL SCORE</view>
<view class="score-value-wrap">
<text class="score-value">{{ detailData.total_score }}</text>
<view class="score-ring"></view>
</view>
<view class="score-stars">
<text v-for="i in 5" :key="i" class="score-star"
:class="{ active: i <= detailData.star_rating }"></text>
</view>
<view class="score-divider"></view>
<text class="score-name">{{ detailData.name }}</text>
<text class="score-pinyin">{{ detailData.pinyin }}</text>
<view v-if="zongheContent" class="master-comment">
<text class="master-rating">{{ zongheContent.rating }}</text>
<text class="master-summary-preview">{{ truncateText(zongheContent.summary, 50) }}</text>
<text class="click-hint">点击查看详解 </text>
</view>
</view>
<!-- 2. 品牌意象解析 -->
<view v-if="pinpaiSection" class="section" @click="openModal('pinpai')">
<view class="section-title">
<text class="section-icon">🏢</text>
<text class="section-text">{{ pinpaiSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="meaning-card">
<view class="meaning-quote"></view>
<text class="meaning-label">商业寓意</text>
<text class="meaning-text">{{ detailData.name_meaning }}</text>
<view class="meaning-judge">
<text class="meaning-judge-label">判断</text>
<text class="meaning-judge-text">{{ pinpaiSection.summary_data.judgment }}</text>
</view>
</view>
</view>
<!-- 3. 商业数理吉凶 -->
<view v-if="shuliSection" class="section" @click="openModal('shuli')">
<view class="section-title">
<text class="section-icon">#</text>
<text class="section-text">{{ shuliSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="math-card">
<view class="math-header">
<view class="math-info">
<text class="math-label">总格 (81数理)</text>
<text class="math-value">{{ shuliSection.summary_data.number }} ({{
shuliSection.summary_data.luck }})</text>
</view>
<text class="math-badge">{{ shuliSection.summary_data.luck_name }}</text>
</view>
</view>
</view>
<!-- 4. 市场潜力评估 -->
<view v-if="shichangSection" class="section section--desktop-wide" @click="openModal('shichang')">
<view class="section-title">
<text class="section-icon">📊</text>
<text class="section-text">{{ shichangSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="radar-card">
<view class="radar-labels">
<view class="radar-label-item">
<text class="radar-label-name">传播力</text>
<text class="radar-label-value">{{ formatScore(shichangSection.summary_data.scores.comm)
}}</text>
</view>
<view class="radar-label-item">
<text class="radar-label-name">契合度</text>
<text class="radar-label-value">{{
formatScore(shichangSection.summary_data.scores.compat)
}}</text>
</view>
<view class="radar-label-item">
<text class="radar-label-name">财运</text>
<text class="radar-label-value">{{
formatScore(shichangSection.summary_data.scores.wealth)
}}</text>
</view>
<view class="radar-label-item">
<text class="radar-label-name">领导力</text>
<text class="radar-label-value">{{ formatScore(shichangSection.summary_data.scores.lead)
}}</text>
</view>
<view class="radar-label-item">
<text class="radar-label-name">凝聚力</text>
<text class="radar-label-value">{{
formatScore(shichangSection.summary_data.scores.cohes)
}}</text>
</view>
<view class="radar-label-item">
<text class="radar-label-name">创新力</text>
<text class="radar-label-value">{{
formatScore(shichangSection.summary_data.scores.innov)
}}</text>
</view>
</view>
</view>
</view>
<!-- 5. 商业卦象 -->
<view v-if="guaxiangSection" class="section" @click="openModal('guaxiang')">
<view class="section-title">
<text class="section-icon"></text>
<text class="section-text">{{ guaxiangSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="gua-card">
<view class="gua-bg-text">{{ getGuaChar(guaxiangSection.summary_data.gua) }}</view>
<view class="gua-content">
<view class="gua-header">
<text class="gua-name">{{ guaxiangSection.summary_data.gua }}</text>
<text class="gua-badge">{{ guaxiangSection.summary_data.gua_type }}</text>
</view>
<text class="gua-desc">{{ guaxiangSection.summary_data.text }}</text>
</view>
</view>
</view>
<!-- 5b5g. 与公司测名 JSON 扩展模块与个人测名同字段名liuyao -->
<view v-if="hasCompanyLiuyao" class="section" @click="openModal('liuyao')">
<view class="section-title">
<text class="section-icon">🔮</text>
<text class="section-text">六爻</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="meaning-card company-extra-card">
<view class="meaning-quote"></view>
<text v-if="toText(companyLiuyao?.hexagram_title)" class="modal-text company-extra-strong">{{
companyLiuyao?.hexagram_title }}</text>
<text v-if="toText(companyLiuyao?.changing_summary)" class="modal-text">动爻{{
companyLiuyao?.changing_summary }}</text>
<text v-if="toText(companyLiuyao?.interpretation)" class="modal-text">{{
companyLiuyao?.interpretation }}</text>
<text v-for="(yl, yi) in arr(companyLiuyao?.yao_lines).slice(0, 6)" :key="yi" class="modal-text">{{
toText(yl) }}</text>
</view>
</view>
<view v-if="hasCompanyWuxingBagua" class="section" @click="openModal('wuxing_bagua')">
<view class="section-title">
<text class="section-icon"></text>
<text class="section-text">五行八卦</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="math-card company-extra-flat">
<text v-if="toText(companyWuxingBagua?.wuxing_sketch)" class="modal-text company-extra-strong">五行{{
companyWuxingBagua?.wuxing_sketch }}</text>
<text v-if="toText(companyWuxingBagua?.bagua_profile)" class="modal-text">八卦{{
companyWuxingBagua?.bagua_profile }}</text>
<text v-if="toText(companyWuxingBagua?.mutual_sketch)" class="modal-text">{{
companyWuxingBagua?.mutual_sketch }}</text>
<text v-if="toText(companyWuxingBagua?.summary)" class="modal-text">{{ companyWuxingBagua?.summary
}}</text>
</view>
</view>
<view v-if="hasCompanyZodiacSign" class="section" @click="openModal('zodiac_sign')">
<view class="section-title">
<text class="section-icon">🐲</text>
<text class="section-text">属相</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="founder-card company-extra-card">
<view class="founder-header">
<view class="founder-avatar">
<text class="founder-avatar-text">{{ toText(companyZodiacSign?.animal_icon) ||
toText(companyZodiacSign?.animal).slice(0, 1) || '属' }}</text>
</view>
<view class="founder-info">
<text class="founder-title">属相</text>
<text class="founder-desc">{{ toText(companyZodiacSign?.animal) }} {{
toText(companyZodiacSign?.earthly_branch) }}</text>
<text v-if="toText(companyZodiacSign?.trait_summary)" class="modal-text company-extra-sub">{{
companyZodiacSign?.trait_summary }}</text>
<text v-if="toText(companyZodiacSign?.name_harmony)" class="modal-text company-extra-sub">与商号{{
companyZodiacSign?.name_harmony }}</text>
</view>
</view>
</view>
</view>
<view v-if="hasCompanyCareerPlan" class="section" @click="openModal('career_plan')">
<view class="section-title">
<text class="section-icon">💼</text>
<text class="section-text">事业规划</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="math-card company-extra-flat">
<text v-if="toText(companyCareerPlan?.summary)" class="modal-text">{{ companyCareerPlan?.summary
}}</text>
<view v-for="(m, mi) in arr(companyCareerPlan?.milestones)" :key="mi"
class="company-career-milestone">
<text class="modal-text company-extra-strong">{{ toText(m?.phase) }}{{ toText(m?.period) ? ' · '
+ toText(m.period) : '' }}</text>
<text v-if="toText(m?.focus)" class="modal-text">{{ m?.focus }}</text>
<text v-if="toText(m?.advice)" class="modal-text">{{ m?.advice }}</text>
</view>
</view>
</view>
<view v-if="hasCompanyLuckyNumbers" class="section" @click="openModal('lucky_numbers')">
<view class="section-title">
<text class="section-icon">🔢</text>
<text class="section-text">幸运数字</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="math-card company-extra-flat">
<text v-if="toText(companyLuckyNumbers?.primary)" class="modal-text company-extra-strong">主推{{
companyLuckyNumbers?.primary }}</text>
<text v-if="companyLuckyNumbersDisplay" class="modal-text">{{ companyLuckyNumbersDisplay }}</text>
<text v-if="toText(companyLuckyNumbers?.meaning)" class="modal-text">{{ companyLuckyNumbers?.meaning
}}</text>
</view>
</view>
<view v-if="hasCompanyLuckyColors" class="section" @click="openModal('lucky_colors')">
<view class="section-title">
<text class="section-icon">🎨</text>
<text class="section-text">幸运颜色</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="math-card company-extra-flat">
<text v-if="toText(companyLuckyColors?.primary)" class="modal-text company-extra-strong">主推{{
companyLuckyColors?.primary }}</text>
<view v-for="(c, ci) in arr(companyLuckyColors?.colors)" :key="ci" class="company-lucky-color-row">
<view v-if="toText(c?.hex)" class="company-lucky-swatch"
:style="{ backgroundColor: toText(c?.hex) }" />
<text class="modal-text company-lucky-color-text">{{ toText(c?.name) }}{{ toText(c?.note) ? ' — '
+ toText(c?.note) : '' }}</text>
</view>
<text v-if="toText(companyLuckyColors?.meaning)" class="modal-text">{{ companyLuckyColors?.meaning
}}</text>
</view>
</view>
<!-- 6. 创始人契合度 -->
<view v-if="founderSection" class="section" @click="openModal('founder')">
<view class="section-title">
<text class="section-icon">👤</text>
<text class="section-text">{{ founderSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="founder-card">
<view class="founder-header">
<view class="founder-avatar">
<text class="founder-avatar-text"></text>
</view>
<view class="founder-info">
<text class="founder-title">创始人命理</text>
<text class="founder-desc">{{ founderSection.summary_data.trait }}</text>
</view>
<view class="founder-score">
<text class="founder-score-value">{{ founderSection.summary_data.score }}</text>
<text class="founder-score-label">契合指数</text>
</view>
</view>
</view>
</view>
<!-- 7. 财运风水布局 -->
<view v-if="fengshuiSection" class="section" @click="openModal('fengshui')">
<view class="section-title">
<text class="section-icon">💎</text>
<text class="section-text">{{ fengshuiSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="fengshui-grid">
<view class="fengshui-card">
<text class="fengshui-icon">📍</text>
<text class="fengshui-label">办公财位</text>
<text class="fengshui-value">{{ fengshuiSection.summary_data.position }}</text>
</view>
<view class="fengshui-card">
<text class="fengshui-icon">🎨</text>
<text class="fengshui-label">品牌主色</text>
<text class="fengshui-value">{{ fengshuiSection.summary_data.colors }}</text>
</view>
</view>
</view>
<!-- 8. 未来五年运势预测 -->
<view v-if="wunianSection" class="section" @click="openModal('wunian')">
<view class="section-title">
<text class="section-icon">📈</text>
<text class="section-text">{{ wunianSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="trend-card">
<view class="trend-chart">
<view v-for="(item, idx) in wunianYears" :key="idx" class="trend-bar-wrap">
<view class="trend-bar" :style="{ height: item.s + '%' }"
:class="{ 'trend-bar-highlight': item.s > 90 }"></view>
<text class="trend-year">{{ item.y }}</text>
</view>
</view>
</view>
</view>
<!-- 9. 企业命理 SWOT 分析 -->
<view v-if="swotSection" class="section" @click="openModal('swot')">
<view class="section-title">
<text class="section-icon">📋</text>
<text class="section-text">{{ swotSection.title }}</text>
<text class="section-hint">点击详解 </text>
</view>
<view class="swot-grid">
<view class="swot-card swot-card-s">
<text class="swot-title swot-title-gold">S / 优势</text>
</view>
<view class="swot-card swot-card-w">
<text class="swot-title swot-title-red">W / 劣势</text>
</view>
<view class="swot-card swot-card-o">
<text class="swot-title swot-title-gold">O / 机会</text>
</view>
<view class="swot-card swot-card-t">
<text class="swot-title swot-title-red">T / 威胁</text>
</view>
</view>
</view>
<!-- Action Buttons -->
<view v-if="props.showBusinessFortune !== false" class="action-buttons">
<!-- <view class="action-btn action-btn-share">
<text class="action-btn-icon">📤</text>
<text class="action-btn-text">生成海报</text>
</view> -->
<view class="action-btn action-btn-primary" @click="handleBusinessFortune">
<text class="action-btn-text">商业运势</text>
</view>
<!-- <view class="action-btn action-btn-download">
<text class="action-btn-icon">📥</text>
<text class="action-btn-text">下载报告</text>
</view> -->
</view>
<!-- Footer -->
<view class="detail-footer">
<text class="footer-text">壹梵 · 致力于东方美学与易经智慧的传承</text>
</view>
</view>
</scroll-view>
<!-- 详情弹窗 -->
<view v-if="showModal" class="modal-overlay" @click.stop="closeModal">
<view class="modal-container" @click.stop="">
<view class="modal-header">
<text class="modal-title">{{ modalTitle }}</text>
<view class="modal-close" @click.stop="closeModal">
<text class="modal-close-icon">×</text>
</view>
</view>
<scroll-view scroll-y class="modal-body">
<view class="modal-body-contain">
<!-- 综合评分详情 -->
<view v-if="currentModal === 'zonghe'" class="modal-content">
<view v-if="zongheContent && zongheContent.rating" class="modal-rating-badge">{{
zongheContent.rating }}</view>
<text class="modal-section-title">大师总评</text>
<text class="modal-text">{{ zongheContent && zongheContent.summary ? zongheContent.summary :
'暂无数据' }}</text>
</view>
<!-- 品牌意象详情 -->
<view v-if="currentModal === 'pinpai'" class="modal-content">
<text class="modal-section-title">品牌解析</text>
<view class="modal-item">
<text class="modal-item-label">核心释义</text>
<text class="modal-text">{{ pinpaiContent && pinpaiContent.intro ? pinpaiContent.intro :
'暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">深度分析</text>
<text class="modal-text">{{ pinpaiContent && pinpaiContent.analysis ?
pinpaiContent.analysis
: '暂无数据' }}</text>
</view>
</view>
<!-- 商业数理详情 -->
<view v-if="currentModal === 'shuli'" class="modal-content">
<view v-if="shuliContent && shuliContent.number" class="modal-number-badge">{{
shuliContent.number }}</view>
<text v-if="shuliContent && shuliContent.luck_name" class="modal-luck-name">{{
shuliContent.luck_name }}</text>
<view class="modal-item">
<text class="modal-item-label">基本含义</text>
<text class="modal-text">{{ shuliContent && shuliContent.basic ? shuliContent.basic :
'暂无数据'
}}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">商业解读</text>
<text class="modal-text">{{ shuliContent && shuliContent.biz ? shuliContent.biz : '暂无数据'
}}</text>
</view>
</view>
<!-- 市场潜力详情 -->
<view v-if="currentModal === 'shichang'" class="modal-content">
<text class="modal-section-title">六维评估详解</text>
<view v-if="shichangContent && shichangContent.comm" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">传播力</text>
<text class="modal-score-value">{{ shichangContent.comm.score ?
(shichangContent.comm.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.comm.desc || '暂无数据' }}</text>
</view>
<view v-if="shichangContent && shichangContent.lead" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">领导力</text>
<text class="modal-score-value">{{ shichangContent.lead.score ?
(shichangContent.lead.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.lead.desc || '暂无数据' }}</text>
</view>
<view v-if="shichangContent && shichangContent.cohes" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">凝聚力</text>
<text class="modal-score-value">{{ shichangContent.cohes.score ?
(shichangContent.cohes.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.cohes.desc || '暂无数据' }}</text>
</view>
<view v-if="shichangContent && shichangContent.innov" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">创新力</text>
<text class="modal-score-value">{{ shichangContent.innov.score ?
(shichangContent.innov.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.innov.desc || '暂无数据' }}</text>
</view>
<view v-if="shichangContent && shichangContent.compat" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">契合度</text>
<text class="modal-score-value">{{ shichangContent.compat.score ?
(shichangContent.compat.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.compat.desc || '暂无数据' }}</text>
</view>
<view v-if="shichangContent && shichangContent.wealth" class="modal-score-item">
<view class="modal-score-header">
<text class="modal-score-name">财运</text>
<text class="modal-score-value">{{ shichangContent.wealth.score ?
(shichangContent.wealth.score * 10).toFixed(0) : '-' }}</text>
</view>
<text class="modal-text">{{ shichangContent.wealth.desc || '暂无数据' }}</text>
</view>
</view>
<!-- 商业卦象详情 -->
<view v-if="currentModal === 'guaxiang'" class="modal-content">
<view class="modal-gua-header">
<text class="modal-gua-name">{{ guaxiangContent && guaxiangContent.gua ?
guaxiangContent.gua
: '暂无卦象' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">卦象释义</text>
<text class="modal-text">{{ guaxiangContent && guaxiangContent.interp ?
guaxiangContent.interp : '暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">商业解读</text>
<text class="modal-text">{{ guaxiangContent && guaxiangContent.biz ? guaxiangContent.biz
:
'暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">决策指引</text>
<text class="modal-text modal-text-highlight">{{ guaxiangContent &&
guaxiangContent.guide ?
guaxiangContent.guide : '暂无数据' }}</text>
</view>
</view>
<!-- 创始人契合详情 -->
<view v-if="currentModal === 'founder'" class="modal-content">
<view class="modal-founder-score">
<text class="modal-founder-score-value">{{ founderContent && founderContent.score ?
founderContent.score : '-' }}</text>
<text class="modal-founder-score-label">契合指数</text>
</view>
<view class="modal-item">
<text class="modal-item-label">命理特征</text>
<text class="modal-text">{{ founderContent && founderContent.trait ?
founderContent.trait :
'暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">详细分析</text>
<text class="modal-text">{{ founderContent && founderContent.analysis ?
founderContent.analysis : '暂无数据' }}</text>
</view>
</view>
<!-- 风水布局详情 -->
<view v-if="currentModal === 'fengshui'" class="modal-content">
<text class="modal-section-title">品牌视觉识别建议</text>
<view class="modal-item">
<text class="modal-item-label">主色调</text>
<text class="modal-text">{{ fengshuiContent && fengshuiContent.color ?
fengshuiContent.color
: '暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">Logo形态</text>
<text class="modal-text">{{ fengshuiContent && fengshuiContent.logo ?
fengshuiContent.logo :
'暂无数据' }}</text>
</view>
<view class="modal-item">
<text class="modal-item-label">办公选址</text>
<text class="modal-text">{{ fengshuiContent && fengshuiContent.office ?
fengshuiContent.office : '暂无数据' }}</text>
</view>
</view>
<!-- 五年运势详情 -->
<view v-if="currentModal === 'wunian'" class="modal-content">
<text class="modal-section-title">未来五年运势详解</text>
<view v-for="(year, idx) in wunianYearsDetail" :key="idx" class="modal-year-item">
<view class="modal-year-header">
<text class="modal-year-name">{{ year.y }}</text>
<text class="modal-year-zhi">({{ year.z }})</text>
<text class="modal-year-label" :class="{ 'modal-year-label-hot': year.s > 90 }">{{
year.l }}</text>
<text class="modal-year-score">{{ year.s }}</text>
</view>
<text class="modal-text">{{ year.d }}</text>
</view>
</view>
<!-- SWOT详情 -->
<view v-if="currentModal === 'swot'" class="modal-content">
<text class="modal-section-title">企业命理SWOT分析</text>
<view class="modal-swot-item modal-swot-s">
<text class="modal-swot-title">Strengths / 优势</text>
<text class="modal-text">{{ swotContent && swotContent.s ? swotContent.s : '暂无数据'
}}</text>
</view>
<view class="modal-swot-item modal-swot-w">
<text class="modal-swot-title">Weaknesses / 劣势</text>
<text class="modal-text">{{ swotContent && swotContent.w ? swotContent.w : '暂无数据'
}}</text>
</view>
<view class="modal-swot-item modal-swot-o">
<text class="modal-swot-title">Opportunities / 机会</text>
<text class="modal-text">{{ swotContent && swotContent.o ? swotContent.o : '暂无数据'
}}</text>
</view>
<view class="modal-swot-item modal-swot-t">
<text class="modal-swot-title">Threats / 威胁</text>
<text class="modal-text">{{ swotContent && swotContent.t ? swotContent.t : '暂无数据'
}}</text>
</view>
</view>
<!-- 公司测名扩展六爻 / 五行八卦 / 属相 / 事业规划 / 幸运数字 / 幸运颜色详文 -->
<view v-if="isCompanyExtraModal" class="modal-content">
<view v-for="(node, idx) in companyExtraModalNodes" :key="idx" class="company-extra-node">
<text v-if="node?.type === 'text'" class="modal-text">{{ toText(node.text) }}</text>
<view v-else-if="node?.type === 'list'">
<text v-for="(item, j) in arr(node.items)" :key="j" class="modal-text">· {{ toText(item)
}}</text>
</view>
<view v-else-if="node?.type === 'kv'">
<text v-for="(item, j) in arr(node.items)" :key="j" class="modal-text">{{
toText(item?.label) }}{{ toText(item?.value) }}</text>
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { ref, computed, withDefaults } from "vue";
import { userApi, namingApi } from "@/api";
import { getWealthAnalysisByReportId } from "@/api/cai-yun";
declare const uni: any;
const props = withDefaults(
defineProps<{
data: any;
showBusinessFortune?: boolean;
/** 电脑端测名:双列玻璃排版 */
desktopLayout?: boolean;
}>(),
{ desktopLayout: false },
);
const emit = defineEmits<{
back: [];
businessFortune: [any];
}>();
const toText = (v: any): string => String(v ?? '').trim();
const toNum = (v: any, fallback = 0): number => {
const n = Number(v);
return Number.isFinite(n) ? n : fallback;
};
const arr = (v: any): any[] => (Array.isArray(v) ? v : []);
const COMPANY_EXTRA_MODAL_KEYS = [
'liuyao',
'wuxing_bagua',
'zodiac_sign',
'career_plan',
'lucky_numbers',
'lucky_colors',
] as const;
const companyLiuyao = computed(() => props.data?.liuyao);
const companyWuxingBagua = computed(() => props.data?.wuxing_bagua);
const companyZodiacSign = computed(() => props.data?.zodiac_sign);
const companyCareerPlan = computed(() => props.data?.career_plan);
const companyLuckyNumbers = computed(() => props.data?.lucky_numbers);
const companyLuckyColors = computed(() => props.data?.lucky_colors);
const hasCompanyLiuyao = computed(() => {
const x = companyLiuyao.value;
if (!x || typeof x !== 'object') return false;
return !!(
toText(x.hexagram_title) ||
toText(x.changing_summary) ||
toText(x.interpretation) ||
arr(x.yao_lines).length ||
arr(x.details?.nodes).length
);
});
const hasCompanyWuxingBagua = computed(() => {
const x = companyWuxingBagua.value;
if (!x || typeof x !== 'object') return false;
return !!(
toText(x.wuxing_sketch) ||
toText(x.bagua_profile) ||
toText(x.mutual_sketch) ||
toText(x.summary) ||
arr(x.details?.nodes).length
);
});
const hasCompanyZodiacSign = computed(() => {
const x = companyZodiacSign.value;
if (!x || typeof x !== 'object') return false;
return !!(
toText(x.animal) ||
toText(x.animal_icon) ||
toText(x.earthly_branch) ||
toText(x.trait_summary) ||
toText(x.name_harmony) ||
arr(x.details?.nodes).length
);
});
const hasCompanyCareerPlan = computed(() => {
const x = companyCareerPlan.value;
if (!x || typeof x !== 'object') return false;
return !!(toText(x.summary) || arr(x.milestones).length || arr(x.details?.nodes).length);
});
const hasCompanyLuckyNumbers = computed(() => {
const x = companyLuckyNumbers.value;
if (!x || typeof x !== 'object') return false;
return !!(toText(x.primary) || toText(x.meaning) || arr(x.numbers).length || arr(x.details?.nodes).length);
});
const hasCompanyLuckyColors = computed(() => {
const x = companyLuckyColors.value;
if (!x || typeof x !== 'object') return false;
return !!(toText(x.primary) || toText(x.meaning) || arr(x.colors).length || arr(x.details?.nodes).length);
});
const companyLuckyNumbersDisplay = computed(() => {
const nums = arr(companyLuckyNumbers.value?.numbers);
if (!nums.length) return '';
return nums.map((n: any) => String(n)).join('、');
});
const nodesToText = (nodes: any): string => {
if (!Array.isArray(nodes)) return '';
const lines: string[] = [];
nodes.forEach((n: any) => {
if (!n) return;
if (n.type === 'text') lines.push(toText(n.text));
else if (n.type === 'list' && Array.isArray(n.items)) lines.push(...n.items.map((x: any) => toText(x)));
else if (n.type === 'kv' && Array.isArray(n.items)) {
n.items.forEach((it: any) => lines.push(`${toText(it?.label)}${toText(it?.value)}`));
}
});
return lines.filter(Boolean).join('\n');
};
const findKvValue = (nodes: any, labelKeyword: string): string => {
if (!Array.isArray(nodes)) return '';
for (const n of nodes) {
if (n?.type !== 'kv' || !Array.isArray(n?.items)) continue;
for (const it of n.items) {
const label = toText(it?.label);
if (label.includes(labelKeyword)) return toText(it?.value);
}
}
return '';
};
const luckToScore = (luck: string): number => {
if (luck.includes('大吉')) return 95;
if (luck.includes('中吉')) return 82;
if (luck.includes('小吉')) return 72;
if (luck.includes('中平') || luck.includes('平')) return 60;
if (luck.includes('凶')) return 35;
return 60;
};
const normalizedData = computed(() => {
const raw = props.data || {};
// 旧结构兼容:已有 sections 直接沿用
if (Array.isArray(raw?.sections)) return raw;
// 新结构适配(按用户提供的后端 schema
const header = raw?.header || {};
const charA = raw?.characterAnalysis || {};
const pattern = raw?.businessPattern || {};
const gua = raw?.gua || {};
const team = raw?.team || {};
const years = raw?.years || {};
const direction = raw?.direction || {};
const layout = raw?.layout || {};
const execution = raw?.execution || {};
const score = toNum(header?.score, 0);
const tagLeft = toText(header?.tagLeft);
const totalNumber = (tagLeft.match(/\d+/)?.[0] || '').trim();
const luckName = (tagLeft.includes('·') ? tagLeft.split('·')[1] : '').trim();
const radarLabels = Array.isArray(pattern?.radar?.labels) ? pattern.radar.labels : [];
const radarValues = Array.isArray(pattern?.radar?.values) ? pattern.radar.values : [];
const scoreMap: Record<string, number> = {};
radarLabels.forEach((label: any, idx: number) => {
scoreMap[toText(label)] = toNum(radarValues[idx], 0);
});
const toScale10 = (n: number) => Number((n / 10).toFixed(1));
const yearItems = Array.isArray(years?.items) ? years.items : [];
return {
id: raw?.id,
report_id: raw?.report_id,
is_favorited: raw?.is_favorited,
name: toText(header?.name),
pinyin: toText(raw?.pinyin),
total_score: score,
star_rating: Math.max(1, Math.min(5, Math.round(score / 20))),
name_meaning: toText(charA?.analysis || header?.quote),
sections: [
{
section_type: 'zonghe',
title: '综合评分',
summary_data: { rating: toText(header?.tagRight) || '—' },
details: [{ content: { rating: toText(header?.tagRight), summary: toText(header?.quote) } }],
},
{
section_type: 'pinpai',
title: '品牌意象解析',
summary_data: { judgment: toText(charA?.analysis) || '—' },
details: [{ content: { intro: toText(charA?.analysis), analysis: nodesToText(charA?.details?.nodes) } }],
},
{
section_type: 'shuli',
title: '商业数理吉凶',
summary_data: { number: totalNumber || '—', luck: toText(header?.tagRight) || '—', luck_name: luckName || '—' },
details: [{
content: {
number: totalNumber || '—',
luck_name: luckName || '—',
basic: findKvValue(charA?.details?.nodes, '总格23') || findKvValue(charA?.details?.nodes, '总格') || nodesToText(charA?.details?.nodes),
biz: nodesToText(charA?.details?.nodes),
}
}],
},
{
section_type: 'shichang',
title: '市场潜力评估',
summary_data: {
scores: {
comm: toScale10(scoreMap['名望'] || scoreMap['传播力'] || 0),
compat: toScale10(scoreMap['基业'] || scoreMap['行业契合'] || 0),
wealth: toScale10(scoreMap['财运'] || 0),
lead: toScale10(scoreMap['机遇'] || 0),
cohes: toScale10(scoreMap['团队'] || 0),
innov: toScale10(scoreMap['竞力'] || 0),
}
},
details: [{
content: {
comm: { score: toScale10(scoreMap['名望'] || 0), desc: nodesToText(pattern?.details?.nodes) },
compat: { score: toScale10(scoreMap['基业'] || 0), desc: nodesToText(pattern?.details?.nodes) },
wealth: { score: toScale10(scoreMap['财运'] || 0), desc: nodesToText(pattern?.details?.nodes) },
lead: { score: toScale10(scoreMap['机遇'] || 0), desc: nodesToText(pattern?.details?.nodes) },
cohes: { score: toScale10(scoreMap['团队'] || 0), desc: nodesToText(pattern?.details?.nodes) },
innov: { score: toScale10(scoreMap['竞力'] || 0), desc: nodesToText(pattern?.details?.nodes) },
}
}],
},
{
section_type: 'guaxiang',
title: '商业卦象',
summary_data: { gua: toText(gua?.name), gua_type: toText(gua?.badge), text: toText(gua?.desc) },
details: [{ content: { gua: toText(gua?.name), interp: toText(gua?.desc), biz: toText(gua?.insight), guide: Array.isArray(gua?.tags) ? gua.tags.join('') : '' } }],
},
{
section_type: 'founder',
title: '创始人契合度',
summary_data: {
trait: toText(team?.members?.[0]?.desc),
score: toText(team?.members?.[0]?.score),
},
details: [{ content: { trait: toText(team?.members?.[0]?.desc), score: toText(team?.members?.[0]?.score), analysis: toText(team?.note) } }],
},
{
section_type: 'fengshui',
title: '财运风水布局',
summary_data: { position: toText(direction?.note), colors: toText(execution?.text).slice(0, 24) + (toText(execution?.text).length > 24 ? '...' : '') },
details: [{ content: { color: findKvValue(layout?.details?.nodes, '核心理念') || toText(execution?.text), logo: nodesToText(layout?.details?.nodes), office: toText(direction?.note) } }],
},
{
section_type: 'wunian',
title: '未来五年运势预测',
summary_data: {
years: yearItems.map((y: any) => ({
y: toText(y?.year).match(/\d{4}/)?.[0] || toText(y?.year),
s: luckToScore(toText(y?.luck)),
})),
},
details: [{
content: {
years: yearItems.map((y: any) => ({
y: toText(y?.year).match(/\d{4}/)?.[0] || toText(y?.year),
z: toText(y?.year).replace(/\d{4}\s*\(?/, '').replace(/\)?$/, ''),
l: toText(y?.luck),
s: luckToScore(toText(y?.luck)),
d: toText(y?.text),
})),
}
}],
},
{
section_type: 'swot',
title: '企业命理 SWOT 分析',
summary_data: {},
details: [{
content: {
s: toText(findKvValue(execution?.details?.nodes, '第1月') || execution?.text),
w: toText(findKvValue(execution?.details?.nodes, '第3月')),
o: toText(findKvValue(execution?.details?.nodes, '第6月')),
t: toText(direction?.note),
}
}],
},
],
};
});
// 收藏状态
const isFavorited = ref(false);
// 初始化收藏状态
if (props.data?.is_favorited !== undefined) {
isFavorited.value = props.data.is_favorited;
}
// 切换收藏状态
const toggleFavorite = async () => {
if (!props.data?.id) {
uni.showToast({ title: "方案ID不存在", icon: "none" });
return;
}
try {
if (!isFavorited.value) {
const res = await userApi.favoriteSolution({ solution_id: props.data.id, category: 'company' });
isFavorited.value = res?.is_favorited ?? true;
uni.showToast({
title: res?.msg || "收藏成功",
icon: "success"
});
return;
}
const res = await userApi.unfavoriteSolution({ solution_id: props.data.id });
isFavorited.value = res?.is_favorited ?? false;
uni.showToast({
title: res?.msg || "已取消收藏",
icon: "success"
});
} catch (e: any) {
uni.showToast({ title: e.msg || "操作失败", icon: "none" });
}
};
// 弹窗状态
const showModal = ref(false);
const currentModal = ref('');
// 弹窗标题映射
const modalTitles: Record<string, string> = {
zonghe: '综合评分详解',
pinpai: '品牌意象详解',
shuli: '商业数理详解',
shichang: '市场潜力详解',
guaxiang: '商业卦象详解',
liuyao: '六爻详解',
wuxing_bagua: '五行八卦详解',
zodiac_sign: '属相详解',
career_plan: '事业规划详解',
lucky_numbers: '幸运数字详解',
lucky_colors: '幸运颜色详解',
founder: '创始人契合详解',
fengshui: '风水布局详解',
wunian: '五年运势详解',
swot: 'SWOT分析详解',
};
const modalTitle = computed(() => modalTitles[currentModal.value] || '详情');
const isCompanyExtraModal = computed(() =>
COMPANY_EXTRA_MODAL_KEYS.includes(currentModal.value as (typeof COMPANY_EXTRA_MODAL_KEYS)[number])
);
const companyExtraModalNodes = computed(() => {
const m = currentModal.value;
if (!COMPANY_EXTRA_MODAL_KEYS.includes(m as (typeof COMPANY_EXTRA_MODAL_KEYS)[number])) return [];
const block = (props.data as Record<string, any>)?.[m];
return arr(block?.details?.nodes);
});
// 打开弹窗
const openModal = (modalType: string) => {
currentModal.value = modalType;
showModal.value = true;
};
// 关闭弹窗
const closeModal = () => {
showModal.value = false;
currentModal.value = '';
};
// 星星数据
const stars = ref(
Array.from({ length: 30 }).map((_, i) => ({
id: i,
top: `${Math.random() * 100}%`,
left: `${Math.random() * 100}%`,
size: Math.random() * 2 + 1,
duration: Math.random() * 3 + 2,
delay: Math.random() * 2,
}))
);
// 安全获取数据
const detailData = computed(() => ({
name: normalizedData.value?.name || '',
pinyin: normalizedData.value?.pinyin || '',
total_score: normalizedData.value?.total_score || 0,
star_rating: normalizedData.value?.star_rating || 0,
name_meaning: normalizedData.value?.name_meaning || '',
}));
console.log('detailData===>>>', detailData.value);
// 获取 section
const getSection = (sectionType: string) => {
const sections = normalizedData.value?.sections;
if (!sections || !Array.isArray(sections)) return null;
return sections.find((s: any) => s.section_type === sectionType) || null;
};
// 获取 section 的 content
const getContent = (section: any) => {
if (!section?.details || !Array.isArray(section.details) || section.details.length === 0) return null;
return section.details[0]?.content || null;
};
// 各模块 section
const zongheSection = computed(() => getSection('zonghe'));
const pinpaiSection = computed(() => getSection('pinpai'));
const shuliSection = computed(() => getSection('shuli'));
const shichangSection = computed(() => getSection('shichang'));
const guaxiangSection = computed(() => getSection('guaxiang'));
const founderSection = computed(() => getSection('founder'));
const fengshuiSection = computed(() => getSection('fengshui'));
const wunianSection = computed(() => getSection('wunian'));
const swotSection = computed(() => getSection('swot'));
// 各模块 content
const zongheContent = computed(() => getContent(zongheSection.value));
const pinpaiContent = computed(() => getContent(pinpaiSection.value));
const shuliContent = computed(() => getContent(shuliSection.value));
const shichangContent = computed(() => getContent(shichangSection.value));
const guaxiangContent = computed(() => getContent(guaxiangSection.value));
const founderContent = computed(() => getContent(founderSection.value));
const fengshuiContent = computed(() => getContent(fengshuiSection.value));
const wunianContent = computed(() => getContent(wunianSection.value));
const swotContent = computed(() => getContent(swotSection.value));
// 五年运势数据
const wunianYears = computed(() => wunianSection.value?.summary_data?.years || []);
const wunianYearsDetail = computed(() => wunianContent.value?.years || []);
// 格式化分数
const formatScore = (score: number | undefined): string => {
if (score === undefined || score === null) return '-';
return (score * 10).toFixed(0);
};
// 获取卦象字符
const getGuaChar = (gua: string): string => {
if (!gua) return '卦';
return gua.substring(0, 2);
};
// 截断文本
const truncateText = (text: string, maxLen: number): string => {
if (!text) return '';
if (text.length <= maxLen) return text;
return text.substring(0, maxLen) + '...';
};
const handleBack = () => {
emit("back");
};
const handleBusinessFortune = async () => {
const solutionId = Number(props.data?.id || 0);
if (!solutionId) {
uni.showToast({ title: '方案ID不存在', icon: 'none' });
return;
}
try {
uni.showLoading({ title: '加载中...' });
// 先获取方案详情以获得report_id
// const solutionDetail = await namingApi.getSolutionDetail(solutionId);
const reportId = props.data?.report_id;
if (!reportId) {
uni.hideLoading();
uni.showToast({ title: '报告ID不存在', icon: 'none' });
return;
}
// 使用report_id获取财运解析数据
const businessFortuneData = await getWealthAnalysisByReportId(reportId);
uni.hideLoading();
uni.setStorageSync('business_fortune_report_id', reportId);
emit('businessFortune', { id: reportId, businessFortuneData });
} catch (error: any) {
uni.hideLoading();
uni.showToast({ title: error?.msg || error?.message || '加载失败,请重试', icon: 'none' });
}
};
</script>
<style scoped>
/* 基础布局 */
.company-detail {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: flex;
flex-direction: column;
background: linear-gradient(180deg, #050508 0%, #10101a 50%, #1a1a2e 100%);
overflow: hidden;
z-index: 50;
}
/* 星空背景 */
.starry-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
z-index: 0;
}
.star {
position: absolute;
border-radius: 50%;
background: #fff;
opacity: 0.2;
animation: twinkle 3s ease-in-out infinite;
}
@keyframes twinkle {
0%,
100% {
opacity: 0.1;
transform: scale(1);
}
50% {
opacity: 0.5;
transform: scale(1.2);
}
}
.glow-top {
position: absolute;
top: -10%;
left: -10%;
width: 50%;
height: 50%;
background: #2a3d5d;
opacity: 0.2;
filter: blur(100px);
border-radius: 50%;
}
.glow-bottom {
position: absolute;
bottom: -10%;
right: -10%;
width: 50%;
height: 50%;
background: #9c2a2a;
opacity: 0.1;
filter: blur(100px);
border-radius: 50%;
}
/* 头部 */
.detail-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 40rpx 30rpx;
padding-top: calc(60rpx + env(safe-area-inset-top, 0px));
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
background: rgba(10, 10, 15, 0.5);
backdrop-filter: blur(10px);
position: relative;
z-index: 20;
}
.detail-header-back {
display: flex;
align-items: center;
color: #a0a0a0;
}
.back-icon {
font-size: 40rpx;
margin-right: 8rpx;
}
.back-text {
font-size: 28rpx;
letter-spacing: 4rpx;
}
.detail-header-title {
font-size: 36rpx;
font-weight: bold;
letter-spacing: 8rpx;
color: #d4af37;
}
.detail-header-favorite {
width: 80rpx;
display: flex;
align-items: center;
justify-content: center;
}
.favorite-icon {
font-size: 48rpx;
color: #a0a0a0;
transition: all 0.3s;
}
.favorite-icon-active {
color: #ff4757;
animation: heartbeat 0.3s ease-in-out;
}
@keyframes heartbeat {
0%,
100% {
transform: scale(1);
}
50% {
transform: scale(1.2);
}
}
.detail-header-placeholder {
width: 80rpx;
}
/* 内容区域 */
.detail-content {
flex: 1;
height: 0;
position: relative;
z-index: 10;
}
.detail-content-inner {
padding-bottom: calc(120rpx + env(safe-area-inset-bottom, 0px));
padding: 30rpx;
}
/* 总分卡片 */
.score-card {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 60rpx 40rpx;
text-align: center;
position: relative;
overflow: hidden;
margin-bottom: 50rpx;
border-radius: 8rpx;
}
.score-corner {
position: absolute;
width: 24rpx;
height: 24rpx;
border-color: #d4af37;
}
.score-corner-tl {
top: 0;
left: 0;
border-top: 4rpx solid;
border-left: 4rpx solid;
}
.score-corner-tr {
top: 0;
right: 0;
border-top: 4rpx solid;
border-right: 4rpx solid;
}
.score-corner-bl {
bottom: 0;
left: 0;
border-bottom: 4rpx solid;
border-left: 4rpx solid;
}
.score-corner-br {
bottom: 0;
right: 0;
border-bottom: 4rpx solid;
border-right: 4rpx solid;
}
.score-label {
font-size: 22rpx;
color: #d4af37;
letter-spacing: 8rpx;
margin-bottom: 20rpx;
opacity: 0.8;
}
.score-value-wrap {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 280rpx;
height: 280rpx;
}
.score-value {
font-size: 120rpx;
font-weight: bold;
background: linear-gradient(180deg, #d4af37 0%, #8a6e1e 100%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.score-ring {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border: 2rpx dashed rgba(212, 175, 55, 0.2);
border-radius: 50%;
animation: rotate 10s linear infinite;
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.score-stars {
display: flex;
justify-content: center;
gap: 8rpx;
margin: 20rpx 0 30rpx;
}
.score-star {
font-size: 28rpx;
color: #5a5a5a;
}
.score-star.active {
color: #d4af37;
}
.score-divider {
width: 100%;
height: 2rpx;
background: linear-gradient(90deg, transparent 0%, rgba(212, 175, 55, 0.3) 50%, transparent 100%);
margin: 20rpx 0;
}
.score-name {
display: block;
font-size: 56rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 12rpx;
margin-top: 20rpx;
}
.score-pinyin {
display: block;
font-size: 26rpx;
color: #a0a0a0;
font-style: italic;
margin-top: 10rpx;
}
.master-comment {
margin-top: 30rpx;
padding-top: 20rpx;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.master-rating {
display: inline-block;
font-size: 24rpx;
color: #d4af37;
border: 1px solid #d4af37;
padding: 6rpx 16rpx;
border-radius: 20rpx;
margin-bottom: 16rpx;
}
.master-summary-preview {
display: block;
font-size: 24rpx;
color: #a0a0a0;
line-height: 1.6;
margin-bottom: 12rpx;
}
.click-hint {
font-size: 22rpx;
color: #d4af37;
opacity: 0.6;
}
/* 通用 Section 样式 */
.section {
margin-bottom: 40rpx;
padding: 10rpx;
border-radius: 16rpx;
transition: background 0.2s;
}
.section:active {
background: rgba(255, 255, 255, 0.05);
}
.section-title {
display: flex;
align-items: center;
margin-bottom: 24rpx;
padding: 0 10rpx;
}
.section-icon {
font-size: 32rpx;
margin-right: 12rpx;
}
.section-text {
font-size: 30rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 4rpx;
}
.section-hint {
font-size: 20rpx;
color: rgba(212, 175, 55, 0.6);
margin-left: auto;
border: 1px solid rgba(212, 175, 55, 0.3);
padding: 4rpx 12rpx;
border-radius: 20rpx;
}
/* 品牌意象卡片 */
.meaning-card {
background: #1a1a2e;
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 40rpx;
border-radius: 12rpx;
position: relative;
overflow: hidden;
}
.meaning-quote {
position: absolute;
right: 20rpx;
top: 10rpx;
font-size: 80rpx;
color: rgba(212, 175, 55, 0.1);
}
.meaning-label {
display: block;
font-size: 26rpx;
font-weight: bold;
color: #d4af37;
margin-bottom: 16rpx;
}
.meaning-text {
display: block;
font-size: 26rpx;
color: #a0a0a0;
line-height: 1.8;
text-align: justify;
}
.meaning-judge {
margin-top: 20rpx;
padding-top: 20rpx;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.meaning-judge-label {
font-size: 26rpx;
color: #d4af37;
}
.meaning-judge-text {
font-size: 26rpx;
color: #e2e2e2;
}
/* 商业数理卡片 */
.math-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.05);
padding: 30rpx;
border-radius: 12rpx;
}
.math-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.math-info {
display: flex;
flex-direction: column;
}
.math-label {
font-size: 24rpx;
color: #a0a0a0;
margin-bottom: 8rpx;
}
.math-value {
font-size: 32rpx;
font-weight: bold;
color: #e2e2e2;
}
.math-badge {
font-size: 22rpx;
color: #d4af37;
border: 1px solid #d4af37;
padding: 8rpx 16rpx;
border-radius: 8rpx;
}
/* 市场潜力雷达 */
.radar-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.05);
padding: 30rpx;
border-radius: 12rpx;
}
.radar-labels {
display: flex;
flex-wrap: wrap;
gap: 20rpx;
}
.radar-label-item {
flex: 0 0 calc(33.33% - 14rpx);
display: flex;
flex-direction: column;
align-items: center;
padding: 16rpx;
background: rgba(255, 255, 255, 0.05);
border-radius: 8rpx;
}
.radar-label-name {
font-size: 22rpx;
color: #a0a0a0;
margin-bottom: 8rpx;
}
.radar-label-value {
font-size: 28rpx;
font-weight: bold;
color: #d4af37;
}
/* 卦象卡片 */
.gua-card {
background: linear-gradient(90deg, #1a1a2e 0%, #16213e 100%);
border: 1px solid rgba(212, 175, 55, 0.3);
padding: 40rpx;
border-radius: 12rpx;
position: relative;
overflow: hidden;
}
.gua-bg-text {
position: absolute;
right: -20rpx;
top: -20rpx;
font-size: 200rpx;
color: rgba(255, 255, 255, 0.05);
font-weight: bold;
}
.gua-content {
position: relative;
z-index: 1;
}
.gua-header {
display: flex;
align-items: baseline;
gap: 16rpx;
margin-bottom: 16rpx;
}
.gua-name {
font-size: 40rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 4rpx;
}
.gua-badge {
font-size: 22rpx;
color: #9c2a2a;
border: 1px solid #9c2a2a;
padding: 4rpx 12rpx;
border-radius: 8rpx;
}
.gua-desc {
font-size: 26rpx;
color: #a0a0a0;
line-height: 1.6;
}
/* 创始人契合卡片 */
.founder-card {
background: linear-gradient(90deg, #16213e 0%, #1a1a2e 100%);
padding: 30rpx;
border-radius: 12rpx;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.founder-header {
display: flex;
align-items: center;
gap: 20rpx;
}
.founder-avatar {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background: rgba(212, 175, 55, 0.2);
display: flex;
align-items: center;
justify-content: center;
}
.founder-avatar-text {
font-size: 32rpx;
color: #d4af37;
}
.founder-info {
flex: 1;
}
.founder-title {
display: block;
font-size: 24rpx;
color: #a0a0a0;
margin-bottom: 8rpx;
}
.founder-desc {
display: block;
font-size: 28rpx;
font-weight: bold;
color: #e2e2e2;
}
.founder-score {
text-align: right;
}
.founder-score-value {
display: block;
font-size: 36rpx;
font-weight: bold;
color: #d4af37;
}
.founder-score-label {
display: block;
font-size: 20rpx;
color: #a0a0a0;
}
/* 风水布局网格 */
.fengshui-grid {
display: flex;
gap: 20rpx;
}
.fengshui-card {
flex: 1;
background: rgba(255, 255, 255, 0.05);
padding: 30rpx;
border-radius: 12rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
display: flex;
flex-direction: column;
align-items: center;
}
.fengshui-icon {
font-size: 40rpx;
margin-bottom: 12rpx;
}
.fengshui-label {
font-size: 22rpx;
color: #a0a0a0;
margin-bottom: 8rpx;
}
.fengshui-value {
font-size: 26rpx;
font-weight: bold;
color: #e2e2e2;
text-align: center;
}
/* 五年运势图表 */
.trend-card {
background: rgba(255, 255, 255, 0.05);
padding: 30rpx;
border-radius: 12rpx;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.trend-chart {
display: flex;
justify-content: space-around;
align-items: flex-end;
height: 200rpx;
padding-top: 20rpx;
}
.trend-bar-wrap {
display: flex;
flex-direction: column;
align-items: center;
width: 60rpx;
}
.trend-bar {
width: 40rpx;
background: linear-gradient(180deg, #d4af37 0%, #8a6e1e 100%);
border-radius: 8rpx 8rpx 0 0;
min-height: 20rpx;
transition: height 0.3s;
}
.trend-bar-highlight {
background: linear-gradient(180deg, #9c2a2a 0%, #d4af37 100%);
box-shadow: 0 0 16rpx rgba(212, 175, 55, 0.5);
}
.trend-year {
font-size: 22rpx;
color: #a0a0a0;
margin-top: 12rpx;
}
/* SWOT 网格 */
.swot-grid {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.swot-card {
flex: 0 0 calc(50% - 8rpx);
padding: 24rpx;
border-radius: 12rpx;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.swot-card-s {
border-left: 4rpx solid #d4af37;
}
.swot-card-w {
border-left: 4rpx solid #9c2a2a;
}
.swot-card-o {
border-left: 4rpx solid #d4af37;
}
.swot-card-t {
border-left: 4rpx solid #9c2a2a;
}
.swot-title {
font-size: 26rpx;
font-weight: bold;
}
.swot-title-gold {
color: #d4af37;
}
.swot-title-red {
color: #9c2a2a;
}
/* 操作按钮 */
.action-buttons {
display: flex;
gap: 20rpx;
margin: 40rpx 0;
}
.action-btn {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
padding: 24rpx 16rpx;
border-radius: 12rpx;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.action-btn-share {
background: rgba(255, 255, 255, 0.05);
}
.action-btn-primary {
background: linear-gradient(135deg, #9c2a2a 0%, #d4af37 100%);
border: none;
}
.action-btn-download {
background: rgba(255, 255, 255, 0.05);
}
.action-btn-icon {
font-size: 36rpx;
margin-bottom: 8rpx;
}
.action-btn-text {
font-size: 24rpx;
color: #e2e2e2;
}
/* 页脚 */
.detail-footer {
text-align: center;
padding: 40rpx 0 60rpx;
}
.footer-text {
font-size: 22rpx;
color: #5a5a5a;
letter-spacing: 2rpx;
}
/* 弹窗样式 */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(4px);
z-index: 100;
display: flex;
align-items: flex-end;
justify-content: center;
}
.modal-container {
width: 100%;
max-height: 85vh;
background: #101015;
border-radius: 32rpx 32rpx 0 0;
border: 1px solid rgba(212, 175, 55, 0.2);
border-bottom: none;
display: flex;
flex-direction: column;
overflow: hidden;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 32rpx 40rpx;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
background: #151520;
}
.modal-title {
font-size: 32rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 4rpx;
}
.modal-close {
width: 60rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, 0.05);
border-radius: 50%;
}
.modal-close-icon {
font-size: 40rpx;
color: #a0a0a0;
}
.modal-body {
flex: 1;
height: 0;
}
.modal-body-contain {
padding: 40rpx;
}
.modal-content {
display: flex;
flex-direction: column;
gap: 30rpx;
}
/* 公司测名扩展模块(与个人测名同 JSON 字段) */
.company-extra-card {
position: relative;
}
.company-extra-flat {
display: flex;
flex-direction: column;
gap: 16rpx;
padding: 28rpx;
}
.company-extra-strong {
color: #e2e2e2;
font-weight: 600;
}
.company-extra-sub {
margin-top: 8rpx;
font-size: 26rpx !important;
}
.company-career-milestone {
margin-top: 20rpx;
padding-top: 20rpx;
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
flex-direction: column;
gap: 8rpx;
}
.company-career-milestone:first-of-type {
margin-top: 0;
padding-top: 0;
border-top: none;
}
.company-lucky-color-row {
display: flex;
align-items: flex-start;
gap: 16rpx;
}
.company-lucky-swatch {
width: 32rpx;
height: 32rpx;
border-radius: 50%;
flex-shrink: 0;
margin-top: 6rpx;
border: 1px solid rgba(255, 255, 255, 0.25);
}
.company-lucky-color-text {
flex: 1;
}
.company-extra-node {
margin-bottom: 16rpx;
}
/* 弹窗内容样式 */
.modal-rating-badge {
display: inline-block;
align-self: flex-start;
font-size: 28rpx;
color: #d4af37;
border: 2rpx solid #d4af37;
padding: 12rpx 24rpx;
border-radius: 8rpx;
background: rgba(212, 175, 55, 0.1);
}
.modal-section-title {
font-size: 30rpx;
font-weight: bold;
color: #d4af37;
letter-spacing: 2rpx;
padding-left: 20rpx;
border-left: 6rpx solid #d4af37;
}
.modal-text {
font-size: 28rpx;
color: #a0a0a0;
line-height: 1.8;
text-align: justify;
}
.modal-text-highlight {
color: #d4af37;
font-weight: bold;
}
.modal-item {
display: flex;
flex-direction: column;
gap: 12rpx;
padding: 24rpx;
background: rgba(255, 255, 255, 0.03);
border-radius: 12rpx;
}
.modal-item-label {
font-size: 26rpx;
font-weight: bold;
color: #e2e2e2;
}
/* 数理弹窗 */
.modal-number-badge {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
background: linear-gradient(135deg, #d4af37 0%, #8a6e1e 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 48rpx;
font-weight: bold;
color: #fff;
align-self: center;
box-shadow: 0 8rpx 32rpx rgba(212, 175, 55, 0.3);
}
.modal-luck-name {
font-size: 32rpx;
font-weight: bold;
color: #e2e2e2;
text-align: center;
letter-spacing: 4rpx;
}
/* 市场潜力弹窗 */
.modal-score-item {
padding: 24rpx;
background: rgba(255, 255, 255, 0.03);
border-radius: 12rpx;
border-left: 4rpx solid #d4af37;
}
.modal-score-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12rpx;
}
.modal-score-name {
font-size: 28rpx;
font-weight: bold;
color: #e2e2e2;
}
.modal-score-value {
font-size: 28rpx;
font-weight: bold;
color: #d4af37;
}
/* 卦象弹窗 */
.modal-gua-header {
text-align: center;
padding: 20rpx;
}
.modal-gua-name {
font-size: 40rpx;
font-weight: bold;
color: #e2e2e2;
letter-spacing: 8rpx;
}
/* 创始人弹窗 */
.modal-founder-score {
display: flex;
flex-direction: column;
align-items: center;
padding: 30rpx;
background: linear-gradient(135deg, rgba(212, 175, 55, 0.2) 0%, rgba(156, 42, 42, 0.2) 100%);
border-radius: 16rpx;
}
.modal-founder-score-value {
font-size: 72rpx;
font-weight: bold;
color: #d4af37;
}
.modal-founder-score-label {
font-size: 24rpx;
color: #a0a0a0;
letter-spacing: 4rpx;
}
/* 五年运势弹窗 */
.modal-year-item {
padding: 24rpx;
background: rgba(255, 255, 255, 0.03);
border-radius: 12rpx;
margin-bottom: 20rpx;
}
.modal-year-header {
display: flex;
align-items: center;
gap: 16rpx;
margin-bottom: 16rpx;
flex-wrap: wrap;
}
.modal-year-name {
font-size: 32rpx;
font-weight: bold;
color: #e2e2e2;
}
.modal-year-zhi {
font-size: 26rpx;
color: #a0a0a0;
}
.modal-year-label {
font-size: 22rpx;
color: #d4af37;
border: 1px solid #d4af37;
padding: 4rpx 12rpx;
border-radius: 8rpx;
}
.modal-year-label-hot {
background: #9c2a2a;
border-color: #9c2a2a;
color: #fff;
}
.modal-year-score {
font-size: 28rpx;
font-weight: bold;
color: #d4af37;
margin-left: auto;
}
/* SWOT弹窗 */
.modal-swot-item {
padding: 24rpx;
border-radius: 12rpx;
background: rgba(255, 255, 255, 0.03);
}
.modal-swot-s {
border-left: 6rpx solid #4CAF50;
}
.modal-swot-w {
border-left: 6rpx solid #F44336;
}
.modal-swot-o {
border-left: 6rpx solid #2196F3;
}
.modal-swot-t {
border-left: 6rpx solid #FF9800;
}
.modal-swot-title {
font-size: 28rpx;
font-weight: bold;
color: #e2e2e2;
margin-bottom: 12rpx;
}
/* —— 电脑端测名详解:双列 + 登录页同系玻璃金边 —— */
.company-detail--desktop {
background: linear-gradient(165deg, #070a12 0%, #12102a 42%, #0a1628 100%) !important;
}
.company-detail--desktop .starry-bg {
opacity: 0.28;
}
.company-detail--desktop .detail-header {
background: rgba(15, 23, 42, 0.72) !important;
border-bottom: 1px solid rgba(212, 175, 55, 0.2) !important;
backdrop-filter: blur(12px);
padding-top: 16px !important;
padding-bottom: 12px !important;
}
.company-detail--desktop .detail-header-title {
color: #f2e6d8 !important;
text-shadow: 0 0 20px rgba(212, 175, 55, 0.22);
}
.company-detail--desktop .detail-header-back {
color: #d4af37 !important;
}
.company-detail--desktop .detail-content--desktop {
flex: 1;
min-height: 0;
height: auto !important;
}
.company-detail--desktop .detail-content-inner--desktop {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px 14px;
padding: 10px 14px 20px !important;
align-content: start;
}
.company-detail--desktop .score-card {
grid-column: 1 / -1;
border-radius: 12px;
background: rgba(15, 23, 42, 0.55) !important;
border: 1px solid rgba(212, 175, 55, 0.22) !important;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
backdrop-filter: blur(10px);
padding: 20px 22px !important;
}
.company-detail--desktop .section {
margin-bottom: 0 !important;
}
.company-detail--desktop .section--desktop-wide {
grid-column: 1 / -1;
}
.company-detail--desktop .section-title {
border-bottom: 1px solid rgba(212, 175, 55, 0.1);
padding-bottom: 8px !important;
margin-bottom: 8px !important;
}
.company-detail--desktop .meaning-card,
.company-detail--desktop .math-card,
.company-detail--desktop .radar-card,
.company-detail--desktop .gua-card,
.company-detail--desktop .company-extra-card {
border-radius: 10px;
background: rgba(15, 23, 42, 0.48) !important;
border: 1px solid rgba(212, 175, 55, 0.16) !important;
backdrop-filter: blur(8px);
}
.company-detail--desktop .modal-text {
font-size: 12px !important;
line-height: 1.45 !important;
}
@media (min-width: 1200px) {
.company-detail--desktop .detail-content-inner--desktop {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.company-detail--desktop .score-card {
grid-column: 1 / -1;
}
}
</style>