From 9a873d6c0e19f5f85c0bd4fdcd135450189afdea Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期日, 03 十一月 2024 15:15:54 +0800
Subject: [PATCH] 流式获取数据

---
 src/api/ai/chat.ts   |   24 +++++++++--
 package-lock.json    |   30 +++++++-------
 src/utils/request.ts |   49 +++++++++++++++++++++++-
 package.json         |    2 
 4 files changed, 81 insertions(+), 24 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f29faae..d502b99 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,7 +21,7 @@
 				"@wangeditor/editor": "^5.1.23",
 				"@wangeditor/editor-for-vue": "^5.1.12",
 				"amis": "^3.2.0",
-				"axios": "^1.3.4",
+				"axios": "^1.7.7",
 				"bimfacesdkloader": "^0.1.0",
 				"countup.js": "^2.5.0",
 				"cropperjs": "^1.5.13",
@@ -2725,11 +2725,11 @@
 			}
 		},
 		"node_modules/axios": {
-			"version": "1.3.4",
-			"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
-			"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+			"version": "1.7.7",
+			"resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
+			"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
 			"dependencies": {
-				"follow-redirects": "^1.15.0",
+				"follow-redirects": "^1.15.6",
 				"form-data": "^4.0.0",
 				"proxy-from-env": "^1.1.0"
 			}
@@ -4717,9 +4717,9 @@
 			}
 		},
 		"node_modules/follow-redirects": {
-			"version": "1.15.2",
-			"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
-			"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+			"version": "1.15.9",
+			"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+			"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
 			"funding": [
 				{
 					"type": "individual",
@@ -11481,11 +11481,11 @@
 			}
 		},
 		"axios": {
-			"version": "1.3.4",
-			"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
-			"integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+			"version": "1.7.7",
+			"resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz",
+			"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
 			"requires": {
-				"follow-redirects": "^1.15.0",
+				"follow-redirects": "^1.15.6",
 				"form-data": "^4.0.0",
 				"proxy-from-env": "^1.1.0"
 			}
@@ -13047,9 +13047,9 @@
 			}
 		},
 		"follow-redirects": {
-			"version": "1.15.2",
-			"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
-			"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+			"version": "1.15.9",
+			"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+			"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
 		},
 		"foreground-child": {
 			"version": "3.2.1",
diff --git a/package.json b/package.json
index 73f3975..fe610e1 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
 		"@wangeditor/editor": "^5.1.23",
 		"@wangeditor/editor-for-vue": "^5.1.12",
 		"amis": "^3.2.0",
-		"axios": "^1.3.4",
+		"axios": "^1.7.7",
 		"bimfacesdkloader": "^0.1.0",
 		"countup.js": "^2.5.0",
 		"cropperjs": "^1.5.13",
diff --git a/src/api/ai/chat.ts b/src/api/ai/chat.ts
index b517867..2226aaf 100644
--- a/src/api/ai/chat.ts
+++ b/src/api/ai/chat.ts
@@ -1,4 +1,4 @@
-import request from '/@/utils/request';
+import request, { streamReq } from '/@/utils/request';
 const GET_SECTION_SAMPLE_API = '/scene/get_scene_group_sample';
 const GET_SECTION_A_LIST_API = '/scene/get_scene_group_tree';
 export const Get_LOGIN_SMS = '/login_sms';
@@ -255,6 +255,20 @@
 		},
 	});
 };
+/**
+ * @description 娴佸紡澶фā鍨嬪璇�
+ * @param {FormData} params
+ **/
+export const questionStreamByPost = (params, callback: (value) => void) =>
+	streamReq(
+		{
+			url: `/chat/question_stream`,
+			method: 'post',
+			params: {},
+			data: params,
+		},
+		callback
+	);
 
 /**
  * @summary AI澶фā鍨嬪璇�
@@ -360,11 +374,11 @@
 
 /**
  * 鏇茬嚎鏌ヨ
- * @param params 
- * @param req 
- * @returns 
+ * @param params
+ * @param req
+ * @returns
  */
-export const curveQuery = (params,req:any=request) =>{
+export const curveQuery = (params, req: any = request) => {
 	return req({
 		url: 'chat/chat_supervisor_json',
 		method: 'POST',
diff --git a/src/utils/request.ts b/src/utils/request.ts
index c8756bf..a79a4c5 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -1,13 +1,13 @@
-import type { AxiosInstance, AxiosRequestConfig } from 'axios';
+import type { AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults } from 'axios';
 import axios from 'axios';
 import { ElMessage } from 'element-plus';
 import { NO_AUTH_API_LIST } from '../api/ai/chat';
 import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user';
+import { Logger } from '../model/logger/Logger';
 import emitter from './mitt';
 import { debounce, decodeFormData } from './util';
 import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants';
 import { Local, LoginInfo, Session } from '/@/utils/storage';
-import { Logger } from '../model/logger/Logger';
 // import JSONbig from 'json-bigint';
 
 //#region ====================== 鍚庣 res.err_code ======================
@@ -128,18 +128,61 @@
 	);
 };
 // 閰嶇疆鏂板缓涓�涓� axios 瀹炰緥
-const createAxiosInstance = () => {
+const createAxiosInstance = (option: Partial<CreateAxiosDefaults<any>> = {}) => {
 	return axios.create({
 		baseURL: MAIN_URL,
 		timeout: 50000,
 		headers: { 'Content-Type': 'application/json;charset=utf-8 ' },
+		...option,
 	});
 };
+
 const service = createAxiosInstance();
 
 export const mainRequest = service;
 
+//#region ====================== 娴佸搷搴旀暟鎹� ======================
+const streamInstance = createAxiosInstance({
+	adapter: 'fetch',
+	responseType: 'stream',
+});
+const decoder = new TextDecoder();
+const encoder = new TextEncoder();
+const readStream = async (stream: ReadableStream, cb: (value) => void) => {
+	const reader = stream.getReader();
+	let lastValue = new Uint8Array();
+	while (1) {
+		const { done, value } = await reader.read();
+		if (done) {
+			break;
+		}
+		const txt = decoder.decode(Uint8Array.from([...lastValue, ...value]));
+		const txtArr = txt.split('\n');
+		txtArr.forEach((value, index, array) => {
+			// 涓�鑸笉浼氬嚭鐜拌繛缁崲琛岋紝鍙彲鑳芥渶鍚庝竴涓槸鎹㈣
+			if (index === array.length - 1) {
+				// 缂栫爜鍥炲幓锛屼腑鏂囧垏鍒嗕細涔辩爜
+				lastValue = encoder.encode(value);
+			} else {
+				cb(value);
+			}
+		});
+	}
+};
+
+export const streamReq = (config: AxiosRequestConfig<any>, callback: (value) => void) => {
+	streamInstance(config).then((response) => {
+		const stream = response as unknown as ReadableStream;
+		readStream(stream, (value) => {
+			const jsonValue = JSON.parse(value);
+			callback(jsonValue);
+		});
+	});
+};
+//#endregion
+
 initRequestInterceptor(service);
+initRequestInterceptor(streamInstance);
 
 export function secondaryRequest(config: AxiosRequestConfig<any>) {
 	return service({

--
Gitblit v1.9.3