ai-chat-bot-interface 1.4.5 → 1.4.7
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.
- package/package.json +1 -1
- package/src/App.vue +1 -1
- package/src/ChatUi.vue +123 -92
- package/src/components/OperateModule.vue +1 -1
- package/src/components/StoreList/StoreCard.vue +72 -0
- package/src/components/StoreList/StoreList.vue +27 -0
- package/src/components/StoreList/mock.js +411 -0
- package/src/utils/imagesViewer.js +8 -0
package/package.json
CHANGED
package/src/App.vue
CHANGED
package/src/ChatUi.vue
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<div v-if="showHeader" class="cui_header">
|
|
5
5
|
<div class="title" @click.stop="queryHistoryList">
|
|
6
6
|
<div class="back" @click.stop="handleBack">
|
|
7
|
-
<back-icon
|
|
7
|
+
<back-icon/>
|
|
8
8
|
</div>
|
|
9
9
|
<div class="name_box">
|
|
10
10
|
<div class="name">{{ name }}</div>
|
|
@@ -18,26 +18,26 @@
|
|
|
18
18
|
</button>
|
|
19
19
|
<template v-show="false">
|
|
20
20
|
<button class="btn">
|
|
21
|
-
<clear-icon
|
|
21
|
+
<clear-icon/>
|
|
22
22
|
</button>
|
|
23
23
|
<button class="btn">
|
|
24
|
-
<close-icon
|
|
24
|
+
<close-icon/>
|
|
25
25
|
</button>
|
|
26
26
|
</template>
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
29
|
<div class="cui_content">
|
|
30
30
|
<div
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
v-if="botInfo && botInfo.onboarding_info"
|
|
32
|
+
style="text-align: left; margin-top: 50px"
|
|
33
33
|
>
|
|
34
34
|
<div style="text-align: center">
|
|
35
35
|
<img
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
:src="botInfo.icon_url"
|
|
37
|
+
alt="icon"
|
|
38
|
+
width="64"
|
|
39
|
+
height="64"
|
|
40
|
+
style="border-radius: 15px"
|
|
41
41
|
/>
|
|
42
42
|
<p class="board_name">{{ botInfo.name }}</p>
|
|
43
43
|
</div>
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
<div class="board_desc">{{ botInfo.onboarding_info.prologue }}</div>
|
|
46
46
|
<div class="flexcss">
|
|
47
47
|
<span
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
v-for="(item, idx) in botInfo.onboarding_info.suggested_questions"
|
|
49
|
+
:key="idx"
|
|
50
|
+
class="board_sug"
|
|
51
|
+
@click.stop="chatConv([{ content: item, text: item }])"
|
|
52
|
+
>{{ item }}</span
|
|
53
53
|
>
|
|
54
54
|
</div>
|
|
55
55
|
</div>
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
<div v-if="conv.role === 'assistant'" class="replay role_sys">
|
|
58
58
|
<div class="replay_content">
|
|
59
59
|
<div class="name">
|
|
60
|
-
<img class="avatar" :src="logo" alt="avatar"
|
|
60
|
+
<img class="avatar" :src="logo" alt="avatar"/>
|
|
61
61
|
{{ name }}
|
|
62
62
|
<!--<span class="time">12:30</span>-->
|
|
63
63
|
</div>
|
|
@@ -98,6 +98,11 @@
|
|
|
98
98
|
:def-msg="finalDefMsg"
|
|
99
99
|
@select="handleCardTap({ type: 'match' }, comp)"
|
|
100
100
|
/>
|
|
101
|
+
<store-list
|
|
102
|
+
v-if="comp.showType === 'store'"
|
|
103
|
+
:list="comp.storeList"
|
|
104
|
+
@select="handleStoreSel"
|
|
105
|
+
/>
|
|
101
106
|
</template>
|
|
102
107
|
</div>
|
|
103
108
|
<div v-else-if="handleTextNeedBtn(conv.content)">
|
|
@@ -110,7 +115,7 @@
|
|
|
110
115
|
</div>
|
|
111
116
|
</template>
|
|
112
117
|
</template>
|
|
113
|
-
<loading-icon2 v-else
|
|
118
|
+
<loading-icon2 v-else/>
|
|
114
119
|
</div>
|
|
115
120
|
</div>
|
|
116
121
|
</div>
|
|
@@ -119,18 +124,18 @@
|
|
|
119
124
|
<div class="name">
|
|
120
125
|
User_{{ uid }}
|
|
121
126
|
<!--<span class="time">12:30</span>-->
|
|
122
|
-
<img class="avatar" :src="avatar" alt="avatar"
|
|
127
|
+
<img class="avatar" :src="avatar" alt="avatar"/>
|
|
123
128
|
</div>
|
|
124
129
|
<div class="box">
|
|
125
130
|
<p class="text" v-html="conv.content"></p>
|
|
126
131
|
<div v-if="conv.extra.length">
|
|
127
|
-
<imge-list :list="conv.extra"
|
|
132
|
+
<imge-list :list="conv.extra"/>
|
|
128
133
|
</div>
|
|
129
134
|
</div>
|
|
130
135
|
</div>
|
|
131
136
|
</div>
|
|
132
137
|
</template>
|
|
133
|
-
<div ref="endTarget" style="height: 100px"
|
|
138
|
+
<div ref="endTarget" style="height: 100px"/>
|
|
134
139
|
</div>
|
|
135
140
|
<operate-module
|
|
136
141
|
v-model="inputText"
|
|
@@ -147,12 +152,12 @@
|
|
|
147
152
|
</template>
|
|
148
153
|
|
|
149
154
|
<script setup>
|
|
150
|
-
import {
|
|
155
|
+
import {computed, nextTick, onMounted, ref} from 'vue';
|
|
151
156
|
import ClearIcon from './components/icons/ClearIcon.vue';
|
|
152
157
|
import CloseIcon from './components/icons/CloseIcon.vue';
|
|
153
158
|
import NewSessionIcon from './components/icons/NewSessionIcon.vue';
|
|
154
159
|
import SendIcon from './components/icons/SendIcon.vue';
|
|
155
|
-
import {
|
|
160
|
+
import {get, post} from './utils/request';
|
|
156
161
|
import DishesCard from './components/DishesCard.vue';
|
|
157
162
|
import DishesList from './components/DishesList.vue';
|
|
158
163
|
import PlanCard from './components/PlanCard.vue';
|
|
@@ -165,6 +170,7 @@ import ImgeList from './components/imgeList.vue';
|
|
|
165
170
|
import ThinkingIcon from './components/icons/ThinkingIcon.vue';
|
|
166
171
|
import OkIcon from './components/icons/OkIcon.vue';
|
|
167
172
|
import AssistantReplay from './components/assistantReplay/assistantReplay.vue';
|
|
173
|
+
import StoreList from './components/StoreList/StoreList.vue';
|
|
168
174
|
|
|
169
175
|
const chatOptions = computed(() => {
|
|
170
176
|
return {
|
|
@@ -208,6 +214,10 @@ const props = defineProps({
|
|
|
208
214
|
required: true,
|
|
209
215
|
default: 'user',
|
|
210
216
|
},
|
|
217
|
+
channel: {
|
|
218
|
+
type: String,
|
|
219
|
+
default: 'web',
|
|
220
|
+
},
|
|
211
221
|
token: {
|
|
212
222
|
type: String,
|
|
213
223
|
required: true,
|
|
@@ -219,15 +229,19 @@ const props = defineProps({
|
|
|
219
229
|
tagList: {
|
|
220
230
|
type: Array,
|
|
221
231
|
default: () => [
|
|
222
|
-
{
|
|
223
|
-
{
|
|
224
|
-
{
|
|
232
|
+
{name: '人工客服', value: 'kefu', type: 'chat', msg: '人工客服'},
|
|
233
|
+
{name: '查看菜单', value: 'menu', type: 'call', msg: '查看菜单'},
|
|
234
|
+
{name: '体检报告', value: 'exam', type: 'upload', msg: '体检报告'},
|
|
225
235
|
],
|
|
226
236
|
},
|
|
227
237
|
defMsg: {
|
|
228
238
|
type: Object,
|
|
229
239
|
default: () => ({}),
|
|
230
240
|
},
|
|
241
|
+
storage: {
|
|
242
|
+
type: String,
|
|
243
|
+
default: 'sessionStorage'
|
|
244
|
+
}
|
|
231
245
|
});
|
|
232
246
|
|
|
233
247
|
const Emits = defineEmits(['call']);
|
|
@@ -243,9 +257,23 @@ const endTarget = ref(null);
|
|
|
243
257
|
const inputText = ref('');
|
|
244
258
|
const botInfo = ref({});
|
|
245
259
|
|
|
260
|
+
const storage = {
|
|
261
|
+
setItem: (key, value) => {
|
|
262
|
+
props.storage === 'sessionStorage'
|
|
263
|
+
? sessionStorage.setItem(key, value)
|
|
264
|
+
: localStorage.setItem(key, value);
|
|
265
|
+
},
|
|
266
|
+
getItem: (key) => {
|
|
267
|
+
return props.storage === 'sessionStorage'
|
|
268
|
+
? sessionStorage.getItem(key)
|
|
269
|
+
: localStorage.getItem(key);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
|
|
246
274
|
onMounted(async () => {
|
|
247
|
-
if (
|
|
248
|
-
conversationId.value =
|
|
275
|
+
if (storage.getItem('conversationId')) {
|
|
276
|
+
conversationId.value = storage.getItem('conversationId');
|
|
249
277
|
await queryBotInfo();
|
|
250
278
|
await queryHistoryList();
|
|
251
279
|
} else {
|
|
@@ -256,14 +284,14 @@ onMounted(async () => {
|
|
|
256
284
|
|
|
257
285
|
const createConv = async () => {
|
|
258
286
|
const res = await post(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
287
|
+
'https://api.coze.cn/v1/conversation/create',
|
|
288
|
+
{bot_id: props.botId, connector_id: '999'},
|
|
289
|
+
{...chatOptions.value},
|
|
262
290
|
);
|
|
263
291
|
console.log(res);
|
|
264
292
|
if (res.code === 0 && res.data) {
|
|
265
293
|
conversationId.value = res.data.id || '';
|
|
266
|
-
|
|
294
|
+
storage.setItem('conversationId', conversationId.value);
|
|
267
295
|
historyList.value = [];
|
|
268
296
|
await queryBotInfo();
|
|
269
297
|
// await messageCreate();
|
|
@@ -333,10 +361,10 @@ const chatConv = async (data) => {
|
|
|
333
361
|
// botId = '7474884145253023795';
|
|
334
362
|
additional_messages.push({
|
|
335
363
|
content: JSON.stringify(
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
364
|
+
item.content.map((con) => ({
|
|
365
|
+
type: con.type,
|
|
366
|
+
file_id: con.file_id,
|
|
367
|
+
})),
|
|
340
368
|
),
|
|
341
369
|
content_type: 'object_string',
|
|
342
370
|
role: 'user',
|
|
@@ -364,19 +392,19 @@ const chatConv = async (data) => {
|
|
|
364
392
|
|
|
365
393
|
historyList.value.push(uObj);
|
|
366
394
|
const res = await fetch(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
395
|
+
`https://api.coze.cn/v3/chat?conversation_id=${conversationId.value}`,
|
|
396
|
+
{
|
|
397
|
+
method: 'POST',
|
|
398
|
+
headers: {
|
|
399
|
+
...chatOptions.value.headers,
|
|
400
|
+
// 'Content-Type': 'text/event-stream',
|
|
401
|
+
},
|
|
402
|
+
body: JSON.stringify({
|
|
403
|
+
bot_id: botId,
|
|
404
|
+
user_id: props.uid,
|
|
405
|
+
stream: true,
|
|
406
|
+
connector_id: '999',
|
|
407
|
+
additional_messages /*[
|
|
380
408
|
{
|
|
381
409
|
content: '[{"type":"image","file_id":"7475569020654436390"}]',
|
|
382
410
|
content_type: 'object_string',
|
|
@@ -388,14 +416,14 @@ const chatConv = async (data) => {
|
|
|
388
416
|
content: isInCode ? data.code : inText, // '配餐1600kcal,身高173,体重60kg,生成一天的套餐',
|
|
389
417
|
},
|
|
390
418
|
]*/,
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
419
|
+
custom_variables: {
|
|
420
|
+
uid: props.uid,
|
|
421
|
+
},
|
|
422
|
+
}),
|
|
423
|
+
credentials: 'same-origin', // 默认同源策略
|
|
424
|
+
mode: 'cors', // 默认跨域模式
|
|
425
|
+
cache: 'default', // 默认缓存策略
|
|
426
|
+
},
|
|
399
427
|
);
|
|
400
428
|
historyList.value.push({
|
|
401
429
|
conversation_id: '',
|
|
@@ -414,7 +442,7 @@ const chatConv = async (data) => {
|
|
|
414
442
|
let buffer = '';
|
|
415
443
|
// 逐块读取数据
|
|
416
444
|
while (true) {
|
|
417
|
-
const {
|
|
445
|
+
const {done, value} = await reader.read();
|
|
418
446
|
if (done) {
|
|
419
447
|
console.log('Stream has ended.');
|
|
420
448
|
isAnswering.value = false;
|
|
@@ -424,7 +452,7 @@ const chatConv = async (data) => {
|
|
|
424
452
|
}
|
|
425
453
|
|
|
426
454
|
// 解码数据块
|
|
427
|
-
const chunk = decoder.decode(value, {
|
|
455
|
+
const chunk = decoder.decode(value, {stream: true});
|
|
428
456
|
buffer += chunk;
|
|
429
457
|
|
|
430
458
|
// 处理数据块
|
|
@@ -461,20 +489,20 @@ const chatConv = async (data) => {
|
|
|
461
489
|
) {
|
|
462
490
|
historyList.value[idx].status = 'answering';
|
|
463
491
|
historyList.value[idx].content = handleText(
|
|
464
|
-
|
|
492
|
+
historyList.value[idx].content + strObj.content,
|
|
465
493
|
);
|
|
466
494
|
scrollToEnd();
|
|
467
495
|
} else if (
|
|
468
|
-
|
|
469
|
-
|
|
496
|
+
strObj.hasOwnProperty('type') &&
|
|
497
|
+
strObj.type === 'tool_response'
|
|
470
498
|
) {
|
|
471
499
|
const extraObj = JSON.parse(strObj.content);
|
|
472
500
|
if (extraObj.hasOwnProperty('showType')) {
|
|
473
|
-
historyList.value[idx].extra.push({
|
|
501
|
+
historyList.value[idx].extra.push({...extraObj});
|
|
474
502
|
} else if (extraObj.hasOwnProperty('response_for_model')) {
|
|
475
503
|
const modelObj = JSON.parse(extraObj.response_for_model);
|
|
476
504
|
if (modelObj.hasOwnProperty('showType')) {
|
|
477
|
-
historyList.value[idx].extra.push({
|
|
505
|
+
historyList.value[idx].extra.push({...modelObj});
|
|
478
506
|
}
|
|
479
507
|
}
|
|
480
508
|
scrollToEnd();
|
|
@@ -487,9 +515,9 @@ const chatConv = async (data) => {
|
|
|
487
515
|
|
|
488
516
|
const queryHistoryList = async () => {
|
|
489
517
|
const res = await post(
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
518
|
+
`https://api.coze.cn/v1/conversation/message/list?conversation_id=${conversationId.value}`,
|
|
519
|
+
{order: 'asc'},
|
|
520
|
+
{...chatOptions.value},
|
|
493
521
|
);
|
|
494
522
|
if (res.code === 0 && res.data && res.data.length) {
|
|
495
523
|
historyList.value = [];
|
|
@@ -518,7 +546,7 @@ const queryHistoryList = async () => {
|
|
|
518
546
|
conversation_id: row.conversation_id,
|
|
519
547
|
bot_id: row.bot_id,
|
|
520
548
|
role: row.role,
|
|
521
|
-
extra: [{
|
|
549
|
+
extra: [{...cardObj}],
|
|
522
550
|
});
|
|
523
551
|
} else if (cardObj.hasOwnProperty('response_for_model')) {
|
|
524
552
|
const modelObj = JSON.parse(cardObj.response_for_model);
|
|
@@ -528,7 +556,7 @@ const queryHistoryList = async () => {
|
|
|
528
556
|
conversation_id: row.conversation_id,
|
|
529
557
|
bot_id: row.bot_id,
|
|
530
558
|
role: row.role,
|
|
531
|
-
extra: [{
|
|
559
|
+
extra: [{...modelObj}],
|
|
532
560
|
});
|
|
533
561
|
}
|
|
534
562
|
}
|
|
@@ -536,8 +564,8 @@ const queryHistoryList = async () => {
|
|
|
536
564
|
console.log('== 解析错误 sys==');
|
|
537
565
|
}
|
|
538
566
|
} else if (
|
|
539
|
-
|
|
540
|
-
|
|
567
|
+
row.content_type === 'object_string' &&
|
|
568
|
+
row.role === 'user'
|
|
541
569
|
) {
|
|
542
570
|
try {
|
|
543
571
|
const strObj = JSON.parse(row.content);
|
|
@@ -547,7 +575,7 @@ const queryHistoryList = async () => {
|
|
|
547
575
|
bot_id: row.bot_id,
|
|
548
576
|
role: row.role,
|
|
549
577
|
meta_data: row.meta_data,
|
|
550
|
-
extra: strObj.map((item) => ({
|
|
578
|
+
extra: strObj.map((item) => ({...item, showType: item.type})),
|
|
551
579
|
});
|
|
552
580
|
} catch (e) {
|
|
553
581
|
console.log('== 解析错误 user==');
|
|
@@ -557,15 +585,15 @@ const queryHistoryList = async () => {
|
|
|
557
585
|
});
|
|
558
586
|
cardList.forEach((card) => {
|
|
559
587
|
const idx =
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
588
|
+
card.role === 'user'
|
|
589
|
+
? historyList.value.findIndex(
|
|
590
|
+
(c) =>
|
|
591
|
+
c.meta_data.chat_group === card.meta_data.chat_group &&
|
|
592
|
+
c.role === card.role,
|
|
593
|
+
)
|
|
594
|
+
: historyList.value.findIndex(
|
|
595
|
+
(c) => c.chat_id === card.chat_id && c.role === card.role,
|
|
596
|
+
);
|
|
569
597
|
if (idx > -1) {
|
|
570
598
|
historyList.value[idx].extra = [...card.extra];
|
|
571
599
|
}
|
|
@@ -577,12 +605,12 @@ const queryHistoryList = async () => {
|
|
|
577
605
|
|
|
578
606
|
const queryBotInfo = async () => {
|
|
579
607
|
const res = await get(
|
|
580
|
-
|
|
581
|
-
|
|
608
|
+
`https://api.coze.cn/v1/bot/get_online_info?bot_id=${props.botId}`,
|
|
609
|
+
{...chatOptions.value},
|
|
582
610
|
);
|
|
583
611
|
console.log(res);
|
|
584
612
|
if (res.code === 0 && res.data) {
|
|
585
|
-
botInfo.value = {
|
|
613
|
+
botInfo.value = {...res.data};
|
|
586
614
|
}
|
|
587
615
|
};
|
|
588
616
|
|
|
@@ -597,24 +625,27 @@ const handleText = (str) => {
|
|
|
597
625
|
// );
|
|
598
626
|
};
|
|
599
627
|
const handleBack = () => {
|
|
600
|
-
Emits('call', {
|
|
628
|
+
Emits('call', {type: 'back'});
|
|
629
|
+
};
|
|
630
|
+
const handleStoreSel = (info) => {
|
|
631
|
+
chatConv([{ content: info.content, text: info.text }]);
|
|
601
632
|
};
|
|
602
|
-
|
|
603
633
|
const handleTagSel = (info) => {
|
|
634
|
+
console.log(info);
|
|
604
635
|
switch (info.type) {
|
|
605
636
|
case 'chat':
|
|
606
|
-
chatConv([{
|
|
637
|
+
chatConv([{content: info.msg, text: info.msg}]);
|
|
607
638
|
break;
|
|
608
639
|
case 'call':
|
|
609
|
-
Emits('call', {
|
|
640
|
+
Emits('call', {...info});
|
|
610
641
|
break;
|
|
611
642
|
}
|
|
612
643
|
};
|
|
613
644
|
|
|
614
|
-
const handleCardTap = ({
|
|
645
|
+
const handleCardTap = ({type}, info) => {
|
|
615
646
|
switch (type) {
|
|
616
647
|
case 'change':
|
|
617
|
-
chatConv([{
|
|
648
|
+
chatConv([{content: '換一套菜品', text: '換一套菜品'}]);
|
|
618
649
|
break;
|
|
619
650
|
case 'match':
|
|
620
651
|
chatConv([
|
|
@@ -625,7 +656,7 @@ const handleCardTap = ({ type }, info) => {
|
|
|
625
656
|
]);
|
|
626
657
|
break;
|
|
627
658
|
default:
|
|
628
|
-
Emits('call', {
|
|
659
|
+
Emits('call', {type, info});
|
|
629
660
|
}
|
|
630
661
|
};
|
|
631
662
|
const handleCall = (data) => {
|
|
@@ -643,8 +674,8 @@ const handleCall = (data) => {
|
|
|
643
674
|
const handlePlanParse = (list) => {
|
|
644
675
|
const pIdx = list.findIndex((p) => p.showType === 'plan');
|
|
645
676
|
return pIdx > -1
|
|
646
|
-
|
|
647
|
-
|
|
677
|
+
? {show: true, text: list[pIdx].planParse}
|
|
678
|
+
: {show: false};
|
|
648
679
|
};
|
|
649
680
|
|
|
650
681
|
const scrollToEnd = () => {
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="sc_wrap" @click.stop="handleSelStore">
|
|
3
|
+
<div
|
|
4
|
+
class="img"
|
|
5
|
+
:style="{
|
|
6
|
+
background: `url(${
|
|
7
|
+
info.signUrl || defImg
|
|
8
|
+
}?x-oss-process=image/resize,w_144) no-repeat center`,
|
|
9
|
+
backgroundSize: 'cover',
|
|
10
|
+
}"
|
|
11
|
+
@click.stop="previewImg([info.signUrl || defImg])"
|
|
12
|
+
/>
|
|
13
|
+
<div>
|
|
14
|
+
<div class="name">{{ info.hpName }}</div>
|
|
15
|
+
<div class="address">{{ info.address }}</div>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script setup>
|
|
21
|
+
import { previewImg } from '../../utils/imagesViewer';
|
|
22
|
+
|
|
23
|
+
const defImg =
|
|
24
|
+
'https://prodstatic.weis1606.cn/api/smartFood/images/logo_img.png';
|
|
25
|
+
const props = defineProps({
|
|
26
|
+
info: {
|
|
27
|
+
type: Object,
|
|
28
|
+
required: true,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
const Emits = defineEmits(['select']);
|
|
32
|
+
const handleSelStore = () => {
|
|
33
|
+
Emits('select', {
|
|
34
|
+
type: 'chat',
|
|
35
|
+
content: props.info.hpName,
|
|
36
|
+
text: props.info.hpName,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<style scoped lang="less">
|
|
42
|
+
.sc_wrap {
|
|
43
|
+
.flexrss();
|
|
44
|
+
gap: 10px;
|
|
45
|
+
cursor: default;
|
|
46
|
+
padding: 10px;
|
|
47
|
+
margin: 10px 0;
|
|
48
|
+
border-radius: 10px;
|
|
49
|
+
background-color: #fff;
|
|
50
|
+
.img {
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
width: 72px;
|
|
53
|
+
height: 72px;
|
|
54
|
+
flex-shrink: 0;
|
|
55
|
+
border-radius: 10px;
|
|
56
|
+
background-color: #d9d9d9;
|
|
57
|
+
}
|
|
58
|
+
.name {
|
|
59
|
+
font-weight: 600;
|
|
60
|
+
font-size: 14px;
|
|
61
|
+
color: #000;
|
|
62
|
+
line-height: 16px;
|
|
63
|
+
}
|
|
64
|
+
.address {
|
|
65
|
+
margin-top: 10px;
|
|
66
|
+
font-weight: 400;
|
|
67
|
+
font-size: 10px;
|
|
68
|
+
color: #666;
|
|
69
|
+
line-height: 12px;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
</style>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>请选择一个门店</div>
|
|
3
|
+
<template v-for="info in list" :key="info.hpName">
|
|
4
|
+
<store-card :info="info" @select="handleSel" />
|
|
5
|
+
</template>
|
|
6
|
+
</template>
|
|
7
|
+
|
|
8
|
+
<script setup>
|
|
9
|
+
import StoreCard from './StoreCard.vue';
|
|
10
|
+
// import data from './mock';
|
|
11
|
+
// import { computed } from 'vue';
|
|
12
|
+
// const list = computed(() => {
|
|
13
|
+
// return data.storeList;
|
|
14
|
+
// });
|
|
15
|
+
const props = defineProps({
|
|
16
|
+
list: {
|
|
17
|
+
type: Array,
|
|
18
|
+
required: true,
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
const Emits = defineEmits(['select']);
|
|
22
|
+
const handleSel = (info) => {
|
|
23
|
+
Emits('select', { ...info });
|
|
24
|
+
};
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<style scoped></style>
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
code: 0,
|
|
3
|
+
|
|
4
|
+
showType: 'store',
|
|
5
|
+
|
|
6
|
+
storeList: [
|
|
7
|
+
{
|
|
8
|
+
signUrl:
|
|
9
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715585779763.jpeg',
|
|
10
|
+
|
|
11
|
+
area: '南山区',
|
|
12
|
+
|
|
13
|
+
address: '南山区粤海街道科技南八路12号超多维科技大厦1层大堂',
|
|
14
|
+
|
|
15
|
+
hpName: '超多维小店',
|
|
16
|
+
|
|
17
|
+
province: '广东省',
|
|
18
|
+
|
|
19
|
+
city: '深圳市',
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
{
|
|
23
|
+
hpName: '大冲店',
|
|
24
|
+
|
|
25
|
+
province: '广东省',
|
|
26
|
+
|
|
27
|
+
city: '深圳市',
|
|
28
|
+
|
|
29
|
+
signUrl:
|
|
30
|
+
'https://prodstatic.weis1606.cn/api/diet/2024011810285638002.jpg',
|
|
31
|
+
|
|
32
|
+
area: '南山区',
|
|
33
|
+
|
|
34
|
+
address: '南山区科技园社区科慧路1号沛鸿大厦A1-110',
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
{
|
|
38
|
+
hpName: '科技生态园店',
|
|
39
|
+
|
|
40
|
+
province: '广东省',
|
|
41
|
+
|
|
42
|
+
city: '深圳市',
|
|
43
|
+
|
|
44
|
+
signUrl:
|
|
45
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716111756137.jpeg',
|
|
46
|
+
|
|
47
|
+
area: '南山区',
|
|
48
|
+
|
|
49
|
+
address:
|
|
50
|
+
'南山区粤海街道高新区社区科技南路16号深圳湾科技生态园11栋裙楼1-26号',
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
{
|
|
54
|
+
address: '南山区粤海街道麻岭社区麻雀岭工业区M-10栋2、3号楼一单元101F',
|
|
55
|
+
|
|
56
|
+
hpName: '麻雀岭店',
|
|
57
|
+
|
|
58
|
+
province: '广东省',
|
|
59
|
+
|
|
60
|
+
city: '深圳市',
|
|
61
|
+
|
|
62
|
+
signUrl:
|
|
63
|
+
'https://prodstatic.weis1606.cn/api/diet/2023121317260169888.jpg',
|
|
64
|
+
|
|
65
|
+
area: '南山区',
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
{
|
|
69
|
+
area: '南山区',
|
|
70
|
+
|
|
71
|
+
address: '南山区粤海街道滨海社区海天二路12号深圳软件产业基地6栋1楼10 铺',
|
|
72
|
+
|
|
73
|
+
hpName: '软件产业基地小店',
|
|
74
|
+
|
|
75
|
+
province: '广东省',
|
|
76
|
+
|
|
77
|
+
city: '深圳市',
|
|
78
|
+
|
|
79
|
+
signUrl:
|
|
80
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716100239511.jpeg',
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
{
|
|
84
|
+
hpName: '阿里小店',
|
|
85
|
+
|
|
86
|
+
province: '广东省',
|
|
87
|
+
|
|
88
|
+
city: '深圳市',
|
|
89
|
+
|
|
90
|
+
signUrl:
|
|
91
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715593853882.jpeg',
|
|
92
|
+
|
|
93
|
+
area: '南山区',
|
|
94
|
+
|
|
95
|
+
address: '南山区粤海街道科苑路3331号阿里巴巴大厦T1栋大堂',
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
{
|
|
99
|
+
hpName: '侨城一号店',
|
|
100
|
+
|
|
101
|
+
province: '广东省',
|
|
102
|
+
|
|
103
|
+
city: '深圳市',
|
|
104
|
+
|
|
105
|
+
signUrl:
|
|
106
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716121683154.jpeg',
|
|
107
|
+
|
|
108
|
+
area: '南山区',
|
|
109
|
+
|
|
110
|
+
address: '南山区沙河街道高发社区深云路二号侨城一号广场主楼B1-8',
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
{
|
|
114
|
+
hpName: '万科云城店',
|
|
115
|
+
|
|
116
|
+
province: '广东省',
|
|
117
|
+
|
|
118
|
+
city: '深圳市',
|
|
119
|
+
|
|
120
|
+
signUrl:
|
|
121
|
+
'https://prodstatic.weis1606.cn/api/diet/2024010514564563664.jpg',
|
|
122
|
+
|
|
123
|
+
area: '南山区',
|
|
124
|
+
|
|
125
|
+
address: '南山区留新四街7-2号',
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
{
|
|
129
|
+
signUrl:
|
|
130
|
+
'https://prodstatic.weis1606.cn/api/diet/2024032818023421881.png',
|
|
131
|
+
|
|
132
|
+
area: '南山区',
|
|
133
|
+
|
|
134
|
+
address:
|
|
135
|
+
'南山区前海深港合作区桂湾五路128号前海深港基金小镇基金路演中心9米商业平台06号商铺',
|
|
136
|
+
|
|
137
|
+
hpName: '前海基金小镇店',
|
|
138
|
+
|
|
139
|
+
province: '广东省',
|
|
140
|
+
|
|
141
|
+
city: '深圳市',
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
{
|
|
145
|
+
address: '南山区深圳市南山区蛇口街道南水社区南水村84号103',
|
|
146
|
+
|
|
147
|
+
hpName: '万融店',
|
|
148
|
+
|
|
149
|
+
province: '广东省',
|
|
150
|
+
|
|
151
|
+
city: '深圳市',
|
|
152
|
+
|
|
153
|
+
signUrl:
|
|
154
|
+
'https://prodstatic.weis1606.cn/api/diet/2024011214451119672.jpg',
|
|
155
|
+
|
|
156
|
+
area: '南山区',
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
{
|
|
160
|
+
hpName: '前海世茂店',
|
|
161
|
+
|
|
162
|
+
province: '广东省',
|
|
163
|
+
|
|
164
|
+
city: '深圳市',
|
|
165
|
+
|
|
166
|
+
signUrl:
|
|
167
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716133943410.jpeg',
|
|
168
|
+
|
|
169
|
+
area: '南山区',
|
|
170
|
+
|
|
171
|
+
address:
|
|
172
|
+
'南山区前海深港合作区南山街道兴海大道3040号前海世茂金融中心一期3、4、5、6号商业盒子106',
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
{
|
|
176
|
+
city: '深圳市',
|
|
177
|
+
|
|
178
|
+
signUrl:
|
|
179
|
+
'https://prodstatic.weis1606.cn/api/diet/2023112418555420239.png',
|
|
180
|
+
|
|
181
|
+
area: '福田区',
|
|
182
|
+
|
|
183
|
+
address: '福田区香蜜湖街道深南大道7010号工商物价大厦三楼饭堂门口',
|
|
184
|
+
|
|
185
|
+
hpName: '市监局内部店',
|
|
186
|
+
|
|
187
|
+
province: '广东省',
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
{
|
|
191
|
+
province: '广东省',
|
|
192
|
+
|
|
193
|
+
city: '深圳市',
|
|
194
|
+
|
|
195
|
+
signUrl:
|
|
196
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715482314867.jpeg',
|
|
197
|
+
|
|
198
|
+
area: '福田区',
|
|
199
|
+
|
|
200
|
+
address: '福田区沙头街道天安社区车工庙丰盛町阳光街C1-112',
|
|
201
|
+
|
|
202
|
+
hpName: '车公庙店',
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
{
|
|
206
|
+
hpName: '西丽福光店',
|
|
207
|
+
|
|
208
|
+
province: '广东省',
|
|
209
|
+
|
|
210
|
+
city: '深圳市',
|
|
211
|
+
|
|
212
|
+
area: '南山区',
|
|
213
|
+
|
|
214
|
+
address: '南山区桃园街道福光社区学苑大道1177号福满家园塘长路2321号',
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
{
|
|
218
|
+
hpName: '宝体店',
|
|
219
|
+
|
|
220
|
+
province: '广东省',
|
|
221
|
+
|
|
222
|
+
city: '深圳市',
|
|
223
|
+
|
|
224
|
+
signUrl:
|
|
225
|
+
'https://prodstatic.weis1606.cn/api/diet/2024042618354733220.png',
|
|
226
|
+
|
|
227
|
+
area: '宝安区',
|
|
228
|
+
|
|
229
|
+
address: '宝安区西乡街道蚝业社区宝安互联网产业基地A区B栋122B',
|
|
230
|
+
},
|
|
231
|
+
|
|
232
|
+
{
|
|
233
|
+
address: '福田区福田街道福安社区深南大道4019号航天大厦A117',
|
|
234
|
+
|
|
235
|
+
hpName: '航天大厦小店',
|
|
236
|
+
|
|
237
|
+
province: '广东省',
|
|
238
|
+
|
|
239
|
+
city: '深圳市',
|
|
240
|
+
|
|
241
|
+
signUrl:
|
|
242
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716011003097.jpeg',
|
|
243
|
+
|
|
244
|
+
area: '福田区',
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
{
|
|
248
|
+
signUrl:
|
|
249
|
+
'https://prodstatic.weis1606.cn/api/diet/2023081915582535599.jpg',
|
|
250
|
+
|
|
251
|
+
area: '福田区',
|
|
252
|
+
|
|
253
|
+
address: '福田区福田区鹏程一路8号',
|
|
254
|
+
|
|
255
|
+
hpName: '建行大厦内部店',
|
|
256
|
+
|
|
257
|
+
province: '广东省',
|
|
258
|
+
|
|
259
|
+
city: '深圳市',
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
{
|
|
263
|
+
province: '广东省',
|
|
264
|
+
|
|
265
|
+
city: '深圳市',
|
|
266
|
+
|
|
267
|
+
signUrl:
|
|
268
|
+
'https://prodstatic.weis1606.cn/api/diet/2024031721030030941.png',
|
|
269
|
+
|
|
270
|
+
area: '福田区',
|
|
271
|
+
|
|
272
|
+
address: '福田区福保街道福保社区槟榔道1号吉虹研发大楼B栋负1层-105号',
|
|
273
|
+
|
|
274
|
+
hpName: '福保吉虹大厦店',
|
|
275
|
+
},
|
|
276
|
+
|
|
277
|
+
{
|
|
278
|
+
signUrl:
|
|
279
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715552113023.jpeg',
|
|
280
|
+
|
|
281
|
+
area: '福田区',
|
|
282
|
+
|
|
283
|
+
address: '福田区梅林街道上梅林新村90栋104',
|
|
284
|
+
|
|
285
|
+
hpName: '上梅林店',
|
|
286
|
+
|
|
287
|
+
province: '广东省',
|
|
288
|
+
|
|
289
|
+
city: '深圳市',
|
|
290
|
+
},
|
|
291
|
+
|
|
292
|
+
{
|
|
293
|
+
area: '福田区',
|
|
294
|
+
|
|
295
|
+
address: '福田区福田街道福华路350号皇庭大厦负127',
|
|
296
|
+
|
|
297
|
+
hpName: '皇庭中心小店',
|
|
298
|
+
|
|
299
|
+
province: '广东省',
|
|
300
|
+
|
|
301
|
+
city: '深圳市',
|
|
302
|
+
|
|
303
|
+
signUrl:
|
|
304
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715580707298.jpeg',
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
{
|
|
308
|
+
address: '龙岗区坂田街道南坑社区雅宝路1号星河WORLD-F栋旁158',
|
|
309
|
+
|
|
310
|
+
hpName: '星河WORLD小店',
|
|
311
|
+
|
|
312
|
+
province: '广东省',
|
|
313
|
+
|
|
314
|
+
city: '深圳市',
|
|
315
|
+
|
|
316
|
+
signUrl:
|
|
317
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716023804466.jpeg',
|
|
318
|
+
|
|
319
|
+
area: '龙岗区',
|
|
320
|
+
},
|
|
321
|
+
|
|
322
|
+
{
|
|
323
|
+
province: '广东省',
|
|
324
|
+
|
|
325
|
+
city: '深圳市',
|
|
326
|
+
|
|
327
|
+
signUrl:
|
|
328
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716070133609.jpeg',
|
|
329
|
+
|
|
330
|
+
area: '福田区',
|
|
331
|
+
|
|
332
|
+
address: '福田区福田街道福南社区福虹路9号世贸广场负101',
|
|
333
|
+
|
|
334
|
+
hpName: '世贸广场小店',
|
|
335
|
+
},
|
|
336
|
+
|
|
337
|
+
{
|
|
338
|
+
city: '深圳市',
|
|
339
|
+
|
|
340
|
+
signUrl:
|
|
341
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715494454478.jpeg',
|
|
342
|
+
|
|
343
|
+
area: '龙岗区',
|
|
344
|
+
|
|
345
|
+
address: '龙岗区坂田街道金银街嘉御豪园15栋S-90号商铺维士数字饮食',
|
|
346
|
+
|
|
347
|
+
hpName: '坂田店',
|
|
348
|
+
|
|
349
|
+
province: '广东省',
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
{
|
|
353
|
+
signUrl:
|
|
354
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716115074197.jpeg',
|
|
355
|
+
|
|
356
|
+
area: '罗湖区',
|
|
357
|
+
|
|
358
|
+
address: '罗湖区南湖街道和平社区深南东路4003号世界金融中心AL108',
|
|
359
|
+
|
|
360
|
+
hpName: '世界金融中心店',
|
|
361
|
+
|
|
362
|
+
province: '广东省',
|
|
363
|
+
|
|
364
|
+
city: '深圳市',
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
{
|
|
368
|
+
hpName: '翠竹店',
|
|
369
|
+
|
|
370
|
+
province: '广东省',
|
|
371
|
+
|
|
372
|
+
city: '深圳市',
|
|
373
|
+
|
|
374
|
+
signUrl:
|
|
375
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072715452841509.jpeg',
|
|
376
|
+
|
|
377
|
+
area: '罗湖区',
|
|
378
|
+
|
|
379
|
+
address: '罗湖区笋岗街道湖景社区洪湖一街合正锦湖逸园夹层商铺02',
|
|
380
|
+
},
|
|
381
|
+
|
|
382
|
+
{
|
|
383
|
+
area: '龙岗区',
|
|
384
|
+
|
|
385
|
+
address: '龙岗区坂田街道岗头社区天安云谷产业园二期10栋106',
|
|
386
|
+
|
|
387
|
+
hpName: '天安云谷小店',
|
|
388
|
+
|
|
389
|
+
province: '广东省',
|
|
390
|
+
|
|
391
|
+
city: '深圳市',
|
|
392
|
+
|
|
393
|
+
signUrl:
|
|
394
|
+
'https://prodstatic.weis1606.cn/api/diet/2023072716040382778.jpeg',
|
|
395
|
+
},
|
|
396
|
+
|
|
397
|
+
{
|
|
398
|
+
province: '广东省',
|
|
399
|
+
|
|
400
|
+
city: '深圳市',
|
|
401
|
+
|
|
402
|
+
area: '龙岗区',
|
|
403
|
+
|
|
404
|
+
address: '龙岗区金积嘉科技园3栋2楼',
|
|
405
|
+
|
|
406
|
+
hpName: '金积嘉店',
|
|
407
|
+
},
|
|
408
|
+
],
|
|
409
|
+
|
|
410
|
+
msg: 'success',
|
|
411
|
+
};
|