@yimou6/common-ui 1.8.0 → 1.9.0

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 (45) hide show
  1. package/cdn/index.cdn.js +10 -9
  2. package/cdn/index.cdn.js.map +1 -1
  3. package/cdn/index.cdn.mjs +10 -9
  4. package/cdn/index.cdn.mjs.map +1 -1
  5. package/cdn/index.css +1 -1
  6. package/es/components/index.d.ts +1 -0
  7. package/es/components/index.mjs +1 -0
  8. package/es/components/index.mjs.map +1 -1
  9. package/es/components/wisdom-chat/index.d.ts +941 -0
  10. package/es/components/wisdom-chat/index.mjs +8 -0
  11. package/es/components/wisdom-chat/index.mjs.map +1 -0
  12. package/es/components/wisdom-chat/src/wisdom-chat.d.ts +82 -0
  13. package/es/components/wisdom-chat/src/wisdom-chat.mjs +139 -0
  14. package/es/components/wisdom-chat/src/wisdom-chat.mjs.map +1 -0
  15. package/es/components/wisdom-chat/src/wisdom-chat.vue.d.ts +941 -0
  16. package/es/components/wisdom-chat/src/wisdom-chat.vue.mjs +6 -0
  17. package/es/components/wisdom-chat/src/wisdom-chat.vue.mjs.map +1 -0
  18. package/es/components/wisdom-chat/src/wisdom-chat.vue2.mjs +393 -0
  19. package/es/components/wisdom-chat/src/wisdom-chat.vue2.mjs.map +1 -0
  20. package/es/index.mjs +1 -0
  21. package/es/index.mjs.map +1 -1
  22. package/es/installer.mjs +3 -1
  23. package/es/installer.mjs.map +1 -1
  24. package/global.d.ts +1 -0
  25. package/lib/components/index.d.ts +1 -0
  26. package/lib/components/index.js +2 -0
  27. package/lib/components/index.js.map +1 -1
  28. package/lib/components/wisdom-chat/index.d.ts +941 -0
  29. package/lib/components/wisdom-chat/index.js +13 -0
  30. package/lib/components/wisdom-chat/index.js.map +1 -0
  31. package/lib/components/wisdom-chat/src/wisdom-chat.d.ts +82 -0
  32. package/lib/components/wisdom-chat/src/wisdom-chat.js +142 -0
  33. package/lib/components/wisdom-chat/src/wisdom-chat.js.map +1 -0
  34. package/lib/components/wisdom-chat/src/wisdom-chat.vue.d.ts +941 -0
  35. package/lib/components/wisdom-chat/src/wisdom-chat.vue.js +10 -0
  36. package/lib/components/wisdom-chat/src/wisdom-chat.vue.js.map +1 -0
  37. package/lib/components/wisdom-chat/src/wisdom-chat.vue2.js +397 -0
  38. package/lib/components/wisdom-chat/src/wisdom-chat.vue2.js.map +1 -0
  39. package/lib/index.js +6 -4
  40. package/lib/index.js.map +1 -1
  41. package/lib/installer.js +3 -1
  42. package/lib/installer.js.map +1 -1
  43. package/package.json +3 -2
  44. package/theme-default/i-wisdom-chat.css +1 -0
  45. package/theme-default/index.css +1 -1
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var wisdomChat_vue_vue_type_script_setup_true_lang = require('./wisdom-chat.vue2.js');
6
+
7
+
8
+
9
+ exports.default = wisdomChat_vue_vue_type_script_setup_true_lang.default;
10
+ //# sourceMappingURL=wisdom-chat.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wisdom-chat.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,397 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var vue = require('vue');
6
+ var chat = require('@tdesign-vue-next/chat');
7
+ var elementPlus = require('element-plus');
8
+ var message = require('../../../utils/message.js');
9
+ var wisdomChat = require('./wisdom-chat.js');
10
+
11
+ var __defProp = Object.defineProperty;
12
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
13
+ const _hoisted_1 = { class: "wisdom-chat" };
14
+ const _hoisted_2 = { class: "wisdom-chat__content" };
15
+ const _hoisted_3 = { class: "chat-sender-inner-header" };
16
+ const _hoisted_4 = {
17
+ key: 0,
18
+ class: "chat-sender-image"
19
+ };
20
+ const _hoisted_5 = {
21
+ key: 1,
22
+ class: "chat-sender-file"
23
+ };
24
+ var _sfc_main = /* @__PURE__ */ vue.defineComponent({
25
+ ...{
26
+ name: "IWisdomChat"
27
+ },
28
+ __name: "wisdom-chat",
29
+ props: wisdomChat.WisdomChatProps,
30
+ setup(__props) {
31
+ var _a, _b;
32
+ const props = __props;
33
+ const chatRef = vue.ref();
34
+ const chatList = vue.ref([
35
+ {
36
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
37
+ content: `\u7531${((_a = props.robot) == null ? void 0 : _a.name) || "\u667A\u80FD\u52A9\u624B"}\u63D0\u4F9B\u6570\u636E\u652F\u6301`,
38
+ avatar: (_b = props.robot) == null ? void 0 : _b.avatar,
39
+ role: "model-change"
40
+ }
41
+ ]);
42
+ const isStreamLoad = vue.ref(false);
43
+ const loading = vue.ref(false);
44
+ const inputValue = vue.ref("");
45
+ const selectValue = vue.ref("");
46
+ const inputImage = vue.ref("");
47
+ const inputFileName = vue.ref("");
48
+ const fetchCancel = vue.ref();
49
+ vue.onMounted(() => {
50
+ if (props.models && props.models.length > 0) {
51
+ selectValue.value = props.models[0].value;
52
+ }
53
+ });
54
+ const modelISImage = vue.computed(() => {
55
+ var _a2;
56
+ const model = (_a2 = props.models) == null ? void 0 : _a2.find((item) => item.value === selectValue.value);
57
+ return (model == null ? void 0 : model.type.indexOf("image")) !== -1;
58
+ });
59
+ const showClearHistory = vue.computed(() => {
60
+ return props.showClearButton && chatList.value.length > 0 && !isStreamLoad.value;
61
+ });
62
+ const showModelSelect = vue.computed(() => {
63
+ return props.showModelSelector && props.models && props.models.length > 0;
64
+ });
65
+ const handleClear = /* @__PURE__ */ __name(() => {
66
+ chatList.value = [];
67
+ }, "handleClear");
68
+ const handleSenderStop = /* @__PURE__ */ __name(() => {
69
+ if (fetchCancel.value) {
70
+ fetchCancel.value.abort();
71
+ loading.value = false;
72
+ isStreamLoad.value = false;
73
+ }
74
+ }, "handleSenderStop");
75
+ const handleSenderSend = /* @__PURE__ */ __name((value) => {
76
+ var _a2, _b2, _c, _d;
77
+ if (isStreamLoad.value || !value.trim()) return;
78
+ const userMessage = {
79
+ avatar: (_a2 = props.self) == null ? void 0 : _a2.avatar,
80
+ name: (_b2 = props.self) == null ? void 0 : _b2.name,
81
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
82
+ content: value,
83
+ image: inputImage.value,
84
+ role: "user"
85
+ };
86
+ chatList.value.unshift(userMessage);
87
+ const botMessage = {
88
+ avatar: (_c = props.robot) == null ? void 0 : _c.avatar,
89
+ name: (_d = props.robot) == null ? void 0 : _d.name,
90
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
91
+ content: "",
92
+ role: "assistant"
93
+ };
94
+ chatList.value.unshift(botMessage);
95
+ sendMsg();
96
+ inputValue.value = "";
97
+ inputImage.value = "";
98
+ inputFileName.value = "";
99
+ }, "handleSenderSend");
100
+ const handleSenderFileSelect = /* @__PURE__ */ __name((params) => {
101
+ const { files } = params;
102
+ if (files.length === 0) {
103
+ return message.default.error("\u8BF7\u9009\u62E9\u6587\u4EF6");
104
+ }
105
+ if (files.length > 1) {
106
+ return message.default.error("\u5355\u6B21\u53EA\u80FD\u4E0A\u4F201\u4E2A\u6587\u4EF6");
107
+ }
108
+ const file = files[0];
109
+ if (!isImage(file)) {
110
+ return message.default.error("\u53EA\u652F\u6301\u4E0A\u4F20\u56FE\u7247\u6587\u4EF6");
111
+ }
112
+ if (file.size > props.maxImageSize * 1024 * 1024) {
113
+ return message.default.error(`\u56FE\u7247\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7${props.maxImageSize}MB`);
114
+ }
115
+ const reader = new FileReader();
116
+ reader.readAsDataURL(file);
117
+ reader.onload = (e) => {
118
+ var _a2;
119
+ if ((_a2 = e.target) == null ? void 0 : _a2.result) {
120
+ inputImage.value = e.target.result;
121
+ }
122
+ };
123
+ reader.onerror = () => {
124
+ message.default.error("\u56FE\u7247\u8BFB\u53D6\u5931\u8D25");
125
+ };
126
+ }, "handleSenderFileSelect");
127
+ const handleDelInputImage = /* @__PURE__ */ __name(() => {
128
+ inputImage.value = "";
129
+ }, "handleDelInputImage");
130
+ const handleDelInputFile = /* @__PURE__ */ __name(() => {
131
+ inputFileName.value = "";
132
+ }, "handleDelInputFile");
133
+ function isImage(file) {
134
+ return file.type.startsWith("image/");
135
+ }
136
+ __name(isImage, "isImage");
137
+ const chatSenderRef = vue.ref();
138
+ function sendMsg() {
139
+ loading.value = true;
140
+ isStreamLoad.value = true;
141
+ const lastItem = chatList.value[0];
142
+ let imageBase64 = "";
143
+ if (inputImage.value) {
144
+ const parts = inputImage.value.split(",");
145
+ if (parts.length > 1) {
146
+ imageBase64 = parts[1];
147
+ }
148
+ }
149
+ const messages = [
150
+ {
151
+ role: "user",
152
+ content: inputValue.value,
153
+ images: imageBase64 ? [imageBase64] : []
154
+ }
155
+ ];
156
+ wisdomChat.fetchSSE(
157
+ messages,
158
+ selectValue.value,
159
+ {
160
+ // 处理增量内容
161
+ success(event) {
162
+ if (event.type === "delta" && event.data) {
163
+ lastItem.content += event.data;
164
+ }
165
+ },
166
+ // 处理完成状态
167
+ complete(isOk, msg) {
168
+ if (!isOk || !lastItem.content) {
169
+ lastItem.role = "error";
170
+ lastItem.content = msg || "\u751F\u6210\u56DE\u590D\u5931\u8D25";
171
+ }
172
+ isStreamLoad.value = false;
173
+ loading.value = false;
174
+ vue.nextTick(() => {
175
+ var _a2, _b2, _c;
176
+ (_a2 = chatRef.value) == null ? void 0 : _a2.scrollToBottom({ behavior: "smooth" });
177
+ const el = (_b2 = chatSenderRef.value) == null ? void 0 : _b2.$el;
178
+ (_c = el.querySelector("textarea")) == null ? void 0 : _c.focus();
179
+ });
180
+ },
181
+ // 处理失败
182
+ fail() {
183
+ isStreamLoad.value = false;
184
+ loading.value = false;
185
+ },
186
+ // 保存取消控制器
187
+ cancel(controller) {
188
+ fetchCancel.value = controller;
189
+ }
190
+ },
191
+ props.apiUrl
192
+ );
193
+ }
194
+ __name(sendMsg, "sendMsg");
195
+ return (_ctx, _cache) => {
196
+ const _component_el_image = vue.resolveComponent("el-image");
197
+ const _component_el_option = vue.resolveComponent("el-option");
198
+ const _component_el_select = vue.resolveComponent("el-select");
199
+ const _component_el_tag = vue.resolveComponent("el-tag");
200
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
201
+ vue.createVNode(vue.unref(chat.Chat), {
202
+ ref_key: "chatRef",
203
+ ref: chatRef,
204
+ class: "wisdom-chat__tchat",
205
+ layout: "both",
206
+ "clear-history": showClearHistory.value,
207
+ onClear: handleClear
208
+ }, {
209
+ footer: vue.withCtx(() => [
210
+ vue.createVNode(vue.unref(chat.ChatSender), {
211
+ ref_key: "chatSenderRef",
212
+ ref: chatSenderRef,
213
+ modelValue: inputValue.value,
214
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => inputValue.value = $event),
215
+ loading: isStreamLoad.value,
216
+ "textarea-props": { placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F..." },
217
+ onStop: handleSenderStop,
218
+ onSend: handleSenderSend,
219
+ onFileSelect: handleSenderFileSelect
220
+ }, vue.createSlots({
221
+ suffix: vue.withCtx(({ renderPresets }) => [
222
+ modelISImage.value ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(renderPresets([{ name: "uploadImage" }])), { key: 0 })) : (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(renderPresets([])), { key: 1 }))
223
+ ]),
224
+ "inner-header": vue.withCtx(() => [
225
+ vue.createElementVNode("div", _hoisted_3, [
226
+ vue.createCommentVNode(" \u56FE\u7247\u9884\u89C8 "),
227
+ inputImage.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4, [
228
+ vue.createVNode(_component_el_image, {
229
+ src: inputImage.value,
230
+ fit: "cover",
231
+ "preview-src-list": [inputImage.value]
232
+ }, null, 8, ["src", "preview-src-list"]),
233
+ vue.createElementVNode("div", {
234
+ class: "chat-sender-image__del",
235
+ onClick: handleDelInputImage
236
+ }, _cache[3] || (_cache[3] = [
237
+ vue.createElementVNode(
238
+ "i",
239
+ { class: "icon-shanchu iconfont" },
240
+ null,
241
+ -1
242
+ /* HOISTED */
243
+ )
244
+ ]))
245
+ ])) : vue.createCommentVNode("v-if", true),
246
+ vue.createCommentVNode(" \u6587\u4EF6\u6807\u7B7E "),
247
+ inputFileName.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5, [
248
+ vue.createVNode(_component_el_tag, {
249
+ closable: "",
250
+ size: "default",
251
+ type: "info",
252
+ hit: "",
253
+ onClose: handleDelInputFile
254
+ }, {
255
+ default: vue.withCtx(() => [
256
+ vue.createTextVNode(
257
+ vue.toDisplayString(inputFileName.value),
258
+ 1
259
+ /* TEXT */
260
+ )
261
+ ]),
262
+ _: 1
263
+ /* STABLE */
264
+ })
265
+ ])) : vue.createCommentVNode("v-if", true)
266
+ ])
267
+ ]),
268
+ _: 2
269
+ /* DYNAMIC */
270
+ }, [
271
+ showModelSelect.value ? {
272
+ name: "prefix",
273
+ fn: vue.withCtx(() => [
274
+ vue.createVNode(_component_el_select, {
275
+ modelValue: selectValue.value,
276
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectValue.value = $event),
277
+ placement: "top",
278
+ style: { "width": "160px" }
279
+ }, {
280
+ default: vue.withCtx(() => [
281
+ (vue.openBlock(true), vue.createElementBlock(
282
+ vue.Fragment,
283
+ null,
284
+ vue.renderList(props.models, (model) => {
285
+ return vue.openBlock(), vue.createBlock(_component_el_option, {
286
+ key: model.value,
287
+ label: model.label,
288
+ value: model.value,
289
+ title: model.description
290
+ }, null, 8, ["label", "value", "title"]);
291
+ }),
292
+ 128
293
+ /* KEYED_FRAGMENT */
294
+ ))
295
+ ]),
296
+ _: 1
297
+ /* STABLE */
298
+ }, 8, ["modelValue"])
299
+ ]),
300
+ key: "0"
301
+ } : void 0
302
+ ]), 1032, ["modelValue", "loading"])
303
+ ]),
304
+ default: vue.withCtx(() => [
305
+ (vue.openBlock(true), vue.createElementBlock(
306
+ vue.Fragment,
307
+ null,
308
+ vue.renderList(chatList.value, (chat$1, index) => {
309
+ return vue.openBlock(), vue.createBlock(vue.unref(chat.ChatItem), {
310
+ key: index,
311
+ role: chat$1.role,
312
+ "text-loading": index === 0 && loading.value,
313
+ variant: "base"
314
+ }, vue.createSlots({
315
+ avatar: vue.withCtx(() => [
316
+ vue.createVNode(vue.unref(elementPlus.ElAvatar), {
317
+ size: "large",
318
+ shape: "circle",
319
+ src: chat$1.avatar
320
+ }, {
321
+ default: vue.withCtx(() => _cache[2] || (_cache[2] = [
322
+ vue.createElementVNode(
323
+ "i",
324
+ {
325
+ class: "iconfont icon-yonghu1",
326
+ style: { "font-size": "20px" }
327
+ },
328
+ null,
329
+ -1
330
+ /* HOISTED */
331
+ )
332
+ ])),
333
+ _: 2
334
+ /* DYNAMIC */
335
+ }, 1032, ["src"])
336
+ ]),
337
+ content: vue.withCtx(() => [
338
+ vue.createElementVNode("div", _hoisted_2, [
339
+ chat$1.content ? (vue.openBlock(), vue.createBlock(vue.unref(chat.ChatContent), {
340
+ key: 0,
341
+ content: chat$1.content,
342
+ variant: "base"
343
+ }, null, 8, ["content"])) : vue.createCommentVNode("v-if", true),
344
+ chat$1.image ? (vue.openBlock(), vue.createBlock(_component_el_image, {
345
+ key: 1,
346
+ class: "chat-content-images",
347
+ src: chat$1.image,
348
+ fit: "cover",
349
+ "preview-src-list": [chat$1.image]
350
+ }, null, 8, ["src", "preview-src-list"])) : vue.createCommentVNode("v-if", true)
351
+ ])
352
+ ]),
353
+ _: 2
354
+ /* DYNAMIC */
355
+ }, [
356
+ chat$1.name ? {
357
+ name: "name",
358
+ fn: vue.withCtx(() => [
359
+ vue.createElementVNode(
360
+ "div",
361
+ null,
362
+ vue.toDisplayString(chat$1.name),
363
+ 1
364
+ /* TEXT */
365
+ )
366
+ ]),
367
+ key: "0"
368
+ } : void 0,
369
+ chat$1.datetime ? {
370
+ name: "datetime",
371
+ fn: vue.withCtx(() => [
372
+ vue.createElementVNode(
373
+ "div",
374
+ null,
375
+ vue.toDisplayString(chat$1.datetime),
376
+ 1
377
+ /* TEXT */
378
+ )
379
+ ]),
380
+ key: "1"
381
+ } : void 0
382
+ ]), 1032, ["role", "text-loading"]);
383
+ }),
384
+ 128
385
+ /* KEYED_FRAGMENT */
386
+ ))
387
+ ]),
388
+ _: 1
389
+ /* STABLE */
390
+ }, 8, ["clear-history"])
391
+ ]);
392
+ };
393
+ }
394
+ });
395
+
396
+ exports.default = _sfc_main;
397
+ //# sourceMappingURL=wisdom-chat.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wisdom-chat.vue2.js","sources":["../../../../../../../packages/components/wisdom-chat/src/wisdom-chat.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n import {\n Chat as TChat,\n ChatContent as TChatContent,\n ChatItem as TChatItem,\n ChatSender as TChatSender,\n } from '@tdesign-vue-next/chat';\n import { ElAvatar } from 'element-plus';\n import { computed, nextTick, onMounted, ref } from 'vue';\n import type { UploadActionType } from '@tdesign-vue-next/chat';\n import INotify from '../../../utils/message';\n import {\n type ChatMessageItemType,\n type ChatMessageType,\n fetchSSE,\n type SSEEvent,\n WisdomChatProps,\n } from './wisdom-chat';\n\n defineOptions({\n name: 'IWisdomChat',\n });\n const props = defineProps(WisdomChatProps);\n\n // 组件引用\n const chatRef = ref();\n\n // 聊天消息列表\n const chatList = ref<ChatMessageItemType[]>([\n {\n datetime: new Date().toLocaleString(),\n content: `由${props.robot?.name || '智能助手'}提供数据支持`,\n avatar: props.robot?.avatar,\n role: 'model-change',\n },\n ]);\n\n // 状态管理\n const isStreamLoad = ref(false); // 是否正在流式加载\n const loading = ref(false); // 是否正在加载\n const inputValue = ref(''); // 输入框值\n const selectValue = ref(''); // 当前选择的模型\n const inputImage = ref(''); // 输入框中的图片(base64)\n const inputFileName = ref(''); // 输入框中的文件名称\n const fetchCancel = ref<AbortController>(); // 取消请求控制器\n\n // 组件挂载时初始化\n onMounted(() => {\n // 初始化模型选择\n if (props.models && props.models.length > 0) {\n selectValue.value = props.models[0].value;\n }\n });\n /**\n * 当前选择的模型是否支持图片上传\n */\n const modelISImage = computed(() => {\n const model = props.models?.find(item => item.value === selectValue.value);\n return model?.type.indexOf('image') !== -1;\n });\n\n /**\n * 是否显示清除历史按钮\n */\n const showClearHistory = computed(() => {\n return props.showClearButton && chatList.value.length > 0 && !isStreamLoad.value;\n });\n\n /**\n * 是否显示模型选择器\n */\n const showModelSelect = computed(() => {\n return props.showModelSelector && props.models && props.models.length > 0;\n });\n\n /**\n * 清空聊天历史\n */\n const handleClear = () => {\n chatList.value = [];\n };\n\n /**\n * 终止当前消息生成\n */\n const handleSenderStop = () => {\n if (fetchCancel.value) {\n fetchCancel.value.abort();\n loading.value = false;\n isStreamLoad.value = false;\n }\n };\n\n /**\n * 发送消息\n * @param value 消息内容\n */\n const handleSenderSend = (value: string) => {\n // 如果正在加载或消息为空,不处理\n if (isStreamLoad.value || !value.trim()) return;\n\n // 添加用户消息\n const userMessage: ChatMessageItemType = {\n avatar: props.self?.avatar,\n name: props.self?.name,\n datetime: new Date().toLocaleString(),\n content: value,\n image: inputImage.value,\n role: 'user',\n };\n chatList.value.unshift(userMessage);\n\n // 添加机器人空消息占位\n const botMessage: ChatMessageItemType = {\n avatar: props.robot?.avatar,\n name: props.robot?.name,\n datetime: new Date().toLocaleString(),\n content: '',\n role: 'assistant',\n };\n chatList.value.unshift(botMessage);\n\n // 发送消息并获取回复\n sendMsg();\n\n // 清空输入\n inputValue.value = '';\n inputImage.value = '';\n inputFileName.value = '';\n };\n\n /**\n * 处理文件选择\n * @param params 文件参数\n */\n const handleSenderFileSelect = (params: { files: File[]; name: UploadActionType }) => {\n const { files } = params;\n\n // 验证文件\n if (files.length === 0) {\n return INotify.error('请选择文件');\n }\n\n if (files.length > 1) {\n return INotify.error('单次只能上传1个文件');\n }\n\n const file = files[0];\n\n // 验证文件类型\n if (!isImage(file)) {\n return INotify.error('只支持上传图片文件');\n }\n\n // 验证文件大小\n if (file.size > props.maxImageSize * 1024 * 1024) {\n return INotify.error(`图片大小不能超过${props.maxImageSize}MB`);\n }\n\n // 图片转base64\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = e => {\n if (e.target?.result) {\n inputImage.value = e.target.result as string;\n }\n };\n reader.onerror = () => {\n INotify.error('图片读取失败');\n };\n };\n\n /**\n * 删除输入框中的图片\n */\n const handleDelInputImage = () => {\n inputImage.value = '';\n };\n\n /**\n * 删除输入框中的文件\n */\n const handleDelInputFile = () => {\n inputFileName.value = '';\n };\n\n /**\n * 判断文件是否为图片\n * @param file 文件对象\n * @returns 是否为图片\n */\n function isImage(file: File): boolean {\n return file.type.startsWith('image/');\n }\n const chatSenderRef = ref();\n /**\n * 发送消息到API并处理响应\n */\n function sendMsg() {\n // 设置加载状态\n loading.value = true;\n isStreamLoad.value = true;\n\n // 获取最新的消息(机器人回复占位)\n const lastItem = chatList.value[0];\n\n // 处理图片数据\n let imageBase64 = '';\n if (inputImage.value) {\n // 从data:image/jpeg;base64,/9j/4AAQ... 格式中提取base64部分\n const parts = inputImage.value.split(',');\n if (parts.length > 1) {\n imageBase64 = parts[1];\n }\n }\n\n // 构建消息对象\n const messages: ChatMessageType[] = [\n {\n role: 'user',\n content: inputValue.value,\n images: imageBase64 ? [imageBase64] : [],\n },\n ];\n\n // 调用API\n fetchSSE(\n messages,\n selectValue.value,\n {\n // 处理增量内容\n success(event: SSEEvent) {\n if (event.type === 'delta' && event.data) {\n lastItem.content += event.data;\n }\n },\n\n // 处理完成状态\n complete(isOk: boolean, msg?: string) {\n // 如果失败或内容为空,显示错误\n if (!isOk || !lastItem.content) {\n lastItem.role = 'error';\n lastItem.content = msg || '生成回复失败';\n }\n\n // 重置状态\n isStreamLoad.value = false;\n loading.value = false;\n\n nextTick(() => {\n // 滚动到底部\n chatRef.value?.scrollToBottom({ behavior: 'smooth' });\n // 输入框重新获取焦点\n const el = chatSenderRef.value?.$el;\n el.querySelector('textarea')?.focus();\n });\n },\n\n // 处理失败\n fail() {\n isStreamLoad.value = false;\n loading.value = false;\n },\n\n // 保存取消控制器\n cancel(controller: AbortController) {\n fetchCancel.value = controller;\n },\n },\n props.apiUrl,\n );\n }\n</script>\n\n<template>\n <div class=\"wisdom-chat\">\n <TChat\n ref=\"chatRef\"\n class=\"wisdom-chat__tchat\"\n layout=\"both\"\n :clear-history=\"showClearHistory\"\n @clear=\"handleClear\"\n >\n <!-- 聊天消息列表 -->\n <template v-for=\"(chat, index) in chatList\" :key=\"index\">\n <TChatItem :role=\"chat.role\" :text-loading=\"index === 0 && loading\" variant=\"base\">\n <!-- 昵称 -->\n <template v-if=\"chat.name\" #name>\n <div>{{ chat.name }}</div>\n </template>\n\n <!-- 时间 -->\n <template v-if=\"chat.datetime\" #datetime>\n <div>{{ chat.datetime }}</div>\n </template>\n\n <!-- 头像 -->\n <template #avatar>\n <ElAvatar size=\"large\" shape=\"circle\" :src=\"chat.avatar\">\n <i class=\"iconfont icon-yonghu1\" style=\"font-size: 20px\" />\n </ElAvatar>\n </template>\n\n <!-- 内容 -->\n <template #content>\n <div class=\"wisdom-chat__content\">\n <TChatContent v-if=\"chat.content\" :content=\"chat.content\" variant=\"base\" />\n <el-image\n v-if=\"chat.image\"\n class=\"chat-content-images\"\n :src=\"chat.image\"\n fit=\"cover\"\n :preview-src-list=\"[chat.image]\"\n />\n </div>\n </template>\n </TChatItem>\n </template>\n\n <!-- 底部输入区域 -->\n <template #footer>\n <TChatSender\n ref=\"chatSenderRef\"\n v-model=\"inputValue\"\n :loading=\"isStreamLoad\"\n :textarea-props=\"{ placeholder: '请输入消息...' }\"\n @stop=\"handleSenderStop\"\n @send=\"handleSenderSend\"\n @file-select=\"handleSenderFileSelect\"\n >\n <!-- 右下角区域 - 图片上传 -->\n <template #suffix=\"{ renderPresets }\">\n <component :is=\"renderPresets([{ name: 'uploadImage' }])\" v-if=\"modelISImage\" />\n <component :is=\"renderPresets([])\" v-else />\n </template>\n\n <!-- 左下角区域 - 模型选择 -->\n <template v-if=\"showModelSelect\" #prefix>\n <el-select v-model=\"selectValue\" placement=\"top\" style=\"width: 160px\">\n <el-option\n v-for=\"model of props.models\"\n :key=\"model.value\"\n :label=\"model.label\"\n :value=\"model.value\"\n :title=\"model.description\"\n />\n </el-select>\n </template>\n\n <!-- 输入框内标题区域 - 已上传图片/文件 -->\n <template #inner-header>\n <div class=\"chat-sender-inner-header\">\n <!-- 图片预览 -->\n <div v-if=\"inputImage\" class=\"chat-sender-image\">\n <el-image :src=\"inputImage\" fit=\"cover\" :preview-src-list=\"[inputImage]\" />\n <div class=\"chat-sender-image__del\" @click=\"handleDelInputImage\">\n <i class=\"icon-shanchu iconfont\" />\n </div>\n </div>\n\n <!-- 文件标签 -->\n <div v-if=\"inputFileName\" class=\"chat-sender-file\">\n <el-tag closable size=\"default\" type=\"info\" hit @close=\"handleDelInputFile\">\n {{ inputFileName }}\n </el-tag>\n </div>\n </div>\n </template>\n </TChatSender>\n </template>\n </TChat>\n </div>\n</template>\n"],"names":["ref","onMounted","computed","_a","_b","INotify","fetchSSE","nextTick"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -31,8 +31,9 @@ var index$i = require('./components/table/index.js');
31
31
  var tenantEnterprise = require('./components/tenant-enterprise/src/tenant-enterprise.js');
32
32
  var index$j = require('./components/tenant-enterprise/index.js');
33
33
  var index$k = require('./components/text-button/index.js');
34
- var index$l = require('./hooks/useBaseTable/index.js');
35
- var index$m = require('./hooks/useECharts/index.js');
34
+ var index$l = require('./components/wisdom-chat/index.js');
35
+ var index$m = require('./hooks/useBaseTable/index.js');
36
+ var index$n = require('./hooks/useECharts/index.js');
36
37
  var install = require('./utils/install.js');
37
38
  var provide = require('./utils/provide.js');
38
39
  var util = require('./utils/util.js');
@@ -74,8 +75,9 @@ exports.TenantEnterpriseProps = tenantEnterprise.TenantEnterpriseProps;
74
75
  exports.ITenantEnterprise = index$j.ITenantEnterprise;
75
76
  exports.ITextButton = index$k.ITextButton;
76
77
  exports.ITextButtonGroup = index$k.ITextButtonGroup;
77
- exports.useBaseTable = index$l.useBaseTable;
78
- exports.useECharts = index$m.useECharts;
78
+ exports.IWisdomChat = index$l.IWisdomChat;
79
+ exports.useBaseTable = index$m.useBaseTable;
80
+ exports.useECharts = index$n.useECharts;
79
81
  exports.withInstall = install.withInstall;
80
82
  exports.withInstallDirectives = install.withInstallDirectives;
81
83
  exports.DICT_STORE = provide.DICT_STORE;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/lib/installer.js CHANGED
@@ -24,6 +24,7 @@ var index$h = require('./components/dialog/index.js');
24
24
  var index$i = require('./components/link/index.js');
25
25
  var index$j = require('./components/flv-player/index.js');
26
26
  var index$k = require('./components/date-picker/index.js');
27
+ var index$l = require('./components/wisdom-chat/index.js');
27
28
 
28
29
  var __defProp = Object.defineProperty;
29
30
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -50,7 +51,8 @@ const component = [
50
51
  index$h.IDialog,
51
52
  index$i.ILink,
52
53
  index$j.IFlvPlayer,
53
- index$k.IDatePicker
54
+ index$k.IDatePicker,
55
+ index$l.IWisdomChat
54
56
  ];
55
57
  const install = /* @__PURE__ */ __name(function(app, _options) {
56
58
  component.forEach((i) => app.use(i, _options));
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sources":["../../../../packages/installer.ts"],"sourcesContent":["import type { App, Plugin } from 'vue';\n\nimport {\n ICheckbox,\n IDatePicker,\n IDescriptionItem,\n IDescriptions,\n IDialog,\n IDivider,\n IDrawer,\n IFlvPlayer,\n IForm,\n IIconSelect,\n IImageVerification,\n ILink,\n ILivePlayer,\n IPageHeader,\n IRadio,\n ISearch,\n ISegmented,\n ISelect,\n ISplitPane,\n ITable,\n ITenantEnterprise,\n ITextButton,\n ITextButtonGroup,\n} from './components';\n\nconst component = [\n IForm,\n ISelect,\n IRadio,\n ICheckbox,\n IDivider,\n IDrawer,\n IIconSelect,\n IImageVerification,\n ITextButton,\n ITextButtonGroup,\n IPageHeader,\n ISearch,\n ITable,\n ISplitPane,\n ITenantEnterprise,\n ISegmented,\n IDescriptions,\n IDescriptionItem,\n ILivePlayer,\n IDialog,\n ILink,\n IFlvPlayer,\n IDatePicker,\n] as Plugin[];\n\nexport const install = function (app: App, _options?: any) {\n component.forEach(i => app.use(i, _options));\n};\n\nexport default {\n install,\n};\n"],"names":["IForm","ISelect","IRadio","ICheckbox","IDivider","IDrawer","IIconSelect","IImageVerification","ITextButton","ITextButtonGroup","IPageHeader","ISearch","ITable","ISplitPane","ITenantEnterprise","ISegmented","IDescriptions","IDescriptionItem","ILivePlayer","IDialog","ILink","IFlvPlayer","IDatePicker"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,SAAY,GAAA;AAAA,EAChBA,WAAA;AAAA,EACAC,eAAA;AAAA,EACAC,cAAA;AAAA,EACAC,iBAAA;AAAA,EACAC,gBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,0BAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,cAAA;AAAA,EACAC,kBAAA;AAAA,EACAC,yBAAA;AAAA,EACAC,kBAAA;AAAA,EACAC,qBAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,aAAA;AAAA,EACAC,kBAAA;AAAA,EACAC;AACF,CAAA;AAEa,MAAA,OAAA,mBAAoB,MAAA,CAAA,SAAA,GAAA,EAAU,QAAgB,EAAA;AACzD,EAAA,SAAA,CAAU,QAAQ,CAAK,CAAA,KAAA,GAAA,CAAI,GAAI,CAAA,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC7C,CAFuB,EAAA,SAAA;AAIvB,gBAAe;AAAA,EACb;AACF,CAAA;;;;;"}
1
+ {"version":3,"file":"installer.js","sources":["../../../../packages/installer.ts"],"sourcesContent":["import type { App, Plugin } from 'vue';\n\nimport {\n ICheckbox,\n IDatePicker,\n IDescriptionItem,\n IDescriptions,\n IDialog,\n IDivider,\n IDrawer,\n IFlvPlayer,\n IForm,\n IIconSelect,\n IImageVerification,\n ILink,\n ILivePlayer,\n IPageHeader,\n IRadio,\n ISearch,\n ISegmented,\n ISelect,\n ISplitPane,\n ITable,\n ITenantEnterprise,\n ITextButton,\n ITextButtonGroup,\n IWisdomChat,\n} from './components';\n\nconst component = [\n IForm,\n ISelect,\n IRadio,\n ICheckbox,\n IDivider,\n IDrawer,\n IIconSelect,\n IImageVerification,\n ITextButton,\n ITextButtonGroup,\n IPageHeader,\n ISearch,\n ITable,\n ISplitPane,\n ITenantEnterprise,\n ISegmented,\n IDescriptions,\n IDescriptionItem,\n ILivePlayer,\n IDialog,\n ILink,\n IFlvPlayer,\n IDatePicker,\n IWisdomChat,\n] as Plugin[];\n\nexport const install = function (app: App, _options?: any) {\n component.forEach(i => app.use(i, _options));\n};\n\nexport default {\n install,\n};\n"],"names":["IForm","ISelect","IRadio","ICheckbox","IDivider","IDrawer","IIconSelect","IImageVerification","ITextButton","ITextButtonGroup","IPageHeader","ISearch","ITable","ISplitPane","ITenantEnterprise","ISegmented","IDescriptions","IDescriptionItem","ILivePlayer","IDialog","ILink","IFlvPlayer","IDatePicker","IWisdomChat"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,SAAY,GAAA;AAAA,EAChBA,WAAA;AAAA,EACAC,eAAA;AAAA,EACAC,cAAA;AAAA,EACAC,iBAAA;AAAA,EACAC,gBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,0BAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,cAAA;AAAA,EACAC,kBAAA;AAAA,EACAC,yBAAA;AAAA,EACAC,kBAAA;AAAA,EACAC,qBAAA;AAAA,EACAC,wBAAA;AAAA,EACAC,mBAAA;AAAA,EACAC,eAAA;AAAA,EACAC,aAAA;AAAA,EACAC,kBAAA;AAAA,EACAC,mBAAA;AAAA,EACAC;AACF,CAAA;AAEa,MAAA,OAAA,mBAAoB,MAAA,CAAA,SAAA,GAAA,EAAU,QAAgB,EAAA;AACzD,EAAA,SAAA,CAAU,QAAQ,CAAK,CAAA,KAAA,GAAA,CAAI,GAAI,CAAA,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC7C,CAFuB,EAAA,SAAA;AAIvB,gBAAe;AAAA,EACb;AACF,CAAA;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yimou6/common-ui",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "description": "Vue3 Component Library",
5
5
  "license": "MIT",
6
6
  "author": "yimou6",
@@ -73,7 +73,8 @@
73
73
  "xgplayer": "^3.0.21",
74
74
  "xgplayer-flv": "^3.0.21",
75
75
  "xgplayer-hls": "^3.0.21",
76
- "ezuikit-js": "^8.1.10"
76
+ "ezuikit-js": "^8.1.10",
77
+ "@tdesign-vue-next/chat": "^0.4.2"
77
78
  },
78
79
  "dependencies": {
79
80
  "@types/ezuikit-js": "^8.0.0",
@@ -0,0 +1 @@
1
+ .wisdom-chat{width:100%;height:100%}.wisdom-chat .t-chat.wisdom-chat__tchat{width:100%;height:100%}.wisdom-chat .wisdom-chat__content{position:relative;width:100%}.wisdom-chat .wisdom-chat__content .chat-content-images{box-sizing:border-box;width:50px;height:50px;margin-top:4px;float:right;overflow:hidden;border:1px solid var(--el-border-color);border-radius:4px}.wisdom-chat .chat-sender-inner-header{width:100%}.wisdom-chat .chat-sender-inner-header .chat-sender-image{position:relative;box-sizing:border-box;width:50px;height:50px;margin-left:10px;overflow:hidden;border:1px solid var(--el-border-color);border-radius:4px;cursor:pointer}.wisdom-chat .chat-sender-inner-header .chat-sender-image:hover .chat-sender-image__del{transform:translateY(0);opacity:1}.wisdom-chat .chat-sender-inner-header .chat-sender-image .chat-sender-image__del{display:flex;position:absolute;top:0;left:0;align-items:center;justify-content:center;width:100%;height:100%;transform:translateY(50%);transition:all .2s cubic-bezier(.4,0,.2,1);opacity:0;background-color:rgba(0,0,0,.5)}.wisdom-chat .chat-sender-inner-header .chat-sender-image .chat-sender-image__del .iconfont{color:#fff;font-size:20px}