Browse Source

初始版本完成

liyanbo 1 tháng trước cách đây
mục cha
commit
e8327fa60a

+ 11 - 13
src/api/qsAiQuestions.js

@@ -12,7 +12,7 @@ export function createQsAiDialogue(data = {}) {
 
 /**
  * 强生菲林 AI 流式问答。
- * 请求体严格使用 qsAi 新接口约定的 conversationId、content、useContext、attachments 四个字段
+ * 无附件时使用 JSON 请求;有附件时使用 multipart/form-data,其中 request 为 JSON 请求体、files 为本地文件
  */
 export async function sendQsAiChatMessageStream(
   conversationId,
@@ -27,25 +27,23 @@ export async function sendQsAiChatMessageStream(
   attachments = []
 ) {
   const token = localStorage.getItem('token')
-  const requestAttachments = attachments.map(({ url, name, type, contentType }) => ({
-    url,
-    name,
-    contentType: contentType || type || 'application/octet-stream'
-  }))
+  const request = { conversationId, content, useContext }
+  const files = attachments.map((attachment) => attachment.file || attachment).filter((file) => file instanceof File)
+  const hasFiles = files.length > 0
+  const formData = new FormData()
+  if (hasFiles) {
+    formData.append('request', new Blob([JSON.stringify(request)], { type: 'application/json' }))
+    files.forEach((file) => formData.append('files', file, file.name))
+  }
 
   return fetchEventSource(`${import.meta.env.VITE_BASE_URL}/bjdxWeb/qsAi/dialogue-send-stream`, {
     method: 'post',
     headers: {
-      'Content-Type': 'application/json',
+      ...(hasFiles ? {} : { 'Content-Type': 'application/json' }),
       ...(token ? { Authorization: `Bearer ${token}` } : {})
     },
     openWhenHidden: true,
-    body: JSON.stringify({
-      conversationId,
-      content,
-      useContext,
-      attachments: requestAttachments
-    }),
+    body: hasFiles ? formData : JSON.stringify(request),
     onmessage: onMessage,
     onerror: onError,
     onclose: onClose,

+ 4 - 1
src/components/MarkdownView/index.vue

@@ -28,7 +28,10 @@ const md = new MarkdownIt({
     }
     return ``
   }
-})
+}).enable(['table'])
+
+md.renderer.rules.table_open = () => '<div class="markdown-table-wrap"><table>'
+md.renderer.rules.table_close = () => '</table></div>'
 
 /** 渲染 markdown */
 const renderedMarkdown = computed(() => {

+ 5 - 1
src/views/qsfl/aiQANew.vue

@@ -16,9 +16,13 @@ const qaConfig = Object.freeze({
   maxFiles: 3,
   maxFileSizeMB: 10,
   maxTotalFileSizeMB: 15,
+  invalidFileNamePattern: /[\\/:*?"<>|\s]/,
+  invalidFileNameMessage: '文件名不能包含空格或\\ / : * ? " < > | 等非法字符,请修改后重试',
+  enableReferenceScript: true,
+  referenceScriptMaxLength: 2000,
   maxInputLength: 1000,
   uploadHint: '支持图片、PDF、Word、Excel 文件;单次最多上传 3 个附件,单个文件不超过 10 MB,附件总大小不超过 15 MB。文档内容过长时,系统将仅分析前 20,000 个字符。',
   inputHint: '单次提问最多输入 1,000 个字符。',
-  suggestions: ['上传资料后提问', '帮我分析附件', '总结文档重点']
+  suggestions: ['请为学员评分']
 })
 </script>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 141 - 44
src/views/qsfl/components/AiQAChat.vue


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác