hookehuyr

联调参观者列表新增和删除接口

...@@ -7,26 +7,15 @@ export {} ...@@ -7,26 +7,15 @@ export {}
7 7
8 declare module '@vue/runtime-core' { 8 declare module '@vue/runtime-core' {
9 export interface GlobalComponents { 9 export interface GlobalComponents {
10 - BookingCode: typeof import('./src/components/bookingCode.vue')['default']
11 QrCode: typeof import('./src/components/qrCode.vue')['default'] 10 QrCode: typeof import('./src/components/qrCode.vue')['default']
12 RouterLink: typeof import('vue-router')['RouterLink'] 11 RouterLink: typeof import('vue-router')['RouterLink']
13 RouterView: typeof import('vue-router')['RouterView'] 12 RouterView: typeof import('vue-router')['RouterView']
14 - VanButton: typeof import('vant/es')['Button']
15 - VanCalendar: typeof import('vant/es')['Calendar']
16 VanCheckbox: typeof import('vant/es')['Checkbox'] 13 VanCheckbox: typeof import('vant/es')['Checkbox']
17 VanCheckboxGroup: typeof import('vant/es')['CheckboxGroup'] 14 VanCheckboxGroup: typeof import('vant/es')['CheckboxGroup']
18 - VanCol: typeof import('vant/es')['Col']
19 VanDatePicker: typeof import('vant/es')['DatePicker'] 15 VanDatePicker: typeof import('vant/es')['DatePicker']
20 - VanDialog: typeof import('vant/es')['Dialog']
21 - VanEmpty: typeof import('vant/es')['Empty']
22 - VanField: typeof import('vant/es')['Field']
23 - VanForm: typeof import('vant/es')['Form']
24 VanIcon: typeof import('vant/es')['Icon'] 16 VanIcon: typeof import('vant/es')['Icon']
25 VanPicker: typeof import('vant/es')['Picker'] 17 VanPicker: typeof import('vant/es')['Picker']
26 VanPopup: typeof import('vant/es')['Popup'] 18 VanPopup: typeof import('vant/es')['Popup']
27 - VanRadio: typeof import('vant/es')['Radio']
28 - VanRadioGroup: typeof import('vant/es')['RadioGroup']
29 - VanRow: typeof import('vant/es')['Row']
30 VanSwipe: typeof import('vant/es')['Swipe'] 19 VanSwipe: typeof import('vant/es')['Swipe']
31 VanSwipeItem: typeof import('vant/es')['SwipeItem'] 20 VanSwipeItem: typeof import('vant/es')['SwipeItem']
32 VanToast: typeof import('vant/es')['Toast'] 21 VanToast: typeof import('vant/es')['Toast']
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
12 "cypress:open": "cypress open" 12 "cypress:open": "cypress open"
13 }, 13 },
14 "dependencies": { 14 "dependencies": {
15 + "@code-ts/cin": "^0.0.2",
15 "@vant/area-data": "^1.3.1", 16 "@vant/area-data": "^1.3.1",
16 "@vant/touch-emulator": "^1.4.0", 17 "@vant/touch-emulator": "^1.4.0",
17 "@vitejs/plugin-legacy": "^1.8.2", 18 "@vitejs/plugin-legacy": "^1.8.2",
......
1 /* 1 /*
2 * @Date: 2023-08-24 09:42:27 2 * @Date: 2023-08-24 09:42:27
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-01-17 17:37:48 4 + * @LastEditTime: 2024-01-18 10:31:15
5 * @FilePath: /xysBooking/src/api/index.js 5 * @FilePath: /xysBooking/src/api/index.js
6 * @Description: 文件描述 6 * @Description: 文件描述
7 */ 7 */
...@@ -10,6 +10,9 @@ import { fn, fetch } from '@/api/fn'; ...@@ -10,6 +10,9 @@ import { fn, fetch } from '@/api/fn';
10 const Api = { 10 const Api = {
11 CAN_RESERVE_DATE_LIST: '/srv/?a=api&t=can_reserve_date_list', 11 CAN_RESERVE_DATE_LIST: '/srv/?a=api&t=can_reserve_date_list',
12 CAN_RESERVE_TIME_LIST: '/srv/?a=api&t=can_reserve_time_list', 12 CAN_RESERVE_TIME_LIST: '/srv/?a=api&t=can_reserve_time_list',
13 + PERSON_LIST: '/srv/?a=api&t=person_list',
14 + ADD_PERSON: '/srv/?a=api&t=add_person',
15 + DEL_PERSON: '/srv/?a=api&t=del_person',
13 }; 16 };
14 17
15 /** 18 /**
...@@ -27,8 +30,26 @@ export const canReserveDateListAPI = (params) => fn(fetch.get(Api.CAN_RESERVE_DA ...@@ -27,8 +30,26 @@ export const canReserveDateListAPI = (params) => fn(fetch.get(Api.CAN_RESERVE_DA
27 export const canReserveTimeListAPI = (params) => fn(fetch.get(Api.CAN_RESERVE_TIME_LIST, params)); 30 export const canReserveTimeListAPI = (params) => fn(fetch.get(Api.CAN_RESERVE_TIME_LIST, params));
28 31
29 /** 32 /**
30 - * @description: 取消预约 33 + * @description: 参观者列表
31 - * @param {String} id 预约订单的ID 34 + * @param {String} reserve_date 预约日期,格式 yyyy-mm-dd,没有传入则不查询指定日期是否已预约
35 + * @param {String} begin_time 时段开始时间,格式 hh:mm
36 + * @param {String} end_time 时段结束时间,格式 hh:mm
32 * @returns 37 * @returns
33 */ 38 */
34 -// export const orderCancelAPI = (params) => fn(fetch.post(Api.ORDER_CANCEL, params)); 39 +export const personListAPI = (params) => fn(fetch.get(Api.PERSON_LIST, params));
40 +
41 +/**
42 + * @description: 添加参观者
43 + * @param {String} name 参观者姓名
44 + * @param {String} id_type 证件类型,1=身份证,3=其他
45 + * @param {String} id_number 证件号
46 + * @returns
47 + */
48 +export const addPersonAPI = (params) => fn(fetch.post(Api.ADD_PERSON, params));
49 +
50 +/**
51 + * @description: 删除参观者
52 + * @param {String} person_id 参观者id
53 + * @returns
54 + */
55 +export const delPersonAPI = (params) => fn(fetch.post(Api.DEL_PERSON, params));
......
1 <!-- 1 <!--
2 * @Date: 2024-01-16 10:06:47 2 * @Date: 2024-01-16 10:06:47
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-01-16 17:06:21 4 + * @LastEditTime: 2024-01-18 10:36:53
5 * @FilePath: /xysBooking/src/components/qrCode.vue 5 * @FilePath: /xysBooking/src/components/qrCode.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
49 <script setup> 49 <script setup>
50 import { ref } from 'vue' 50 import { ref } from 'vue'
51 import { useRoute, useRouter } from 'vue-router' 51 import { useRoute, useRouter } from 'vue-router'
52 -import xctcCheck from "xctc-check"
53 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 52 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
54 //import { } from '@/utils/generateModules.js' 53 //import { } from '@/utils/generateModules.js'
55 //import { } from '@/utils/generateIcons.js' 54 //import { } from '@/utils/generateIcons.js'
...@@ -134,11 +133,7 @@ const nextCode = () => { ...@@ -134,11 +133,7 @@ const nextCode = () => {
134 } 133 }
135 134
136 const formatId = (id) => { 135 const formatId = (id) => {
137 - if (id.length === 15) { 136 + return replaceMiddleCharacters(id);
138 - return replaceMiddleCharacters(id);
139 - } else {
140 - return xctcCheck.formatInfoHide(id)
141 - }
142 }; 137 };
143 138
144 const userinfo = computed(() => { 139 const userinfo = computed(() => {
......
1 <!-- 1 <!--
2 * @Date: 2024-01-15 17:39:29 2 * @Date: 2024-01-15 17:39:29
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-01-16 17:25:22 4 + * @LastEditTime: 2024-01-18 10:23:30
5 * @FilePath: /xysBooking/src/views/addVisitor.vue 5 * @FilePath: /xysBooking/src/views/addVisitor.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -51,13 +51,15 @@ ...@@ -51,13 +51,15 @@
51 <script setup> 51 <script setup>
52 import { ref } from 'vue' 52 import { ref } from 'vue'
53 import { useRoute, useRouter } from 'vue-router' 53 import { useRoute, useRouter } from 'vue-router'
54 -import xctcCheck from "xctc-check" 54 +import { validateCIN } from '@code-ts/cin'
55 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 55 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
56 //import { } from '@/utils/generateModules.js' 56 //import { } from '@/utils/generateModules.js'
57 //import { } from '@/utils/generateIcons.js' 57 //import { } from '@/utils/generateIcons.js'
58 //import { } from '@/composables' 58 //import { } from '@/composables'
59 import { showSuccessToast, showFailToast } from 'vant'; 59 import { showSuccessToast, showFailToast } from 'vant';
60 import { useGo } from '@/hooks/useGo' 60 import { useGo } from '@/hooks/useGo'
61 +import { addPersonAPI } from '@/api/index'
62 +
61 const $route = useRoute(); 63 const $route = useRoute();
62 const $router = useRouter(); 64 const $router = useRouter();
63 useTitle($route.meta.title); 65 useTitle($route.meta.title);
...@@ -81,29 +83,28 @@ const checkUsername = () => { ...@@ -81,29 +83,28 @@ const checkUsername = () => {
81 return flag; 83 return flag;
82 } 84 }
83 const checkIdCode = () => { 85 const checkIdCode = () => {
84 - const res = xctcCheck.checkIdCard(idCode.value);
85 let flag = true; 86 let flag = true;
86 if (idCode.value.length === 15) { // 15位身份证号码不校验 87 if (idCode.value.length === 15) { // 15位身份证号码不校验
87 flag = true; 88 flag = true;
88 } else { 89 } else {
89 - if (res.status) { 90 + if (validateCIN(idCode.value)) {
90 91
91 } else { 92 } else {
92 show_error.value = true; 93 show_error.value = true;
93 - error_message.value = res.msg; 94 + error_message.value = '请检查身份证号码';
94 flag = false; 95 flag = false;
95 } 96 }
96 } 97 }
97 return flag; 98 return flag;
98 } 99 }
99 100
100 -const addVisitor = () => { 101 +const addVisitor = async () => {
101 - // TODO:保存用户信息 102 + // 保存用户信息
102 if (checkUsername() && checkIdCode()) { 103 if (checkUsername() && checkIdCode()) {
103 - $router.go(-1); 104 + const { code, data } = await addPersonAPI({ name: username.value, id_type: id_type.value, id_number: idCode.value });
104 - console.warn(username.value); 105 + if (code) {
105 - console.warn(idCode.value); 106 + $router.go(-1);
106 - console.warn(fieldValue.value); 107 + }
107 } 108 }
108 } 109 }
109 110
...@@ -112,14 +113,17 @@ const idTypeChange = () => { ...@@ -112,14 +113,17 @@ const idTypeChange = () => {
112 showPicker.value = !showPicker.value; 113 showPicker.value = !showPicker.value;
113 } 114 }
114 const columns = [ 115 const columns = [
115 - { text: '身份证', value: '0' }, 116 + { text: '身份证', value: '1' },
116 - { text: '其他证件', value: '1' }, 117 + { text: '其他证件', value: '3' },
117 ]; 118 ];
118 const fieldValue = ref('身份证'); 119 const fieldValue = ref('身份证');
120 +const id_type = ref('1');
119 121
120 const onConfirm = ({ selectedOptions }) => { 122 const onConfirm = ({ selectedOptions }) => {
121 showPicker.value = false; 123 showPicker.value = false;
124 + //
122 fieldValue.value = selectedOptions[0].text; 125 fieldValue.value = selectedOptions[0].text;
126 + id_type.value = selectedOptions[0].value;
123 }; 127 };
124 </script> 128 </script>
125 129
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
18 <script setup> 18 <script setup>
19 import { ref } from 'vue' 19 import { ref } from 'vue'
20 import { useRoute, useRouter } from 'vue-router' 20 import { useRoute, useRouter } from 'vue-router'
21 -import xctcCheck from "xctc-check"
22 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 21 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
23 //import { } from '@/utils/generateModules.js' 22 //import { } from '@/utils/generateModules.js'
24 //import { } from '@/utils/generateIcons.js' 23 //import { } from '@/utils/generateIcons.js'
......
1 <!-- 1 <!--
2 * @Date: 2024-01-16 13:33:36 2 * @Date: 2024-01-16 13:33:36
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-01-17 07:03:58 4 + * @LastEditTime: 2024-01-18 10:36:04
5 * @FilePath: /xysBooking/src/views/me.vue 5 * @FilePath: /xysBooking/src/views/me.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
17 <div v-for="(item, index) in visitorList" :key="index" class="visitor-item"> 17 <div v-for="(item, index) in visitorList" :key="index" class="visitor-item">
18 <div> 18 <div>
19 <p style="color: #A67939;">{{ item.name }}</p> 19 <p style="color: #A67939;">{{ item.name }}</p>
20 - <p>证件号:{{ formatId(item.idCard) }}</p> 20 + <p>证件号:{{ formatId(item.id_number) }}</p>
21 </div> 21 </div>
22 <div @click="removeItem(item)" style="margin-left: 1rem;"> 22 <div @click="removeItem(item)" style="margin-left: 1rem;">
23 <van-icon name="https://cdn.ipadbiz.cn/xys/booking/%E5%88%A0%E9%99%A4@2x.png" /> 23 <van-icon name="https://cdn.ipadbiz.cn/xys/booking/%E5%88%A0%E9%99%A4@2x.png" />
...@@ -35,13 +35,13 @@ ...@@ -35,13 +35,13 @@
35 import { ref } from 'vue' 35 import { ref } from 'vue'
36 import { useRoute, useRouter } from 'vue-router' 36 import { useRoute, useRouter } from 'vue-router'
37 import { useGo } from '@/hooks/useGo' 37 import { useGo } from '@/hooks/useGo'
38 -import xctcCheck from "xctc-check"
39 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 38 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
40 //import { } from '@/utils/generateModules.js' 39 //import { } from '@/utils/generateModules.js'
41 //import { } from '@/utils/generateIcons.js' 40 //import { } from '@/utils/generateIcons.js'
42 //import { } from '@/composables' 41 //import { } from '@/composables'
43 import { showConfirmDialog } from 'vant'; 42 import { showConfirmDialog } from 'vant';
44 import { showSuccessToast, showFailToast } from 'vant'; 43 import { showSuccessToast, showFailToast } from 'vant';
44 +import { personListAPI, delPersonAPI } from '@/api/index'
45 const go = useGo(); 45 const go = useGo();
46 const $route = useRoute(); 46 const $route = useRoute();
47 const $router = useRouter(); 47 const $router = useRouter();
...@@ -68,11 +68,7 @@ function replaceMiddleCharacters(inputString) { ...@@ -68,11 +68,7 @@ function replaceMiddleCharacters(inputString) {
68 } 68 }
69 69
70 const formatId = (id) => { 70 const formatId = (id) => {
71 - if (id.length === 15) { 71 + return replaceMiddleCharacters(id);
72 - return replaceMiddleCharacters(id);
73 - } else {
74 - return xctcCheck.formatInfoHide(id)
75 - }
76 }; 72 };
77 73
78 const removeItem = (item) => { 74 const removeItem = (item) => {
...@@ -82,23 +78,24 @@ const removeItem = (item) => { ...@@ -82,23 +78,24 @@ const removeItem = (item) => {
82 confirmButtonColor: '#A67939', 78 confirmButtonColor: '#A67939',
83 width: '80vw' 79 width: '80vw'
84 }) 80 })
85 - .then(() => { 81 + .then(async () => {
86 // on confirm 82 // on confirm
87 - showSuccessToast('删除成功'); 83 + const { code, data } = await delPersonAPI({ person_id: item.id });
88 - visitorList.value = visitorList.value.filter((v) => v.id !== item.id); 84 + if (code) {
85 + showSuccessToast('删除成功');
86 + visitorList.value = visitorList.value.filter((v) => v.id !== item.id);
87 + }
89 }) 88 })
90 .catch(() => { 89 .catch(() => {
91 // on cancel 90 // on cancel
92 }); 91 });
93 } 92 }
94 93
95 -onMounted(() => { 94 +onMounted(async () => {
96 - visitorList.value = [ 95 + const { code, data } = await personListAPI();
97 - { id: '1', name: '张雨燕1', idCard: '311522190103214', today: false }, 96 + if (code) {
98 - { id: '2', name: '张雨燕2', idCard: '311522190103214279', today: true }, 97 + visitorList.value = data;
99 - { id: '3',name: '张雨燕3', idCard: '311522190103214279', today: false }, 98 + }
100 - { id: '4',name: '张雨燕4', idCard: '311522190103214279', today: false }
101 - ];
102 }) 99 })
103 </script> 100 </script>
104 101
......
1 <!-- 1 <!--
2 * @Date: 2024-01-15 16:25:51 2 * @Date: 2024-01-15 16:25:51
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-01-16 18:19:12 4 + * @LastEditTime: 2024-01-18 10:36:40
5 * @FilePath: /xysBooking/src/views/submit.vue 5 * @FilePath: /xysBooking/src/views/submit.vue
6 - * @Description: 文件描述 6 + * @Description: 预约人员信息
7 --> 7 -->
8 <template> 8 <template>
9 <div class="submit-page"> 9 <div class="submit-page">
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
22 </div> 22 </div>
23 <div> 23 <div>
24 <p style="color: #A67939;">{{ item.name }}</p> 24 <p style="color: #A67939;">{{ item.name }}</p>
25 - <p>证件号:{{ formatId(item.idCard) }}</p> 25 + <p>证件号:{{ formatId(item.id_number) }}</p>
26 - <p v-if="item.today" style="color: #9C9A9A; font-size: 0.8rem;">*已预约过2024-01-10参观,请不要重复预约</p> 26 + <p v-if="item.is_reserve === '1'" style="color: #9C9A9A; font-size: 0.8rem;">*已预约过{{ date }}参观,请不要重复预约</p>
27 </div> 27 </div>
28 </div> 28 </div>
29 </div> 29 </div>
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
46 <script setup> 46 <script setup>
47 import { ref } from 'vue' 47 import { ref } from 'vue'
48 import { useRoute, useRouter } from 'vue-router' 48 import { useRoute, useRouter } from 'vue-router'
49 -import xctcCheck from "xctc-check"
50 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 49 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
51 //import { } from '@/utils/generateModules.js' 50 //import { } from '@/utils/generateModules.js'
52 //import { } from '@/utils/generateIcons.js' 51 //import { } from '@/utils/generateIcons.js'
...@@ -55,6 +54,7 @@ import { useGo } from '@/hooks/useGo' ...@@ -55,6 +54,7 @@ import { useGo } from '@/hooks/useGo'
55 import { showSuccessToast, showFailToast, showToast } from 'vant'; 54 import { showSuccessToast, showFailToast, showToast } from 'vant';
56 import icon_check1 from '@/assets/images/多选01@2x.png' 55 import icon_check1 from '@/assets/images/多选01@2x.png'
57 import icon_check2 from '@/assets/images/多选02@2x.png' 56 import icon_check2 from '@/assets/images/多选02@2x.png'
57 +import { personListAPI } from '@/api/index'
58 const $route = useRoute(); 58 const $route = useRoute();
59 const $router = useRouter(); 59 const $router = useRouter();
60 useTitle($route.meta.title); 60 useTitle($route.meta.title);
...@@ -82,16 +82,12 @@ function replaceMiddleCharacters(inputString) { ...@@ -82,16 +82,12 @@ function replaceMiddleCharacters(inputString) {
82 } 82 }
83 83
84 const formatId = (id) => { 84 const formatId = (id) => {
85 - if (id.length === 15) { 85 + return replaceMiddleCharacters(id);
86 - return replaceMiddleCharacters(id);
87 - } else {
88 - return xctcCheck.formatInfoHide(id)
89 - }
90 }; 86 };
91 87
92 const checked_visitors = ref([]); 88 const checked_visitors = ref([]);
93 const addVisitor = (item) => { 89 const addVisitor = (item) => {
94 - if (item.today) { // 今天已经预约 90 + if (item.is_reserve === '1') { // 今天已经预约
95 showToast('已预约过参观,请不要重复预约!') 91 showToast('已预约过参观,请不要重复预约!')
96 return; 92 return;
97 } 93 }
...@@ -126,13 +122,11 @@ const submitBtn = () => { ...@@ -126,13 +122,11 @@ const submitBtn = () => {
126 } 122 }
127 } 123 }
128 124
129 -onMounted(() => { 125 +onMounted(async () => {
130 - visitorList.value = [ 126 + const { code, data } = await personListAPI({ reserve_date: date, begin_time: time.split('-')[0], end_time: time.split('-')[1] });
131 - { id: '1', name: '张雨燕1', idCard: '311522190103214', today: false }, 127 + if (code) {
132 - { id: '2', name: '张雨燕2', idCard: '311522190103214279', today: true }, 128 + visitorList.value = data;
133 - { id: '3',name: '张雨燕3', idCard: '311522190103214279', today: false }, 129 + }
134 - { id: '4',name: '张雨燕4', idCard: '311522190103214279', today: false }
135 - ];
136 }); 130 });
137 </script> 131 </script>
138 132
......
...@@ -213,6 +213,11 @@ ...@@ -213,6 +213,11 @@
213 "@babel/helper-validator-identifier" "^7.22.5" 213 "@babel/helper-validator-identifier" "^7.22.5"
214 to-fast-properties "^2.0.0" 214 to-fast-properties "^2.0.0"
215 215
216 +"@code-ts/cin@^0.0.2":
217 + version "0.0.2"
218 + resolved "https://mirrors.cloud.tencent.com/npm/@code-ts/cin/-/cin-0.0.2.tgz#574a64df3e55a180ae5f12d33830e62fa6c0ccb2"
219 + integrity sha512-ZFIcwfxnYeBKAJSInmvKk3ogblkQTUUZDA1biqiEoukiAFsX3ldlQp+ZHooFIMeSYuR/32pGSNtFtgDl8TwyXQ==
220 +
216 "@colors/colors@1.5.0": 221 "@colors/colors@1.5.0":
217 version "1.5.0" 222 version "1.5.0"
218 resolved "https://mirrors.cloud.tencent.com/npm/@colors/colors/-/colors-1.5.0.tgz" 223 resolved "https://mirrors.cloud.tencent.com/npm/@colors/colors/-/colors-1.5.0.tgz"
......