chat.wxml 4.6 KB

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