vue2-client 1.22.28 → 1.22.29

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 (90) hide show
  1. package/.env.his +19 -19
  2. package/.idea/af-vue2-client.iml +2 -3
  3. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  4. package/package.json +1 -1
  5. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +775 -775
  6. package/src/base-client/components/common/HIS/HForm/HForm.vue +1708 -1708
  7. package/src/base-client/components/common/HIS/HTab/HTab.vue +790 -790
  8. package/src/base-client/components/common/XInspectionDetailDrawer/components/HazardPhotos.vue +18 -0
  9. package/src/base-client/components/common/XInspectionDetailDrawer/index.vue +6 -0
  10. package/src/base-client/components/common/XMarkdownViewer/demo.vue +102 -102
  11. package/src/base-client/components/his/XTransfer/index.md +327 -327
  12. package/.history/.eslintrc_20260521171150.js +0 -74
  13. package/.history/.eslintrc_20260521171213.js +0 -74
  14. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154443.vue +0 -726
  15. package/.history/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm_20260601154700.vue +0 -478
  16. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260611152602.vue +0 -755
  17. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702161223.vue +0 -748
  18. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702163310.vue +0 -832
  19. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702163324.vue +0 -748
  20. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702165416.vue +0 -748
  21. package/.history/src/base-client/components/common/HIS/HButtons/HButtons_20260702174939.vue +0 -793
  22. package/.history/src/base-client/components/common/HIS/HForm/HForm_20260702115430.vue +0 -1463
  23. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310142713.vue +0 -512
  24. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260310145118.vue +0 -511
  25. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260311094834.vue +0 -696
  26. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260320143028.vue +0 -693
  27. package/.history/src/base-client/components/common/HIS/HFormTable/HFormTable_20260409101450.vue +0 -677
  28. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260625173703.vue +0 -767
  29. package/.history/src/base-client/components/common/HIS/HTab/HTab_20260626112425.vue +0 -803
  30. package/.history/src/base-client/components/common/XAddNativeForm/XAddNativeForm_20260626173854.vue +0 -1522
  31. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180349.vue +0 -862
  32. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180623.vue +0 -862
  33. package/.history/src/base-client/components/common/XCollapse/XCollapse_20260703180702.vue +0 -842
  34. package/.history/src/base-client/components/common/XForm/XFormItem_20260703101840.vue +0 -1621
  35. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140403.vue +0 -643
  36. package/.history/src/base-client/components/common/XMarkdownViewer/XMarkdownViewer_20260519140829.vue +0 -628
  37. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519142824.vue +0 -104
  38. package/.history/src/base-client/components/common/XMarkdownViewer/demo_20260519143155.vue +0 -102
  39. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20260703180412.vue +0 -1102
  40. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20260703180623.vue +0 -1093
  41. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171231.vue +0 -1241
  42. package/.history/src/base-client/components/common/XReportGrid/XReport_20260309171441.vue +0 -1223
  43. package/.history/src/base-client/components/his/HAi/HAi_20260612174826.vue +0 -472
  44. package/.history/src/base-client/components/his/HAi/HAi_20260612175839.vue +0 -538
  45. package/.history/src/base-client/components/his/HAi/HAi_20260615103331.vue +0 -650
  46. package/.history/src/base-client/components/his/HAi/HAi_20260618140214.vue +0 -1396
  47. package/.history/src/base-client/components/his/HAi/HAi_20260618140556.vue +0 -1396
  48. package/.history/src/base-client/components/his/XHDescriptions/XHDescriptions_20260424134504.vue +0 -1469
  49. package/.history/src/base-client/components/his/XRadio/XRadio_20260702140351.vue +0 -774
  50. package/.history/src/base-client/components/his/XRadio/XRadio_20260702140441.vue +0 -774
  51. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171133.vue +0 -788
  52. package/.history/src/base-client/components/his/XSidebar/XSidebar_20260610171151.vue +0 -780
  53. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511170841.vue +0 -585
  54. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260511171138.vue +0 -787
  55. package/.history/src/base-client/components/his/XTransfer/XTransfer_20260512141830.vue +0 -739
  56. package/.history/src/components/STable/index_20260409155138.js +0 -806
  57. package/.history/src/components/STable/index_20260409155218.js +0 -814
  58. package/.history/src/expression/core/Expression_20260305164427.js +0 -1371
  59. package/.history/src/expression/core/Expression_20260305170258.js +0 -1358
  60. package/.history/src/expression/core/Program_20260305111830.js +0 -944
  61. package/.history/src/expression/core/Program_20260305112041.js +0 -931
  62. package/.history/src/logic/LogicRunner_20260304154306.js +0 -170
  63. package/.history/src/logic/LogicRunner_20260304155553.js +0 -112
  64. package/.history/src/logic/LogicRunner_20260305105834.js +0 -112
  65. package/.history/src/logic/LogicRunner_20260305112718.js +0 -129
  66. package/.history/src/logic/LogicRunner_20260305182436.js +0 -133
  67. package/.history/src/logic/LogicRunner_20260306151301.js +0 -213
  68. package/.history/src/logic/LogicRunner_20260306152419.js +0 -213
  69. package/.history/src/logic/plugins/common/DateTools_20260305154159.js +0 -61
  70. package/.history/src/logic/plugins/common/DateTools_20260305154217.js +0 -44
  71. package/.history/src/logic/plugins/common/DateTools_20260305161014.js +0 -44
  72. package/.history/src/logic/plugins/common/HttpTools_20260305164352.js +0 -80
  73. package/.history/src/logic/plugins/common/HttpTools_20260305170258.js +0 -75
  74. package/.history/src/logic/plugins/common/HttpTools_20260305171634.js +0 -75
  75. package/.history/src/logic/plugins/common/HttpTools_20260306152419.js +0 -72
  76. package/.history/src/services/api/restTools_20260427142149.js +0 -245
  77. package/.history/src/services/api/restTools_20260427142853.js +0 -230
  78. package/.history/src/services/api/restTools_20260519135558.js +0 -230
  79. package/.history/src/services/api/restTools_20260519140825.js +0 -230
  80. package/.history/src/services/api/restTools_20260519151223.js +0 -230
  81. package/.history/src/theme/global_20260703101634.less +0 -370
  82. package/.history/src/theme/global_20260703101840.less +0 -337
  83. package/.history/src/theme/global_20260703104511.less +0 -337
  84. package/.history/src/utils/indexedDB_20260306150918.js +0 -593
  85. package/.history/src/utils/indexedDB_20260306151301.js +0 -586
  86. package/.idea/codeStyles/Project.xml +0 -62
  87. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  88. package/.idea/misc.xml +0 -6
  89. 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 +0 -153
  90. package/preview-input-box.html +0 -180
@@ -1,1396 +0,0 @@
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>