vue2-client 1.22.26 → 1.22.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.env.his +19 -19
  2. package/.history/.eslintrc_20260521171150.js +74 -0
  3. package/.history/.eslintrc_20260521171213.js +74 -0
  4. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +726 -0
  5. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +478 -0
  6. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +755 -0
  7. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702161223.vue +748 -0
  8. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702163310.vue +832 -0
  9. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702163324.vue +748 -0
  10. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702165416.vue +748 -0
  11. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702174939.vue +793 -0
  12. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260702115430.vue +1463 -0
  13. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +512 -0
  14. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +511 -0
  15. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +696 -0
  16. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +693 -0
  17. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +677 -0
  18. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260625173703.vue +767 -0
  19. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260626112425.vue +803 -0
  20. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260626173854.vue +1522 -0
  21. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180349.vue +862 -0
  22. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180623.vue +862 -0
  23. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180702.vue +842 -0
  24. package/.history/src/base-client/components/common/XForm/XFormItem_20260703101840.vue +1621 -0
  25. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +643 -0
  26. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +628 -0
  27. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +104 -0
  28. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +102 -0
  29. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20260703180412.vue +1102 -0
  30. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20260703180623.vue +1093 -0
  31. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +1241 -0
  32. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +1223 -0
  33. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +472 -0
  34. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +538 -0
  35. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +650 -0
  36. package/.history/src/base-client/components/his/HAi/HAi_20260618140214.vue +1396 -0
  37. package/.history/src/base-client/components/his/HAi/HAi_20260618140556.vue +1396 -0
  38. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +1469 -0
  39. package/.history/src/base-client/components/his/XRadio/XRadio_20260702140351.vue +774 -0
  40. package/.history/src/base-client/components/his/XRadio/XRadio_20260702140441.vue +774 -0
  41. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +788 -0
  42. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +780 -0
  43. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +585 -0
  44. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +787 -0
  45. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +739 -0
  46. package/.history/src/components/STable/index_20260409155138.js +806 -0
  47. package/.history/src/components/STable/index_20260409155218.js +814 -0
  48. package/.history/src/expression/core/Expression_20260305164427.js +1371 -0
  49. package/.history/src/expression/core/Expression_20260305170258.js +1358 -0
  50. package/.history/src/expression/core/Program_20260305111830.js +944 -0
  51. package/.history/src/expression/core/Program_20260305112041.js +931 -0
  52. package/.history/src/logic/LogicRunner_20260304154306.js +170 -0
  53. package/.history/src/logic/LogicRunner_20260304155553.js +112 -0
  54. package/.history/src/logic/LogicRunner_20260305105834.js +112 -0
  55. package/.history/src/logic/LogicRunner_20260305112718.js +129 -0
  56. package/.history/src/logic/LogicRunner_20260305182436.js +133 -0
  57. package/.history/src/logic/LogicRunner_20260306151301.js +213 -0
  58. package/.history/src/logic/LogicRunner_20260306152419.js +213 -0
  59. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +61 -0
  60. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +44 -0
  61. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +44 -0
  62. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +80 -0
  63. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +75 -0
  64. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +75 -0
  65. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +72 -0
  66. package/.history/src/services/api/restTools_20260427142149.js +245 -0
  67. package/.history/src/services/api/restTools_20260427142853.js +230 -0
  68. package/.history/src/services/api/restTools_20260519135558.js +230 -0
  69. package/.history/src/services/api/restTools_20260519140825.js +230 -0
  70. package/.history/src/services/api/restTools_20260519151223.js +230 -0
  71. package/.history/src/theme/global_20260703101634.less +370 -0
  72. package/.history/src/theme/global_20260703101840.less +337 -0
  73. package/.history/src/theme/global_20260703104511.less +337 -0
  74. package/.history/src/utils/indexedDB_20260306150918.js +593 -0
  75. package/.history/src/utils/indexedDB_20260306151301.js +586 -0
  76. package/.idea/codeStyles/Project.xml +62 -0
  77. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  78. package/.idea/misc.xml +5 -87
  79. package/docs/XCollapse/345/261/225/345/274/200/347/251/272/347/231/275/346/216/222/346/237/245/350/256/260/345/275/225.md +153 -0
  80. package/package.json +1 -1
  81. package/preview-input-box.html +180 -0
  82. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +775 -748
  83. package/src/base-client/components/common/HIS/HForm/HForm.vue +1708 -1186
  84. package/src/base-client/components/common/HIS/HTab/HTab.vue +790 -790
  85. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  86. package/src/base-client/components/his/XRadio/XRadio.vue +73 -1
  87. package/src/base-client/components/his/XTitle/XTitle.vue +63 -3
  88. package/src/base-client/components/his/XTransfer/index.md +327 -327
  89. package/src/services/user.js +1 -0
  90. package/.idea/.name +0 -1
  91. package/.idea/MarsCodeWorkspaceAppSettings.xml +0 -8
  92. package/.idea/deployment.xml +0 -14
  93. package/.idea/gradle.xml +0 -7
  94. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  95. package/.idea/libraries/contour_plot.xml +0 -9
  96. package/.idea/material_theme_project_new.xml +0 -18
@@ -0,0 +1,1396 @@
1
+ <template>
2
+ <div class="ai-consultation-outer">
3
+ <div class="ai-consultation-container">
4
+ <div class="chat-area-wrapper">
5
+ <!-- 问题导航条 -->
6
+ <div class="message-nav">
7
+ <div
8
+ v-for="(navItem, navIndex) in navMessages"
9
+ :key="`nav-${navIndex}`"
10
+ class="nav-dot"
11
+ :class="{ active: activeNavIndex === navItem.index }"
12
+ :title="navItem.content"
13
+ @click="scrollToMessage(navItem.index)"
14
+ />
15
+ </div>
16
+ <div class="chat-area">
17
+ <!-- 对话区域 -->
18
+ <div class="dialog-area">
19
+ <template v-for="(item, index) in displayItems">
20
+ <div
21
+ v-if="item.type === 'divider'"
22
+ :key="`divider-${index}`"
23
+ class="dialog-divider"
24
+ >
25
+ <span class="dialog-divider-text">{{ item.text }}</span>
26
+ </div>
27
+ <div
28
+ v-else
29
+ :key="`msg-${index}`"
30
+ :class="['dialog-message', item.type]"
31
+ >
32
+ <div class="message-content">
33
+ <div v-if="item.attachments && item.attachments.length" class="message-attachments">
34
+ <div
35
+ v-for="(file, fileIndex) in item.attachments"
36
+ :key="fileIndex"
37
+ :class="['attachment-item', { 'is-image': file.isImage }]"
38
+ >
39
+ <div v-if="file.isImage" class="image-preview" @click="previewImage(file)">
40
+ <img :src="file.url" :alt="file.name" />
41
+ <span class="image-name">{{ file.name }}</span>
42
+ </div>
43
+ <div v-else class="file-item">
44
+ <a-icon type="file" class="file-icon" />
45
+ <span class="file-name">{{ file.name }}</span>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ <div class="message-bubble">
50
+ <div class="message-text" v-html="renderMd(item.content)" />
51
+ </div>
52
+ <!-- 用户消息操作按钮 - 悬浮显示 -->
53
+ <div v-if="item.type === 'user'" class="message-actions user-actions">
54
+ <span class="action-btn" title="复制" @click="copyMessage(item)">
55
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><defs><clipPath id="master_svg0_2979_064909"><rect x="24" y="0" width="24" height="24" rx="0"/></clipPath></defs><g transform="matrix(0,1,-1,0,24,-24)" clip-path="url(#master_svg0_2979_064909)"><path d="M35.0998046875,10.30078125C35.0998046875,10.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125C43.1998046875,10.30078125,43.1998046875,8.30078125,43.1998046875,8.30078125C43.1998046875,8.30078125,35.0998046875,8.30078125,35.0998046875,8.30078125C35.0998046875,8.30078125,35.0998046875,10.30078125,35.0998046875,10.30078125C35.0998046875,10.30078125,35.0998046875,10.30078125,35.0998046875,10.30078125ZM43.1998046875,10.30078125C43.6416046875,10.30078125,43.9998046875,10.65895125,43.9998046875,11.10078125C43.9998046875,11.10078125,45.9998046875,11.10078125,45.9998046875,11.10078125C45.9998046875,9.55438425,44.7462046875,8.30078125,43.1998046875,8.30078125C43.1998046875,8.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125C43.1998046875,10.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125ZM43.9998046875,11.10078125C43.9998046875,11.10078125,43.9998046875,19.20078125,43.9998046875,19.20078125C43.9998046875,19.20078125,45.9998046875,19.20078125,45.9998046875,19.20078125C45.9998046875,19.20078125,45.9998046875,11.10078125,45.9998046875,11.10078125C45.9998046875,11.10078125,43.9998046875,11.10078125,43.9998046875,11.10078125C43.9998046875,11.10078125,43.9998046875,11.10078125,43.9998046875,11.10078125ZM43.9998046875,19.20078125C43.9998046875,19.64258125,43.6416046875,20.00078125,43.1998046875,20.00078125C43.1998046875,20.00078125,43.1998046875,22.00078125,43.1998046875,22.00078125C44.7462046875,22.00078125,45.9998046875,20.74718125,45.9998046875,19.20078125C45.9998046875,19.20078125,43.9998046875,19.20078125,43.9998046875,19.20078125C43.9998046875,19.20078125,43.9998046875,19.20078125,43.9998046875,19.20078125ZM43.1998046875,20.00078125C43.1998046875,20.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125C35.0998046875,20.00078125,35.0998046875,22.00078125,35.0998046875,22.00078125C35.0998046875,22.00078125,43.1998046875,22.00078125,43.1998046875,22.00078125C43.1998046875,22.00078125,43.1998046875,20.00078125,43.1998046875,20.00078125C43.1998046875,20.00078125,43.1998046875,20.00078125,43.1998046875,20.00078125ZM35.0998046875,20.00078125C34.6579746875,20.00078125,34.2998046875,19.64258125,34.2998046875,19.20078125C34.2998046875,19.20078125,32.2998046875,19.20078125,32.2998046875,19.20078125C32.2998046875,20.74718125,33.5534076875,22.00078125,35.0998046875,22.00078125C35.0998046875,22.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125C35.0998046875,20.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125ZM34.2998046875,19.20078125C34.2998046875,19.20078125,34.2998046875,11.10078125,34.2998046875,11.10078125C34.2998046875,11.10078125,32.2998046875,11.10078125,32.2998046875,11.10078125C32.2998046875,11.10078125,32.2998046875,19.20078125,32.2998046875,19.20078125C32.2998046875,19.20078125,34.2998046875,19.20078125,34.2998046875,19.20078125C34.2998046875,19.20078125,34.2998046875,19.20078125,34.2998046875,19.20078125ZM34.2998046875,11.10078125C34.2998046875,10.65895125,34.6579746875,10.30078125,35.0998046875,10.30078125C35.0998046875,10.30078125,35.0998046875,8.30078125,35.0998046875,8.30078125C33.5534076875,8.30078125,32.2998046875,9.55438425,32.2998046875,11.10078125C32.2998046875,11.10078125,34.2998046875,11.10078125,34.2998046875,11.10078125C34.2998046875,11.10078125,34.2998046875,11.10078125,34.2998046875,11.10078125Z" fill="#94979E" fill-opacity="1"/><path d="M29.7,15.7C30.2522802,15.7,30.6999998,15.2523,30.6999998,14.7C30.6999998,14.1477,30.2522802,13.7,29.7,13.7C29.7,13.7,29.7,15.7,29.7,15.7C29.7,15.7,29.7,15.7,29.7,15.7ZM27,12.9C27,12.9,26,12.9,26,12.9C26,12.9,27,12.9,27,12.9C27,12.9,27,12.9,27,12.9ZM28.8,3C28.8,3,28.8,2,28.8,2C28.8,2,28.8,3,28.8,3C28.8,3,28.8,3,28.8,3ZM36.9,3C36.9,3,36.9,2,36.9,2C36.9,2,36.9,3,36.9,3C36.9,3,36.9,3,36.9,3ZM37.7,5.7C37.7,6.2522802,38.1477,6.6999998,38.7,6.6999998C39.2523,6.6999998,39.7,6.2522802,39.7,5.7C39.7,5.7,37.7,5.7,37.7,5.7C37.7,5.7,37.7,5.7,37.7,5.7ZM29.7,13.7C29.7,13.7,28.8,13.7,28.8,13.7C28.8,13.7,28.8,15.7,28.8,15.7C28.8,15.7,29.7,15.7,29.7,15.7C29.7,15.7,29.7,13.7,29.7,13.7C29.7,13.7,29.7,13.7,29.7,13.7ZM28.8,13.7C28.5878301,13.7,28.38434,13.6157,28.2343099,13.4657C28.2343099,13.4657,26.82010102,14.8799,26.82010102,14.8799C27.345203,15.405,28.057389999999998,15.7,28.8,15.7C28.8,15.7,28.8,13.7,28.8,13.7C28.8,13.7,28.8,13.7,28.8,13.7ZM28.2343099,13.4657C28.08429,13.3157,28,13.1122,28,12.9C28,12.9,26,12.9,26,12.9C26,13.6426,26.294999,14.3548,26.82010102,14.8799C26.82010102,14.8799,28.2343099,13.4657,28.2343099,13.4657C28.2343099,13.4657,28.2343099,13.4657,28.2343099,13.4657ZM28,12.9C28,12.9,28,4.8,28,4.8C28,4.8,26,4.8,26,4.8C26,4.8,26,12.9,26,12.9C26,12.9,28,12.9,28,12.9C28,12.9,28,12.9,28,12.9ZM28,4.8C28,4.5878301,28.08429,4.38434,28.2343099,4.2343098999999995C28.2343099,4.2343098999999995,26.82010102,2.82010102,26.82010102,2.82010102C26.294999,3.3452029999999997,26,4.05739,26,4.8C26,4.8,28,4.8,28,4.8C28,4.8,28,4.8,28,4.8ZM28.2343099,4.2343098999999995C28.38434,4.08429,28.5878301,4,28.8,4C28.8,4,28.8,2,28.8,2C28.057389999999998,2,27.345203,2.294999,26.82010102,2.82010102C26.82010102,2.82010102,28.2343099,4.2343098999999995,28.2343099,4.2343098999999995C28.2343099,4.2343098999999995,28.2343099,4.2343098999999995,28.2343099,4.2343098999999995ZM28.8,4C28.8,4,36.9,4,36.9,4C36.9,4,36.9,2,36.9,2C36.9,2,28.8,2,28.8,2C28.8,2,28.8,4,28.8,4C28.8,4,28.8,4,28.8,4ZM36.9,4C37.1122,4,37.3157,4.08429,37.4657,4.2343098999999995C37.4657,4.2343098999999995,38.8799,2.82010102,38.8799,2.82010102C38.3548,2.294999,37.6426,2,36.9,2C36.9,2,36.9,4,36.9,4C36.9,4,36.9,4,36.9,4ZM37.4657,4.2343098999999995C37.615700000000004,4.38434,37.7,4.5878301,37.7,4.8C37.7,4.8,39.7,4.8,39.7,4.8C39.7,4.05739,39.405,3.3452029999999997,38.8799,2.82010102C38.8799,2.82010102,37.4657,4.2343098999999995,37.4657,4.2343098999999995C37.4657,4.2343098999999995,37.4657,4.2343098999999995,37.4657,4.2343098999999995ZM37.7,4.8C37.7,4.8,37.7,5.7,37.7,5.7C37.7,5.7,39.7,5.7,39.7,5.7C39.7,5.7,39.7,4.8,39.7,4.8C39.7,4.8,37.7,4.8,37.7,4.8C37.7,4.8,37.7,4.8,37.7,4.8Z" fill="#94979E" fill-opacity="1"/></g></svg>
56
+ </span>
57
+ <span class="action-btn" title="修改" @click="editMessage(item)">
58
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><path d="M21.4545,8.3636398C22.181801,7.6363597,22.181801,6.5454497,21.4545,5.818179799999999C21.4545,5.818179799999999,18.181801,2.5454547400000003,18.181801,2.5454547400000003C17.4545,1.81818175,16.363599999999998,1.81818175,15.6364,2.5454547400000003C15.6364,2.5454547400000003,2,16.181800000000003,2,16.181800000000003C2,16.181800000000003,2,22,2,22C2,22,7.8181801,22,7.8181801,22C7.8181801,22,21.4545,8.3636398,21.4545,8.3636398ZM16.909100000000002,3.8181797C16.909100000000002,3.8181797,20.181801,7.09091,20.181801,7.09091C20.181801,7.09091,17.4545,9.8181796,17.4545,9.8181796C17.4545,9.8181796,14.1818,6.5454497,14.1818,6.5454497C14.1818,6.5454497,16.909100000000002,3.8181797,16.909100000000002,3.8181797ZM3.81818,20.181799C3.81818,20.181799,3.81818,16.909100000000002,3.81818,16.909100000000002C3.81818,16.909100000000002,12.9091,7.8181796,12.9091,7.8181796C12.9091,7.8181796,16.181800000000003,11.09091,16.181800000000003,11.09091C16.181800000000003,11.09091,7.09091,20.181799,7.09091,20.181799C7.09091,20.181799,3.81818,20.181799,3.81818,20.181799Z" fill="#94979E" fill-opacity="1"/></svg>
59
+ </span>
60
+ <span class="action-btn" title="收藏" @click="favoriteMessage(item)">
61
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><path d="M21.9251463125,8.9689453225C21.9251463125,8.5271173125,21.5670453125,8.1689453125,21.1252463125,8.1689453125C20.6833453125,8.1689453125,20.3251453125,8.5271173125,20.3251453125,8.9689453225C20.3251453125,8.9689453225,21.9251463125,8.9689453225,21.9251463125,8.9689453225C21.9251463125,8.9689453225,21.9251463125,8.9689453225,21.9251463125,8.9689453225ZM4.9064453225,18.2314453125C4.4646173125,18.2314453125,4.1064453125,18.5896153125,4.1064453125,19.0314453125C4.1064453125,19.473245312499998,4.4646173125,19.8314453125,4.9064453225,19.8314453125C4.9064453225,19.8314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125C4.9064453225,18.2314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125ZM20.3251453125,8.9689453225C20.3251453125,8.9689453225,20.3251453125,18.0314455125,20.3251453125,18.0314455125C20.3251453125,18.0314455125,21.9251463125,18.0314455125,21.9251463125,18.0314455125C21.9251463125,18.0314455125,21.9251463125,8.9689453225,21.9251463125,8.9689453225C21.9251463125,8.9689453225,20.3251453125,8.9689453225,20.3251453125,8.9689453225C20.3251453125,8.9689453225,20.3251453125,8.9689453225,20.3251453125,8.9689453225ZM20.1252463125,18.2314453125C20.1252463125,18.2314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125C4.9064453225,18.2314453125,4.9064453225,19.8314453125,4.9064453225,19.8314453125C4.9064453225,19.8314453125,20.1252463125,19.8314453125,20.1252463125,19.8314453125C20.1252463125,19.8314453125,20.1252463125,18.2314453125,20.1252463125,18.2314453125C20.1252463125,18.2314453125,20.1252463125,18.2314453125,20.1252463125,18.2314453125ZM20.3251453125,18.0314455125C20.3251453125,18.1419058125,20.2356453125,18.2314453125,20.1252463125,18.2314453125C20.1252463125,18.2314453125,20.1252463125,19.8314453125,20.1252463125,19.8314453125C21.1193443125,19.8314453125,21.9251463125,19.0255453125,21.9251463125,18.0314455125C21.9251463125,18.0314455125,20.3251453125,18.0314455125,20.3251453125,18.0314455125C20.3251453125,18.0314455125,20.3251453125,18.0314455125,20.3251453125,18.0314455125Z" fill="#94979E" fill-opacity="1"/><rect x="3.800000011920929" y="4.800000011920929" width="14.399999976158142" height="11.399999976158142" rx="1.199999988079071" fill-opacity="0" stroke-opacity="1" stroke="#94979E" fill="none" stroke-width="1.600000023841858"/><path d="M12,8C12,7.44771501,11.552285,7,11,7C10.44771501,7,10,7.44771501,10,8C10,8,12,8,12,8C12,8,12,8,12,8ZM10,13.4000001C10,13.95228,10.44771501,14.4000001,11,14.4000001C11.552285,14.4000001,12,13.95228,12,13.4000001C12,13.4000001,10,13.4000001,10,13.4000001C10,13.4000001,10,13.4000001,10,13.4000001ZM10,8C10,8,10,13.4000001,10,13.4000001C10,13.4000001,12,13.4000001,12,13.4000001C12,13.4000001,12,8,12,8C12,8,10,8,10,8C10,8,10,8,10,8Z" fill="#94979E" fill-opacity="1"/><path d="M16.7001953125,10.701171875C16.7001953125,10.148886885,16.2524803125,9.701171875,15.7001953125,9.701171875C15.1479103225,9.701171875,14.7001953125,10.148886885,14.7001953125,10.701171875C14.7001953125,10.701171875,16.7001953125,10.701171875,16.7001953125,10.701171875C16.7001953125,10.701171875,16.7001953125,10.701171875,16.7001953125,10.701171875ZM14.7001953125,16.101171975C14.7001953125,16.653451875000002,15.1479103225,17.101171975,15.7001953125,17.101171975C16.2524803125,17.101171975,16.7001953125,16.653451875000002,16.7001953125,16.101171975C16.7001953125,16.101171975,14.7001953125,16.101171975,14.7001953125,16.101171975C14.7001953125,16.101171975,14.7001953125,16.101171975,14.7001953125,16.101171975ZM14.7001953125,10.701171875C14.7001953125,10.701171875,14.7001953125,16.101171975,14.7001953125,16.101171975C14.7001953125,16.101171975,16.7001953125,16.101171975,16.7001953125,16.101171975C16.7001953125,16.101171975,16.7001953125,10.701171875,16.7001953125,10.701171875C16.7001953125,10.701171875,14.7001953125,10.701171875,14.7001953125,10.701171875C14.7001953125,10.701171875,14.7001953125,10.701171875,14.7001953125,10.701171875Z" fill="#94979E" fill-opacity="1" transform="matrix(0,1,-1,0,24.4013671875,-4.9990234375)"/></svg>
62
+ </span>
63
+ <span class="action-btn" title="删除" @click="deleteMessage(item)">
64
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><defs><clipPath id="master_svg0_2979_064907"><rect x="0" y="0" width="24" height="24" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_2979_064907)"><path d="M3.9000000953674316,5.60009765625C3.3477151053674317,5.60009765625,2.9000000953674316,6.04781266625,2.9000000953674316,6.60009765625C2.9000000953674316,7.1523826562499995,3.3477151053674317,7.60009765625,3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625C3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625ZM20.100001095367432,7.60009765625C20.652300095367433,7.60009765625,21.100001095367432,7.1523826562499995,21.100001095367432,6.60009765625C21.100001095367432,6.04781266625,20.652300095367433,5.60009765625,20.100001095367432,5.60009765625C20.100001095367432,5.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625C20.100001095367432,7.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625ZM3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625C20.100001095367432,7.60009765625,20.100001095367432,5.60009765625,20.100001095367432,5.60009765625C20.100001095367432,5.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625C3.9000000953674316,5.60009765625,3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625Z" fill="#94979E" fill-opacity="1"/><path d="M18.298828220367433,6.5999999C18.298828220367433,6.5999999,19.298828220367433,6.5999999,19.298828220367433,6.5999999C19.298828220367433,6.04772,18.851128220367432,5.5999999,18.298828220367433,5.5999999C18.298828220367433,5.5999999,18.298828220367433,6.5999999,18.298828220367433,6.5999999C18.298828220367433,6.5999999,18.298828220367433,6.5999999,18.298828220367433,6.5999999ZM5.698828220367432,19.200001C5.698828220367432,19.200001,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.200001,5.698828220367432,19.200001,5.698828220367432,19.200001C5.698828220367432,19.200001,5.698828220367432,19.200001,5.698828220367432,19.200001ZM5.698828220367432,6.5999999C5.698828220367432,6.5999999,5.698828220367432,5.5999999,5.698828220367432,5.5999999C5.146543230367431,5.5999999,4.698828220367432,6.04772,4.698828220367432,6.5999999C4.698828220367432,6.5999999,5.698828220367432,6.5999999,5.698828220367432,6.5999999C5.698828220367432,6.5999999,5.698828220367432,6.5999999,5.698828220367432,6.5999999ZM7.398828220367432,6.5999999C7.398828220367432,7.1522799,7.8465483203674316,7.5999999,8.398828220367431,7.5999999C8.951108420367433,7.5999999,9.398828020367432,7.1522799,9.398828020367432,6.5999999C9.398828020367432,6.5999999,7.398828220367432,6.5999999,7.398828220367432,6.5999999C7.398828220367432,6.5999999,7.398828220367432,6.5999999,7.398828220367432,6.5999999ZM10.198828220367432,3C10.198828220367432,3,10.198828220367432,2,10.198828220367432,2C10.198828220367432,2,10.198828220367432,3,10.198828220367432,3C10.198828220367432,3,10.198828220367432,3,10.198828220367432,3ZM13.798828620367432,3C13.798828620367432,3,13.798828620367432,2,13.798828620367432,2C13.798828620367432,2,13.798828620367432,3,13.798828620367432,3C13.798828620367432,3,13.798828620367432,3,13.798828620367432,3ZM14.59882782036743,6.5999999C14.59882782036743,7.1522799,15.046548220367432,7.5999999,15.598828220367432,7.5999999C16.151128220367433,7.5999999,16.59882822036743,7.1522799,16.59882822036743,6.5999999C16.59882822036743,6.5999999,14.59882782036743,6.5999999,14.59882782036743,6.5999999C14.59882782036743,6.5999999,14.59882782036743,6.5999999,14.59882782036743,6.5999999ZM17.298828220367433,6.5999999C17.298828220367433,6.5999999,17.298828220367433,19.200001,17.298828220367433,19.200001C17.298828220367433,19.200001,19.298828220367433,19.200001,19.298828220367433,19.200001C19.298828220367433,19.200001,19.298828220367433,6.5999999,19.298828220367433,6.5999999C19.298828220367433,6.5999999,17.298828220367433,6.5999999,17.298828220367433,6.5999999C17.298828220367433,6.5999999,17.298828220367433,6.5999999,17.298828220367433,6.5999999ZM17.298828220367433,19.200001C17.298828220367433,19.412201,17.214528220367434,19.6157,17.064528220367432,19.765699C17.064528220367432,19.765699,18.47872822036743,21.179899,18.47872822036743,21.179899C19.00382822036743,20.6548,19.298828220367433,19.9426,19.298828220367433,19.200001C19.298828220367433,19.200001,17.298828220367433,19.200001,17.298828220367433,19.200001C17.298828220367433,19.200001,17.298828220367433,19.200001,17.298828220367433,19.200001ZM17.064528220367432,19.765699C16.91452822036743,19.915701,16.71102822036743,20,16.498828220367432,20C16.498828220367432,20,16.498828220367432,22,16.498828220367432,22C17.241428220367432,22,17.95362822036743,21.705,18.47872822036743,21.179899C18.47872822036743,21.179899,17.064528220367432,19.765699,17.064528220367432,19.765699C17.064528220367432,19.765699,17.064528220367432,19.765699,17.064528220367432,19.765699ZM16.498828220367432,20C16.498828220367432,20,7.4988282203674315,20,7.4988282203674315,20C7.4988282203674315,20,7.4988282203674315,22,7.4988282203674315,22C7.4988282203674315,22,16.498828220367432,22,16.498828220367432,22C16.498828220367432,22,16.498828220367432,20,16.498828220367432,20C16.498828220367432,20,16.498828220367432,20,16.498828220367432,20ZM7.4988282203674315,20C7.286658320367431,20,7.0831682203674315,19.915701,6.933138120367431,19.765699C6.933138120367431,19.765699,5.518929240367432,21.179899,5.518929240367432,21.179899C6.044031220367431,21.705,6.7562182203674315,22,7.4988282203674315,22C7.4988282203674315,22,7.4988282203674315,20,7.4988282203674315,20C7.4988282203674315,20,7.4988282203674315,20,7.4988282203674315,20ZM6.933138120367431,19.765699C6.783118220367432,19.6157,6.698828220367432,19.412201,6.698828220367432,19.200001C6.698828220367432,19.200001,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.9426,4.993827220367431,20.6548,5.518929240367432,21.179899C5.518929240367432,21.179899,6.933138120367431,19.765699,6.933138120367431,19.765699C6.933138120367431,19.765699,6.933138120367431,19.765699,6.933138120367431,19.765699ZM6.698828220367432,19.200001C6.698828220367432,19.200001,6.698828220367432,6.5999999,6.698828220367432,6.5999999C6.698828220367432,6.5999999,4.698828220367432,6.5999999,4.698828220367432,6.5999999C4.698828220367432,6.5999999,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.200001,6.698828220367432,19.200001,6.698828220367432,19.200001C6.698828220367432,19.200001,6.698828220367432,19.200001,6.698828220367432,19.200001ZM5.698828220367432,7.5999999C5.698828220367432,7.5999999,18.298828220367433,7.5999999,18.298828220367433,7.5999999C18.298828220367433,7.5999999,18.298828220367433,5.5999999,18.298828220367433,5.5999999C18.298828220367433,5.5999999,5.698828220367432,5.5999999,5.698828220367432,5.5999999C5.698828220367432,5.5999999,5.698828220367432,7.5999999,5.698828220367432,7.5999999C5.698828220367432,7.5999999,5.698828220367432,7.5999999,5.698828220367432,7.5999999ZM9.398828020367432,6.5999999C9.398828020367432,6.5999999,9.398828020367432,4.8,9.398828020367432,4.8C9.398828020367432,4.8,7.398828220367432,4.8,7.398828220367432,4.8C7.398828220367432,4.8,7.398828220367432,6.5999999,7.398828220367432,6.5999999C7.398828220367432,6.5999999,9.398828020367432,6.5999999,9.398828020367432,6.5999999C9.398828020367432,6.5999999,9.398828020367432,6.5999999,9.398828020367432,6.5999999ZM9.398828020367432,4.8C9.398828020367432,4.5878301,9.483118020367431,4.38434,9.633138220367432,4.2343098999999995C9.633138220367432,4.2343098999999995,8.218928320367432,2.82010102,8.218928320367432,2.82010102C7.6938281203674315,3.345202,7.398828220367432,4.05739,7.398828220367432,4.8C7.398828220367432,4.8,9.398828020367432,4.8,9.398828020367432,4.8C9.398828020367432,4.8,9.398828020367432,4.8,9.398828020367432,4.8ZM9.633138220367432,4.2343098999999995C9.783168320367432,4.08429,9.986658120367432,4,10.198828220367432,4C10.198828220367432,4,10.198828220367432,2,10.198828220367432,2C9.456218220367433,2,8.744028120367432,2.294999,8.218928320367432,2.82010102C8.218928320367432,2.82010102,9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995C9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995ZM10.198828220367432,4C10.198828220367432,4,13.798828620367432,4,13.798828620367432,4C13.798828620367432,4,13.798828620367432,2,13.798828620367432,2C13.798828620367432,2,10.198828220367432,2,10.198828220367432,2C10.198828220367432,2,10.198828220367432,4,10.198828220367432,4C10.198828220367432,4,10.198828220367432,4,10.198828220367432,4ZM13.798828620367432,4C14.010998220367432,4,14.214488520367432,4.08429,14.364518620367432,4.2343098999999995C14.364518620367432,4.2343098999999995,15.778728220367432,2.82010102,15.778728220367432,2.82010102C15.253628220367432,2.294999,14.541438620367432,2,13.798828620367432,2C13.798828620367432,2,13.798828620367432,4,13.798828620367432,4C13.798828620367432,4,13.798828620367432,4,13.798828620367432,4ZM14.364518620367432,4.2343098999999995C14.514538320367432,4.38434,14.59882782036743,4.5878301,14.59882782036743,4.8C14.59882782036743,4.8,16.59882822036743,4.8,16.59882822036743,4.8C16.59882822036743,4.05739,16.303828220367432,3.345202,15.778728220367432,2.82010102C15.778728220367432,2.82010102,14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995C14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995ZM14.59882782036743,4.8C14.59882782036743,4.8,14.59882782036743,6.5999999,14.59882782036743,6.5999999C14.59882782036743,6.5999999,16.59882822036743,6.5999999,16.59882822036743,6.5999999C16.59882822036743,6.5999999,16.59882822036743,4.8,16.59882822036743,4.8C16.59882822036743,4.8,14.59882782036743,4.8,14.59882782036743,4.8C14.59882782036743,4.8,14.59882782036743,4.8,14.59882782036743,4.8Z" fill="#94979E" fill-opacity="1"/><path d="M11.198828220367432,11.10009765625C11.198828220367432,10.54781266625,10.751113220367431,10.10009765625,10.198828220367432,10.10009765625C9.646543230367431,10.10009765625,9.198828220367432,10.54781266625,9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625C11.198828220367432,11.10009765625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625ZM9.198828220367432,16.50009775625C9.198828220367432,17.052377656250002,9.646543230367431,17.50009775625,10.198828220367432,17.50009775625C10.751113220367431,17.50009775625,11.198828220367432,17.052377656250002,11.198828220367432,16.50009775625C11.198828220367432,16.50009775625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625C9.198828220367432,16.50009775625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625ZM9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625C9.198828220367432,16.50009775625,11.198828220367432,16.50009775625,11.198828220367432,16.50009775625C11.198828220367432,16.50009775625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625C11.198828220367432,11.10009765625,9.198828220367432,11.10009765625,9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,9.198828220367432,11.10009765625,9.198828220367432,11.10009765625Z" fill="#94979E" fill-opacity="1"/><path d="M14.800390720367432,11.10009765625C14.800390720367432,10.54781266625,14.352675720367431,10.10009765625,13.800390720367432,10.10009765625C13.248105730367431,10.10009765625,12.800390720367432,10.54781266625,12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625C14.800390720367432,11.10009765625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625ZM12.800390720367432,16.50009775625C12.800390720367432,17.052377656250002,13.248105730367431,17.50009775625,13.800390720367432,17.50009775625C14.352675720367431,17.50009775625,14.800390720367432,17.052377656250002,14.800390720367432,16.50009775625C14.800390720367432,16.50009775625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625C12.800390720367432,16.50009775625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625ZM12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625C12.800390720367432,16.50009775625,14.800390720367432,16.50009775625,14.800390720367432,16.50009775625C14.800390720367432,16.50009775625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625C14.800390720367432,11.10009765625,12.800390720367432,11.10009765625,12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,12.800390720367432,11.10009765625,12.800390720367432,11.10009765625Z" fill="#94979E" fill-opacity="1"/></g></svg>
65
+ </span>
66
+ </div>
67
+ <!-- AI消息操作按钮 - 当前正在输出的消息等渲染完成后再显示 -->
68
+ <div v-if="item.type === 'ai' && (!isAiStreaming || index !== displayItems.length - 1)" class="message-actions ai-actions">
69
+ <span class="action-btn" title="复制" @click="copyMessage(item)">
70
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><defs><clipPath id="master_svg0_2979_064909"><rect x="24" y="0" width="24" height="24" rx="0"/></clipPath></defs><g transform="matrix(0,1,-1,0,24,-24)" clip-path="url(#master_svg0_2979_064909)"><path d="M35.0998046875,10.30078125C35.0998046875,10.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125C43.1998046875,10.30078125,43.1998046875,8.30078125,43.1998046875,8.30078125C43.1998046875,8.30078125,35.0998046875,8.30078125,35.0998046875,8.30078125C35.0998046875,8.30078125,35.0998046875,10.30078125,35.0998046875,10.30078125C35.0998046875,10.30078125,35.0998046875,10.30078125,35.0998046875,10.30078125ZM43.1998046875,10.30078125C43.6416046875,10.30078125,43.9998046875,10.65895125,43.9998046875,11.10078125C43.9998046875,11.10078125,45.9998046875,11.10078125,45.9998046875,11.10078125C45.9998046875,9.55438425,44.7462046875,8.30078125,43.1998046875,8.30078125C43.1998046875,8.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125C43.1998046875,10.30078125,43.1998046875,10.30078125,43.1998046875,10.30078125ZM43.9998046875,11.10078125C43.9998046875,11.10078125,43.9998046875,19.20078125,43.9998046875,19.20078125C43.9998046875,19.20078125,45.9998046875,19.20078125,45.9998046875,19.20078125C45.9998046875,19.20078125,45.9998046875,11.10078125,45.9998046875,11.10078125C45.9998046875,11.10078125,43.9998046875,11.10078125,43.9998046875,11.10078125C43.9998046875,11.10078125,43.9998046875,11.10078125,43.9998046875,11.10078125ZM43.9998046875,19.20078125C43.9998046875,19.64258125,43.6416046875,20.00078125,43.1998046875,20.00078125C43.1998046875,20.00078125,43.1998046875,22.00078125,43.1998046875,22.00078125C44.7462046875,22.00078125,45.9998046875,20.74718125,45.9998046875,19.20078125C45.9998046875,19.20078125,43.9998046875,19.20078125,43.9998046875,19.20078125C43.9998046875,19.20078125,43.9998046875,19.20078125,43.9998046875,19.20078125ZM43.1998046875,20.00078125C43.1998046875,20.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125C35.0998046875,20.00078125,35.0998046875,22.00078125,35.0998046875,22.00078125C35.0998046875,22.00078125,43.1998046875,22.00078125,43.1998046875,22.00078125C43.1998046875,22.00078125,43.1998046875,20.00078125,43.1998046875,20.00078125C43.1998046875,20.00078125,43.1998046875,20.00078125,43.1998046875,20.00078125ZM35.0998046875,20.00078125C34.6579746875,20.00078125,34.2998046875,19.64258125,34.2998046875,19.20078125C34.2998046875,19.20078125,32.2998046875,19.20078125,32.2998046875,19.20078125C32.2998046875,20.74718125,33.5534076875,22.00078125,35.0998046875,22.00078125C35.0998046875,22.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125C35.0998046875,20.00078125,35.0998046875,20.00078125,35.0998046875,20.00078125ZM34.2998046875,19.20078125C34.2998046875,19.20078125,34.2998046875,11.10078125,34.2998046875,11.10078125C34.2998046875,11.10078125,32.2998046875,11.10078125,32.2998046875,11.10078125C32.2998046875,11.10078125,32.2998046875,19.20078125,32.2998046875,19.20078125C32.2998046875,19.20078125,34.2998046875,19.20078125,34.2998046875,19.20078125C34.2998046875,19.20078125,34.2998046875,19.20078125,34.2998046875,19.20078125ZM34.2998046875,11.10078125C34.2998046875,10.65895125,34.6579746875,10.30078125,35.0998046875,10.30078125C35.0998046875,10.30078125,35.0998046875,8.30078125,35.0998046875,8.30078125C33.5534076875,8.30078125,32.2998046875,9.55438425,32.2998046875,11.10078125C32.2998046875,11.10078125,34.2998046875,11.10078125,34.2998046875,11.10078125C34.2998046875,11.10078125,34.2998046875,11.10078125,34.2998046875,11.10078125Z" fill="#94979E" fill-opacity="1"/><path d="M29.7,15.7C30.2522802,15.7,30.6999998,15.2523,30.6999998,14.7C30.6999998,14.1477,30.2522802,13.7,29.7,13.7C29.7,13.7,29.7,15.7,29.7,15.7C29.7,15.7,29.7,15.7,29.7,15.7ZM27,12.9C27,12.9,26,12.9,26,12.9C26,12.9,27,12.9,27,12.9C27,12.9,27,12.9,27,12.9ZM28.8,3C28.8,3,28.8,2,28.8,2C28.8,2,28.8,3,28.8,3C28.8,3,28.8,3,28.8,3ZM36.9,3C36.9,3,36.9,2,36.9,2C36.9,2,36.9,3,36.9,3C36.9,3,36.9,3,36.9,3ZM37.7,5.7C37.7,6.2522802,38.1477,6.6999998,38.7,6.6999998C39.2523,6.6999998,39.7,6.2522802,39.7,5.7C39.7,5.7,37.7,5.7,37.7,5.7C37.7,5.7,37.7,5.7,37.7,5.7ZM29.7,13.7C29.7,13.7,28.8,13.7,28.8,13.7C28.8,13.7,28.8,15.7,28.8,15.7C28.8,15.7,29.7,15.7,29.7,15.7C29.7,15.7,29.7,13.7,29.7,13.7C29.7,13.7,29.7,13.7,29.7,13.7ZM28.8,13.7C28.5878301,13.7,28.38434,13.6157,28.2343099,13.4657C28.2343099,13.4657,26.82010102,14.8799,26.82010102,14.8799C27.345203,15.405,28.057389999999998,15.7,28.8,15.7C28.8,15.7,28.8,13.7,28.8,13.7C28.8,13.7,28.8,13.7,28.8,13.7ZM28.2343099,13.4657C28.08429,13.3157,28,13.1122,28,12.9C28,12.9,26,12.9,26,12.9C26,13.6426,26.294999,14.3548,26.82010102,14.8799C26.82010102,14.8799,28.2343099,13.4657,28.2343099,13.4657C28.2343099,13.4657,28.2343099,13.4657,28.2343099,13.4657ZM28,12.9C28,12.9,28,4.8,28,4.8C28,4.8,26,4.8,26,4.8C26,4.8,26,12.9,26,12.9C26,12.9,28,12.9,28,12.9C28,12.9,28,12.9,28,12.9ZM28,4.8C28,4.5878301,28.08429,4.38434,28.2343099,4.2343098999999995C28.2343099,4.2343098999999995,26.82010102,2.82010102,26.82010102,2.82010102C26.294999,3.3452029999999997,26,4.05739,26,4.8C26,4.8,28,4.8,28,4.8C28,4.8,28,4.8,28,4.8ZM28.2343099,4.2343098999999995C28.38434,4.08429,28.5878301,4,28.8,4C28.8,4,28.8,2,28.8,2C28.057389999999998,2,27.345203,2.294999,26.82010102,2.82010102C26.82010102,2.82010102,28.2343099,4.2343098999999995,28.2343099,4.2343098999999995C28.2343099,4.2343098999999995,28.2343099,4.2343098999999995,28.2343099,4.2343098999999995ZM28.8,4C28.8,4,36.9,4,36.9,4C36.9,4,36.9,2,36.9,2C36.9,2,28.8,2,28.8,2C28.8,2,28.8,4,28.8,4C28.8,4,28.8,4,28.8,4ZM36.9,4C37.1122,4,37.3157,4.08429,37.4657,4.2343098999999995C37.4657,4.2343098999999995,38.8799,2.82010102,38.8799,2.82010102C38.3548,2.294999,37.6426,2,36.9,2C36.9,2,36.9,4,36.9,4C36.9,4,36.9,4,36.9,4ZM37.4657,4.2343098999999995C37.615700000000004,4.38434,37.7,4.5878301,37.7,4.8C37.7,4.8,39.7,4.8,39.7,4.8C39.7,4.05739,39.405,3.3452029999999997,38.8799,2.82010102C38.8799,2.82010102,37.4657,4.2343098999999995,37.4657,4.2343098999999995C37.4657,4.2343098999999995,37.4657,4.2343098999999995,37.4657,4.2343098999999995ZM37.7,4.8C37.7,4.8,37.7,5.7,37.7,5.7C37.7,5.7,39.7,5.7,39.7,5.7C39.7,5.7,39.7,4.8,39.7,4.8C39.7,4.8,37.7,4.8,37.7,4.8C37.7,4.8,37.7,4.8,37.7,4.8Z" fill="#94979E" fill-opacity="1"/></g></svg>
71
+ </span>
72
+ <span class="action-btn" title="刷新" @click="regenerateAiResponse(item)">
73
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#94979E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12a9 9 0 11-9-9c2.52 0 4.93 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/></svg>
74
+ </span>
75
+ <span class="action-btn" title="收藏" @click="favoriteMessage(item)">
76
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><path d="M21.9251463125,8.9689453225C21.9251463125,8.5271173125,21.5670453125,8.1689453125,21.1252463125,8.1689453125C20.6833453125,8.1689453125,20.3251453125,8.5271173125,20.3251453125,8.9689453225C20.3251453125,8.9689453225,21.9251463125,8.9689453225,21.9251463125,8.9689453225C21.9251463125,8.9689453225,21.9251463125,8.9689453225,21.9251463125,8.9689453225ZM4.9064453225,18.2314453125C4.4646173125,18.2314453125,4.1064453125,18.5896153125,4.1064453125,19.0314453125C4.1064453125,19.473245312499998,4.4646173125,19.8314453125,4.9064453225,19.8314453125C4.9064453225,19.8314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125C4.9064453225,18.2314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125ZM20.3251453125,8.9689453225C20.3251453125,8.9689453225,20.3251453125,18.0314455125,20.3251453125,18.0314455125C20.3251453125,18.0314455125,21.9251463125,18.0314455125,21.9251463125,18.0314455125C21.9251463125,18.0314455125,21.9251463125,8.9689453225,21.9251463125,8.9689453225C21.9251463125,8.9689453225,20.3251453125,8.9689453225,20.3251453125,8.9689453225C20.3251453125,8.9689453225,20.3251453125,8.9689453225,20.3251453125,8.9689453225ZM20.1252463125,18.2314453125C20.1252463125,18.2314453125,4.9064453225,18.2314453125,4.9064453225,18.2314453125C4.9064453225,18.2314453125,4.9064453225,19.8314453125,4.9064453225,19.8314453125C4.9064453225,19.8314453125,20.1252463125,19.8314453125,20.1252463125,19.8314453125C20.1252463125,19.8314453125,20.1252463125,18.2314453125,20.1252463125,18.2314453125C20.1252463125,18.2314453125,20.1252463125,18.2314453125,20.1252463125,18.2314453125ZM20.3251453125,18.0314455125C20.3251453125,18.1419058125,20.2356453125,18.2314453125,20.1252463125,18.2314453125C20.1252463125,18.2314453125,20.1252463125,19.8314453125,20.1252463125,19.8314453125C21.1193443125,19.8314453125,21.9251463125,19.0255453125,21.9251463125,18.0314455125C21.9251463125,18.0314455125,20.3251453125,18.0314455125,20.3251453125,18.0314455125C20.3251453125,18.0314455125,20.3251453125,18.0314455125,20.3251453125,18.0314455125Z" fill="#94979E" fill-opacity="1"/><rect x="3.800000011920929" y="4.800000011920929" width="14.399999976158142" height="11.399999976158142" rx="1.199999988079071" fill-opacity="0" stroke-opacity="1" stroke="#94979E" fill="none" stroke-width="1.600000023841858"/><path d="M12,8C12,7.44771501,11.552285,7,11,7C10.44771501,7,10,7.44771501,10,8C10,8,12,8,12,8C12,8,12,8,12,8ZM10,13.4000001C10,13.95228,10.44771501,14.4000001,11,14.4000001C11.552285,14.4000001,12,13.95228,12,13.4000001C12,13.4000001,10,13.4000001,10,13.4000001C10,13.4000001,10,13.4000001,10,13.4000001ZM10,8C10,8,10,13.4000001,10,13.4000001C10,13.4000001,12,13.4000001,12,13.4000001C12,13.4000001,12,8,12,8C12,8,10,8,10,8C10,8,10,8,10,8Z" fill="#94979E" fill-opacity="1"/><path d="M16.7001953125,10.701171875C16.7001953125,10.148886885,16.2524803125,9.701171875,15.7001953125,9.701171875C15.1479103225,9.701171875,14.7001953125,10.148886885,14.7001953125,10.701171875C14.7001953125,10.701171875,16.7001953125,10.701171875,16.7001953125,10.701171875C16.7001953125,10.701171875,16.7001953125,10.701171875,16.7001953125,10.701171875ZM14.7001953125,16.101171975C14.7001953125,16.653451875000002,15.1479103225,17.101171975,15.7001953125,17.101171975C16.2524803125,17.101171975,16.7001953125,16.653451875000002,16.7001953125,16.101171975C16.7001953125,16.101171975,14.7001953125,16.101171975,14.7001953125,16.101171975C14.7001953125,16.101171975,14.7001953125,16.101171975,14.7001953125,16.101171975ZM14.7001953125,10.701171875C14.7001953125,10.701171875,14.7001953125,16.101171975,14.7001953125,16.101171975C14.7001953125,16.101171975,16.7001953125,16.101171975,16.7001953125,16.101171975C16.7001953125,16.101171975,16.7001953125,10.701171875,16.7001953125,10.701171875C16.7001953125,10.701171875,14.7001953125,10.701171875,14.7001953125,10.701171875C14.7001953125,10.701171875,14.7001953125,10.701171875,14.7001953125,10.701171875Z" fill="#94979E" fill-opacity="1" transform="matrix(0,1,-1,0,24.4013671875,-4.9990234375)"/></svg>
77
+ </span>
78
+ <span class="action-btn" title="删除" @click="deleteMessage(item)">
79
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="20" height="20" viewBox="0 0 24 24"><defs><clipPath id="master_svg0_2979_064907"><rect x="0" y="0" width="24" height="24" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_2979_064907)"><path d="M3.9000000953674316,5.60009765625C3.3477151053674317,5.60009765625,2.9000000953674316,6.04781266625,2.9000000953674316,6.60009765625C2.9000000953674316,7.1523826562499995,3.3477151053674317,7.60009765625,3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625C3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625ZM20.100001095367432,7.60009765625C20.652300095367433,7.60009765625,21.100001095367432,7.1523826562499995,21.100001095367432,6.60009765625C21.100001095367432,6.04781266625,20.652300095367433,5.60009765625,20.100001095367432,5.60009765625C20.100001095367432,5.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625C20.100001095367432,7.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625ZM3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,20.100001095367432,7.60009765625,20.100001095367432,7.60009765625C20.100001095367432,7.60009765625,20.100001095367432,5.60009765625,20.100001095367432,5.60009765625C20.100001095367432,5.60009765625,3.9000000953674316,5.60009765625,3.9000000953674316,5.60009765625C3.9000000953674316,5.60009765625,3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625C3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625,3.9000000953674316,7.60009765625Z" fill="#94979E" fill-opacity="1"/><path d="M18.298828220367433,6.5999999C18.298828220367433,6.5999999,19.298828220367433,6.5999999,19.298828220367433,6.5999999C19.298828220367433,6.04772,18.851128220367432,5.5999999,18.298828220367433,5.5999999C18.298828220367433,5.5999999,18.298828220367433,6.5999999,18.298828220367433,6.5999999C18.298828220367433,6.5999999,18.298828220367433,6.5999999,18.298828220367433,6.5999999ZM5.698828220367432,19.200001C5.698828220367432,19.200001,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.200001,5.698828220367432,19.200001,5.698828220367432,19.200001C5.698828220367432,19.200001,5.698828220367432,19.200001,5.698828220367432,19.200001ZM5.698828220367432,6.5999999C5.698828220367432,6.5999999,5.698828220367432,5.5999999,5.698828220367432,5.5999999C5.146543230367431,5.5999999,4.698828220367432,6.04772,4.698828220367432,6.5999999C4.698828220367432,6.5999999,5.698828220367432,6.5999999,5.698828220367432,6.5999999C5.698828220367432,6.5999999,5.698828220367432,6.5999999,5.698828220367432,6.5999999ZM7.398828220367432,6.5999999C7.398828220367432,7.1522799,7.8465483203674316,7.5999999,8.398828220367431,7.5999999C8.951108420367433,7.5999999,9.398828020367432,7.1522799,9.398828020367432,6.5999999C9.398828020367432,6.5999999,7.398828220367432,6.5999999,7.398828220367432,6.5999999C7.398828220367432,6.5999999,7.398828220367432,6.5999999,7.398828220367432,6.5999999ZM10.198828220367432,3C10.198828220367432,3,10.198828220367432,2,10.198828220367432,2C10.198828220367432,2,10.198828220367432,3,10.198828220367432,3C10.198828220367432,3,10.198828220367432,3,10.198828220367432,3ZM13.798828620367432,3C13.798828620367432,3,13.798828620367432,2,13.798828620367432,2C13.798828620367432,2,13.798828620367432,3,13.798828620367432,3C13.798828620367432,3,13.798828620367432,3,13.798828620367432,3ZM14.59882782036743,6.5999999C14.59882782036743,7.1522799,15.046548220367432,7.5999999,15.598828220367432,7.5999999C16.151128220367433,7.5999999,16.59882822036743,7.1522799,16.59882822036743,6.5999999C16.59882822036743,6.5999999,14.59882782036743,6.5999999,14.59882782036743,6.5999999C14.59882782036743,6.5999999,14.59882782036743,6.5999999,14.59882782036743,6.5999999ZM17.298828220367433,6.5999999C17.298828220367433,6.5999999,17.298828220367433,19.200001,17.298828220367433,19.200001C17.298828220367433,19.200001,19.298828220367433,19.200001,19.298828220367433,19.200001C19.298828220367433,19.200001,19.298828220367433,6.5999999,19.298828220367433,6.5999999C19.298828220367433,6.5999999,17.298828220367433,6.5999999,17.298828220367433,6.5999999C17.298828220367433,6.5999999,17.298828220367433,6.5999999,17.298828220367433,6.5999999ZM17.298828220367433,19.200001C17.298828220367433,19.412201,17.214528220367434,19.6157,17.064528220367432,19.765699C17.064528220367432,19.765699,18.47872822036743,21.179899,18.47872822036743,21.179899C19.00382822036743,20.6548,19.298828220367433,19.9426,19.298828220367433,19.200001C19.298828220367433,19.200001,17.298828220367433,19.200001,17.298828220367433,19.200001C17.298828220367433,19.200001,17.298828220367433,19.200001,17.298828220367433,19.200001ZM17.064528220367432,19.765699C16.91452822036743,19.915701,16.71102822036743,20,16.498828220367432,20C16.498828220367432,20,16.498828220367432,22,16.498828220367432,22C17.241428220367432,22,17.95362822036743,21.705,18.47872822036743,21.179899C18.47872822036743,21.179899,17.064528220367432,19.765699,17.064528220367432,19.765699C17.064528220367432,19.765699,17.064528220367432,19.765699,17.064528220367432,19.765699ZM16.498828220367432,20C16.498828220367432,20,7.4988282203674315,20,7.4988282203674315,20C7.4988282203674315,20,7.4988282203674315,22,7.4988282203674315,22C7.4988282203674315,22,16.498828220367432,22,16.498828220367432,22C16.498828220367432,22,16.498828220367432,20,16.498828220367432,20C16.498828220367432,20,16.498828220367432,20,16.498828220367432,20ZM7.4988282203674315,20C7.286658320367431,20,7.0831682203674315,19.915701,6.933138120367431,19.765699C6.933138120367431,19.765699,5.518929240367432,21.179899,5.518929240367432,21.179899C6.044031220367431,21.705,6.7562182203674315,22,7.4988282203674315,22C7.4988282203674315,22,7.4988282203674315,20,7.4988282203674315,20C7.4988282203674315,20,7.4988282203674315,20,7.4988282203674315,20ZM6.933138120367431,19.765699C6.783118220367432,19.6157,6.698828220367432,19.412201,6.698828220367432,19.200001C6.698828220367432,19.200001,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.9426,4.993827220367431,20.6548,5.518929240367432,21.179899C5.518929240367432,21.179899,6.933138120367431,19.765699,6.933138120367431,19.765699C6.933138120367431,19.765699,6.933138120367431,19.765699,6.933138120367431,19.765699ZM6.698828220367432,19.200001C6.698828220367432,19.200001,6.698828220367432,6.5999999,6.698828220367432,6.5999999C6.698828220367432,6.5999999,4.698828220367432,6.5999999,4.698828220367432,6.5999999C4.698828220367432,6.5999999,4.698828220367432,19.200001,4.698828220367432,19.200001C4.698828220367432,19.200001,6.698828220367432,19.200001,6.698828220367432,19.200001C6.698828220367432,19.200001,6.698828220367432,19.200001,6.698828220367432,19.200001ZM5.698828220367432,7.5999999C5.698828220367432,7.5999999,18.298828220367433,7.5999999,18.298828220367433,7.5999999C18.298828220367433,7.5999999,18.298828220367433,5.5999999,18.298828220367433,5.5999999C18.298828220367433,5.5999999,5.698828220367432,5.5999999,5.698828220367432,5.5999999C5.698828220367432,5.5999999,5.698828220367432,7.5999999,5.698828220367432,7.5999999C5.698828220367432,7.5999999,5.698828220367432,7.5999999,5.698828220367432,7.5999999ZM9.398828020367432,6.5999999C9.398828020367432,6.5999999,9.398828020367432,4.8,9.398828020367432,4.8C9.398828020367432,4.8,7.398828220367432,4.8,7.398828220367432,4.8C7.398828220367432,4.8,7.398828220367432,6.5999999,7.398828220367432,6.5999999C7.398828220367432,6.5999999,9.398828020367432,6.5999999,9.398828020367432,6.5999999C9.398828020367432,6.5999999,9.398828020367432,6.5999999,9.398828020367432,6.5999999ZM9.398828020367432,4.8C9.398828020367432,4.5878301,9.483118020367431,4.38434,9.633138220367432,4.2343098999999995C9.633138220367432,4.2343098999999995,8.218928320367432,2.82010102,8.218928320367432,2.82010102C7.6938281203674315,3.345202,7.398828220367432,4.05739,7.398828220367432,4.8C7.398828220367432,4.8,9.398828020367432,4.8,9.398828020367432,4.8C9.398828020367432,4.8,9.398828020367432,4.8,9.398828020367432,4.8ZM9.633138220367432,4.2343098999999995C9.783168320367432,4.08429,9.986658120367432,4,10.198828220367432,4C10.198828220367432,4,10.198828220367432,2,10.198828220367432,2C9.456218220367433,2,8.744028120367432,2.294999,8.218928320367432,2.82010102C8.218928320367432,2.82010102,9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995C9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995,9.633138220367432,4.2343098999999995ZM10.198828220367432,4C10.198828220367432,4,13.798828620367432,4,13.798828620367432,4C13.798828620367432,4,13.798828620367432,2,13.798828620367432,2C13.798828620367432,2,10.198828220367432,2,10.198828220367432,2C10.198828220367432,2,10.198828220367432,4,10.198828220367432,4C10.198828220367432,4,10.198828220367432,4,10.198828220367432,4ZM13.798828620367432,4C14.010998220367432,4,14.214488520367432,4.08429,14.364518620367432,4.2343098999999995C14.364518620367432,4.2343098999999995,15.778728220367432,2.82010102,15.778728220367432,2.82010102C15.253628220367432,2.294999,14.541438620367432,2,13.798828620367432,2C13.798828620367432,2,13.798828620367432,4,13.798828620367432,4C13.798828620367432,4,13.798828620367432,4,13.798828620367432,4ZM14.364518620367432,4.2343098999999995C14.514538320367432,4.38434,14.59882782036743,4.5878301,14.59882782036743,4.8C14.59882782036743,4.8,16.59882822036743,4.8,16.59882822036743,4.8C16.59882822036743,4.05739,16.303828220367432,3.345202,15.778728220367432,2.82010102C15.778728220367432,2.82010102,14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995C14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995,14.364518620367432,4.2343098999999995ZM14.59882782036743,4.8C14.59882782036743,4.8,14.59882782036743,6.5999999,14.59882782036743,6.5999999C14.59882782036743,6.5999999,16.59882822036743,6.5999999,16.59882822036743,6.5999999C16.59882822036743,6.5999999,16.59882822036743,4.8,16.59882822036743,4.8C16.59882822036743,4.8,14.59882782036743,4.8,14.59882782036743,4.8C14.59882782036743,4.8,14.59882782036743,4.8,14.59882782036743,4.8Z" fill="#94979E" fill-opacity="1"/><path d="M11.198828220367432,11.10009765625C11.198828220367432,10.54781266625,10.751113220367431,10.10009765625,10.198828220367432,10.10009765625C9.646543230367431,10.10009765625,9.198828220367432,10.54781266625,9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625C11.198828220367432,11.10009765625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625ZM9.198828220367432,16.50009775625C9.198828220367432,17.052377656250002,9.646543230367431,17.50009775625,10.198828220367432,17.50009775625C10.751113220367431,17.50009775625,11.198828220367432,17.052377656250002,11.198828220367432,16.50009775625C11.198828220367432,16.50009775625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625C9.198828220367432,16.50009775625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625ZM9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,9.198828220367432,16.50009775625,9.198828220367432,16.50009775625C9.198828220367432,16.50009775625,11.198828220367432,16.50009775625,11.198828220367432,16.50009775625C11.198828220367432,16.50009775625,11.198828220367432,11.10009765625,11.198828220367432,11.10009765625C11.198828220367432,11.10009765625,9.198828220367432,11.10009765625,9.198828220367432,11.10009765625C9.198828220367432,11.10009765625,9.198828220367432,11.10009765625,9.198828220367432,11.10009765625Z" fill="#94979E" fill-opacity="1"/><path d="M14.800390720367432,11.10009765625C14.800390720367432,10.54781266625,14.352675720367431,10.10009765625,13.800390720367432,10.10009765625C13.248105730367431,10.10009765625,12.800390720367432,10.54781266625,12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625C14.800390720367432,11.10009765625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625ZM12.800390720367432,16.50009775625C12.800390720367432,17.052377656250002,13.248105730367431,17.50009775625,13.800390720367432,17.50009775625C14.352675720367431,17.50009775625,14.800390720367432,17.052377656250002,14.800390720367432,16.50009775625C14.800390720367432,16.50009775625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625C12.800390720367432,16.50009775625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625ZM12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,12.800390720367432,16.50009775625,12.800390720367432,16.50009775625C12.800390720367432,16.50009775625,14.800390720367432,16.50009775625,14.800390720367432,16.50009775625C14.800390720367432,16.50009775625,14.800390720367432,11.10009765625,14.800390720367432,11.10009765625C14.800390720367432,11.10009765625,12.800390720367432,11.10009765625,12.800390720367432,11.10009765625C12.800390720367432,11.10009765625,12.800390720367432,11.10009765625,12.800390720367432,11.10009765625Z" fill="#94979E" fill-opacity="1"/></g></svg>
80
+ </span>
81
+ </div>
82
+ </div>
83
+ <span v-if="isAiStreaming && index === displayItems.length - 1 && item.type === 'ai'" class="typing-cursor">▍</span>
84
+ </div>
85
+ </template>
86
+ </div>
87
+ </div>
88
+
89
+ <div class="bottom-input-wrapper">
90
+ <div class="input-container">
91
+ <!-- 文件预览区域 - 仅当有附件时显示 -->
92
+ <div v-if="pendingAttachments.length" class="attachment-preview-area">
93
+ <div
94
+ v-for="(file, index) in pendingAttachments"
95
+ :key="index"
96
+ :class="['preview-item', { 'is-image': file.isImage }]"
97
+ >
98
+ <div v-if="file.isImage" class="preview-image">
99
+ <img :src="file.url" :alt="file.name" />
100
+ </div>
101
+ <div v-else class="preview-file">
102
+ <a-icon type="file" />
103
+ <span class="preview-file-name">{{ file.name }}</span>
104
+ </div>
105
+ <a-button
106
+ type="primary"
107
+ shape="circle"
108
+ size="small"
109
+ class="preview-remove-btn"
110
+ @click="removePendingAttachment(index)"
111
+ >
112
+ <a-icon type="close" />
113
+ </a-button>
114
+ </div>
115
+ <div class="add-upload-item" @click="triggerUpload">
116
+ <span class="add-upload-icon">+</span>
117
+ </div>
118
+ </div>
119
+
120
+ <div class="input-textarea-area">
121
+ <a-textarea
122
+ ref="consultTextarea"
123
+ v-model="doctorInputText"
124
+ placeholder="医生补充信息或提问..."
125
+ class="bottom-input"
126
+ :rows="1"
127
+ resize="none"
128
+ @input="handleInput"
129
+ @keydown="handleKeydown"
130
+ ></a-textarea>
131
+ </div>
132
+
133
+ <input
134
+ ref="uploadInput"
135
+ type="file"
136
+ style="display: none"
137
+ @change="handleFileChange"
138
+ multiple
139
+ accept="image/*,.pdf,.doc,.docx"
140
+ />
141
+
142
+ <div class="input-controls">
143
+ <div class="input-controls-left">
144
+ <a-button class="upload-btn" @click="triggerUpload">
145
+ <a-icon type="plus" class="upload-icon" />
146
+ <span class="upload-text">上传(报告、图片)</span>
147
+ </a-button>
148
+ </div>
149
+
150
+ <div class="input-controls-right">
151
+ <span class="enter-tip">Enter</span>
152
+ <a-button
153
+ type="primary"
154
+ shape="circle"
155
+ class="send-btn"
156
+ @click="handleSendMessage"
157
+ :disabled="!doctorInputText.trim() && !pendingAttachments.length"
158
+ >
159
+ <span class="send-icon">↑</span>
160
+ </a-button>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+
167
+ <!-- 图片预览Modal -->
168
+ <a-modal :visible="previewVisible" :footer="null" @cancel="previewVisible = false" width="800px">
169
+ <img :src="previewImageUrl" alt="预览图片" style="width: 100%" />
170
+ </a-modal>
171
+ </div>
172
+ </div>
173
+ </template>
174
+
175
+ <script>
176
+ import { startEventStreamPOST } from '@vue2-client/services/api/restTools'
177
+ import { marked } from 'marked'
178
+ import moment from 'moment/moment'
179
+ import { mapState } from 'vuex'
180
+ import rawAxios from 'axios'
181
+
182
+ const BAICHUAN_FILE_API = 'http://api.baichuan-ai.com/v1/files'
183
+ const BAICHUAN_API_KEY = 'sk-c6368da98129d38b74d7df85a2be8414'
184
+
185
+ export default {
186
+ name: 'AIConsultation',
187
+ emits: ['edit', 'favorite', 'delete', 'refresh'],
188
+ data() {
189
+ return {
190
+ currentDialogId: null,
191
+ doctorInputText: '',
192
+ isPlaying: false,
193
+ isRecording: false,
194
+ patientComplaint: '',
195
+ doctorQuestions: [],
196
+ examinationOrder: null,
197
+ aiDiagnosis: null,
198
+ dialogMessages: [],
199
+ pendingAttachments: [],
200
+ currentStreamConnection: null,
201
+ isAiStreaming: false,
202
+ resizeTimeout: null,
203
+ previewVisible: false,
204
+ previewImageUrl: '',
205
+ activeNavIndex: -1,
206
+ uploading: false,
207
+ uploadProgress: 0
208
+ }
209
+ },
210
+ computed: {
211
+ ...mapState('account', {currUser: 'user'}),
212
+ // 导航消息列表:仅包含用户消息
213
+ navMessages() {
214
+ return this.displayItems
215
+ .map((item, index) => ({ type: item.type, index, content: item.content || '' }))
216
+ .filter(item => item.type === 'user')
217
+ },
218
+ // 把 dialogMessages 与日期分隔符合并成最终渲染列表
219
+ displayItems() {
220
+ const items = []
221
+ let lastDateKey = ''
222
+ this.dialogMessages.forEach(msg => {
223
+ const dateKey = this.getDateKey(msg.timestamp)
224
+ if (dateKey && dateKey !== lastDateKey) {
225
+ items.push({ type: 'divider', text: this.getDateLabel(msg.timestamp) })
226
+ lastDateKey = dateKey
227
+ }
228
+ items.push(msg)
229
+ })
230
+ return items
231
+ }
232
+ },
233
+ mounted() {
234
+ this.$nextTick(() => {
235
+ this.autoResizeTextarea()
236
+ })
237
+ },
238
+ beforeDestroy() {
239
+ // 组件销毁时关闭流式连接
240
+ if (this.currentStreamConnection) {
241
+ this.currentStreamConnection()
242
+ this.currentStreamConnection = null
243
+ }
244
+ if (this.resizeTimeout) {
245
+ clearTimeout(this.resizeTimeout)
246
+ }
247
+ },
248
+ methods: {
249
+ copyMessage(item) {
250
+ // 复制消息内容
251
+ const text = item.content || ''
252
+ if (!text) {
253
+ this.$message.warning('无内容可复制')
254
+ return
255
+ }
256
+ // 兼容方式复制文本
257
+ const textarea = document.createElement('textarea')
258
+ textarea.value = text
259
+ textarea.style.position = 'fixed'
260
+ textarea.style.opacity = '0'
261
+ document.body.appendChild(textarea)
262
+ textarea.select()
263
+ try {
264
+ document.execCommand('copy')
265
+ this.$message.success('已复制')
266
+ } catch {
267
+ this.$message.error('复制失败')
268
+ } finally {
269
+ document.body.removeChild(textarea)
270
+ }
271
+ },
272
+
273
+ editMessage(item) {
274
+ this.$emit('edit', item)
275
+ },
276
+
277
+ favoriteMessage(item) {
278
+ this.$emit('favorite', item)
279
+ },
280
+
281
+ deleteMessage(item) {
282
+ this.$emit('delete', item)
283
+ },
284
+
285
+ regenerateAiResponse(item) {
286
+ this.$emit('refresh', item)
287
+ },
288
+
289
+ autoResizeTextarea() {
290
+ this.$nextTick(() => {
291
+ const textarea = this.$refs.consultTextarea?.$el || this.$refs.consultTextarea
292
+ if (!textarea) return
293
+
294
+ textarea.style.height = 'auto'
295
+ const scrollHeight = textarea.scrollHeight
296
+ textarea.style.height = `${Math.min(Math.max(scrollHeight, 120), 250)}px`
297
+ })
298
+ },
299
+
300
+ handleInput() {
301
+ if (this.resizeTimeout) clearTimeout(this.resizeTimeout)
302
+ this.resizeTimeout = setTimeout(() => {
303
+ this.autoResizeTextarea()
304
+ }, 16)
305
+ },
306
+
307
+ renderMd(text) {
308
+ if (!text) return ''
309
+ try {
310
+ return marked.parse(text, { breaks: true, gfm: true, headerIds: false, mangle: false })
311
+ } catch {
312
+ return text
313
+ }
314
+ },
315
+
316
+ handleKeydown(event) {
317
+ if (event.key === 'Enter' && !event.shiftKey) {
318
+ event.preventDefault()
319
+ this.handleSendMessage()
320
+ }
321
+ },
322
+
323
+ initDialog() {
324
+ if (!this.currentDialogId) {
325
+ this.currentDialogId = moment().format('YYYYMMDDHHmmss')
326
+ }
327
+ },
328
+
329
+ clearDialog() {
330
+ this.currentDialogId = moment().format('YYYYMMDDHHmmss')
331
+ this.dialogMessages = []
332
+ },
333
+
334
+ async handleSendMessage() {
335
+ if (this.uploading) return
336
+ if (!this.doctorInputText.trim() && !this.pendingAttachments.length) return
337
+ if (this.pendingAttachments.some(f => f.uploading || f.uploadProgress > 0 && !f.file_id && !f.uploadFailed)) {
338
+ this.$message.warning('请等待文件上传完成')
339
+ return
340
+ }
341
+
342
+ // 确保有dialogId
343
+ if (!this.currentDialogId) {
344
+ this.initDialog()
345
+ }
346
+
347
+ const messageContent = this.doctorInputText.trim()
348
+ const attachments = [...this.pendingAttachments]
349
+
350
+ // 附件已经在选择时上传完成,直接使用file_id
351
+ const fileIds = attachments
352
+ .filter(f => f.file_id)
353
+ .map(f => ({ file_id: f.file_id }))
354
+
355
+ const doctorMessage = {
356
+ type: 'user',
357
+ content: messageContent,
358
+ time: new Date().toLocaleTimeString(),
359
+ timestamp: Date.now(),
360
+ attachments: attachments
361
+ }
362
+ this.dialogMessages.push(doctorMessage)
363
+ this.scrollToBottom()
364
+
365
+ this.doctorInputText = ''
366
+ this.pendingAttachments = []
367
+ this.autoResizeTextarea()
368
+
369
+ const chatId = this.currentDialogId
370
+ let aiContent = ''
371
+ const aiMsgIndex = this.dialogMessages.length
372
+ this.dialogMessages.push({
373
+ type: 'ai',
374
+ content: '',
375
+ time: new Date().toLocaleTimeString(),
376
+ timestamp: Date.now()
377
+ })
378
+ this.scrollToBottom()
379
+
380
+ this.isAiStreaming = true
381
+
382
+ const requestBody = {
383
+ userMessage: messageContent,
384
+ chatId,
385
+ model: '',
386
+ prompt: '',
387
+ useContext: true,
388
+ user: this.currUser.operInfo,
389
+ files: fileIds
390
+ }
391
+
392
+ this.currentStreamConnection = startEventStreamPOST(
393
+ '/his-web/api/af-his/ai/chat/stream',
394
+ requestBody,
395
+ {'Content-Type': 'application/json'},
396
+ (data, type) => {
397
+ if (type === 'additionalInfo' || type === 'sourceInfo') return
398
+
399
+ let textChunk = ''
400
+ if (typeof data === 'object' && data !== null) {
401
+ const choices = data.choices
402
+ if (Array.isArray(choices) && choices.length > 0) {
403
+ const delta = choices[0].delta
404
+
405
+ // 优先取 delta.content(标准 OpenAI 格式)
406
+ if (delta && typeof delta.content === 'string' && delta.content) {
407
+ textChunk = delta.content
408
+ }
409
+
410
+ // 兼容百川模型的 thinking 字段
411
+ if (!textChunk && delta && delta.thinking) {
412
+ const thinking = delta.thinking
413
+ if (thinking.summary && typeof thinking.summary === 'string') {
414
+ textChunk = `[思考中] ${thinking.summary}`
415
+ }
416
+ if (Array.isArray(thinking.steps)) {
417
+ const activeStep = thinking.steps.find(s => s.status === 'in_progress')
418
+ if (activeStep && activeStep.label) {
419
+ textChunk = `[思考中] ${activeStep.label}`
420
+ }
421
+ }
422
+ }
423
+
424
+ // 检测模型拒答
425
+ const finishReason = choices[0].finish_reason
426
+ if (finishReason === 'refuse_answer') {
427
+ const refuseTip = '\n\n> ⚠️ 很抱歉,当前问题我无法回答,请尝试调整提问方式或联系管理员。'
428
+ if (!this.dialogMessages[aiMsgIndex].content.includes('无法回答')) {
429
+ this.dialogMessages[aiMsgIndex].content += refuseTip
430
+ this.isAiStreaming = false
431
+ this.scrollToBottom()
432
+ }
433
+ }
434
+ }
435
+ } else if (typeof data === 'string') {
436
+ textChunk = data
437
+ }
438
+
439
+ if (textChunk) {
440
+ aiContent += textChunk
441
+ this.dialogMessages[aiMsgIndex].content = aiContent
442
+ this.scrollToBottom()
443
+ }
444
+ },
445
+ (error) => {
446
+ this.isAiStreaming = false
447
+ this.dialogMessages[aiMsgIndex].content += `\n\n[错误: ${error.message || '请求失败'}]`
448
+ this.scrollToBottom()
449
+ },
450
+ () => {
451
+ this.isAiStreaming = false
452
+ // 如果 AI 消息为空(模型拒答或无响应),显示拒答提示
453
+ if (!aiContent && this.dialogMessages[aiMsgIndex]) {
454
+ this.dialogMessages[aiMsgIndex].content = '很抱歉,当前问题我无法回答,请尝试调整提问方式或联系管理员。'
455
+ }
456
+ this.scrollToBottom()
457
+ }
458
+ )
459
+ },
460
+
461
+ simulateTyping(aiMsgIndex, fullText) {
462
+ let i = 0
463
+ const step = () => {
464
+ if (i < fullText.length) {
465
+ i += 3
466
+ this.dialogMessages[aiMsgIndex].content = fullText.slice(0, i)
467
+ this.scrollToBottom()
468
+ setTimeout(step, 20)
469
+ } else {
470
+ this.dialogMessages[aiMsgIndex].content = fullText
471
+ this.isAiStreaming = false
472
+ this.scrollToBottom()
473
+ }
474
+ }
475
+ setTimeout(step, 150)
476
+ },
477
+
478
+ setPatientComplaint(complaint) {
479
+ this.patientComplaint = complaint
480
+ },
481
+
482
+ scrollToBottom(delay = 0) {
483
+ this.$nextTick(() => {
484
+ setTimeout(() => {
485
+ const chatArea = document.querySelector('.chat-area')
486
+ if (chatArea) {
487
+ chatArea.scrollTop = chatArea.scrollHeight
488
+ }
489
+ }, delay)
490
+ })
491
+ },
492
+
493
+ scrollToMessage(displayIndex) {
494
+ this.activeNavIndex = displayIndex
495
+ this.$nextTick(() => {
496
+ const messages = document.querySelectorAll('.dialog-area > div')
497
+ const target = messages[displayIndex]
498
+ if (target) {
499
+ target.scrollIntoView({ behavior: 'smooth', block: 'center' })
500
+ }
501
+ })
502
+ },
503
+
504
+ reset() {
505
+ if (this.currentStreamConnection) {
506
+ this.currentStreamConnection()
507
+ this.currentStreamConnection = null
508
+ }
509
+ this.isAiStreaming = false
510
+ this.patientComplaint = ''
511
+ this.doctorQuestions = []
512
+ this.examinationOrder = null
513
+ this.aiDiagnosis = null
514
+ this.doctorInputText = ''
515
+ this.isPlaying = false
516
+ this.isRecording = false
517
+ this.dialogMessages = []
518
+ this.pendingAttachments.forEach(file => {
519
+ if (file.url) {
520
+ URL.revokeObjectURL(file.url)
521
+ }
522
+ })
523
+ this.pendingAttachments = []
524
+ this.$nextTick(() => {
525
+ this.autoResizeTextarea()
526
+ const chatArea = document.querySelector('.chat-area')
527
+ if (chatArea) {
528
+ chatArea.scrollTop = 0
529
+ }
530
+ })
531
+ },
532
+
533
+ /**
534
+ * 开启新对话
535
+ * 父组件可通过 ref 调用此方法
536
+ */
537
+ startNewChat() {
538
+ if (this.currentStreamConnection) {
539
+ this.currentStreamConnection()
540
+ this.currentStreamConnection = null
541
+ }
542
+ this.currentDialogId = moment().format('YYYYMMDDHHmmss')
543
+ this.isAiStreaming = false
544
+ this.patientComplaint = ''
545
+ this.doctorQuestions = []
546
+ this.examinationOrder = null
547
+ this.aiDiagnosis = null
548
+ this.doctorInputText = ''
549
+ this.isPlaying = false
550
+ this.isRecording = false
551
+ this.dialogMessages = []
552
+ this.pendingAttachments.forEach(file => {
553
+ if (file.url) {
554
+ URL.revokeObjectURL(file.url)
555
+ }
556
+ })
557
+ this.pendingAttachments = []
558
+ this.$nextTick(() => {
559
+ this.autoResizeTextarea()
560
+ const chatArea = document.querySelector('.chat-area')
561
+ if (chatArea) {
562
+ chatArea.scrollTop = 0
563
+ }
564
+ })
565
+ },
566
+
567
+ /**
568
+ * 加载历史对话
569
+ * @param {Array} dialogList - 对话列表,支持两种格式:
570
+ * 1. 直接消息数组:[{ type, content, time, id }, ...]
571
+ * 2. 嵌套格式:[{ messages: [{ type, content, time, id }, ...] }, ...]
572
+ * @param {string} sessionId - 可选,会话 ID,用于继续历史对话
573
+ * 父组件可通过 ref 调用此方法
574
+ */
575
+ loadHistoryDialogs(dialogList, sessionId) {
576
+ console.log('加载历史信息',dialogList,sessionId)
577
+ if (!Array.isArray(dialogList)) {
578
+ console.error('loadHistoryDialogs: dialogList 必须是数组')
579
+ return
580
+ }
581
+
582
+ if (this.currentStreamConnection) {
583
+ this.currentStreamConnection()
584
+ this.currentStreamConnection = null
585
+ }
586
+ this.isAiStreaming = false
587
+
588
+ // 如果提供了 sessionId,设置当前会话 ID
589
+ if (sessionId) {
590
+ this.currentDialogId = sessionId
591
+ }
592
+
593
+ const allMessages = []
594
+
595
+ const processMessage = (msg) => {
596
+ if (!msg) return null
597
+
598
+ const message = {
599
+ id: msg.id || msg._id || msg.messageId || msg.msgId || msg.msg_id || msg.message_id || '',
600
+ type: msg.type === 'assistant' ? 'ai' : (msg.type || 'user'),
601
+ content: msg.content || '',
602
+ time: msg.time || '',
603
+ timestamp: msg.timestamp || Date.now()
604
+ }
605
+
606
+ // 清理 AI 响应中多余的引号(后端存储问题)
607
+ // 格式如: """"医学"影像"..." -> "医学影像..."
608
+ if (message.type === 'ai' && message.content && message.content.includes('"')) {
609
+ message.content = message.content.replace(/"/g, '')
610
+ }
611
+
612
+ let attachments = []
613
+ if (Array.isArray(msg.attachments)) {
614
+ attachments = msg.attachments
615
+ } else if (typeof msg.content === 'string' && msg.content.trim().startsWith('{')) {
616
+ try {
617
+ const parsed = JSON.parse(msg.content)
618
+ if (parsed.content && Array.isArray(parsed.content)) {
619
+ const textPart = parsed.content
620
+ .filter(item => item && item.type === 'text')
621
+ .map(item => item.text)
622
+ .join('')
623
+ if (textPart) {
624
+ message.content = textPart
625
+ }
626
+ attachments = parsed.content
627
+ .filter(item => item && item.type === 'file' && item.file && item.file.file_id)
628
+ .map(item => ({
629
+ name: item.file.file_name || item.file.file_id,
630
+ isImage: false,
631
+ url: item.file.url || '',
632
+ file_id: item.file.file_id
633
+ }))
634
+ }
635
+ } catch (e) {
636
+ // JSON 解析失败,保留原始 content
637
+ }
638
+ }
639
+
640
+ if (attachments.length) {
641
+ message.attachments = attachments
642
+ }
643
+ return message
644
+ }
645
+
646
+ dialogList.forEach(dialog => {
647
+ if (!dialog) return
648
+
649
+ if (Array.isArray(dialog.messages)) {
650
+ dialog.messages.forEach(msg => {
651
+ const processed = processMessage(msg)
652
+ if (processed) allMessages.push(processed)
653
+ })
654
+ } else if (dialog.type || dialog.content) {
655
+ const processed = processMessage(dialog)
656
+ if (processed) allMessages.push(processed)
657
+ }
658
+ })
659
+
660
+ this.dialogMessages = allMessages
661
+ console.log('加载历史对话:', allMessages)
662
+ this.$nextTick(() => {
663
+ this.scrollToBottom()
664
+ })
665
+ },
666
+
667
+ triggerUpload() {
668
+ this.$refs.uploadInput.click()
669
+ },
670
+
671
+ async handleFileChange(event) {
672
+ const files = Array.from(event.target.files || [])
673
+ if (!files.length) return
674
+
675
+ const attachments = files.map(file => {
676
+ const isImage = file.type.startsWith('image/')
677
+ return {
678
+ name: file.name,
679
+ size: file.size,
680
+ type: file.type,
681
+ isImage,
682
+ url: isImage ? URL.createObjectURL(file) : '',
683
+ rawFile: file,
684
+ uploadProgress: 0
685
+ }
686
+ })
687
+
688
+ this.pendingAttachments = [...this.pendingAttachments, ...attachments]
689
+ event.target.value = ''
690
+
691
+ await this.uploadPendingFiles()
692
+ },
693
+
694
+ async uploadPendingFiles() {
695
+ const pendingFiles = this.pendingAttachments.filter(f => !f.file_id && !f.uploading && f.uploadProgress !== 100)
696
+ if (!pendingFiles.length) return
697
+
698
+ this.uploading = true
699
+
700
+ for (const file of pendingFiles) {
701
+ file.uploading = true
702
+ file.uploadProgress = 0
703
+
704
+ try {
705
+ const result = await this.uploadFileToBaichuan(file)
706
+ if (result && result.file_id) {
707
+ file.file_id = result.file_id
708
+ file.uploadProgress = 100
709
+ } else {
710
+ file.uploadFailed = true
711
+ }
712
+ } catch (error) {
713
+ file.uploadFailed = true
714
+ } finally {
715
+ file.uploading = false
716
+ }
717
+ }
718
+
719
+ const allDone = this.pendingAttachments.every(
720
+ f => f.file_id || f.uploadFailed || f.uploadProgress === 100
721
+ )
722
+ if (allDone) {
723
+ this.uploading = false
724
+ this.uploadProgress = 0
725
+ }
726
+ },
727
+
728
+ async uploadFileToBaichuan(file) {
729
+ const formData = new FormData()
730
+ formData.append('purpose', 'medical')
731
+ formData.append('file', file.rawFile || file)
732
+
733
+ const uploadClient = rawAxios.create()
734
+
735
+ return uploadClient.post(BAICHUAN_FILE_API, formData, {
736
+ headers: {
737
+ 'Authorization': `Bearer ${BAICHUAN_API_KEY}`,
738
+ 'Content-Type': 'multipart/form-data'
739
+ },
740
+ onUploadProgress: (progressEvent) => {
741
+ if (progressEvent.total) {
742
+ file.uploadProgress = Math.round((progressEvent.loaded * 100) / progressEvent.total)
743
+ }
744
+ }
745
+ }).then(res => {
746
+ const data = res.data
747
+ return {
748
+ name: file.name,
749
+ file_id: data && data.id ? data.id : '',
750
+ originalFile: file
751
+ }
752
+ }).catch(error => {
753
+ console.error('上传文件到百川失败:', error)
754
+ this.$message.error(`文件 ${file.name} 上传失败`)
755
+ return null
756
+ })
757
+ },
758
+
759
+ removePendingAttachment(index) {
760
+ const file = this.pendingAttachments[index]
761
+ if (file && file.url) {
762
+ URL.revokeObjectURL(file.url)
763
+ }
764
+ this.pendingAttachments.splice(index, 1)
765
+ },
766
+
767
+ removeAttachment(message, fileIndex) {
768
+ const file = message.attachments[fileIndex]
769
+ if (file && file.url) {
770
+ URL.revokeObjectURL(file.url)
771
+ }
772
+ message.attachments.splice(fileIndex, 1)
773
+ },
774
+
775
+ previewImage(file) {
776
+ if (file.url) {
777
+ this.previewImageUrl = file.url
778
+ this.previewVisible = true
779
+ }
780
+ },
781
+
782
+ // 初始化测试数据:两天内容(昨天 + 今天),不调用接口
783
+ // 获取时间戳的日期键(YYYY-MM-DD)
784
+ getDateKey(timestamp) {
785
+ if (!timestamp) return ''
786
+ return moment(timestamp).format('YYYY-MM-DD')
787
+ },
788
+
789
+ // 解析日期键为本地日期对象
790
+ parseDateKey(dateKey) {
791
+ return moment(dateKey, 'YYYY-MM-DD')
792
+ },
793
+
794
+ // 把日期戳格式化为"今天 / 昨天 / 具体日期"
795
+ getDateLabel(timestamp) {
796
+ if (!timestamp) return ''
797
+ const m = moment(timestamp)
798
+ const today = moment().startOf('day')
799
+ const yesterday = today.clone().subtract(1, 'day')
800
+ const target = m.clone().startOf('day')
801
+
802
+ if (target.isSame(today, 'day')) return '今天'
803
+ if (target.isSame(yesterday, 'day')) return '昨天'
804
+ // 跨年显示年份
805
+ if (target.year() !== today.year()) {
806
+ return m.format('YYYY年M月D日')
807
+ }
808
+ return m.format('M月D日')
809
+ }
810
+ }
811
+ }
812
+ </script>
813
+
814
+ <style scoped>
815
+ .ai-consultation-outer {
816
+ box-sizing: border-box;
817
+ margin: 0;
818
+ padding: 0;
819
+ width: 100%;
820
+ height: 100%;
821
+ }
822
+
823
+ .ai-consultation-container {
824
+ width: 100%;
825
+ height: 100%;
826
+ display: flex;
827
+ flex-direction: column;
828
+ background: #FFFFFF;
829
+ border: 1px solid #E5E9F0;
830
+ }
831
+
832
+ .chat-area-wrapper {
833
+ position: relative;
834
+ flex: 1 1 auto;
835
+ min-height: 0;
836
+ }
837
+
838
+ .chat-area {
839
+ flex: 0 1 auto;
840
+ overflow-y: auto;
841
+ padding: 16px;
842
+ width: 100%;
843
+ padding-left: 172px;
844
+ padding-right: 178px;
845
+ background: #fff;
846
+ /* 初始高度:没有内容时也保留这块区域 */
847
+ min-height: 620px;
848
+ /* 最大高度:内容超过则出现滚动条 */
849
+ max-height: 620px;
850
+ box-sizing: border-box;
851
+ }
852
+
853
+ /* 消息导航条 */
854
+ .message-nav {
855
+ position: absolute;
856
+ top: 50%;
857
+ right: 16px;
858
+ transform: translateY(-50%);
859
+ display: flex;
860
+ flex-direction: column;
861
+ align-items: center;
862
+ gap: 8px;
863
+ z-index: 10;
864
+ }
865
+
866
+ .nav-dot {
867
+ width: 8px;
868
+ height: 8px;
869
+ border-radius: 6px;
870
+ opacity: 1;
871
+ background: #94979E;
872
+ cursor: pointer;
873
+ transition: transform 0.2s, background 0.2s;
874
+ }
875
+
876
+ .nav-dot:hover {
877
+ transform: scale(1.2);
878
+ background: #0057FE;
879
+ }
880
+
881
+ .nav-dot.active {
882
+ background: #0057FE;
883
+ transform: scale(1.3);
884
+ }
885
+
886
+ /* 消息列表:跟随 chat-area 高度 */
887
+ .dialog-area {
888
+ display: flex;
889
+ flex-direction: column;
890
+ min-height: 208px; /* 240(chat-area) - 16*2(padding) = 208 */
891
+ }
892
+
893
+ /* 日期分隔符 */
894
+ .dialog-divider {
895
+ display: flex;
896
+ align-items: center;
897
+ justify-content: center;
898
+ margin: 8px 0 16px;
899
+ }
900
+
901
+ .dialog-divider::before,
902
+ .dialog-divider::after {
903
+ content: '';
904
+ flex: 1;
905
+ height: 1px;
906
+ background: #E5E9F0;
907
+ }
908
+
909
+ .dialog-divider-text {
910
+ padding: 2px 12px;
911
+ font-size: 12px;
912
+ color: #8C8C8C;
913
+ background: #F5F7FA;
914
+ border-radius: 10px;
915
+ margin: 0 12px;
916
+ white-space: nowrap;
917
+ }
918
+
919
+ /* 底部输入框区域 */
920
+ .bottom-input-wrapper {
921
+ flex-shrink: 0;
922
+ padding: 12px 16px;
923
+ background: #fff;
924
+ }
925
+
926
+ .input-container {
927
+ width: 782px;
928
+ margin: 0 auto;
929
+ padding: 12px;
930
+ display: flex;
931
+ flex-direction: column;
932
+ border: 1px solid #E5E9F0;
933
+ border-radius: 6px;
934
+ background: #FFFFFF;
935
+ box-sizing: border-box;
936
+ }
937
+
938
+ .input-textarea-area {
939
+ flex: 1 1 auto;
940
+ min-height: 0;
941
+ margin-bottom: 8px;
942
+ }
943
+
944
+ .bottom-input {
945
+ width: 100%;
946
+ height: 100%;
947
+ border: none !important;
948
+ background: transparent;
949
+ padding: 0;
950
+ font-family: 'Source Han Sans', 'Microsoft YaHei', sans-serif;
951
+ font-size: 16px;
952
+ color: #313131;
953
+ resize: none;
954
+ outline: none;
955
+ box-shadow: none !important;
956
+ }
957
+
958
+ .bottom-input:focus,
959
+ .bottom-input:hover {
960
+ border: none !important;
961
+ box-shadow: none !important;
962
+ }
963
+
964
+ .bottom-input::placeholder {
965
+ color: #999;
966
+ }
967
+
968
+ .input-controls {
969
+ flex-shrink: 0;
970
+ display: flex;
971
+ align-items: center;
972
+ justify-content: space-between;
973
+ padding-top: 0;
974
+ border-top: none;
975
+ }
976
+
977
+ .input-controls-left {
978
+ display: flex;
979
+ align-items: center;
980
+ gap: 8px;
981
+ }
982
+
983
+ .input-controls-right {
984
+ display: flex;
985
+ align-items: center;
986
+ gap: 8px;
987
+ }
988
+
989
+ .enter-tip {
990
+ font-family: 'Inter', sans-serif;
991
+ font-size: 14px;
992
+ font-weight: 500;
993
+ color: #9E9E9E;
994
+ padding: 4px 8px;
995
+ }
996
+
997
+ .send-btn {
998
+ width: 30px;
999
+ height: 30px;
1000
+ background: #0057FE;
1001
+ border: none;
1002
+ border-radius: 50%;
1003
+ color: #fff;
1004
+ font-size: 14px;
1005
+ cursor: pointer;
1006
+ display: flex;
1007
+ align-items: center;
1008
+ justify-content: center;
1009
+ padding: 0;
1010
+ }
1011
+
1012
+ .send-btn:hover {
1013
+ background: #0040cc;
1014
+ }
1015
+
1016
+ .send-icon {
1017
+ font-size: 14px;
1018
+ font-weight: bold;
1019
+ }
1020
+
1021
+ /* 文件预览区域 */
1022
+ .attachment-preview-area {
1023
+ display: flex;
1024
+ flex-wrap: wrap;
1025
+ gap: 12px;
1026
+ margin-bottom: 12px;
1027
+ }
1028
+
1029
+ .preview-item {
1030
+ position: relative;
1031
+ width: 100px;
1032
+ height: 100px;
1033
+ border: 1px solid #E5E9F0;
1034
+ border-radius: 6px;
1035
+ opacity: 1;
1036
+ background: #fafafa;
1037
+ box-sizing: border-box;
1038
+ }
1039
+
1040
+ .preview-item:hover {
1041
+ border-color: #0057FE;
1042
+ }
1043
+
1044
+ .preview-image {
1045
+ width: 100%;
1046
+ height: 100%;
1047
+ position: relative;
1048
+ }
1049
+
1050
+ .preview-image img {
1051
+ width: 100%;
1052
+ height: 100%;
1053
+ object-fit: cover;
1054
+ }
1055
+
1056
+ .preview-remove-btn {
1057
+ position: absolute;
1058
+ top: -10px;
1059
+ right: -10px;
1060
+ width: 20px;
1061
+ height: 20px;
1062
+ padding: 0;
1063
+ font-size: 12px;
1064
+ background: #E5E9F0;
1065
+ border: 1px solid #5D5C5C;
1066
+ border-radius: 50%;
1067
+ color: #5D5C5C;
1068
+ opacity: 1;
1069
+ display: flex;
1070
+ align-items: center;
1071
+ justify-content: center;
1072
+ line-height: 1;
1073
+ z-index: 2;
1074
+ }
1075
+
1076
+ .preview-remove-btn:hover,
1077
+ .preview-remove-btn:active {
1078
+ background: #0057FE;
1079
+ border-color: #0057FE;
1080
+ color: #fff;
1081
+ }
1082
+
1083
+ .preview-file {
1084
+ width: 100%;
1085
+ height: 100%;
1086
+ display: flex;
1087
+ flex-direction: column;
1088
+ align-items: center;
1089
+ justify-content: center;
1090
+ padding: 8px;
1091
+ box-sizing: border-box;
1092
+ }
1093
+
1094
+ .add-upload-item {
1095
+ width: 100px;
1096
+ height: 100px;
1097
+ border-radius: 6px;
1098
+ opacity: 1;
1099
+ box-sizing: border-box;
1100
+ border: 1px solid #E5E9F0;
1101
+ display: flex;
1102
+ align-items: center;
1103
+ justify-content: center;
1104
+ cursor: pointer;
1105
+ background: #fafafa;
1106
+ }
1107
+
1108
+ .add-upload-icon {
1109
+ height: 39px;
1110
+ opacity: 1;
1111
+ font-family: Source Han Sans;
1112
+ font-size: 36px;
1113
+ font-weight: normal;
1114
+ line-height: 39px;
1115
+ text-align: right;
1116
+ letter-spacing: 0em;
1117
+ font-feature-settings: "kern" on;
1118
+ color: #9E9E9E;
1119
+ transition: color 0.2s;
1120
+ }
1121
+
1122
+ .add-upload-item:hover {
1123
+ background: #F4F4F4;
1124
+ }
1125
+
1126
+ .add-upload-item:active {
1127
+ background: #0057FE;
1128
+ }
1129
+
1130
+ .add-upload-item:active .add-upload-icon {
1131
+ color: #FFFFFF;
1132
+ }
1133
+
1134
+ .preview-file .anticon {
1135
+ font-size: 24px;
1136
+ color: #0057FE;
1137
+ margin-bottom: 4px;
1138
+ }
1139
+
1140
+ .preview-file-name {
1141
+ font-size: 11px;
1142
+ color: #666;
1143
+ text-align: center;
1144
+ word-break: break-all;
1145
+ line-height: 1.2;
1146
+ max-height: 32px;
1147
+ overflow: hidden;
1148
+ text-overflow: ellipsis;
1149
+ display: -webkit-box;
1150
+ -webkit-line-clamp: 2;
1151
+ -webkit-box-orient: vertical;
1152
+ line-clamp: 2;
1153
+ }
1154
+
1155
+ .preview-file .preview-remove-btn {
1156
+ position: absolute;
1157
+ top: 50%;
1158
+ right: 50%;
1159
+ transform: translate(50%, -50%);
1160
+ }
1161
+
1162
+ /* 消息中的附件样式 */
1163
+ .message-attachments {
1164
+ margin-top: 8px;
1165
+ display: flex;
1166
+ flex-wrap: wrap;
1167
+ gap: 12px;
1168
+ }
1169
+
1170
+ .attachment-item {
1171
+ position: relative;
1172
+ width: 100px;
1173
+ height: 100px;
1174
+ border: 1px solid #E5E9F0;
1175
+ border-radius: 6px;
1176
+ opacity: 1;
1177
+ overflow: visible;
1178
+ background: #fafafa;
1179
+ box-sizing: border-box;
1180
+ }
1181
+
1182
+ .attachment-item:hover {
1183
+ border-color: #0057FE;
1184
+ }
1185
+
1186
+ .image-preview {
1187
+ width: 100%;
1188
+ height: 100%;
1189
+ position: relative;
1190
+ cursor: pointer;
1191
+ }
1192
+
1193
+ .image-preview img {
1194
+ width: 100%;
1195
+ height: 100%;
1196
+ object-fit: cover;
1197
+ }
1198
+
1199
+ .image-name {
1200
+ position: absolute;
1201
+ bottom: 0;
1202
+ left: 0;
1203
+ right: 0;
1204
+ padding: 4px;
1205
+ background: rgba(0, 0, 0, 0.5);
1206
+ color: #fff;
1207
+ font-size: 11px;
1208
+ text-align: center;
1209
+ white-space: nowrap;
1210
+ overflow: hidden;
1211
+ text-overflow: ellipsis;
1212
+ }
1213
+
1214
+ .remove-btn {
1215
+ position: absolute;
1216
+ top: 50%;
1217
+ right: 50%;
1218
+ width: 20px;
1219
+ height: 20px;
1220
+ padding: 0;
1221
+ font-size: 12px;
1222
+ background: #E5E9F0;
1223
+ border: 1px solid #5D5C5C;
1224
+ border-radius: 50%;
1225
+ color: #5D5C5C;
1226
+ opacity: 1;
1227
+ display: flex;
1228
+ align-items: center;
1229
+ justify-content: center;
1230
+ line-height: 1;
1231
+ z-index: 2;
1232
+ transform: translate(50%, -50%);
1233
+ }
1234
+
1235
+ .remove-btn:hover,
1236
+ .remove-btn:active {
1237
+ background: #0057FE;
1238
+ border-color: #0057FE;
1239
+ color: #fff;
1240
+ }
1241
+
1242
+ .file-item {
1243
+ width: 100%;
1244
+ height: 100%;
1245
+ display: flex;
1246
+ flex-direction: column;
1247
+ align-items: center;
1248
+ justify-content: center;
1249
+ padding: 8px;
1250
+ box-sizing: border-box;
1251
+ }
1252
+
1253
+ .file-icon {
1254
+ font-size: 28px;
1255
+ color: #0057FE;
1256
+ margin-bottom: 4px;
1257
+ }
1258
+
1259
+ .file-name {
1260
+ font-size: 11px;
1261
+ color: #666;
1262
+ text-align: center;
1263
+ word-break: break-all;
1264
+ line-height: 1.2;
1265
+ max-height: 32px;
1266
+ overflow: hidden;
1267
+ text-overflow: ellipsis;
1268
+ display: -webkit-box;
1269
+ -webkit-line-clamp: 2;
1270
+ -webkit-box-orient: vertical;
1271
+ line-clamp: 2;
1272
+ }
1273
+
1274
+ .file-item .remove-btn {
1275
+ position: absolute;
1276
+ top: -10px;
1277
+ right: -10px;
1278
+ }
1279
+
1280
+ /* 对话区域样式 */
1281
+ .dialog-message {
1282
+ display: flex;
1283
+ margin-bottom: 16px;
1284
+ align-items: flex-start;
1285
+ }
1286
+
1287
+ .dialog-message:last-child {
1288
+ margin-bottom: 0;
1289
+ }
1290
+
1291
+ .dialog-message.ai {
1292
+ flex-direction: row;
1293
+ }
1294
+
1295
+ .dialog-message.user {
1296
+ flex-direction: row-reverse;
1297
+ }
1298
+
1299
+ .dialog-message.user .message-content {
1300
+ display: flex;
1301
+ flex-direction: column;
1302
+ align-items: flex-end;
1303
+ }
1304
+
1305
+ .dialog-message.user .message-bubble {
1306
+ height: 32px;
1307
+ border-radius: 6px;
1308
+ opacity: 1;
1309
+ background: #F4F4F4;
1310
+ display: flex;
1311
+ align-items: center;
1312
+ padding: 0 12px;
1313
+ box-sizing: border-box;
1314
+ max-width: 100%;
1315
+ }
1316
+
1317
+ .dialog-message.user .message-bubble .message-text {
1318
+ text-align: left;
1319
+ color: #313131;
1320
+ }
1321
+
1322
+ .dialog-message.ai .message-bubble {
1323
+ display: flex;
1324
+ align-items: flex-start;
1325
+ max-width: 100%;
1326
+ }
1327
+
1328
+ .dialog-message.ai .message-bubble .message-text {
1329
+ text-align: justify;
1330
+ color: #313131;
1331
+ }
1332
+
1333
+ .message-text {
1334
+ opacity: 1;
1335
+ font-family: Source Han Sans;
1336
+ font-size: 16px;
1337
+ font-weight: normal;
1338
+ line-height: 32px;
1339
+ letter-spacing: 0em;
1340
+ font-feature-settings: "kern" on;
1341
+ max-width: 100%;
1342
+ color: #313131;
1343
+ }
1344
+
1345
+ .message-actions {
1346
+ display: flex;
1347
+ align-items: center;
1348
+ gap: 8px;
1349
+ margin-top: 6px;
1350
+ opacity: 1;
1351
+ visibility: visible;
1352
+ transition: opacity 0.2s, visibility 0.2s;
1353
+ }
1354
+
1355
+ .dialog-message.ai .message-actions {
1356
+ opacity: 1;
1357
+ visibility: visible;
1358
+ }
1359
+
1360
+ .dialog-message.user .message-actions {
1361
+ opacity: 1;
1362
+ visibility: visible;
1363
+ }
1364
+
1365
+ .action-btn {
1366
+ width: 32px;
1367
+ height: 32px;
1368
+ display: flex;
1369
+ align-items: center;
1370
+ justify-content: center;
1371
+ cursor: pointer;
1372
+ border-radius: 6px;
1373
+ transition: background 0.2s;
1374
+ }
1375
+
1376
+ .action-btn:hover {
1377
+ background: #F0F0F0;
1378
+ }
1379
+
1380
+ .action-btn svg {
1381
+ display: block;
1382
+ }
1383
+
1384
+ .typing-cursor {
1385
+ display: inline-block;
1386
+ margin-left: 2px;
1387
+ color: #0057FE;
1388
+ font-size: 18px;
1389
+ animation: blink 1s step-end infinite;
1390
+ }
1391
+
1392
+ @keyframes blink {
1393
+ 0%, 100% { opacity: 1; }
1394
+ 50% { opacity: 0; }
1395
+ }
1396
+ </style>