Files
MBTI_wang/miniprogram/pages/ai-chat/index.wxml
Ghost a411bf7b21 高考版优化
审核模式优化
2026-04-29 18:01:26 +08:00

290 lines
13 KiB
Plaintext
Raw 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.

<!-- 神仙 AI · 对话页(精选推荐嵌入第 2 轮及以后的助手气泡 · MBTI 去测进测评列表) -->
<view class="ai-page">
<view class="container audit-purchase" wx:if="{{auditPurchaseMode}}">
<view class="success-mask" wx:if="{{auditSuccessModal.visible}}" bindtap="closeAuditSuccessModal">
<view class="success-dialog" catchtap="catchTapAuditSuccess">
<view class="success-icon-wrap">
<view class="success-icon-circle">
<text class="success-icon-check">✓</text>
</view>
</view>
<text class="success-dialog-title">{{auditSuccessModal.title}}</text>
<text class="success-dialog-content">{{auditSuccessModal.content}}</text>
<text class="success-dialog-hint">顾问将通过您预留的联系方式与您沟通,请留意来电或短信。</text>
<view class="success-dialog-btns success-dialog-btns--single">
<button class="success-btn-close success-btn-close--primary" bindtap="closeAuditSuccessModal">我知道了</button>
</view>
</view>
</view>
<view class="deep-hero">
<text class="deep-hero__eyebrow">UNDERSTAND YOURSELF · 了解自己</text>
<text class="deep-hero__title">更深入地看见你自己</text>
<text class="deep-hero__desc">{{auditDeepHeroDesc}}</text>
</view>
<view class="tabs-container deep-tabs">
<view class="tabs-list">
<view class="tab-item {{auditPurchaseTab === 'personal' ? 'active' : ''}}" data-tab="personal" bindtap="onAuditPurchaseSwitchTab">
<text class="tab-text">个人解读</text>
</view>
<view class="tab-item {{auditPurchaseTab === 'enterprise' ? 'active' : ''}}" data-tab="enterprise" bindtap="onAuditPurchaseSwitchTab">
<text class="tab-text">团队与企业</text>
</view>
</view>
</view>
<view wx:if="{{auditPurchaseLoading}}" class="loading-wrap">
<text class="loading-text">加载中...</text>
</view>
<view wx:elif="{{auditPurchaseError}}" class="purchase-error-state">
<view class="purchase-error-ic">⚠️</view>
<text class="purchase-error-title">加载失败</text>
<text class="purchase-error-msg">{{auditPurchaseError}}</text>
<text class="purchase-error-hint">请稍后重试</text>
</view>
<block wx:else>
<view wx:if="{{auditPurchaseTab === 'personal'}}">
<view wx:for="{{auditPurchasePersonal}}" wx:key="id" class="pricing-card {{index === 0 ? 'featured' : ''}}" style="margin: 24rpx;">
<view class="card-header">
<text class="plan-title">{{item.title}}</text>
<view class="price-section" wx:if="{{item.price !== undefined}}">
<text class="price-symbol">¥</text>
<text class="price-amount">{{item.price}}</text>
<text class="price-unit">{{item.priceUnit || '/次'}}</text>
</view>
<text class="plan-subtitle" wx:if="{{item.subtitle}}">{{item.subtitle}}</text>
</view>
<view class="features-list" wx:if="{{item.features && item.features.length}}">
<view class="feature-item" wx:for="{{item.features}}" wx:for-item="f" wx:key="*this">
<view class="check-icon">✓</view>
<text class="feature-text">{{f}}</text>
</view>
</view>
<button
class="purchase-button primary"
wx:if="{{item.actionType === 'buy' && !auditHasPhone}}"
open-type="getPhoneNumber"
bindgetphonenumber="onGetPhoneNumberForAuditPurchase"
data-tab="personal"
data-index="{{index}}"
disabled="{{auditPurchasing}}"
>
<text class="button-text">{{item.purchaseButtonText || '了解自己并付款'}}</text>
</button>
<button
class="purchase-button primary"
wx:elif="{{item.actionType === 'buy' && auditHasPhone}}"
bindtap="handleAuditPurchaseTap"
data-tab="personal"
data-index="{{index}}"
disabled="{{auditPurchasing}}"
>
<text class="button-text">{{item.purchaseButtonText || '了解自己并付款'}}</text>
</button>
<button
class="purchase-button primary"
wx:else
bindtap="handleAuditPurchaseTap"
data-tab="personal"
data-index="{{index}}"
disabled="{{auditPurchasing}}"
>
<text class="button-text">{{item.buttonText || '申请咨询'}}</text>
</button>
</view>
<view wx:if="{{!auditPurchaseLoading && auditPurchasePersonal.length === 0}}" class="empty-tip">
<text>暂无可用的个人版套餐</text>
</view>
</view>
<view wx:else>
<view wx:for="{{auditPurchaseEnterprise}}" wx:key="id" class="pricing-card {{index === 1 ? 'featured-blue' : ''}}" style="margin: 24rpx;">
<view class="card-header-flex">
<view class="header-left">
<text class="plan-title-sm">{{item.title}}</text>
<text class="plan-desc" wx:if="{{item.subtitle}}">{{item.subtitle}}</text>
</view>
<view class="header-right" wx:if="{{item.priceDisplay || item.price}}">
<text class="price-amount-small">{{item.priceDisplay || '¥' + item.price}}</text>
<text class="price-limit" wx:if="{{item.userLimit}}">{{item.userLimit}}</text>
</view>
</view>
<view class="features-list" wx:if="{{item.features && item.features.length}}">
<view class="feature-item" wx:for="{{item.features}}" wx:for-item="f" wx:key="*this">
<view class="check-icon blue">✓</view>
<text class="feature-text">{{f}}</text>
</view>
</view>
<button
class="purchase-button secondary"
wx:if="{{!auditHasPhone}}"
open-type="getPhoneNumber"
bindgetphonenumber="onGetPhoneNumberForAuditPurchase"
data-tab="enterprise"
data-index="{{index}}"
disabled="{{auditPurchasing}}"
>
<text class="button-text">{{item.buttonText || '申请咨询并降低30%成本'}}</text>
</button>
<button
class="purchase-button secondary"
wx:else
bindtap="handleAuditPurchaseTap"
data-tab="enterprise"
data-index="{{index}}"
disabled="{{auditPurchasing}}"
>
<text class="button-text">{{item.buttonText || '申请咨询并降低30%成本'}}</text>
</button>
</view>
<view wx:if="{{!auditPurchaseLoading && auditPurchaseEnterprise.length === 0}}" class="empty-tip">
<text>暂无可用的企业版套餐</text>
</view>
</view>
</block>
</view>
<scroll-view
wx:else
class="chat-scroll"
style="height: {{chatScrollHeightPx}}px;"
scroll-y="true"
scroll-into-view="{{scrollTarget}}"
scroll-with-animation="true"
enhanced
show-scrollbar="{{false}}"
>
<!-- MBTI 引导:去测 → 详细性格测试列表(不直跳拍摄) -->
<view class="mbti-remind-card" wx:if="{{messages.length === 0}}">
<image class="mbti-remind-avatar" src="/images/shenxian-ai-logo.png" mode="aspectFill" />
<view class="mbti-remind-body">
<view class="mbti-remind-title">我是神仙 AI</view>
<view class="mbti-remind-sub" wx:if="{{mbtiType}}">
已了解你的 <text class="mbti-badge">{{mbtiType}}</text>,继续聊~
</view>
<view class="mbti-remind-sub" wx:else>先做一下 MBTI 测评,我能帮你聊得更懂你哦~</view>
<view class="mbti-remind-actions">
<text class="mbti-remind-tag">MBTI</text>
<view class="mbti-remind-btn" hover-class="mbti-remind-btn--press" bindtap="onGoMbtiTest">去测 MBTI</view>
</view>
</view>
</view>
<view class="msg-wrap" wx:for="{{messages}}" wx:key="id" id="msg-{{item.id}}">
<view wx:if="{{item.role === 'assistant'}}" class="msg msg-ai">
<image class="avatar-ai" src="/images/shenxian-ai-logo.png" mode="aspectFill" />
<view class="bubble bubble-ai {{item.isDegraded ? 'bubble-degraded' : ''}}">
<view class="bubble-ai-inner">
<text class="bubble-ai-text" user-select="true">{{item.content}}</text>
</view>
<!-- 精选推荐:周期抽检 + 意图与正文相关;功能卡点击跳转,文章卡走原文/外链 -->
<view
wx:if="{{item.inlineArticle}}"
class="inline-reco"
catchtap="onTapArticle"
data-id="{{item.inlineArticle.id}}"
data-url="{{item.inlineArticle.url}}"
data-title="{{item.inlineArticle.title}}"
data-source-id="{{item.inlineArticle.sourceId}}"
data-nav-path="{{item.inlineArticle.navPath}}"
>
<view class="inline-reco-icons" wx:if="{{item.inlineArticle.icons && item.inlineArticle.icons.length}}">
<text class="inline-reco-ic" wx:for="{{item.inlineArticle.icons}}" wx:for-item="ic" wx:key="*this">{{ic}}</text>
</view>
<view class="inline-reco-bar">
<text class="inline-reco-label">精选推荐</text>
<text class="inline-reco-hint">{{item.inlineArticle.readCountLabel || '阅读'}}</text>
</view>
<view class="inline-reco-card">
<image class="inline-reco-cover" src="{{item.inlineArticle.cover || defaultCover}}" mode="aspectFill" />
<view class="inline-reco-body">
<text class="inline-reco-title">{{item.inlineArticle.title}}</text>
<view class="inline-reco-meta">
<text class="inline-reco-tag">{{item.inlineArticle.tag || 'MBTI'}}</text>
<text class="inline-reco-time">{{item.inlineArticle.publishedAt}}</text>
</view>
</view>
</view>
</view>
<view class="bubble-meta" wx:if="{{item.isDegraded}}">(降级兜底)</view>
</view>
</view>
<view wx:else class="msg msg-me">
<view class="bubble bubble-me">
<text user-select="true">{{item.content}}</text>
</view>
</view>
</view>
<view class="typing" wx:if="{{sending}}" id="msg-typing">
<image class="avatar-ai" src="/images/shenxian-ai-logo.png" mode="aspectFill" />
<view class="bubble bubble-ai">
<view class="bubble-ai-inner"><text class="bubble-ai-text">神仙AI在思考…</text></view>
</view>
</view>
<view class="report-cta" wx:if="{{showReportCta}}" bindtap="onTapReportCta">
<view class="report-cta-text">✨ 聊了这么多,来份专属 AI 深度画像报告¥9.9</view>
<view class="report-cta-btn">立即生成</view>
</view>
<view class="scroll-bottom" id="bottom"></view>
</scroll-view>
<!-- 与 Tab 之间的白底垫层,避免聊天记录从输入条/底栏缝隙透出pointer-events:none 不挡操作) -->
<view class="ai-bottom-solid" aria-hidden="true" wx:if="{{!auditPurchaseMode}}"></view>
<!-- 底部:快捷语(横滑)+ 输入区,固定在 Tab 之上 -->
<view class="composer-wrap {{quickQuestions.length > 0 ? 'composer-wrap--has-chips' : ''}}" wx:if="{{!auditPurchaseMode}}">
<view class="quick-chips-outer" wx:if="{{quickQuestions.length > 0}}">
<scroll-view
class="quick-chips-scroll"
scroll-x="{{true}}"
enhanced="{{true}}"
show-scrollbar="{{false}}"
>
<view class="quick-chips-row">
<view
class="quick-chip"
wx:for="{{quickQuestions}}"
wx:for-item="q"
wx:key="*this"
data-q="{{q}}"
bindtap="onTapQuick"
>{{q}}</view>
</view>
</scroll-view>
<view class="quick-chips-edge-fade" aria-hidden="true"></view>
</view>
<view class="input-bar">
<view class="resume-entry" bindtap="onTapUploadResume" hover-class="resume-entry--press">
<view class="resume-entry-icon" aria-hidden="true"></view>
<text class="resume-entry-txt">简历</text>
</view>
<input
class="input"
placeholder="问你想了解的自己"
placeholder-class="input-ph"
value="{{draft}}"
bindinput="onInput"
bindfocus="onInputFocus"
bindconfirm="onSend"
confirm-type="send"
confirm-hold="true"
adjust-position="{{true}}"
maxlength="800"
disabled="{{sending}}"
/>
<button
class="send-icon-btn {{draft ? 'send-icon-btn--active' : ''}}"
bindtap="onSend"
disabled="{{sending || !draft}}"
hover-class="send-icon-btn--hover"
>
<view class="send-icon-plane"></view>
</button>
</view>
</view>
</view>