DialogContent.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <template>
  2. <div class="dialog-chat-answer-content" :style="custom_style">
  3. <div class="mind-map" v-if="mind_map">
  4. <a-button class="mind-map-btn" @click="toShowMindMap">
  5. <img width="14px" style="margin-right: 10px" src="../../assets/chat/mind-map.png" alt="" />
  6. 思维导图
  7. </a-button>
  8. </div>
  9. <DialogWebPage
  10. v-if="is_internet_search"
  11. :internet_search="internet_search"
  12. @toSearchPage="toSearchPage"
  13. ></DialogWebPage>
  14. <!-- <a-button class="think-select" v-if="deep_loading">
  15. <icon-robot class="robot" @click="handleThinkClick" />
  16. <span>思考中...</span>
  17. <icon-down v-if="true" class="down" />
  18. <icon-up v-else class="down" />
  19. </a-button> -->
  20. <DialogThinkContent v-if="is_think && deep_answer" :deep_loading="deep_loading" :deep_answer="deep_answer">
  21. </DialogThinkContent>
  22. <div v-if="is_loading">
  23. <a-spin></a-spin>
  24. </div>
  25. <div v-if="content.length !== 0 && !is_loading" v-html="content" class="answer-content-text" />
  26. <slot></slot>
  27. </div>
  28. </template>
  29. <script setup>
  30. import { computed } from 'vue';
  31. import DialogWebPage from './DialogWebPage.vue';
  32. import DialogThinkContent from './DialogThinkContent.vue';
  33. // 接收markdown数据,进行一些转换
  34. const props = defineProps({
  35. /**
  36. * 内容类型
  37. */
  38. type: String,
  39. /**
  40. * 文本内容
  41. */
  42. content: String,
  43. /**
  44. * 状态值
  45. */
  46. is_loading: Boolean,
  47. /**
  48. * 内容区域最大宽度
  49. */
  50. max_width: Number,
  51. /**
  52. * 是否展示思考
  53. * */
  54. is_think: Boolean,
  55. /**
  56. * 是否展示联网搜索
  57. * */
  58. is_internet_search: Boolean,
  59. /**
  60. * 联网数据
  61. * */
  62. internet_search: Array,
  63. deep_answer: String,
  64. deep_loading: Boolean,
  65. mind_map: String
  66. });
  67. const emit = defineEmits(['toSearchPage', 'toShowMindMap']);
  68. /**
  69. * 内容DOM节点的样式
  70. * 主要用于控制节点的宽度,避免对话内容中某些内容将对话区域撑开,造成样式异常
  71. */
  72. const custom_style = computed(() => {
  73. if (props.max_width) {
  74. return `max-width: ${props.max_width - 40}px;`;
  75. } else {
  76. return '';
  77. }
  78. });
  79. const toSearchPage = () => {
  80. emit('toSearchPage');
  81. };
  82. const handleThinkClick = () => {
  83. // 展开/收起
  84. };
  85. //
  86. const toShowMindMap = () => {
  87. emit('toShowMindMap');
  88. };
  89. </script>
  90. <style lang="css" scoped>
  91. .dialog-chat-answer-content {
  92. position: relative;
  93. background-color: var(--color-bg-1);
  94. color: var(--color-text-1);
  95. border-radius: 12px;
  96. padding-top: 25px;
  97. padding-bottom: 26px;
  98. padding-left: 30px;
  99. padding-right: 30px;
  100. }
  101. .dialog-chat-answer-content code {
  102. overflow-x: auto;
  103. }
  104. .answer-content-text {
  105. line-height: 24px;
  106. }
  107. .mind-map {
  108. margin-bottom: 10px;
  109. }
  110. .mind-map-btn {
  111. border-radius: 8px;
  112. }
  113. </style>