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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ai-chat-bot-interface",
3
3
  "private": false,
4
- "version": "1.4.5",
4
+ "version": "1.4.7",
5
5
  "type": "module",
6
6
  "main": "index.js",
7
7
  "description": "A AI chat bot interface. (private)",
package/src/App.vue CHANGED
@@ -6,7 +6,7 @@ import ChatUi from './ChatUi.vue';
6
6
  <div style="width: 100vw; height: 100vh">
7
7
  <chat-ui
8
8
  bot-id="555"
9
- token="pat_28888"
9
+ token="pat_8888"
10
10
  uid="262598"
11
11
  :def-msg="{ placeholder: '发消息...' }"
12
12
  :show-header="true"
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
- v-if="botInfo && botInfo.onboarding_info"
32
- style="text-align: left; margin-top: 50px"
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
- :src="botInfo.icon_url"
37
- alt="icon"
38
- width="64"
39
- height="64"
40
- style="border-radius: 15px"
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
- 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
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 { computed, nextTick, onMounted, ref } from 'vue';
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 { get, post } from './utils/request';
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
- { name: '人工客服', value: 'kefu', type: 'chat', msg: '人工客服' },
223
- { name: '查看菜单', value: 'menu', type: 'call', msg: '查看菜单' },
224
- { name: '体检报告', value: 'exam', type: 'upload', msg: '体检报告' },
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 (localStorage.getItem('conversationId')) {
248
- conversationId.value = localStorage.getItem('conversationId');
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
- 'https://api.coze.cn/v1/conversation/create',
260
- { bot_id: props.botId, connector_id: '999' },
261
- { ...chatOptions.value },
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
- localStorage.setItem('conversationId', conversationId.value);
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
- item.content.map((con) => ({
337
- type: con.type,
338
- file_id: con.file_id,
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
- `https://api.coze.cn/v3/chat?conversation_id=${conversationId.value}`,
368
- {
369
- method: 'POST',
370
- headers: {
371
- ...chatOptions.value.headers,
372
- // 'Content-Type': 'text/event-stream',
373
- },
374
- body: JSON.stringify({
375
- bot_id: botId,
376
- user_id: props.uid,
377
- stream: true,
378
- connector_id: '999',
379
- additional_messages /*[
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
- custom_variables: {
392
- uid: props.uid,
393
- },
394
- }),
395
- credentials: 'same-origin', // 默认同源策略
396
- mode: 'cors', // 默认跨域模式
397
- cache: 'default', // 默认缓存策略
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 { done, value } = await reader.read();
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, { stream: true });
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
- historyList.value[idx].content + strObj.content,
492
+ historyList.value[idx].content + strObj.content,
465
493
  );
466
494
  scrollToEnd();
467
495
  } else if (
468
- strObj.hasOwnProperty('type') &&
469
- strObj.type === 'tool_response'
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({ ...extraObj });
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({ ...modelObj });
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
- `https://api.coze.cn/v1/conversation/message/list?conversation_id=${conversationId.value}`,
491
- { order: 'asc' },
492
- { ...chatOptions.value },
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: [{ ...cardObj }],
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: [{ ...modelObj }],
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
- row.content_type === 'object_string' &&
540
- row.role === 'user'
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) => ({ ...item, showType: item.type })),
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
- card.role === 'user'
561
- ? historyList.value.findIndex(
562
- (c) =>
563
- c.meta_data.chat_group === card.meta_data.chat_group &&
564
- c.role === card.role,
565
- )
566
- : historyList.value.findIndex(
567
- (c) => c.chat_id === card.chat_id && c.role === card.role,
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
- `https://api.coze.cn/v1/bot/get_online_info?bot_id=${props.botId}`,
581
- { ...chatOptions.value },
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 = { ...res.data };
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', { type: 'back' });
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([{ content: info.msg, text: info.msg }]);
637
+ chatConv([{content: info.msg, text: info.msg}]);
607
638
  break;
608
639
  case 'call':
609
- Emits('call', { ...info });
640
+ Emits('call', {...info});
610
641
  break;
611
642
  }
612
643
  };
613
644
 
614
- const handleCardTap = ({ type }, info) => {
645
+ const handleCardTap = ({type}, info) => {
615
646
  switch (type) {
616
647
  case 'change':
617
- chatConv([{ content: '換一套菜品', text: '換一套菜品' }]);
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', { type, info });
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
- ? { show: true, text: list[pIdx].planParse }
647
- : { show: false };
677
+ ? {show: true, text: list[pIdx].planParse}
678
+ : {show: false};
648
679
  };
649
680
 
650
681
  const scrollToEnd = () => {
@@ -80,7 +80,7 @@
80
80
  <input
81
81
  ref="uploadInput"
82
82
  type="file"
83
- accept="image/*"
83
+ accept="image/*,application/pdf"
84
84
  style="display: none"
85
85
  @change="handleFileChange"
86
86
  />
@@ -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
+ };
@@ -0,0 +1,8 @@
1
+ import { api as viewerApi } from 'v-viewer';
2
+ import 'viewerjs/dist/viewer.css';
3
+
4
+ export const previewImg = (list) => {
5
+ viewerApi({
6
+ images: list,
7
+ });
8
+ };