chat.wxml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <view class="chat-nav">
  2. <navigation-bar title="音乐数字AI客服" back-btn="{{true}}" bg-color="#E8F4FC"></navigation-bar>
  3. </view>
  4. <!-- 背景图 -->
  5. <image class="bg-image" src="./images/bg.png" mode="aspectFill"></image>
  6. <view class="chat-container">
  7. <!-- 聊天消息列表 -->
  8. <scroll-view class="chat-scroll" style="bottom: calc(120rpx + {{keyboardHeight}}px);" scroll-y scroll-into-view="{{scrollToMessage}}" enhanced show-scrollbar="{{false}}">
  9. <view class="message-list">
  10. <block wx:for="{{messages}}" wx:key="id">
  11. <!-- AI文本消息(带头像) -->
  12. <view wx:if="{{item.type === 'ai' && item.contentType === 'text'}}" class="message-row ai-row">
  13. <!-- AI头像 -->
  14. <view class="avatar ai-avatar">
  15. <image class="ai-avatar-image" src="./images/ai-avatar.png" mode="aspectFill" binderror="onAvatarError" wx:if="{{!avatarError}}"></image>
  16. <text wx:if="{{avatarError}}" class="avatar-fallback">AI</text>
  17. </view>
  18. <view class="message-content">
  19. <view class="bubble ai-bubble">
  20. <text class="message-text">{{item.content}}</text>
  21. </view>
  22. </view>
  23. </view>
  24. <!-- 常见问题卡片(不带头像) -->
  25. <view wx:if="{{item.type === 'ai' && item.contentType === 'faq'}}" class="message-row faq-row">
  26. <view class="message-content faq-content-full">
  27. <view class="faq-card">
  28. <view class="faq-header">
  29. <image class="faq-header-img" src="./images/faq-header.png" mode="aspectFit"></image>
  30. </view>
  31. <view class="faq-list">
  32. <view wx:for="{{item.questions}}" wx:key="index" wx:for-item="question" class="faq-item" data-index="{{index}}" bindtap="onFaqTap">
  33. <image class="faq-icon-img" src="./images/faq-icon.png" mode="aspectFit"></image>
  34. <text class="faq-text">{{question}}</text>
  35. <image class="faq-arrow-img" src="./images/arrow-right.png" mode="aspectFit"></image>
  36. </view>
  37. </view>
  38. </view>
  39. </view>
  40. </view>
  41. <!-- 用户消息 -->
  42. <view wx:if="{{item.type === 'user'}}" class="message-row user-row">
  43. <view class="message-content">
  44. <view wx:if="{{item.contentType === 'text'}}" class="bubble user-bubble">
  45. <text class="message-text">{{item.content}}</text>
  46. </view>
  47. <view wx:if="{{item.contentType === 'image'}}" class="user-image">
  48. <image src="{{item.content}}" mode="aspectFill" bindtap="onImageTap" data-url="{{item.content}}"></image>
  49. </view>
  50. </view>
  51. <view class="avatar user-avatar">
  52. <image wx:if="{{userAvatar}}" src="{{userAvatar}}" mode="widthFix"></image>
  53. <image wx:else src="./images/user-avatar.png" mode="widthFix"></image>
  54. </view>
  55. </view>
  56. <!-- AI回复(用户问题答案) -->
  57. <view wx:if="{{item.type === 'reply'}}" class="message-row ai-row">
  58. <view class="avatar ai-avatar">
  59. <image class="ai-avatar-image" src="./images/ai-avatar.png" mode="aspectFill" binderror="onAvatarError" wx:if="{{!avatarError}}"></image>
  60. <text wx:if="{{avatarError}}" class="avatar-fallback">AI</text>
  61. </view>
  62. <view class="message-content">
  63. <view class="bubble ai-bubble">
  64. <text class="message-text">{{item.content}}</text>
  65. </view>
  66. </view>
  67. </view>
  68. </block>
  69. <!-- 加载中状态 -->
  70. <view wx:if="{{isLoading}}" class="message-row ai-row loading-row">
  71. <view class="avatar ai-avatar">
  72. <image class="ai-avatar-image" src="./images/ai-avatar.png" mode="aspectFill"></image>
  73. </view>
  74. <view class="loading-bubble">
  75. <view class="loading-dots">
  76. <view class="dot"></view>
  77. <view class="dot"></view>
  78. <view class="dot"></view>
  79. </view>
  80. </view>
  81. </view>
  82. <view id="last-message"></view>
  83. </view>
  84. </scroll-view>
  85. <!-- 输入区域 -->
  86. <view class="input-area" style="bottom: {{keyboardHeight}}px;">
  87. <view class="input-container">
  88. <view class="input-wrapper">
  89. <input
  90. class="chat-input"
  91. placeholder="请输入您的问题..."
  92. placeholder-class="placeholder"
  93. value="{{inputValue}}"
  94. bindinput="onInput"
  95. confirm-type="send"
  96. bindconfirm="sendTextMessage"
  97. adjust-position="{{false}}"
  98. cursor-spacing="20"
  99. bindkeyboardheightchange="onKeyboardHeightChange"
  100. />
  101. </view>
  102. <view class="send-btn" bindtap="sendTextMessage">
  103. <text class="send-btn-text">发送</text>
  104. </view>
  105. </view>
  106. </view>
  107. </view>