@yimou6/common-ui 1.7.8 → 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 (95) 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/concise-logger/index.d.ts +2 -0
  7. package/es/components/concise-logger/index.mjs +9 -0
  8. package/es/components/concise-logger/index.mjs.map +1 -0
  9. package/es/components/concise-logger/src/concise-logger.d.ts +5 -0
  10. package/es/components/concise-logger/src/concise-logger.mjs +4 -0
  11. package/es/components/concise-logger/src/concise-logger.mjs.map +1 -0
  12. package/es/components/concise-logger/src/concise-logger.vue.d.ts +2 -0
  13. package/es/components/concise-logger/src/concise-logger.vue.mjs +6 -0
  14. package/es/components/concise-logger/src/concise-logger.vue.mjs.map +1 -0
  15. package/es/components/concise-logger/src/concise-logger.vue2.mjs +18 -0
  16. package/es/components/concise-logger/src/concise-logger.vue2.mjs.map +1 -0
  17. package/es/components/index.d.ts +2 -1
  18. package/es/components/index.mjs +3 -2
  19. package/es/components/index.mjs.map +1 -1
  20. package/es/components/text-button/index.d.ts +238 -1
  21. package/es/components/text-button/index.mjs +8 -1
  22. package/es/components/text-button/index.mjs.map +1 -1
  23. package/es/components/text-button/src/text-button-group.vue.d.ts +92 -0
  24. package/es/components/text-button/src/text-button-group.vue.mjs +6 -0
  25. package/es/components/text-button/src/text-button-group.vue.mjs.map +1 -0
  26. package/es/components/text-button/src/text-button-group.vue2.mjs +56 -0
  27. package/es/components/text-button/src/text-button-group.vue2.mjs.map +1 -0
  28. package/es/components/text-button/src/text-button.d.ts +11 -0
  29. package/es/components/text-button/src/text-button.mjs +7 -1
  30. package/es/components/text-button/src/text-button.mjs.map +1 -1
  31. package/es/components/wisdom-chat/index.d.ts +941 -0
  32. package/es/components/wisdom-chat/index.mjs +8 -0
  33. package/es/components/wisdom-chat/index.mjs.map +1 -0
  34. package/es/components/wisdom-chat/src/wisdom-chat.d.ts +82 -0
  35. package/es/components/wisdom-chat/src/wisdom-chat.mjs +139 -0
  36. package/es/components/wisdom-chat/src/wisdom-chat.mjs.map +1 -0
  37. package/es/components/wisdom-chat/src/wisdom-chat.vue.d.ts +941 -0
  38. package/es/components/wisdom-chat/src/wisdom-chat.vue.mjs +6 -0
  39. package/es/components/wisdom-chat/src/wisdom-chat.vue.mjs.map +1 -0
  40. package/es/components/wisdom-chat/src/wisdom-chat.vue2.mjs +393 -0
  41. package/es/components/wisdom-chat/src/wisdom-chat.vue2.mjs.map +1 -0
  42. package/es/index.mjs +3 -2
  43. package/es/index.mjs.map +1 -1
  44. package/es/installer.mjs +6 -3
  45. package/es/installer.mjs.map +1 -1
  46. package/es/utils/provide.d.ts +6 -2
  47. package/es/utils/provide.mjs.map +1 -1
  48. package/global.d.ts +2 -0
  49. package/lib/components/concise-logger/index.d.ts +2 -0
  50. package/lib/components/concise-logger/index.js +14 -0
  51. package/lib/components/concise-logger/index.js.map +1 -0
  52. package/lib/components/concise-logger/src/concise-logger.d.ts +5 -0
  53. package/lib/components/concise-logger/src/concise-logger.js +6 -0
  54. package/lib/components/concise-logger/src/concise-logger.js.map +1 -0
  55. package/lib/components/concise-logger/src/concise-logger.vue.d.ts +2 -0
  56. package/lib/components/concise-logger/src/concise-logger.vue.js +10 -0
  57. package/lib/components/concise-logger/src/concise-logger.vue.js.map +1 -0
  58. package/lib/components/concise-logger/src/concise-logger.vue2.js +22 -0
  59. package/lib/components/concise-logger/src/concise-logger.vue2.js.map +1 -0
  60. package/lib/components/index.d.ts +2 -1
  61. package/lib/components/index.js +8 -5
  62. package/lib/components/index.js.map +1 -1
  63. package/lib/components/text-button/index.d.ts +238 -1
  64. package/lib/components/text-button/index.js +9 -1
  65. package/lib/components/text-button/index.js.map +1 -1
  66. package/lib/components/text-button/src/text-button-group.vue.d.ts +92 -0
  67. package/lib/components/text-button/src/text-button-group.vue.js +10 -0
  68. package/lib/components/text-button/src/text-button-group.vue.js.map +1 -0
  69. package/lib/components/text-button/src/text-button-group.vue2.js +60 -0
  70. package/lib/components/text-button/src/text-button-group.vue2.js.map +1 -0
  71. package/lib/components/text-button/src/text-button.d.ts +11 -0
  72. package/lib/components/text-button/src/text-button.js +7 -0
  73. package/lib/components/text-button/src/text-button.js.map +1 -1
  74. package/lib/components/wisdom-chat/index.d.ts +941 -0
  75. package/lib/components/wisdom-chat/index.js +13 -0
  76. package/lib/components/wisdom-chat/index.js.map +1 -0
  77. package/lib/components/wisdom-chat/src/wisdom-chat.d.ts +82 -0
  78. package/lib/components/wisdom-chat/src/wisdom-chat.js +142 -0
  79. package/lib/components/wisdom-chat/src/wisdom-chat.js.map +1 -0
  80. package/lib/components/wisdom-chat/src/wisdom-chat.vue.d.ts +941 -0
  81. package/lib/components/wisdom-chat/src/wisdom-chat.vue.js +10 -0
  82. package/lib/components/wisdom-chat/src/wisdom-chat.vue.js.map +1 -0
  83. package/lib/components/wisdom-chat/src/wisdom-chat.vue2.js +397 -0
  84. package/lib/components/wisdom-chat/src/wisdom-chat.vue2.js.map +1 -0
  85. package/lib/index.js +12 -9
  86. package/lib/index.js.map +1 -1
  87. package/lib/installer.js +5 -2
  88. package/lib/installer.js.map +1 -1
  89. package/lib/utils/provide.d.ts +6 -2
  90. package/lib/utils/provide.js.map +1 -1
  91. package/package.json +3 -2
  92. package/theme-default/i-table.css +1 -1
  93. package/theme-default/i-text-button.css +1 -1
  94. package/theme-default/i-wisdom-chat.css +1 -0
  95. package/theme-default/index.css +1 -1
@@ -0,0 +1,6 @@
1
+ import _sfc_main from './wisdom-chat.vue2.mjs';
2
+
3
+
4
+
5
+ export { _sfc_main as default };
6
+ //# sourceMappingURL=wisdom-chat.vue.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wisdom-chat.vue.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,393 @@
1
+ import { defineComponent, ref, onMounted, computed, nextTick, resolveComponent, openBlock, createElementBlock, createVNode, unref, withCtx, createSlots, createBlock, resolveDynamicComponent, createElementVNode, createCommentVNode, createTextVNode, toDisplayString, Fragment, renderList } from 'vue';
2
+ import { Chat, ChatSender, ChatItem, ChatContent } from '@tdesign-vue-next/chat';
3
+ import { ElAvatar } from 'element-plus';
4
+ import INotify from '../../../utils/message.mjs';
5
+ import { WisdomChatProps, fetchSSE } from './wisdom-chat.mjs';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ const _hoisted_1 = { class: "wisdom-chat" };
10
+ const _hoisted_2 = { class: "wisdom-chat__content" };
11
+ const _hoisted_3 = { class: "chat-sender-inner-header" };
12
+ const _hoisted_4 = {
13
+ key: 0,
14
+ class: "chat-sender-image"
15
+ };
16
+ const _hoisted_5 = {
17
+ key: 1,
18
+ class: "chat-sender-file"
19
+ };
20
+ var _sfc_main = /* @__PURE__ */ defineComponent({
21
+ ...{
22
+ name: "IWisdomChat"
23
+ },
24
+ __name: "wisdom-chat",
25
+ props: WisdomChatProps,
26
+ setup(__props) {
27
+ var _a, _b;
28
+ const props = __props;
29
+ const chatRef = ref();
30
+ const chatList = ref([
31
+ {
32
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
33
+ content: `\u7531${((_a = props.robot) == null ? void 0 : _a.name) || "\u667A\u80FD\u52A9\u624B"}\u63D0\u4F9B\u6570\u636E\u652F\u6301`,
34
+ avatar: (_b = props.robot) == null ? void 0 : _b.avatar,
35
+ role: "model-change"
36
+ }
37
+ ]);
38
+ const isStreamLoad = ref(false);
39
+ const loading = ref(false);
40
+ const inputValue = ref("");
41
+ const selectValue = ref("");
42
+ const inputImage = ref("");
43
+ const inputFileName = ref("");
44
+ const fetchCancel = ref();
45
+ onMounted(() => {
46
+ if (props.models && props.models.length > 0) {
47
+ selectValue.value = props.models[0].value;
48
+ }
49
+ });
50
+ const modelISImage = computed(() => {
51
+ var _a2;
52
+ const model = (_a2 = props.models) == null ? void 0 : _a2.find((item) => item.value === selectValue.value);
53
+ return (model == null ? void 0 : model.type.indexOf("image")) !== -1;
54
+ });
55
+ const showClearHistory = computed(() => {
56
+ return props.showClearButton && chatList.value.length > 0 && !isStreamLoad.value;
57
+ });
58
+ const showModelSelect = computed(() => {
59
+ return props.showModelSelector && props.models && props.models.length > 0;
60
+ });
61
+ const handleClear = /* @__PURE__ */ __name(() => {
62
+ chatList.value = [];
63
+ }, "handleClear");
64
+ const handleSenderStop = /* @__PURE__ */ __name(() => {
65
+ if (fetchCancel.value) {
66
+ fetchCancel.value.abort();
67
+ loading.value = false;
68
+ isStreamLoad.value = false;
69
+ }
70
+ }, "handleSenderStop");
71
+ const handleSenderSend = /* @__PURE__ */ __name((value) => {
72
+ var _a2, _b2, _c, _d;
73
+ if (isStreamLoad.value || !value.trim()) return;
74
+ const userMessage = {
75
+ avatar: (_a2 = props.self) == null ? void 0 : _a2.avatar,
76
+ name: (_b2 = props.self) == null ? void 0 : _b2.name,
77
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
78
+ content: value,
79
+ image: inputImage.value,
80
+ role: "user"
81
+ };
82
+ chatList.value.unshift(userMessage);
83
+ const botMessage = {
84
+ avatar: (_c = props.robot) == null ? void 0 : _c.avatar,
85
+ name: (_d = props.robot) == null ? void 0 : _d.name,
86
+ datetime: (/* @__PURE__ */ new Date()).toLocaleString(),
87
+ content: "",
88
+ role: "assistant"
89
+ };
90
+ chatList.value.unshift(botMessage);
91
+ sendMsg();
92
+ inputValue.value = "";
93
+ inputImage.value = "";
94
+ inputFileName.value = "";
95
+ }, "handleSenderSend");
96
+ const handleSenderFileSelect = /* @__PURE__ */ __name((params) => {
97
+ const { files } = params;
98
+ if (files.length === 0) {
99
+ return INotify.error("\u8BF7\u9009\u62E9\u6587\u4EF6");
100
+ }
101
+ if (files.length > 1) {
102
+ return INotify.error("\u5355\u6B21\u53EA\u80FD\u4E0A\u4F201\u4E2A\u6587\u4EF6");
103
+ }
104
+ const file = files[0];
105
+ if (!isImage(file)) {
106
+ return INotify.error("\u53EA\u652F\u6301\u4E0A\u4F20\u56FE\u7247\u6587\u4EF6");
107
+ }
108
+ if (file.size > props.maxImageSize * 1024 * 1024) {
109
+ return INotify.error(`\u56FE\u7247\u5927\u5C0F\u4E0D\u80FD\u8D85\u8FC7${props.maxImageSize}MB`);
110
+ }
111
+ const reader = new FileReader();
112
+ reader.readAsDataURL(file);
113
+ reader.onload = (e) => {
114
+ var _a2;
115
+ if ((_a2 = e.target) == null ? void 0 : _a2.result) {
116
+ inputImage.value = e.target.result;
117
+ }
118
+ };
119
+ reader.onerror = () => {
120
+ INotify.error("\u56FE\u7247\u8BFB\u53D6\u5931\u8D25");
121
+ };
122
+ }, "handleSenderFileSelect");
123
+ const handleDelInputImage = /* @__PURE__ */ __name(() => {
124
+ inputImage.value = "";
125
+ }, "handleDelInputImage");
126
+ const handleDelInputFile = /* @__PURE__ */ __name(() => {
127
+ inputFileName.value = "";
128
+ }, "handleDelInputFile");
129
+ function isImage(file) {
130
+ return file.type.startsWith("image/");
131
+ }
132
+ __name(isImage, "isImage");
133
+ const chatSenderRef = ref();
134
+ function sendMsg() {
135
+ loading.value = true;
136
+ isStreamLoad.value = true;
137
+ const lastItem = chatList.value[0];
138
+ let imageBase64 = "";
139
+ if (inputImage.value) {
140
+ const parts = inputImage.value.split(",");
141
+ if (parts.length > 1) {
142
+ imageBase64 = parts[1];
143
+ }
144
+ }
145
+ const messages = [
146
+ {
147
+ role: "user",
148
+ content: inputValue.value,
149
+ images: imageBase64 ? [imageBase64] : []
150
+ }
151
+ ];
152
+ fetchSSE(
153
+ messages,
154
+ selectValue.value,
155
+ {
156
+ // 处理增量内容
157
+ success(event) {
158
+ if (event.type === "delta" && event.data) {
159
+ lastItem.content += event.data;
160
+ }
161
+ },
162
+ // 处理完成状态
163
+ complete(isOk, msg) {
164
+ if (!isOk || !lastItem.content) {
165
+ lastItem.role = "error";
166
+ lastItem.content = msg || "\u751F\u6210\u56DE\u590D\u5931\u8D25";
167
+ }
168
+ isStreamLoad.value = false;
169
+ loading.value = false;
170
+ nextTick(() => {
171
+ var _a2, _b2, _c;
172
+ (_a2 = chatRef.value) == null ? void 0 : _a2.scrollToBottom({ behavior: "smooth" });
173
+ const el = (_b2 = chatSenderRef.value) == null ? void 0 : _b2.$el;
174
+ (_c = el.querySelector("textarea")) == null ? void 0 : _c.focus();
175
+ });
176
+ },
177
+ // 处理失败
178
+ fail() {
179
+ isStreamLoad.value = false;
180
+ loading.value = false;
181
+ },
182
+ // 保存取消控制器
183
+ cancel(controller) {
184
+ fetchCancel.value = controller;
185
+ }
186
+ },
187
+ props.apiUrl
188
+ );
189
+ }
190
+ __name(sendMsg, "sendMsg");
191
+ return (_ctx, _cache) => {
192
+ const _component_el_image = resolveComponent("el-image");
193
+ const _component_el_option = resolveComponent("el-option");
194
+ const _component_el_select = resolveComponent("el-select");
195
+ const _component_el_tag = resolveComponent("el-tag");
196
+ return openBlock(), createElementBlock("div", _hoisted_1, [
197
+ createVNode(unref(Chat), {
198
+ ref_key: "chatRef",
199
+ ref: chatRef,
200
+ class: "wisdom-chat__tchat",
201
+ layout: "both",
202
+ "clear-history": showClearHistory.value,
203
+ onClear: handleClear
204
+ }, {
205
+ footer: withCtx(() => [
206
+ createVNode(unref(ChatSender), {
207
+ ref_key: "chatSenderRef",
208
+ ref: chatSenderRef,
209
+ modelValue: inputValue.value,
210
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => inputValue.value = $event),
211
+ loading: isStreamLoad.value,
212
+ "textarea-props": { placeholder: "\u8BF7\u8F93\u5165\u6D88\u606F..." },
213
+ onStop: handleSenderStop,
214
+ onSend: handleSenderSend,
215
+ onFileSelect: handleSenderFileSelect
216
+ }, createSlots({
217
+ suffix: withCtx(({ renderPresets }) => [
218
+ modelISImage.value ? (openBlock(), createBlock(resolveDynamicComponent(renderPresets([{ name: "uploadImage" }])), { key: 0 })) : (openBlock(), createBlock(resolveDynamicComponent(renderPresets([])), { key: 1 }))
219
+ ]),
220
+ "inner-header": withCtx(() => [
221
+ createElementVNode("div", _hoisted_3, [
222
+ createCommentVNode(" \u56FE\u7247\u9884\u89C8 "),
223
+ inputImage.value ? (openBlock(), createElementBlock("div", _hoisted_4, [
224
+ createVNode(_component_el_image, {
225
+ src: inputImage.value,
226
+ fit: "cover",
227
+ "preview-src-list": [inputImage.value]
228
+ }, null, 8, ["src", "preview-src-list"]),
229
+ createElementVNode("div", {
230
+ class: "chat-sender-image__del",
231
+ onClick: handleDelInputImage
232
+ }, _cache[3] || (_cache[3] = [
233
+ createElementVNode(
234
+ "i",
235
+ { class: "icon-shanchu iconfont" },
236
+ null,
237
+ -1
238
+ /* HOISTED */
239
+ )
240
+ ]))
241
+ ])) : createCommentVNode("v-if", true),
242
+ createCommentVNode(" \u6587\u4EF6\u6807\u7B7E "),
243
+ inputFileName.value ? (openBlock(), createElementBlock("div", _hoisted_5, [
244
+ createVNode(_component_el_tag, {
245
+ closable: "",
246
+ size: "default",
247
+ type: "info",
248
+ hit: "",
249
+ onClose: handleDelInputFile
250
+ }, {
251
+ default: withCtx(() => [
252
+ createTextVNode(
253
+ toDisplayString(inputFileName.value),
254
+ 1
255
+ /* TEXT */
256
+ )
257
+ ]),
258
+ _: 1
259
+ /* STABLE */
260
+ })
261
+ ])) : createCommentVNode("v-if", true)
262
+ ])
263
+ ]),
264
+ _: 2
265
+ /* DYNAMIC */
266
+ }, [
267
+ showModelSelect.value ? {
268
+ name: "prefix",
269
+ fn: withCtx(() => [
270
+ createVNode(_component_el_select, {
271
+ modelValue: selectValue.value,
272
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectValue.value = $event),
273
+ placement: "top",
274
+ style: { "width": "160px" }
275
+ }, {
276
+ default: withCtx(() => [
277
+ (openBlock(true), createElementBlock(
278
+ Fragment,
279
+ null,
280
+ renderList(props.models, (model) => {
281
+ return openBlock(), createBlock(_component_el_option, {
282
+ key: model.value,
283
+ label: model.label,
284
+ value: model.value,
285
+ title: model.description
286
+ }, null, 8, ["label", "value", "title"]);
287
+ }),
288
+ 128
289
+ /* KEYED_FRAGMENT */
290
+ ))
291
+ ]),
292
+ _: 1
293
+ /* STABLE */
294
+ }, 8, ["modelValue"])
295
+ ]),
296
+ key: "0"
297
+ } : void 0
298
+ ]), 1032, ["modelValue", "loading"])
299
+ ]),
300
+ default: withCtx(() => [
301
+ (openBlock(true), createElementBlock(
302
+ Fragment,
303
+ null,
304
+ renderList(chatList.value, (chat, index) => {
305
+ return openBlock(), createBlock(unref(ChatItem), {
306
+ key: index,
307
+ role: chat.role,
308
+ "text-loading": index === 0 && loading.value,
309
+ variant: "base"
310
+ }, createSlots({
311
+ avatar: withCtx(() => [
312
+ createVNode(unref(ElAvatar), {
313
+ size: "large",
314
+ shape: "circle",
315
+ src: chat.avatar
316
+ }, {
317
+ default: withCtx(() => _cache[2] || (_cache[2] = [
318
+ createElementVNode(
319
+ "i",
320
+ {
321
+ class: "iconfont icon-yonghu1",
322
+ style: { "font-size": "20px" }
323
+ },
324
+ null,
325
+ -1
326
+ /* HOISTED */
327
+ )
328
+ ])),
329
+ _: 2
330
+ /* DYNAMIC */
331
+ }, 1032, ["src"])
332
+ ]),
333
+ content: withCtx(() => [
334
+ createElementVNode("div", _hoisted_2, [
335
+ chat.content ? (openBlock(), createBlock(unref(ChatContent), {
336
+ key: 0,
337
+ content: chat.content,
338
+ variant: "base"
339
+ }, null, 8, ["content"])) : createCommentVNode("v-if", true),
340
+ chat.image ? (openBlock(), createBlock(_component_el_image, {
341
+ key: 1,
342
+ class: "chat-content-images",
343
+ src: chat.image,
344
+ fit: "cover",
345
+ "preview-src-list": [chat.image]
346
+ }, null, 8, ["src", "preview-src-list"])) : createCommentVNode("v-if", true)
347
+ ])
348
+ ]),
349
+ _: 2
350
+ /* DYNAMIC */
351
+ }, [
352
+ chat.name ? {
353
+ name: "name",
354
+ fn: withCtx(() => [
355
+ createElementVNode(
356
+ "div",
357
+ null,
358
+ toDisplayString(chat.name),
359
+ 1
360
+ /* TEXT */
361
+ )
362
+ ]),
363
+ key: "0"
364
+ } : void 0,
365
+ chat.datetime ? {
366
+ name: "datetime",
367
+ fn: withCtx(() => [
368
+ createElementVNode(
369
+ "div",
370
+ null,
371
+ toDisplayString(chat.datetime),
372
+ 1
373
+ /* TEXT */
374
+ )
375
+ ]),
376
+ key: "1"
377
+ } : void 0
378
+ ]), 1032, ["role", "text-loading"]);
379
+ }),
380
+ 128
381
+ /* KEYED_FRAGMENT */
382
+ ))
383
+ ]),
384
+ _: 1
385
+ /* STABLE */
386
+ }, 8, ["clear-history"])
387
+ ]);
388
+ };
389
+ }
390
+ });
391
+
392
+ export { _sfc_main as default };
393
+ //# sourceMappingURL=wisdom-chat.vue2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wisdom-chat.vue2.mjs","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":["_a","_b"],"mappings":"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"}
package/es/index.mjs CHANGED
@@ -4,8 +4,8 @@ import './components/index.mjs';
4
4
  import './hooks/index.mjs';
5
5
  import './utils/index.mjs';
6
6
  export { ICheckbox } from './components/checkbox/index.mjs';
7
- export { IDescriptionItem, IDescriptions } from './components/descriptions/index.mjs';
8
7
  export { IDatePicker } from './components/date-picker/index.mjs';
8
+ export { IDescriptionItem, IDescriptions } from './components/descriptions/index.mjs';
9
9
  export { IDialog } from './components/dialog/index.mjs';
10
10
  export { IDivider } from './components/divider/index.mjs';
11
11
  export { IDrawer } from './components/drawer/index.mjs';
@@ -27,7 +27,8 @@ export { TableProps } from './components/table/src/table.mjs';
27
27
  export { ITable } from './components/table/index.mjs';
28
28
  export { TenantEnterpriseEmits, TenantEnterpriseProps } from './components/tenant-enterprise/src/tenant-enterprise.mjs';
29
29
  export { ITenantEnterprise } from './components/tenant-enterprise/index.mjs';
30
- export { ITextButton } from './components/text-button/index.mjs';
30
+ export { ITextButton, ITextButtonGroup } from './components/text-button/index.mjs';
31
+ export { IWisdomChat } from './components/wisdom-chat/index.mjs';
31
32
  export { useBaseTable } from './hooks/useBaseTable/index.mjs';
32
33
  export { useECharts } from './hooks/useECharts/index.mjs';
33
34
  export { withInstall, withInstallDirectives } from './utils/install.mjs';
package/es/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/es/installer.mjs CHANGED
@@ -7,7 +7,7 @@ import { IDivider } from './components/divider/index.mjs';
7
7
  import { IDrawer } from './components/drawer/index.mjs';
8
8
  import { IIconSelect } from './components/icon-select/index.mjs';
9
9
  import { IImageVerification } from './components/image-verification/index.mjs';
10
- import { ITextButton } from './components/text-button/index.mjs';
10
+ import { ITextButton, ITextButtonGroup } from './components/text-button/index.mjs';
11
11
  import { IPageHeader } from './components/page-header/index.mjs';
12
12
  import { ISearch } from './components/search/index.mjs';
13
13
  import { ITable } from './components/table/index.mjs';
@@ -20,6 +20,7 @@ import { IDialog } from './components/dialog/index.mjs';
20
20
  import { ILink } from './components/link/index.mjs';
21
21
  import { IFlvPlayer } from './components/flv-player/index.mjs';
22
22
  import { IDatePicker } from './components/date-picker/index.mjs';
23
+ import { IWisdomChat } from './components/wisdom-chat/index.mjs';
23
24
 
24
25
  var __defProp = Object.defineProperty;
25
26
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
@@ -33,6 +34,7 @@ const component = [
33
34
  IIconSelect,
34
35
  IImageVerification,
35
36
  ITextButton,
37
+ ITextButtonGroup,
36
38
  IPageHeader,
37
39
  ISearch,
38
40
  ITable,
@@ -45,10 +47,11 @@ const component = [
45
47
  IDialog,
46
48
  ILink,
47
49
  IFlvPlayer,
48
- IDatePicker
50
+ IDatePicker,
51
+ IWisdomChat
49
52
  ];
50
53
  const install = /* @__PURE__ */ __name(function(app, _options) {
51
- component.forEach((i) => app.use(i));
54
+ component.forEach((i) => app.use(i, _options));
52
55
  }, "install");
53
56
  var installer = {
54
57
  install
@@ -1 +1 @@
1
- {"version":3,"file":"installer.mjs","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} from './components';\n\nconst component = [\n IForm,\n ISelect,\n IRadio,\n ICheckbox,\n IDivider,\n IDrawer,\n IIconSelect,\n IImageVerification,\n ITextButton,\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));\n};\n\nexport default {\n install,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEa,MAAA,OAAA,mBAAoB,MAAA,CAAA,SAAA,GAAA,EAAU,QAAgB,EAAA;AACzD,EAAA,SAAA,CAAU,OAAQ,CAAA,CAAA,CAAA,KAAK,GAAI,CAAA,GAAA,CAAI,CAAC,CAAC,CAAA;AACnC,CAFuB,EAAA,SAAA;AAIvB,gBAAe;AAAA,EACb;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"installer.mjs","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":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,SAAY,GAAA;AAAA,EAChB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;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;;;;"}
@@ -46,8 +46,12 @@ export declare const USER_INFO: InjectionKey<{
46
46
  export declare const SITE_UNIT_STORE: InjectionKey<{
47
47
  tenantList: any[];
48
48
  tenantEnterprise: any[];
49
- currentTenantId: string;
50
- getCurrentTenantId: string;
49
+ currentTenantId: number;
50
+ currentEnterpriseId: number;
51
+ getCurrentTenantId: number;
52
+ getCurrentEnterpriseId: number | number[];
53
+ SET_CURRENT_TENANT_ID: (id: number) => void;
54
+ SET_CURRENT_ENTERPRISE_ID: (id: number | number[]) => void;
51
55
  getEnterprise: (isSet?: boolean, tenantId?: number | string) => Promise<any[]>;
52
56
  getTenantList: () => Promise<any[]>;
53
57
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"provide.mjs","sources":["../../../../../packages/utils/provide.ts"],"sourcesContent":["import type { AxiosRequestConfig, Method } from 'axios';\nimport type { InjectionKey, Ref } from 'vue';\n\n/**\n * 全局字典注入\n */\nexport const DICT_STORE = Symbol('dictStore') as InjectionKey<{\n dict: Ref<Record<string, any>>;\n getDict: (dictType: string) => Promise<any[]>;\n}>;\n\nexport interface IMenuStore {\n // 当前激活菜单\n // todo any => class.Menu\n currentMenu: Ref<any>;\n getCurrentMenu: () => any;\n // 包含全部菜单信息的tree\n menuTreeAll: Ref<any[]>;\n // 包含全部菜单信息的list\n menuListAll: Ref<any[]>;\n}\n\n/**\n * 菜单store\n * - 当前激活菜单: currentMenu\n * - 全部菜单tree:menuTreeAll\n * - 全部菜单list:menuListAll\n */\nexport const MENU_STORE = Symbol('MENU_STORE') as InjectionKey<IMenuStore>;\n\n/**\n * http请求方法注入\n */\nexport const HTTP_REQ = Symbol('HTTP_REQ') as InjectionKey<{\n request: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n productionReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n systemReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n aiReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n busReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n}>;\n\n/**\n * userInfo 注入\n */\nexport const USER_INFO = Symbol('USER_INFO') as InjectionKey<{\n username: string;\n roles: any[];\n verifyCode: string;\n currentPage: number;\n isRemembered: boolean;\n loginDay: number;\n userInfo: {\n roleId?: number;\n nickName?: string;\n phoneNumber?: string;\n userName?: string;\n userType?: string;\n roleName?: string;\n enterpriseName?: string;\n tenantId?: number;\n tenantEnterpriseId?: number;\n tenantEnterpriseDeptId?: number;\n userId?: number;\n id?: string;\n soldierUserId?: string;\n avatar?: string;\n roles?: any;\n };\n}>;\n\n/**\n * 站点单位store 注入\n */\nexport const SITE_UNIT_STORE = Symbol('SITE_UNIT_STORE') as InjectionKey<{\n tenantList: any[];\n tenantEnterprise: any[];\n currentTenantId: string;\n getCurrentTenantId: string;\n getEnterprise: (isSet?: boolean, tenantId?: number | string) => Promise<any[]>;\n getTenantList: () => Promise<any[]>;\n}>;\n\n/**\n * 注入系统配置serverConfig.json\n */\nexport const SERVER_CONFIG = Symbol('SERVER_CONFIG') as InjectionKey<Record<string, any>>;\n\n/**\n * 注入主题\n */\nexport const THEME_STORE = Symbol('SYSTEM_THEME') as InjectionKey<Ref<string>>;\n"],"names":[],"mappings":"AAMa,MAAA,UAAA,GAAa,OAAO,WAAW;AAsB/B,MAAA,UAAA,GAAa,OAAO,YAAY;AAKhC,MAAA,QAAA,GAAW,OAAO,UAAU;AAW5B,MAAA,SAAA,GAAY,OAAO,WAAW;AA6B9B,MAAA,eAAA,GAAkB,OAAO,iBAAiB;AAY1C,MAAA,aAAA,GAAgB,OAAO,eAAe;AAKtC,MAAA,WAAA,GAAc,OAAO,cAAc;;;;"}
1
+ {"version":3,"file":"provide.mjs","sources":["../../../../../packages/utils/provide.ts"],"sourcesContent":["import type { AxiosRequestConfig, Method } from 'axios';\nimport type { InjectionKey, Ref } from 'vue';\n\n/**\n * 全局字典注入\n */\nexport const DICT_STORE = Symbol('dictStore') as InjectionKey<{\n dict: Ref<Record<string, any>>;\n getDict: (dictType: string) => Promise<any[]>;\n}>;\n\nexport interface IMenuStore {\n // 当前激活菜单\n // todo any => class.Menu\n currentMenu: Ref<any>;\n getCurrentMenu: () => any;\n // 包含全部菜单信息的tree\n menuTreeAll: Ref<any[]>;\n // 包含全部菜单信息的list\n menuListAll: Ref<any[]>;\n}\n\n/**\n * 菜单store\n * - 当前激活菜单: currentMenu\n * - 全部菜单tree:menuTreeAll\n * - 全部菜单list:menuListAll\n */\nexport const MENU_STORE = Symbol('MENU_STORE') as InjectionKey<IMenuStore>;\n\n/**\n * http请求方法注入\n */\nexport const HTTP_REQ = Symbol('HTTP_REQ') as InjectionKey<{\n request: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n productionReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n systemReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n aiReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n busReq: <T>(method: Method, url: string, param?: AxiosRequestConfig) => Promise<T>;\n}>;\n\n/**\n * userInfo 注入\n */\nexport const USER_INFO = Symbol('USER_INFO') as InjectionKey<{\n username: string;\n roles: any[];\n verifyCode: string;\n currentPage: number;\n isRemembered: boolean;\n loginDay: number;\n userInfo: {\n roleId?: number;\n nickName?: string;\n phoneNumber?: string;\n userName?: string;\n userType?: string;\n roleName?: string;\n enterpriseName?: string;\n tenantId?: number;\n tenantEnterpriseId?: number;\n tenantEnterpriseDeptId?: number;\n userId?: number;\n id?: string;\n soldierUserId?: string;\n avatar?: string;\n roles?: any;\n };\n}>;\n\n/**\n * 站点单位store 注入\n */\nexport const SITE_UNIT_STORE = Symbol('SITE_UNIT_STORE') as InjectionKey<{\n tenantList: any[];\n tenantEnterprise: any[];\n currentTenantId: number;\n currentEnterpriseId: number;\n getCurrentTenantId: number;\n getCurrentEnterpriseId: number | number[];\n SET_CURRENT_TENANT_ID: (id: number) => void;\n SET_CURRENT_ENTERPRISE_ID: (id: number | number[]) => void;\n getEnterprise: (isSet?: boolean, tenantId?: number | string) => Promise<any[]>;\n getTenantList: () => Promise<any[]>;\n}>;\n\n/**\n * 注入系统配置serverConfig.json\n */\nexport const SERVER_CONFIG = Symbol('SERVER_CONFIG') as InjectionKey<Record<string, any>>;\n\n/**\n * 注入主题\n */\nexport const THEME_STORE = Symbol('SYSTEM_THEME') as InjectionKey<Ref<string>>;\n"],"names":[],"mappings":"AAMa,MAAA,UAAA,GAAa,OAAO,WAAW;AAsB/B,MAAA,UAAA,GAAa,OAAO,YAAY;AAKhC,MAAA,QAAA,GAAW,OAAO,UAAU;AAW5B,MAAA,SAAA,GAAY,OAAO,WAAW;AA6B9B,MAAA,eAAA,GAAkB,OAAO,iBAAiB;AAgB1C,MAAA,aAAA,GAAgB,OAAO,eAAe;AAKtC,MAAA,WAAA,GAAc,OAAO,cAAc;;;;"}
package/global.d.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  declare module 'vue' {
4
4
  export interface GlobalComponents {
5
5
  ICheckbox: typeof import('@tzj/common-ui')['ICheckbox'];
6
+ IConciseLogger: typeof import('@tzj/common-ui')['IConciseLogger'];
6
7
  IDatePicker: typeof import('@tzj/common-ui')['IDatePicker'];
7
8
  IDescriptions: typeof import('@tzj/common-ui')['IDescriptions'];
8
9
  IDialog: typeof import('@tzj/common-ui')['IDialog'];
@@ -23,6 +24,7 @@ declare module 'vue' {
23
24
  ITable: typeof import('@tzj/common-ui')['ITable'];
24
25
  ITenantEnterprise: typeof import('@tzj/common-ui')['ITenantEnterprise'];
25
26
  ITextButton: typeof import('@tzj/common-ui')['ITextButton'];
27
+ IWisdomChat: typeof import('@tzj/common-ui')['IWisdomChat'];
26
28
  }
27
29
  }
28
30
 
@@ -0,0 +1,2 @@
1
+ export declare const IConciseLogger: import("../../types").SFCWithInstall<import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>>;
2
+ export default IConciseLogger;
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('../../utils/index.js');
6
+ require('./src/concise-logger.vue.js');
7
+ var install = require('../../utils/install.js');
8
+ var conciseLogger_vue_vue_type_script_setup_true_lang = require('./src/concise-logger.vue2.js');
9
+
10
+ const IConciseLogger = install.withInstall(conciseLogger_vue_vue_type_script_setup_true_lang.default);
11
+
12
+ exports.IConciseLogger = IConciseLogger;
13
+ exports.default = IConciseLogger;
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../../packages/components/concise-logger/index.ts"],"sourcesContent":["import { withInstall } from '../../utils';\nimport ConciseLogger from './src/concise-logger.vue';\n\nexport const IConciseLogger = withInstall(ConciseLogger); // 增加类型\n\nexport default IConciseLogger;\n"],"names":["withInstall","ConciseLogger"],"mappings":";;;;;;;;;AAGa,MAAA,cAAA,GAAiBA,oBAAYC,yDAAa;;;;;"}
@@ -0,0 +1,5 @@
1
+ import type { ExtractPropTypes } from 'vue';
2
+ import type ConciseLogger from './concise-logger.vue';
3
+ export declare const ConciseLoggerProps: {};
4
+ export type ConciseLoggerPropsType = ExtractPropTypes<typeof ConciseLoggerProps>;
5
+ export type ConciseLoggerInstance = InstanceType<typeof ConciseLogger>;
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const ConciseLoggerProps = {};
4
+
5
+ exports.ConciseLoggerProps = ConciseLoggerProps;
6
+ //# sourceMappingURL=concise-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concise-logger.js","sources":["../../../../../../../packages/components/concise-logger/src/concise-logger.ts"],"sourcesContent":["import type { ExtractPropTypes } from 'vue';\nimport type ConciseLogger from './concise-logger.vue';\n\nexport const ConciseLoggerProps = {};\n\nexport type ConciseLoggerPropsType = ExtractPropTypes<typeof ConciseLoggerProps>;\nexport type ConciseLoggerInstance = InstanceType<typeof ConciseLogger>;\n"],"names":[],"mappings":";;AAGO,MAAM,qBAAqB;;;;"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var conciseLogger_vue_vue_type_script_setup_true_lang = require('./concise-logger.vue2.js');
6
+
7
+
8
+
9
+ exports.default = conciseLogger_vue_vue_type_script_setup_true_lang.default;
10
+ //# sourceMappingURL=concise-logger.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concise-logger.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}