hookehuyr

✨ feat(签名控件): 样式和功能调整

......@@ -31,6 +31,7 @@ declare module '@vue/runtime-core' {
NutCell: typeof import('@nutui/nutui-taro')['Cell']
NutCheckbox: typeof import('@nutui/nutui-taro')['Checkbox']
NutCheckboxGroup: typeof import('@nutui/nutui-taro')['CheckboxGroup']
NutCol: typeof import('@nutui/nutui-taro')['Col']
NutConfigProvider: typeof import('@nutui/nutui-taro')['ConfigProvider']
NutDatePicker: typeof import('@nutui/nutui-taro')['DatePicker']
NutDialog: typeof import('@nutui/nutui-taro')['Dialog']
......@@ -46,6 +47,8 @@ declare module '@vue/runtime-core' {
NutRadio: typeof import('@nutui/nutui-taro')['Radio']
NutRadioGroup: typeof import('@nutui/nutui-taro')['RadioGroup']
NutRate: typeof import('@nutui/nutui-taro')['Rate']
NutRow: typeof import('@nutui/nutui-taro')['Row']
NutSignature: typeof import('@nutui/nutui-taro')['Signature']
NutSwiper: typeof import('@nutui/nutui-taro')['Swiper']
NutSwiperItem: typeof import('@nutui/nutui-taro')['SwiperItem']
NutTextarea: typeof import('@nutui/nutui-taro')['Textarea']
......
......@@ -40,7 +40,7 @@
"@nutui/icons-vue-taro": "^0.0.9",
"@nutui/nutui-taro": "^4.0.5",
"@tarojs/components": "3.6.2",
"@tarojs/extend": "^3.6.2",
"@tarojs/extend": "3.6.2",
"@tarojs/helper": "3.6.2",
"@tarojs/plugin-framework-vue3": "3.6.2",
"@tarojs/plugin-html": "3.6.2",
......@@ -59,10 +59,13 @@
"axios-miniprogram": "^2.0.0-rc-2",
"browser-md5-file": "^1.1.1",
"dayjs": "^1.11.7",
"js-sha1": "^0.6.0",
"pinia": "2.0.10",
"taro-plugin-pinia": "^1.0.0",
"taro-plugin-style-resource": "^0.1.9",
"uuid": "^9.0.0",
"vue": "^3.0.0",
"vue-esign": "^1.1.4",
"weixin-js-sdk": "^1.6.0"
},
"devDependencies": {
......
<!--
* @Date: 2022-09-06 16:29:31
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2023-03-23 15:50:45
* @FilePath: /data-table/src/components/SignField/index.vue
* @LastEditTime: 2023-04-13 15:28:49
* @FilePath: /custom_form/src/components/SignField/index.vue
* @Description: 电子签名控件
-->
<template>
<div v-if="HideShow" class="sign-page">
<div class="label">
<span v-if="item.component_props.required">&nbsp;*</span>
<text v-if="item.component_props.required">&nbsp;*</text>
{{ item.component_props.label }}
{{ valid }}
</div>
<div ref="wrapperRef" class="esign-wrapper">
<!-- <div style="padding: 1rem; position: relative; height: 150px; background-color: #FCFCFC;border: 1px solid #EAEAEA; border-radius: 5px;"> -->
<vue-esign v-if="esignWidth" ref="esign" class="sign-wrapper" :width="esignWidth" :height="esignHeight" :isCrop="isCrop"
:lineWidth="lineWidth" :lineColor="lineColor" :bgColor.sync="bgColor" />
<div v-if="show_sign" class="whiteboard">
<div class="text" @click="startSign">
<van-icon name="edit" />&nbsp;点击开始签署电子签名
<div class="esign-wrapper">
<nut-signature v-if="show_sign" class="sign-wrapper" @confirm="confirm" @clear="clear"></nut-signature>
<div v-if="image_url">
<img :src="image_url" style="width: 100%; border: 1px solid #eaeaea; background-color: #fcfcfc;">
<nut-button color="red" @click="removeSign">删除签名</nut-button>
</div>
</div>
</div>
<div v-if="!show_sign">
<div v-if="show_control" class="control-sign">
<van-row gutter="20" style="padding: 0 1rem">
<van-col :span="12">
<van-button type="default" block @click="handleGenerate">确认签名</van-button>
</van-col>
<van-col :span="12">
<van-button type="default" block @click="cancelSign">取消签名</van-button>
</van-col>
</van-row>
</div>
<div v-else style="padding: 0 1rem">
<van-button type="danger" block @click="handleReset">删除签名</van-button>
</div>
</div>
<div v-if="show_empty" class="van-field__error-message" style="padding: 0 1rem 1rem 1rem">
<div v-if="show_empty" style="padding: 10px 20px; color: red; font-size: 12px;">
电子签名不能为空
</div>
<van-divider />
<nut-divider :style="{ color: '#ebedf0' }" />
<nut-overlay v-model:visible="loading">
<div class="wrapper" style="color: white; font-size: 15px;">
<Loading />
上传中...
</div>
<van-overlay :show="loading">
<div class="wrapper" @click.stop>
<van-loading vertical color="#FFFFFF">生成中...</van-loading>
</nut-overlay>
<nut-toast :msg="toast_msg" v-model:visible="toast_show" :type="toast_type" />
</div>
</van-overlay>
</template>
<script setup>
import Taro, { useLoad } from '@tarojs/taro'
import { ref, computed, watch, onMounted, reactive } from "vue";
import { v4 as uuidv4 } from "uuid";
import { qiniuTokenAPI, qiniuUploadAPI, saveFileAPI } from "@/api/common";
import { showSuccessToast, showFailToast } from "vant";
import { useRoute } from "vue-router";
import BMF from "browser-md5-file";
// import { showSuccessToast, showFailToast } from "vant";
import { getUrlParams } from "@/utils/tools";
import { getEtag } from "@/utils/qetag.js"; // 生成hash值
import dayjs from "dayjs";
import { Uploader, Loading, Edit } from '@nutui/icons-vue-taro';
const props = defineProps({
item: Object,
......@@ -66,33 +50,110 @@ const props = defineProps({
const HideShow = computed(() => {
return !props.item.component_props.disabled
})
const $route = useRoute();
const toast_msg = ref('');
const toast_show = ref(false);
const toast_type = ref('success');
const emit = defineEmits(["active"]);
const esign = ref(null);
const show_sign = ref(true);
let esignWidth = ref();
let esignHeight = ref();
const wrapperRef = ref(null)
onMounted(() => {
// 动态计算画板canvas宽度/高度
setTimeout(() => {
esignWidth.value = wrapperRef.value.offsetWidth - 32;
esignHeight.value = (window.innerHeight) / 5;
}, 100);
})
const lineWidth = ref(6);
const lineColor = ref("#000000");
const bgColor = ref("#FCFCFC");
const isCrop = ref(false);
const show_control = ref(true);
const image_url = ref("");
const show_empty = ref(false);
const removeSign = () => {
show_sign.value = true;
clear()
}
const handleReset = () => {
// 清空画板
esign.value.reset();
show_control.value = true;
// 确认签名回调
const confirm = async (canvas, data) => {
if (canvas === '请绘制签名') {
validSign();
return false;
}
// H5环境 只能获取canvas
if (process.env.TARO_ENV === 'h5') {
let affix = uuidv4();
let fileName = `uploadForm/${formCode}/${affix}_sign.png`;
let file = dataURLtoFile(canvas.toDataURL("image/png"), fileName); // 生成文件
const imgUrl = await handleUpload(file, fileName);
if (imgUrl) {
loading.value = false;
props.item.value = {
key: "sign",
filed_name: props.item.key,
value: { name: `电子签名${dayjs().format('YYYYMMDDHHmmss')}.png`, url: imgUrl.src},
};
image_url.value = imgUrl.src;
show_sign.value = false;
show_empty.value = false;
emit("active", props.item.value);
}
} else { // weapp 环境
if (!data) {
toast_msg.value = '生成签名失败,请稍后尝试'
toast_show.value = true;
toast_type.value = 'warn';
return false;
}
const fs = Taro.getFileSystemManager()
fs.getFileInfo({
filePath: data,
success: async (res) => {
const file_info = res;
// 获取七牛token
const filename = `uploadForm/${formCode}/${file_info.digest}_sign.png`; // 真实文件名
const getToken = await qiniuTokenAPI({
name: filename,
hash: file_info.digest,
});
// 文件上传七牛云
// 第一次上传
if (getToken.token) {
loading.value = true;
// 自拍图片上传七牛服务器
Taro.uploadFile({
url: 'https://up.qbox.me',
filePath: data,
name: `file`,
formData: {
token: getToken.token,
key: filename
},
})
.then(async (res) => {
res.data = JSON.parse(res.data);
if (res.data.filekey) {
// 保存文件
const { data } = await saveFileAPI({
name: filename,
filekey: res.data.filekey,
hash: file_info.digest,
});
// 生成图片成功
if (data.src) {
loading.value = false;
props.item.value = {
key: "sign",
filed_name: props.item.key,
value: { name: `电子签名${dayjs().format('YYYYMMDDHHmmss')}.png`, url: data.src },
};
image_url.value = data.src;
show_sign.value = false;
show_empty.value = false;
emit("active", props.item.value);
}
}
})
.catch((error) => {
console.error(error)
loading.value = false;
})
}
}
})
}
};
const clear = () => {
// 删除可能存在的签名
image_url.value = "";
props.item.value = {
......@@ -101,11 +162,14 @@ const handleReset = () => {
value: "",
};
emit("active", props.item.value);
};
}
const image_url = ref("");
const show_empty = ref(false);
/********** 上传七牛云获取图片地址 ***********/
const loading = ref(false);
const formCode = $route.query.code; // 表单code
const formCode = getUrlParams(location.href) ? getUrlParams(location.href).code : ''; // 表单code
const uuid = () => {
let s = [];
let hexDigits = "0123456789abcdef";
......@@ -169,35 +233,6 @@ const handleUpload = async (files, filename) => {
return imgUrl;
};
const handleGenerate = () => {
esign.value
.generate()
.then(async (res) => {
let affix = uuidv4();
let fileName = `uploadForm/${formCode}/${affix}_sign.png`;
let file = dataURLtoFile(res, fileName); // 生成文件
const imgUrl = await handleUpload(file, fileName);
loading.value = false;
props.item.value = {
key: "sign",
filed_name: props.item.key,
value: { name: `电子签名${dayjs().format('YYYYMMDDHHmmss')}.png`, url: imgUrl.src},
};
image_url.value = imgUrl.src;
show_control.value = false;
show_empty.value = false;
emit("active", props.item.value);
})
.catch((err) => {
loading.value = false;
// 签名生成失败
console.warn(err);
if (err) {
showFailToast("签名生成失败");
}
});
};
//将图片base64转换为文件
const dataURLtoFile = (dataurl, filename) => {
var arr = dataurl.split(","),
......@@ -211,17 +246,6 @@ const dataURLtoFile = (dataurl, filename) => {
return new File([u8arr], filename, { type: mime });
};
const show_sign = ref(true);
const startSign = () => {
show_sign.value = false;
show_empty.value = false;
};
const cancelSign = () => {
show_sign.value = true;
show_empty.value = false;
handleReset();
};
const validSign = () => {
// 必填项 未生成签名
if (props.item.component_props.required && !image_url.value) {
......@@ -235,50 +259,52 @@ const validSign = () => {
defineExpose({ validSign });
</script>
<!-- <script>
<script>
export default {
methods: {
validSign () {
console.warn(0);
}
}
mounted() {
},
}
</script> -->
</script>
<style lang="less" scoped>
<style lang="less">
.sign-page {
// padding-bottom: 1rem;
.label {
padding: 1rem 1rem 0 1rem;
font-size: 0.9rem;
margin-left: 1rem;
padding-bottom: 20px;
font-size: 26px;
font-weight: bold;
span {
text {
color: red;
}
}
.esign-wrapper {
padding: 1rem;
padding: 0 1rem;
position: relative;
box-sizing: border-box;
.sign-wrapper {
border: 1px solid #eaeaea;
// border: 1px solid #eaeaea;
border-radius: 5px;
}
.nut-signature-inner {
background: #fcfcfc !important;
}
.whiteboard {
position: absolute;
height: 100%;
width: 100%;
left: 50%;
top: 50%;
top: 40%;
transform: translate(-50%, -50%);
text-align: center;
.text {
font-size: 28px;
position: absolute;
width: 100%;
top: 50%;
......
......@@ -12,7 +12,7 @@ import ImageUploaderField from '@/components/ImageUploaderField/index.vue'
import FileUploaderField from '@/components/FileUploaderField/index.vue'
import PhoneField from '@/components/PhoneField/index.vue'
import EmailField from '@/components/EmailField/index.vue'
// import SignField from '@/components/SignField/index.vue'
import SignField from '@/components/SignField/index.vue'
import RatePickerField from '@/components/RatePickerField/index.vue'
// import CalendarField from '@/components/CalendarField/index.vue'
import IdentityField from '@/components/IdentityField/index.vue'
......@@ -119,10 +119,10 @@ export function createComponentType(data) {
item.name = item.key
item.component = EmailField
}
// if (item.component_props.tag === 'sign') {
// item.name = item.key
// item.component = SignField
// }
if (item.component_props.tag === 'sign') {
item.name = item.key
item.component = SignField
}
if (item.component_props.tag === 'rate') {
item.name = item.key
item.component = RatePickerField
......
......@@ -22,13 +22,20 @@
dependencies:
"@babel/highlight" "7.0.0-beta.44"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.44", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.18.6":
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6":
version "7.18.6"
resolved "https://mirrors.cloud.tencent.com/npm/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/code-frame@^7.0.0-beta.44", "@babel/code-frame@^7.14.5":
version "7.21.4"
resolved "https://mirrors.cloud.tencent.com/npm/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39"
integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==
dependencies:
"@babel/highlight" "^7.18.6"
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5":
version "7.21.0"
resolved "https://mirrors.cloud.tencent.com/npm/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298"
......@@ -340,6 +347,11 @@
resolved "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3"
integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==
"@babel/parser@^7.18.4":
version "7.21.4"
resolved "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17"
integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
version "7.18.6"
resolved "https://mirrors.cloud.tencent.com/npm/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
......@@ -1633,7 +1645,7 @@
swiper "6.8.0"
weui "^1.1.2"
"@tarojs/extend@^3.6.2":
"@tarojs/extend@3.6.2":
version "3.6.2"
resolved "https://mirrors.cloud.tencent.com/npm/@tarojs/extend/-/extend-3.6.2.tgz#f7badc3e322b76b616e10194f030cd5126ce4a6a"
integrity sha512-lKClhLFk9CPfT2z+djdzX4dBr3KLCzVystjC4KnZ00EAW7j6DlyiudwVUXmPwHAyEkq7n99qKZBy/lWQ3+p+cw==
......@@ -2321,6 +2333,15 @@
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-sfc@2.7.14":
version "2.7.14"
resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz#3446fd2fbb670d709277fc3ffa88efc5e10284fd"
integrity sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==
dependencies:
"@babel/parser" "^7.18.4"
postcss "^8.4.14"
source-map "^0.6.1"
"@vue/compiler-sfc@3.2.47", "@vue/compiler-sfc@^3.0.0", "@vue/compiler-sfc@^3.0.5":
version "3.2.47"
resolved "https://mirrors.cloud.tencent.com/npm/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d"
......@@ -3997,7 +4018,12 @@ cli-highlight@^2.1.4:
parse5-htmlparser2-tree-adapter "^6.0.0"
yargs "^16.0.0"
cli-spinners@^2.2.0, cli-spinners@^2.5.0:
cli-spinners@^2.2.0:
version "2.8.0"
resolved "https://mirrors.cloud.tencent.com/npm/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc"
integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==
cli-spinners@^2.5.0:
version "2.7.0"
resolved "https://mirrors.cloud.tencent.com/npm/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a"
integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==
......@@ -4599,6 +4625,11 @@ csstype@^2.6.8:
resolved "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e"
integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
csstype@^3.1.0:
version "3.1.2"
resolved "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
cuint@^0.2.2:
version "0.2.2"
resolved "https://mirrors.cloud.tencent.com/npm/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
......@@ -7418,6 +7449,13 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
is-core-module@^2.11.0:
version "2.12.0"
resolved "https://mirrors.cloud.tencent.com/npm/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4"
integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==
dependencies:
has "^1.0.3"
is-core-module@^2.4.0, is-core-module@^2.5.0, is-core-module@^2.9.0:
version "2.11.0"
resolved "https://mirrors.cloud.tencent.com/npm/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
......@@ -7898,6 +7936,11 @@ js-sdsl@^4.1.4:
resolved "https://mirrors.cloud.tencent.com/npm/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430"
integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==
js-sha1@^0.6.0:
version "0.6.0"
resolved "https://mirrors.cloud.tencent.com/npm/js-sha1/-/js-sha1-0.6.0.tgz#adbee10f0e8e18aa07cdea807cf08e9183dbc7f9"
integrity sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==
js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://mirrors.cloud.tencent.com/npm/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
......@@ -9287,9 +9330,9 @@ num2fraction@^1.2.2:
integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
nwsapi@^2.2.0:
version "2.2.2"
resolved "https://mirrors.cloud.tencent.com/npm/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0"
integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==
version "2.2.3"
resolved "https://mirrors.cloud.tencent.com/npm/nwsapi/-/nwsapi-2.2.3.tgz#00e04dfd5a4a751e5ec2fecdc75dfd2f0db820fa"
integrity sha512-jscxIO4/VKScHlbmFBdV1Z6LXnLO+ZR4VMtypudUdfwtKxUN3TQcNFIHLwKtrUbDyHN4/GycY9+oRGZ2XMXYPw==
oauth-sign@~0.9.0:
version "0.9.0"
......@@ -10323,7 +10366,7 @@ postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.23, postcss@^7.0.32, postcss@^7.0.
picocolors "^0.2.1"
source-map "^0.6.1"
postcss@^8.1.10, postcss@^8.3.5, postcss@^8.4.18, postcss@^8.4.19:
postcss@^8.1.10, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.18, postcss@^8.4.19:
version "8.4.21"
resolved "https://mirrors.cloud.tencent.com/npm/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4"
integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==
......@@ -10368,9 +10411,9 @@ prettier@^1.14.2:
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
prettier@^2.7.1:
version "2.8.6"
resolved "https://mirrors.cloud.tencent.com/npm/prettier/-/prettier-2.8.6.tgz#5c174b29befd507f14b83e3c19f83fdc0e974b71"
integrity sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ==
version "2.8.7"
resolved "https://mirrors.cloud.tencent.com/npm/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450"
integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==
pretty-bytes@^5.3.0:
version "5.6.0"
......@@ -10962,7 +11005,16 @@ resolve-url@^0.2.1:
resolved "https://mirrors.cloud.tencent.com/npm/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.22.0, resolve@^1.22.1:
resolve@^1.1.6:
version "1.22.2"
resolved "https://mirrors.cloud.tencent.com/npm/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
dependencies:
is-core-module "^2.11.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.22.0, resolve@^1.22.1:
version "1.22.1"
resolved "https://mirrors.cloud.tencent.com/npm/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
......@@ -12776,6 +12828,11 @@ uuid@^8.3.2:
resolved "https://mirrors.cloud.tencent.com/npm/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
uuid@^9.0.0:
version "9.0.0"
resolved "https://mirrors.cloud.tencent.com/npm/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://mirrors.cloud.tencent.com/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
......@@ -12856,6 +12913,13 @@ vue-demi@*:
resolved "https://mirrors.cloud.tencent.com/npm/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99"
integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==
vue-esign@^1.1.4:
version "1.1.4"
resolved "https://mirrors.cloud.tencent.com/npm/vue-esign/-/vue-esign-1.1.4.tgz#3e0cc2b72c3ef5914822929193f6a9ddeb775b3a"
integrity sha512-7Ix5PdcyyhVfsvrT9a+yp5+36gbQ0/bpDO+QSLT58IgJ5t164PEptOy5Nslw8bZbk3n3Hc7SP5B8eXQ8X8W+OA==
dependencies:
vue "^2.5.11"
vue-eslint-parser@^8.0.1:
version "8.3.0"
resolved "https://mirrors.cloud.tencent.com/npm/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"
......@@ -12878,6 +12942,14 @@ vue-loader@^17.0.0:
hash-sum "^2.0.0"
loader-utils "^2.0.0"
vue@^2.5.11:
version "2.7.14"
resolved "https://mirrors.cloud.tencent.com/npm/vue/-/vue-2.7.14.tgz#3743dcd248fd3a34d421ae456b864a0246bafb17"
integrity sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==
dependencies:
"@vue/compiler-sfc" "2.7.14"
csstype "^3.1.0"
vue@^3.0.0:
version "3.2.47"
resolved "https://mirrors.cloud.tencent.com/npm/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0"
......