Commit 3bd06417 authored by zhanglongbao's avatar zhanglongbao

Initial commit

parents
Pipeline #644 canceled with stages
# 接口域名
VITE_APP_BASE_URL = 'http://work-order-test.linanquan.com'
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
{
"htmlWhitespaceSensitivity": "strict",
"bracketSameLine": true,
"tabWidth": 4
}
# Vue 3 + TypeScript + Vite
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about the recommended Project Setup and IDE Support in the [Vue Docs TypeScript Guide](https://vuejs.org/guide/typescript/overview.html#project-setup).
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
}
/* eslint-disable */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {}
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
Avatar: typeof import('./src/components/avatar/index.vue')['default']
copy: typeof import('./src/components/widget/field/input copy/index.vue')['default']
Date_time: typeof import('./src/components/widget/field/date_time/index.vue')['default']
Date_time_range: typeof import('./src/components/widget/field/date_time_range/index.vue')['default']
Dd: typeof import('./src/components/name/dd.vue')['default']
Dept: typeof import('./src/components/widget/field/dept/index.vue')['default']
File: typeof import('./src/components/widget/field/file/index.vue')['default']
Image: typeof import('./src/components/widget/field/image/index.vue')['default']
Input: typeof import('./src/components/widget/field/input/index.vue')['default']
Multiline: typeof import('./src/components/widget/field/multiline/index.vue')['default']
Name: typeof import('./src/components/name/index.vue')['default']
Number: typeof import('./src/components/widget/field/number/index.vue')['default']
Parting_line: typeof import('./src/components/widget/field/parting_line/index.vue')['default']
Popup: typeof import('./src/components/popup/index.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
Select: typeof import('./src/components/select/index.vue')['default']
Select_time: typeof import('./src/components/select_time/index.vue')['default']
Select_user_dept: typeof import('./src/components/select_user_dept/index.vue')['default']
Single_choice: typeof import('./src/components/widget/field/single_choice/index.vue')['default']
User: typeof import('./src/components/widget/field/user/index.vue')['default']
User_dept_list: typeof import('./src/components/user_dept_list/index.vue')['default']
User_list: typeof import('./src/components/user_list/index.vue')['default']
VanButton: typeof import('vant/es')['Button']
VanCheckbox: typeof import('vant/es')['Checkbox']
VanDatePicker: typeof import('vant/es')['DatePicker']
VanPicker: typeof import('vant/es')['Picker']
VanPopup: typeof import('vant/es')['Popup']
VanStepper: typeof import('vant/es')['Stepper']
VanTimePicker: typeof import('vant/es')['TimePicker']
Widget: typeof import('./src/components/widget/index.vue')['default']
Wx: typeof import('./src/components/name/wx.vue')['default']
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
{
"name": "jisu_gongdan_phone",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
},
"dependencies": {
"axios": "^1.7.5",
"dingtalk-jsapi": "^3.0.38",
"pinia": "^2.2.2",
"smooth-signature": "^1.0.15",
"vant": "^4.9.4",
"vue": "^3.4.37",
"vue-router": "^4.4.3"
},
"devDependencies": {
"@types/node": "^22.5.0",
"@types/sortablejs": "^1.15.8",
"@vant/auto-import-resolver": "^1.2.1",
"@vitejs/plugin-vue": "^5.1.2",
"less": "^4.2.0",
"typescript": "^5.5.3",
"unplugin-auto-import": "^0.18.2",
"unplugin-vue-components": "^0.27.4",
"vite": "^5.4.1",
"vue-tsc": "^2.0.29"
}
}
lockfileVersion: '6.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
dependencies:
axios:
specifier: ^1.7.5
version: 1.7.5
dingtalk-jsapi:
specifier: ^3.0.38
version: 3.0.38
pinia:
specifier: ^2.2.2
version: 2.2.2(typescript@5.5.4)(vue@3.4.38)
smooth-signature:
specifier: ^1.0.15
version: 1.0.15
vant:
specifier: ^4.9.4
version: 4.9.4(vue@3.4.38)
vue:
specifier: ^3.4.37
version: 3.4.38(typescript@5.5.4)
vue-router:
specifier: ^4.4.3
version: 4.4.3(vue@3.4.38)
devDependencies:
'@types/node':
specifier: ^22.5.0
version: 22.5.0
'@types/sortablejs':
specifier: ^1.15.8
version: 1.15.8
'@vant/auto-import-resolver':
specifier: ^1.2.1
version: 1.2.1
'@vitejs/plugin-vue':
specifier: ^5.1.2
version: 5.1.2(vite@5.4.2)(vue@3.4.38)
less:
specifier: ^4.2.0
version: 4.2.0
typescript:
specifier: ^5.5.3
version: 5.5.4
unplugin-auto-import:
specifier: ^0.18.2
version: 0.18.2
unplugin-vue-components:
specifier: ^0.27.4
version: 0.27.4(vue@3.4.38)
vite:
specifier: ^5.4.1
version: 5.4.2(@types/node@22.5.0)(less@4.2.0)
vue-tsc:
specifier: ^2.0.29
version: 2.0.29(typescript@5.5.4)
packages:
/@antfu/utils@0.7.10:
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
dev: true
/@babel/helper-string-parser@7.24.8:
resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
engines: {node: '>=6.9.0'}
/@babel/helper-validator-identifier@7.24.7:
resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
engines: {node: '>=6.9.0'}
/@babel/parser@7.25.4:
resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.25.4
/@babel/types@7.25.4:
resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-string-parser': 7.24.8
'@babel/helper-validator-identifier': 7.24.7
to-fast-properties: 2.0.0
/@esbuild/aix-ppc64@0.21.5:
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [aix]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm64@0.21.5:
resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-arm@0.21.5:
resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
engines: {node: '>=12'}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/android-x64@0.21.5:
resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-arm64@0.21.5:
resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/darwin-x64@0.21.5:
resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-arm64@0.21.5:
resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/freebsd-x64@0.21.5:
resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm64@0.21.5:
resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-arm@0.21.5:
resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ia32@0.21.5:
resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-loong64@0.21.5:
resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
engines: {node: '>=12'}
cpu: [loong64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-mips64el@0.21.5:
resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-ppc64@0.21.5:
resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-riscv64@0.21.5:
resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-s390x@0.21.5:
resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/linux-x64@0.21.5:
resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@esbuild/netbsd-x64@0.21.5:
resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/openbsd-x64@0.21.5:
resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
requiresBuild: true
dev: true
optional: true
/@esbuild/sunos-x64@0.21.5:
resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-arm64@0.21.5:
resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-ia32@0.21.5:
resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@esbuild/win32-x64@0.21.5:
resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@jridgewell/sourcemap-codec@1.5.0:
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.stat': 2.0.5
run-parallel: 1.2.0
dev: true
/@nodelib/fs.stat@2.0.5:
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
engines: {node: '>= 8'}
dev: true
/@nodelib/fs.walk@1.2.8:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
dev: true
/@rollup/pluginutils@5.1.0:
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
'@types/estree': 1.0.5
estree-walker: 2.0.2
picomatch: 2.3.1
dev: true
/@rollup/rollup-android-arm-eabi@4.21.0:
resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==}
cpu: [arm]
os: [android]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-android-arm64@4.21.0:
resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==}
cpu: [arm64]
os: [android]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-darwin-arm64@4.21.0:
resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-darwin-x64@4.21.0:
resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-arm-gnueabihf@4.21.0:
resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==}
cpu: [arm]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-arm-musleabihf@4.21.0:
resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==}
cpu: [arm]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-arm64-gnu@4.21.0:
resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-arm64-musl@4.21.0:
resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==}
cpu: [arm64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-powerpc64le-gnu@4.21.0:
resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-riscv64-gnu@4.21.0:
resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-s390x-gnu@4.21.0:
resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==}
cpu: [s390x]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-x64-gnu@4.21.0:
resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==}
cpu: [x64]
os: [linux]
libc: [glibc]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-linux-x64-musl@4.21.0:
resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==}
cpu: [x64]
os: [linux]
libc: [musl]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-win32-arm64-msvc@4.21.0:
resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-win32-ia32-msvc@4.21.0:
resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@rollup/rollup-win32-x64-msvc@4.21.0:
resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@types/estree@1.0.5:
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
dev: true
/@types/node@22.5.0:
resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==}
dependencies:
undici-types: 6.19.8
dev: true
/@types/sortablejs@1.15.8:
resolution: {integrity: sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==}
dev: true
/@vant/auto-import-resolver@1.2.1:
resolution: {integrity: sha512-czGWW4UolNITkF3qQSQlpHDHAsI3/GHVKbRMmEEpry7NWdnU4p5a5jBi0VApbaLa5g80Hy10XVs3IB+UozoSUw==}
dev: true
/@vant/popperjs@1.3.0:
resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==}
dev: false
/@vant/use@1.6.0(vue@3.4.38):
resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==}
peerDependencies:
vue: ^3.0.0
dependencies:
vue: 3.4.38(typescript@5.5.4)
dev: false
/@vitejs/plugin-vue@5.1.2(vite@5.4.2)(vue@3.4.38):
resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==}
engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies:
vite: ^5.0.0
vue: ^3.2.25
dependencies:
vite: 5.4.2(@types/node@22.5.0)(less@4.2.0)
vue: 3.4.38(typescript@5.5.4)
dev: true
/@volar/language-core@2.4.0:
resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==}
dependencies:
'@volar/source-map': 2.4.0
dev: true
/@volar/source-map@2.4.0:
resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==}
dev: true
/@volar/typescript@2.4.0:
resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==}
dependencies:
'@volar/language-core': 2.4.0
path-browserify: 1.0.1
vscode-uri: 3.0.8
dev: true
/@vue/compiler-core@3.4.38:
resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==}
dependencies:
'@babel/parser': 7.25.4
'@vue/shared': 3.4.38
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.2.0
/@vue/compiler-dom@3.4.38:
resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==}
dependencies:
'@vue/compiler-core': 3.4.38
'@vue/shared': 3.4.38
/@vue/compiler-sfc@3.4.38:
resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==}
dependencies:
'@babel/parser': 7.25.4
'@vue/compiler-core': 3.4.38
'@vue/compiler-dom': 3.4.38
'@vue/compiler-ssr': 3.4.38
'@vue/shared': 3.4.38
estree-walker: 2.0.2
magic-string: 0.30.11
postcss: 8.4.41
source-map-js: 1.2.0
/@vue/compiler-ssr@3.4.38:
resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==}
dependencies:
'@vue/compiler-dom': 3.4.38
'@vue/shared': 3.4.38
/@vue/compiler-vue2@2.7.16:
resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
dependencies:
de-indent: 1.0.2
he: 1.2.0
dev: true
/@vue/devtools-api@6.6.3:
resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==}
dev: false
/@vue/language-core@2.0.29(typescript@5.5.4):
resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@volar/language-core': 2.4.0
'@vue/compiler-dom': 3.4.38
'@vue/compiler-vue2': 2.7.16
'@vue/shared': 3.4.38
computeds: 0.0.1
minimatch: 9.0.5
muggle-string: 0.4.1
path-browserify: 1.0.1
typescript: 5.5.4
dev: true
/@vue/reactivity@3.4.38:
resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==}
dependencies:
'@vue/shared': 3.4.38
/@vue/runtime-core@3.4.38:
resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==}
dependencies:
'@vue/reactivity': 3.4.38
'@vue/shared': 3.4.38
/@vue/runtime-dom@3.4.38:
resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==}
dependencies:
'@vue/reactivity': 3.4.38
'@vue/runtime-core': 3.4.38
'@vue/shared': 3.4.38
csstype: 3.1.3
/@vue/server-renderer@3.4.38(vue@3.4.38):
resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==}
peerDependencies:
vue: 3.4.38
dependencies:
'@vue/compiler-ssr': 3.4.38
'@vue/shared': 3.4.38
vue: 3.4.38(typescript@5.5.4)
/@vue/shared@3.4.38:
resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==}
/acorn@8.12.1:
resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
engines: {node: '>=0.4.0'}
hasBin: true
dev: true
/anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'}
dependencies:
normalize-path: 3.0.0
picomatch: 2.3.1
dev: true
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: false
/axios@1.7.5:
resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==}
dependencies:
follow-redirects: 1.15.6
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
/balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'}
dev: true
/brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
dev: true
/braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
dependencies:
fill-range: 7.1.1
dev: true
/chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
dependencies:
anymatch: 3.1.3
braces: 3.0.3
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.3
dev: true
/combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: false
/computeds@0.0.1:
resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
dev: true
/confbox@0.1.7:
resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==}
dev: true
/copy-anything@2.0.6:
resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
dependencies:
is-what: 3.14.1
dev: true
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
/de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
dev: true
/debug@4.3.6:
resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.1.2
dev: true
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: false
/dingtalk-jsapi@3.0.38:
resolution: {integrity: sha512-Hm77aRq2k3KPyBF0lGi0Nk9qjdABF0fp+m4gsnEKGJ+0Iyu+rimwfxkRSjFd/HF2OvFbYVNBOKhqj9NitC46ig==}
dependencies:
promise-polyfill: 7.1.2
dev: false
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
/errno@0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true
requiresBuild: true
dependencies:
prr: 1.0.1
dev: true
optional: true
/esbuild@0.21.5:
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@esbuild/aix-ppc64': 0.21.5
'@esbuild/android-arm': 0.21.5
'@esbuild/android-arm64': 0.21.5
'@esbuild/android-x64': 0.21.5
'@esbuild/darwin-arm64': 0.21.5
'@esbuild/darwin-x64': 0.21.5
'@esbuild/freebsd-arm64': 0.21.5
'@esbuild/freebsd-x64': 0.21.5
'@esbuild/linux-arm': 0.21.5
'@esbuild/linux-arm64': 0.21.5
'@esbuild/linux-ia32': 0.21.5
'@esbuild/linux-loong64': 0.21.5
'@esbuild/linux-mips64el': 0.21.5
'@esbuild/linux-ppc64': 0.21.5
'@esbuild/linux-riscv64': 0.21.5
'@esbuild/linux-s390x': 0.21.5
'@esbuild/linux-x64': 0.21.5
'@esbuild/netbsd-x64': 0.21.5
'@esbuild/openbsd-x64': 0.21.5
'@esbuild/sunos-x64': 0.21.5
'@esbuild/win32-arm64': 0.21.5
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
dev: true
/escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
dev: true
/estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
/estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
dependencies:
'@types/estree': 1.0.5
dev: true
/fast-glob@3.3.2:
resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
engines: {node: '>=8.6.0'}
dependencies:
'@nodelib/fs.stat': 2.0.5
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
micromatch: 4.0.8
dev: true
/fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
dependencies:
reusify: 1.0.4
dev: true
/fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
dependencies:
to-regex-range: 5.0.1
dev: true
/follow-redirects@1.15.6:
resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/form-data@4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
dependencies:
is-glob: 4.0.3
dev: true
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
requiresBuild: true
dev: true
optional: true
/he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
dev: true
/iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
requiresBuild: true
dependencies:
safer-buffer: 2.1.2
dev: true
optional: true
/image-size@0.5.5:
resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
engines: {node: '>=0.10.0'}
hasBin: true
requiresBuild: true
dev: true
optional: true
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
dependencies:
binary-extensions: 2.3.0
dev: true
/is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
dev: true
/is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
dependencies:
is-extglob: 2.1.1
dev: true
/is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
dev: true
/is-what@3.14.1:
resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
dev: true
/js-tokens@9.0.0:
resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
dev: true
/less@4.2.0:
resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==}
engines: {node: '>=6'}
hasBin: true
dependencies:
copy-anything: 2.0.6
parse-node-version: 1.0.1
tslib: 2.7.0
optionalDependencies:
errno: 0.1.8
graceful-fs: 4.2.11
image-size: 0.5.5
make-dir: 2.1.0
mime: 1.6.0
needle: 3.3.1
source-map: 0.6.1
dev: true
/local-pkg@0.5.0:
resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
engines: {node: '>=14'}
dependencies:
mlly: 1.7.1
pkg-types: 1.2.0
dev: true
/magic-string@0.30.11:
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
/make-dir@2.1.0:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
requiresBuild: true
dependencies:
pify: 4.0.1
semver: 5.7.2
dev: true
optional: true
/merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
dev: true
/micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
dependencies:
braces: 3.0.3
picomatch: 2.3.1
dev: true
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
dev: false
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
dev: false
/mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
hasBin: true
requiresBuild: true
dev: true
optional: true
/minimatch@9.0.5:
resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
brace-expansion: 2.0.1
dev: true
/mlly@1.7.1:
resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==}
dependencies:
acorn: 8.12.1
pathe: 1.1.2
pkg-types: 1.2.0
ufo: 1.5.4
dev: true
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
/muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
dev: true
/nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
/needle@3.3.1:
resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
engines: {node: '>= 4.4.x'}
hasBin: true
requiresBuild: true
dependencies:
iconv-lite: 0.6.3
sax: 1.4.1
dev: true
optional: true
/normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
dev: true
/parse-node-version@1.0.1:
resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
engines: {node: '>= 0.10'}
dev: true
/path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
dev: true
/pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
dev: true
/picocolors@1.0.1:
resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
dev: true
/pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
requiresBuild: true
dev: true
optional: true
/pinia@2.2.2(typescript@5.5.4)(vue@3.4.38):
resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==}
peerDependencies:
'@vue/composition-api': ^1.4.0
typescript: '>=4.4.4'
vue: ^2.6.14 || ^3.3.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
typescript:
optional: true
dependencies:
'@vue/devtools-api': 6.6.3
typescript: 5.5.4
vue: 3.4.38(typescript@5.5.4)
vue-demi: 0.14.10(vue@3.4.38)
dev: false
/pkg-types@1.2.0:
resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==}
dependencies:
confbox: 0.1.7
mlly: 1.7.1
pathe: 1.1.2
dev: true
/postcss@8.4.41:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.7
picocolors: 1.0.1
source-map-js: 1.2.0
/promise-polyfill@7.1.2:
resolution: {integrity: sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ==}
dev: false
/proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: false
/prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
requiresBuild: true
dev: true
optional: true
/queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
dev: true
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
dependencies:
picomatch: 2.3.1
dev: true
/reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true
/rollup@4.21.0:
resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
dependencies:
'@types/estree': 1.0.5
optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.21.0
'@rollup/rollup-android-arm64': 4.21.0
'@rollup/rollup-darwin-arm64': 4.21.0
'@rollup/rollup-darwin-x64': 4.21.0
'@rollup/rollup-linux-arm-gnueabihf': 4.21.0
'@rollup/rollup-linux-arm-musleabihf': 4.21.0
'@rollup/rollup-linux-arm64-gnu': 4.21.0
'@rollup/rollup-linux-arm64-musl': 4.21.0
'@rollup/rollup-linux-powerpc64le-gnu': 4.21.0
'@rollup/rollup-linux-riscv64-gnu': 4.21.0
'@rollup/rollup-linux-s390x-gnu': 4.21.0
'@rollup/rollup-linux-x64-gnu': 4.21.0
'@rollup/rollup-linux-x64-musl': 4.21.0
'@rollup/rollup-win32-arm64-msvc': 4.21.0
'@rollup/rollup-win32-ia32-msvc': 4.21.0
'@rollup/rollup-win32-x64-msvc': 4.21.0
fsevents: 2.3.3
dev: true
/run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
dependencies:
queue-microtask: 1.2.3
dev: true
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
requiresBuild: true
dev: true
optional: true
/sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
requiresBuild: true
dev: true
optional: true
/scule@1.3.0:
resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
dev: true
/semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
requiresBuild: true
dev: true
optional: true
/semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
dev: true
/smooth-signature@1.0.15:
resolution: {integrity: sha512-YmoDJxUHo22ITgavyw1LEld8kpACzNS3uZuXey6D73rSSWq5S3oAAt3wJ7K60s9CdmUhrPG1myHE0i/N9LI31Q==}
dev: false
/source-map-js@1.2.0:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
requiresBuild: true
dev: true
optional: true
/strip-literal@2.1.0:
resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
dependencies:
js-tokens: 9.0.0
dev: true
/to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
dependencies:
is-number: 7.0.0
dev: true
/tslib@2.7.0:
resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
dev: true
/typescript@5.5.4:
resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==}
engines: {node: '>=14.17'}
hasBin: true
/ufo@1.5.4:
resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
dev: true
/undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
dev: true
/unimport@3.11.1:
resolution: {integrity: sha512-DuB1Uoq01LrrXTScxnwOoMSlTXxyKcULguFxbLrMDFcE/CO0ZWHpEiyhovN0mycPt7K6luAHe8laqvwvuoeUPg==}
dependencies:
'@rollup/pluginutils': 5.1.0
acorn: 8.12.1
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
mlly: 1.7.1
pathe: 1.1.2
pkg-types: 1.2.0
scule: 1.3.0
strip-literal: 2.1.0
unplugin: 1.12.2
transitivePeerDependencies:
- rollup
dev: true
/unplugin-auto-import@0.18.2:
resolution: {integrity: sha512-Dwb3rAic75harVBrVjwiq6H24PT+nBq2dpxV5BH8NNI6sDFaTytvP+iyo4xy7prQbR3r5K6nMs4f5Wp9PE4g8A==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': ^3.2.2
'@vueuse/core': '*'
peerDependenciesMeta:
'@nuxt/kit':
optional: true
'@vueuse/core':
optional: true
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
minimatch: 9.0.5
unimport: 3.11.1
unplugin: 1.12.2
transitivePeerDependencies:
- rollup
dev: true
/unplugin-vue-components@0.27.4(vue@3.4.38):
resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==}
engines: {node: '>=14'}
peerDependencies:
'@babel/parser': ^7.15.8
'@nuxt/kit': ^3.2.2
vue: 2 || 3
peerDependenciesMeta:
'@babel/parser':
optional: true
'@nuxt/kit':
optional: true
dependencies:
'@antfu/utils': 0.7.10
'@rollup/pluginutils': 5.1.0
chokidar: 3.6.0
debug: 4.3.6
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.11
minimatch: 9.0.5
mlly: 1.7.1
unplugin: 1.12.2
vue: 3.4.38(typescript@5.5.4)
transitivePeerDependencies:
- rollup
- supports-color
dev: true
/unplugin@1.12.2:
resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==}
engines: {node: '>=14.0.0'}
dependencies:
acorn: 8.12.1
chokidar: 3.6.0
webpack-sources: 3.2.3
webpack-virtual-modules: 0.6.2
dev: true
/vant@4.9.4(vue@3.4.38):
resolution: {integrity: sha512-dUu3yopMf2a6MkrdBWxGfDIcHmSs/ULgvBkBcfK8gE29QZ/A6kFyhnUzcMU2yklMGUUwAygzx44TPEfhp7hkfQ==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@vant/popperjs': 1.3.0
'@vant/use': 1.6.0(vue@3.4.38)
'@vue/shared': 3.4.38
vue: 3.4.38(typescript@5.5.4)
dev: false
/vite@5.4.2(@types/node@22.5.0)(less@4.2.0):
resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
'@types/node': ^18.0.0 || >=20.0.0
less: '*'
lightningcss: ^1.21.0
sass: '*'
sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
peerDependenciesMeta:
'@types/node':
optional: true
less:
optional: true
lightningcss:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
dependencies:
'@types/node': 22.5.0
esbuild: 0.21.5
less: 4.2.0
postcss: 8.4.41
rollup: 4.21.0
optionalDependencies:
fsevents: 2.3.3
dev: true
/vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
dev: true
/vue-demi@0.14.10(vue@3.4.38):
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.4.38(typescript@5.5.4)
dev: false
/vue-router@4.4.3(vue@3.4.38):
resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==}
peerDependencies:
vue: ^3.2.0
dependencies:
'@vue/devtools-api': 6.6.3
vue: 3.4.38(typescript@5.5.4)
dev: false
/vue-tsc@2.0.29(typescript@5.5.4):
resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
dependencies:
'@volar/typescript': 2.4.0
'@vue/language-core': 2.0.29(typescript@5.5.4)
semver: 7.6.3
typescript: 5.5.4
dev: true
/vue@3.4.38(typescript@5.5.4):
resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@vue/compiler-dom': 3.4.38
'@vue/compiler-sfc': 3.4.38
'@vue/runtime-dom': 3.4.38
'@vue/server-renderer': 3.4.38(vue@3.4.38)
'@vue/shared': 3.4.38
typescript: 5.5.4
/webpack-sources@3.2.3:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
engines: {node: '>=10.13.0'}
dev: true
/webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
dev: true
<template>
<router-view v-slot="{ Component }">
<component :is="Component" />
</router-view>
</template>
<script setup lang="ts"></script>
<style lang="less" scoped></style>
import axios from "axios";
import { getToken, getUrlKey } from "@/utils/public";
import { login } from "@/utils/container/index";
import { showToast } from "vant";
const http = axios.create({
baseURL: "/api",
timeout: 5000,
});
http.interceptors.request.use((config) => {
const token = getToken();
config.data = {
arg: {
...(config.data || {}),
token,
},
meta: {
app_id: getUrlKey("corp_id") || undefined,
},
};
return config;
});
http.interceptors.response.use((response) => {
if (response.status == 200) {
if (response.data.code == 1000) {
showToast({ message: "登陆过期", position: "top" });
login();
}
if (![0, 1000].includes(response.data.code)) {
showToast({ message: response.data.msg, position: "top" });
}
return response.data;
}
});
interface ResponseData {
code: number;
msg: string;
data: any;
}
export default {
post(...params: any[]): Promise<ResponseData> {
return http.post.apply(null, params as any) as Promise<ResponseData>;
},
};
import platform from "./methods/platform";
import user from "./methods/user";
import system from "./methods/system";
import form from "./methods/form";
import customer from "./methods/customer";
import product from "./methods/product";
import oss from "./methods/oss";
import order from "./methods/order";
import log from "./methods/log";
import power from "./methods/power";
export default {
platform,
user,
system,
form,
customer,
product,
oss,
order,
log,
power,
};
import http from "../axios";
interface CustomerList {
page: number;
size: number;
form_id: string;
labels?: string[];
key_word?: string;
where?: string;
ids?: string[];
}
export default {
// 客户标签
listCustomerLabel() {
return http.post("/order.customer/listCustomerLabel");
},
// 删除客户标签
deleteCustomerLabel(params: { ids: string[] }) {
return http.post("/order.customer/deleteCustomerLabel", params);
},
// 添加客户标签
saveCustomLabel(params: {
label_name: string;
label_color: string;
label_icon: string;
}) {
return http.post("/order.customer/saveCustomLabel", params);
},
// 新建/修改客户
saveCustomInfo(params: any) {
return http.post("/order.customer/saveCustomInfo", params);
},
// 客户列表
listCustomInfo(params: CustomerList) {
return http.post("/order.customer/listCustomInfo", params);
},
// 删除客户
deleteCustomInfo(params: { ids: string[]; form_id: string }) {
return http.post("/order.customer/deleteCustomInfo", params);
},
// 客户统计
getCustomCount(params: { form_id: string }) {
return http.post("/order.customer/getCustomCount", params);
},
// 客户详情
CustomDetail(params: { id: string; form_id: string }) {
return http.post("/order.customer/CustomDetail", params);
},
// 客户关联的产品
getCustomerProducts(params: { customer_id: string; form_id: string }) {
return http.post("/order.customer/getCustomerProducts", params);
},
// 客户日志
getCustomerLog(params: { id: string; form_id: string }) {
return http.post("/order.log/getCustomerLog", params);
},
// 获取客户配置
getCompanyCustomer() {
return http.post("/order.customer/getCompanyCustomer");
},
// 修改客户配置
setCompanyCustomer(params: any) {
return http.post("/order.customer/setCompanyCustomer", params);
},
};
import http from "../axios";
export default {
// 获取表单类型列表
TemplateLists(params: { template_type?: number[]; form_ids?: string[] }) {
return http.post("/order.form/TemplateLists", params);
},
// 获取工单类类型详情
FormDetail(params: { id: string }) {
return http.post("/order.form/FromDetail", params);
},
// 更新表单
FormUpdate(params: { form_ids: string[] }) {
return http.post("/order.form/FormUpdate", { cover: 1, ...params });
},
// 更新所有表单
UpdateCompanyForm() {
return http.post("/order.form/UpdateCompanyForm", { cover: 1 });
},
// 修改表单
TemplateEdit(params: FormDetail) {
return http.post("/order.form/formAdd", params);
},
// 表单禁用/启用
DisableTemplate(params: { id: string; action_type: 1 | 2 }) {
return http.post("/order.form/DisableTemplate", params);
},
// 获取form_id对应的表单数据
GetFormData(params: { form_id: string; page: number; size: number }) {
return http.post("/order.form/GetFormData", params);
},
// 获取省市区地址
GetAddress() {
return http.post("/order.form/GetAddress");
},
// 获取表单工作流
listFlowNode(params: { form_id: string }) {
return http.post("/order.form/listFlowNode", params);
},
// 修改表单工作流
updateFlowNode(params: { form_id: string; data: any[] }) {
return http.post("/order.form/updateFlowNode", params);
},
};
import http from "../axios";
export default {
// 查询日志列表
getLogById(params: any) {
return http.post("/order.log/getLogById", params);
},
};
import http from "../axios";
export default {
// 获取工单状态数量
getOrderStatusCount() {
return http.post("/order.order/getOrderStatusCount");
},
// 工单列表
listOrder(params: { form_id?: string; where?: string }) {
return http.post("/order.order/listOrder", params);
},
// 工单列表
deleteOrder(params: { form_id: string; id: string }) {
return http.post("/order.order/deleteOrder", params);
},
// 新建/修改工单
saveOrder(params: any) {
return http.post("/order.order/saveOrder", params);
},
// 工单详情
orderDetail(params: { form_id: string; id: string }) {
return http.post("/order.order/orderDetail", params);
},
// 指派工单
assignOrder(params: {
form_id: string;
id: string;
fuze_user: string;
xietong_user: string;
}) {
return http.post("/order.order/assignOrder", params);
},
// 接单
receiveOrder(params: { form_id: string; id: string }) {
return http.post("/order.order/receiveOrder", params);
},
// 开始
startOrder(params: { form_id: string; id: string }) {
return http.post("/order.order/startOrder", params);
},
// 完成
finishOrder(params: { form_id: string; id: string; data: any }) {
return http.post("/order.order/finishOrder", params);
},
// 评价
evaluateOrder(params: { form_id: string; id: string; data: any }) {
return http.post("/order.order/evaluateOrder", params);
},
// 保存回执/评价内容
saveTemplateData(params: { form_id: string; order_id: string; data: any }) {
return http.post("/order.order_template/saveTemplateData", params);
},
// 获取回执/评价内容
getTemplateData(params: { form_id: string; order_id: string }) {
return http.post("/order.order_template/getTemplateData", params);
},
// 工单标签
listOrderLabel(params: { keyword?: string; page: number; size: number }) {
return http.post("/order.order/listOrderLabel", params);
},
};
import http from "../axios";
export default {
// 获取oss配置
getOssConfig() {
return http.post("/order.file/getOssConfig");
},
// 文件签名
getSignByMap(params: any) {
return http.post("/order.file/getSignByMap", params);
},
};
import http from "../axios";
export default {
// 钉钉登陆
loginByAuthCode(params: { auth_code: string; relate_corp_id: string }) {
return http.post("/order.platform-dingtalk/loginByAuthCode", params);
},
};
import http from "../axios";
export default {
// 角色列表
PartList(params: {
page: number;
size: number;
is_system?: number;
part_name?: string;
}) {
return http.post("/order.power/PartList", params);
},
// 删除角色
DeletePart(params: { id: string }) {
return http.post("/order.power/DeletePart", params);
},
// 修改/新建角色
CreatePart(params: {
id?: string;
part_name: string;
is_system: number;
user_ids: string[];
part_power: any;
}) {
return http.post("/order.power/CreatePart", params);
},
};
import http from "../axios";
export default {
// 产品列表
listProduct(params: { page: number; size: number; [k: string]: any }) {
return http.post("/order.product/listProduct", params);
},
// 新增/修改产品
saveProduct(params: any) {
return http.post("/order.product/saveProduct", params);
},
// 删除产品
deleteProduct(params: { ids: string[]; form_id: string }) {
return http.post("/order.product/deleteProduct", params);
},
// 产品统计
getClassifyCount(params: { form_id: string }) {
return http.post("/order.product/getClassifyCount", params);
},
// 产品详情
productDetail(params: { id: string; form_id: string }) {
return http.post("/order.product/productDetail", params);
},
// 获取产品的二维码
getProductQrcode(params: { product_id: string }) {
return http.post("/order.product/getProductQrcode", params);
},
// 产品动态
getProductLog(params: { id: string; form_id: string }) {
return http.post("/order.log/getProductLog", params);
},
// 设置产品其他配置
setCompanyProduct(params: any) {
return http.post("/order.product/setCompanyProduct", params);
},
// 获取产品其他配置
getCompanyProduct() {
return http.post("/order.product/getCompanyProduct");
},
/** ——————————产品分类—————————— */
// 新增/修改产品分类
saveClassify(params: {
id?: string;
classify_name: string;
_parent_id?: string;
}) {
return http.post("/order.product/saveClassify", params);
},
// 删除产品分类
deleteClassify(params: { ids: string[] }) {
return http.post("/order.product/deleteClassify", params);
},
// 产品分类列表
listClassify(params: { _parent_id?: string; keyword?: string }) {
return http.post("/order.product/listClassify", params);
},
/** ——————————产品二维码—————————— */
// 二维码列表
listQrcode() {
return http.post("/order.product/listQrcode");
},
// 二维码列表
deleteQrcode(params: { ids: string[] }) {
return http.post("/order.product/deleteQrcode", params);
},
// 创建/修改二维码
saveQrcode(params: {
id?: string;
product_id?: string;
show_number?: number;
show_company?: number;
show_logo?: number;
qrcode_number?: string;
}) {
return http.post("/order.product/saveQrcode", params);
},
// 二维码详情
detailQrcode(params: { ids: string[] }) {
return http.post("/order.product/detailQrcode", params);
},
// 批量生成二维码
batchCreate(params: {
show_number: number;
show_company: number;
show_logo: number;
count: number;
}) {
return http.post("/order.product/batchCreate", params);
},
// 批量下载二维码
batchDownload(params: { ids: string[] }) {
return http.post("/order.product/batchDownload", params);
},
// 获取二维码设置
getQrCodeWindow(params: { form_id: string }) {
return http.post("/order.product/getQrCodeWindow", params);
},
// 二维码设置
setQrCodeWindow(params: {
form_id: string;
back_ground: string;
show_customer_fields: string[];
show_product_fields: string[];
buttons: {
button_name: string;
order_form_id: string;
button_order_type: string;
}[];
}) {
return http.post("/order.product/setQrCodeWindow", params);
},
};
import http from "../axios";
export default {
// 生产唯一id
createId() {
return http.post("/order.code/createId");
},
};
import http from "../axios";
export default {
// 根据token获取用户信息
getByToken() {
return http.post("/order.user/getByToken");
},
// 获取部门
getDeptByParentId(params: { _parent_id?: string }) {
return http.post("/order.department/getDeptByParentId", params);
},
// 获取部门下的人员
getUsersByDeptId(params: { id: string }) {
return http.post("/order.department/getUsersByDeptId", {
page: 1,
size: 9999,
need_children: 0,
...params,
});
},
// 启用/禁用人员
usersUnuse(params: { users: string[]; state: 0 | 1 }) {
return http.post("/order.user/usersUnuse", params);
},
// 修改用户信息
updateUser(params: {
user_id: string;
phone: string;
team_ids: string[];
role_ids: string[];
}) {
return http.post("/order.user/updateUser", params);
},
// 离职/复职人员
usersLeave(params: { users: string[]; state: 0 | 1 }) {
return http.post("/order.user/usersLeave", params);
},
// 查看所有团队
listTeam() {
return http.post("/order.team/listTeam");
},
// 新增团队
insertTeam(params: { _parent_id?: string; [k: string]: any }) {
return http.post("/order.team/insertTeam", params);
},
// 修改团队
updateTeam(params: { id: string; [k: string]: any }) {
return http.post("/order.team/updateTeam", params);
},
// 删除团队
deleteTeam(params: { ids: string[] }) {
return http.post("/order.team/deleteTeam", params);
},
// 查询企业下的人员信息
getByCorpId(params: {
dept_ids?: string[];
team_ids?: string[];
on_job?: number;
status?: number;
name?: string;
}) {
return http.post("/order.user/getByCorpId", params);
},
// 工作状态
listWorkStatus() {
return http.post("/order.user/listWorkStatus");
},
// 新增工作状态
addWorkStatus(params: { name: string; color: string }) {
return http.post("/order.user/addWorkStatus", params);
},
// 删除工作状态
deleteWorkStatus(params: { ids: string[] }) {
return http.post("/order.user/deleteWorkStatus", params);
},
// 修改我的工作状态
updateMyWorkStatus(params: { work_status_id: string }) {
return http.post("/order.user/updateMyWorkStatus", params);
},
// 获取我的工作状态
getMyWorkStatus() {
return http.post("/order.user/getMyWorkStatus");
},
};
:root {
font-size: 15px;
--blue: #1779fc; // 蓝色
--orange: #f5a034; // 橘色
--light_orange: #fef4e8; // 淡橘色
--green: #22a37d; // 绿色
--gray: #595a5d; // 灰色
--light_gray: #999999; // 淡灰色
--hover_blue: #eef7ff; // hover色
--border_color: #eaeaea; // 边框颜色
--navbar_height: 50px; // tabs高度
/* 背景色 */
--bg_gray: #f5f6f8;
--bg_green: #e6f4f1;
/* icon颜色 */
--icon_gray: #b7b8c0;
}
body {
width: 100vw;
height: 100vh;
box-sizing: border-box;
}
// 必填
.required {
color: red;
margin-right: 4px;
}
// tabs菜单样式
.tabs {
display: flex;
align-items: center;
padding: 0 20px;
height: 100%;
span {
margin-right: 20px;
position: relative;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
min-width: 50px;
user-select: none;
cursor: pointer;
&.active {
color: var(--blue);
&::after {
content: "";
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 4px;
background-color: var(--blue);
}
}
}
}
// 按钮
.button_group {
display: flex;
align-items: center;
& + .button {
margin-left: 10px;
}
.button {
border-radius: 0;
position: relative;
}
.button + .button {
margin-left: 0;
}
.button:nth-of-type(1) {
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.button:nth-last-of-type(1) {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.button:not(:nth-last-of-type(1))::after {
content: "";
position: absolute;
right: 0;
top: 6px;
bottom: 6px;
width: 1px;
background-color: white;
}
}
.button {
--btn_bg_color: var(--blue);
--btn_color: white;
--btn_height: 29px;
color: var(--btn_color);
background-color: var(--btn_bg_color);
padding: 0 10px;
border-radius: 4px;
cursor: pointer;
user-select: none;
font-size: 12px;
box-sizing: border-box;
height: var(--btn_height);
line-height: var(--btn_height);
display: inline-block;
text-align: center;
&:hover {
opacity: 0.8;
}
i {
margin-right: 4px;
}
& + .button {
margin-left: 10px;
}
// 颜色
&.green {
--btn_bg_color: #46998b;
}
&.red {
--btn_bg_color: red;
}
&.gray {
--btn_bg_color: #a7a7a7;
}
&.orange {
--btn_bg_color: var(var(--orange));
}
// 样式
&.text {
color: var(--btn_bg_color);
background-color: transparent;
font-size: 14px;
padding: 0;
&:hover {
text-decoration: underline;
}
}
&.plain {
border: 1px solid var(--btn_bg_color);
color: var(--btn_bg_color);
background-color: transparent;
}
}
// 标签
.tags {
display: flex;
flex-wrap: wrap;
.tag {
color: var(--color);
background-color: var(--bg_color);
padding: 0 10px;
display: flex;
align-items: center;
border-radius: 4px;
margin: 4px 6px 4px 0;
height: 26px;
position: relative;
flex-shrink: 0;
i:not(.active, .remove) {
margin-right: 6px;
}
.active {
margin-left: 4px;
cursor: pointer;
}
.remove {
position: absolute;
right: -4px;
top: -4px;
color: var(--gray);
cursor: pointer;
display: none;
&:hover {
color: var(--blue);
}
}
&:hover .remove {
display: inline-block;
}
&.add {
cursor: pointer;
color: var(--blue);
background-color: var(--hover_blue);
}
}
}
// 状态
.status {
display: inline-block;
height: 24px;
width: 50px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 5px;
font-size: 12px;
}
// 圆点
.round {
width: var(--size);
height: var(--size);
border-radius: 50%;
background-color: var(--bg_color);
position: relative;
display: inline-block;
&::after {
content: "";
position: absolute;
width: var(--small_size);
height: var(--small_size);
background-color: var(--color);
border-radius: 50%;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
}
// 无数据
.empty {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.cursor {
cursor: pointer;
color: var(--blue);
}
}
/* http://meyerweb.com/eric/tools/css/reset/
v2.0 | 20110126
License: none (public domain)
*/
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
}
ol,
ul {
list-style: none;
}
blockquote,
q {
quotes: none;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: "";
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
input,
textarea {
border: none;
outline: none;
}
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#0096f7;}.cls-2{fill:#0275b5;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>doc</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M129.5,69a5.5,5.5,0,0,0-5.23-5.23h0c-2-.2-5.44.27-6.31,5.54l-8.43,50.92L94.67,68.32c-1.25-3.75-3.8-4.54-5.72-4.54-3.3,0-5.48,1.67-6.13,4.6l-14.57,51L60,69.39a6.31,6.31,0,0,0-2-4.47,5.71,5.71,0,0,0-4.33-1.14C50.34,64.12,48.34,66,48,69v.16a18.52,18.52,0,0,0,.3,3.05h0v0a6.58,6.58,0,0,0,.12.74h0c.07.25.25.61.39,1.19l10.55,58.22c.94,4.08,3.6,6.24,7.6,6.24h0l.86,0c4.19,0,6.86-2.16,7.72-6.2l13.2-47.81L102,132.48c1.23,4.32,4.18,6.46,8.53,6.17,4.32,0,7-2.27,7.67-6.3l11-58.3a43.4,43.4,0,0,0,.4-4.87Z"/><path class="cls-4" d="M124.6,67.25A5.5,5.5,0,0,0,119.37,62h0c-2-.2-5.44.27-6.31,5.54l-8.43,50.92L89.77,66.56C88.52,62.8,86,62,84.05,62c-3.3,0-5.48,1.67-6.13,4.6l-14.57,51-8.28-50a6.31,6.31,0,0,0-2-4.47A5.71,5.71,0,0,0,48.74,62c-3.3.33-5.3,2.19-5.64,5.24v.16a18.52,18.52,0,0,0,.3,3.05h0v0a6.58,6.58,0,0,0,.12.74h0c.07.25.25.61.39,1.19l10.55,58.22c.94,4.08,3.6,6.24,7.6,6.24h0l.86,0c4.19,0,6.86-2.16,7.72-6.2L83.86,82.9l13.21,47.83c1.23,4.32,4.18,6.46,8.53,6.17,4.32,0,7-2.27,7.67-6.3l11-58.3a43.4,43.4,0,0,0,.4-4.87Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#6f50b2;}.cls-2{fill:#493189;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>dwg</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M32.89,81.37H21c-2.65,0-4.1,1.46-4.1,4.1v42.7c0,2.65,1.46,4.1,4.1,4.1H34c13.61-.74,20.88-9.38,21.62-25.76C54.87,90.39,47.23,81.93,32.89,81.37Zm14.51,25.15c-.52,12.37-5.37,18.56-14.83,18.91H24.8V88.23H32C42,88.57,47.05,94.58,47.41,106.52Z"/><path class="cls-2" d="M110.25,80.84h0c-1.31-.13-3.59.18-4.18,3.69l-6,36L89.62,83.85c-.83-2.5-2.52-3-3.79-3a3.74,3.74,0,0,0-4.07,3.06l-10.3,36L65.61,84.59a4.22,4.22,0,0,0-1.32-3,4.24,4.24,0,0,0-6.61,2.72v.09A13.34,13.34,0,0,0,58,87l.07.21a2.15,2.15,0,0,1,.18.44l7.32,40.46a4.88,4.88,0,0,0,5.1,4.18h0c3.14.21,5.13-1.25,5.75-4.14l9.31-33.7L95,128.14c.78,2.73,2.57,4.16,5.17,4.16l.53,0c3,0,4.74-1.47,5.17-4.22l7.58-40.32a29.89,29.89,0,0,0,.28-3.35v-.1A3.64,3.64,0,0,0,110.25,80.84Z"/><path class="cls-2" d="M158.87,103.72a5.24,5.24,0,0,0-4.15-1.27H144.48c-2.47,0-3.83,1.27-3.83,3.65a3.88,3.88,0,0,0,3.83,3.75h7.79v1.76c-.86,9-5.2,13.57-13.17,14.09-9.65-.34-14.59-6.53-15.12-18.82.7-12.21,5.56-18.4,14.82-18.92a18.06,18.06,0,0,1,10.33,3.64c1.8,1.2,3.07,1.76,4.06,1.76h0A3.87,3.87,0,0,0,157,89.62l0-.24-.11-.22c-2.48-5.15-8.46-7.95-17.85-8.32-14.5.75-22.32,9.47-23.25,25.95v.11c1.11,16.29,8.66,24.84,22.48,25.4,14.37,0,21.75-8.11,21.94-24.06A5.69,5.69,0,0,0,158.87,103.72Z"/><path class="cls-4" d="M30.05,78.37H18.13c-2.65,0-4.1,1.46-4.1,4.1v42.7c0,2.65,1.46,4.1,4.1,4.1h13c13.61-.74,20.88-9.38,21.62-25.76C52,87.39,44.38,78.93,30.05,78.37Zm14.51,25.15c-.52,12.37-5.37,18.56-14.83,18.91H22V85.23h7.22C39.18,85.57,44.21,91.58,44.56,103.52Z"/><path class="cls-4" d="M107.41,77.84h0c-1.31-.13-3.59.18-4.18,3.69l-6,36L86.78,80.85c-.83-2.5-2.52-3-3.79-3a3.74,3.74,0,0,0-4.07,3.06l-10.3,36L62.76,81.59a4.22,4.22,0,0,0-1.32-3,4.24,4.24,0,0,0-6.61,2.72v.09a13.34,13.34,0,0,0,.29,2.6l.07.21a2.15,2.15,0,0,1,.18.44l7.32,40.46a4.88,4.88,0,0,0,5.1,4.18h0c3.14.21,5.13-1.25,5.75-4.14l9.31-33.7,9.31,33.71c.78,2.73,2.57,4.16,5.17,4.16l.53,0c3,0,4.74-1.47,5.17-4.22l7.58-40.32a29.89,29.89,0,0,0,.28-3.35v-.1A3.64,3.64,0,0,0,107.41,77.84Z"/><path class="cls-4" d="M156,100.72a5.24,5.24,0,0,0-4.15-1.27H141.63c-2.47,0-3.83,1.27-3.83,3.65a3.88,3.88,0,0,0,3.83,3.75h7.79v1.76c-.86,9-5.2,13.57-13.17,14.09-9.65-.34-14.59-6.53-15.12-18.82.7-12.21,5.56-18.4,14.82-18.92a18.06,18.06,0,0,1,10.33,3.64c1.8,1.2,3.07,1.76,4.06,1.76h0a3.87,3.87,0,0,0,3.74-3.74l0-.24-.11-.22c-2.48-5.15-8.46-7.95-17.85-8.32-14.5.75-22.32,9.47-23.25,25.95v.11c1.11,16.29,8.66,24.84,22.48,25.4,14.37,0,21.75-8.11,21.94-24.06A5.69,5.69,0,0,0,156,100.72Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#9f9d9f;}.cls-2{fill:#6d6b6c;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>未知</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M81.27,126.41H81c-4.09.34-6.52,2.78-6.85,6.86v.26c.34,4.16,2.82,6.45,7,6.45s6.64-2.29,7-6.44v-.27C87.79,129.19,85.35,126.76,81.27,126.41Z"/><path class="cls-2" d="M105.15,81.35c-1.19-13-9.23-20.08-23.92-21H81c-13.24,1.18-20.71,7.09-22.2,17.56l0,.23c0,3.89,2.14,6.22,6,6.57h.14c2.34,0,4.23-1.58,5.61-4.68l.06-.15c1.7-5.12,5.13-7.61,10.47-7.63C88,72.81,91.49,76,92,82.39c0,5.6-2.79,8.78-8.76,10-4.85,1.21-6.3,2.24-7,2.91-.91.91-1.3,2.61-1.3,5.7v12c0,4.18,2.25,6.58,6.16,6.58s6.16-2.4,6.16-6.58v-9.53c11.56-2.88,17.57-10.28,17.86-22v-.18Z"/><path class="cls-4" d="M78.34,123.93h-.27c-4.09.34-6.52,2.78-6.85,6.86v.26c.34,4.16,2.82,6.45,7,6.45s6.64-2.29,7-6.44v-.27C84.85,126.71,82.41,124.28,78.34,123.93Z"/><path class="cls-4" d="M102.21,78.87c-1.19-13-9.23-20.08-23.92-21h-.24C64.82,59.09,57.35,65,55.86,75.47l0,.23c0,3.89,2.14,6.22,6,6.57H62c2.34,0,4.23-1.58,5.61-4.68l.06-.15c1.7-5.12,5.13-7.61,10.47-7.63,6.93.52,10.41,3.72,10.92,10.09,0,5.6-2.79,8.78-8.76,10-4.85,1.21-6.3,2.24-7,2.91-.91.91-1.3,2.61-1.3,5.7v12c0,4.18,2.25,6.58,6.16,6.58s6.16-2.4,6.16-6.58V101c11.56-2.88,17.57-10.28,17.86-22v-.18Z"/></g></g></svg>
\ No newline at end of file
import doc from "./doc.svg";
import dwg from "./dwg.svg";
import file from "./file.svg";
import pdf from "./pdf.svg";
import ppt from "./ppt.svg";
import psd from "./psd.svg";
import rar from "./rar.svg";
import video from "./video.svg";
import xlsx from "./xlsx.svg";
import zip from "./zip.svg";
export default {
doc,
dwg,
file,
pdf,
ppt,
psd,
rar,
video,
xlsx,
zip,
};
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#f55a5b;}.cls-2{fill:#cc373e;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>pdf</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M107.45,63.72h-45c-3.93,0-6.19,2.25-6.19,6.19v62.5c0,3.44,2.11,5.41,5.8,5.41s5.8-2,5.8-5.41V106.18h37.25c3.68,0,5.8-2,5.8-5.41v-.15A5.84,5.84,0,0,0,105.26,95H67.86v-20H107.6a5.82,5.82,0,0,0,5.64-5.64v-.15C113.25,65.69,111.14,63.72,107.45,63.72Z"/><path class="cls-4" d="M103.45,60.55h-45c-3.93,0-6.19,2.25-6.19,6.19v62.5c0,3.44,2.11,5.41,5.8,5.41s5.8-2,5.8-5.41V103h37.25c3.68,0,5.8-2,5.8-5.41v-.15a5.84,5.84,0,0,0-5.64-5.64H63.86v-20H103.6a5.82,5.82,0,0,0,5.64-5.64V66C109.25,62.52,107.14,60.55,103.45,60.55Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#f98950;}.cls-2{fill:#f26c38;}.cls-3{fill:#fff;}</style></defs><title>ppt</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-2" d="M98.69,63H59a5.34,5.34,0,0,0-5.42,5.24v66a5.43,5.43,0,0,0,10.84,0V116.87H98.7c15.4,0,27.91-12.08,27.91-26.94S114.09,63,98.69,63Zm0,43.43H64.43v-33H98.7c9.41,0,17.07,7.4,17.07,16.48S108.11,106.42,98.69,106.42Z"/><path class="cls-2" d="M96.7,105.41"/><path class="cls-3" d="M96.69,59.38H57a5.33,5.33,0,0,0-5.42,5.23v66a5.43,5.43,0,0,0,10.84,0V113.26H96.69c15.4,0,27.92-12.08,27.92-26.94S112.09,59.38,96.69,59.38Zm0,43.41H62.44v-33H96.69c9.42,0,17.08,7.4,17.08,16.48s-7.66,16.48-17.08,16.48Zm0,0"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#3555a5;}.cls-2{fill:#1a3772;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>psd</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M70.75,95.05V95C69.87,83.13,63.21,76.8,51,76.14H37.08c-3.08,0-4.77,1.69-4.77,4.77v50.26c0,2.67,1.58,4.14,4.46,4.14s4.46-1.47,4.46-4.14V113.95H51.31c11.8-1.09,18.34-7.42,19.44-18.81Zm-9.23,0c-.41,6.75-3.89,10.23-10.65,10.62H41.22V84.11h9.34C57.53,84.3,61.11,87.88,61.52,95Z"/><path class="cls-2" d="M91.44,99.44h0C84.37,97.09,80.8,94.23,80.8,91c.37-4.5,3.05-6.87,8.11-7.25a15,15,0,0,1,7.61,2,6.81,6.81,0,0,0,3.79,1.42c2.61-.26,4-1.73,4-4.14l0-.27c-1.19-4.26-6.1-6.66-15-7.33h-.14c-10.55.66-16.57,5.92-17.89,15.63v.14c0,7.14,5.4,12.64,16.07,16.34,7.47,2.56,11.26,5.73,11.26,9.33-.58,6.82-4.18,10.32-10.94,10.71a18.69,18.69,0,0,1-9.24-3,8.25,8.25,0,0,0-3.64-1.39c-1.55,0-4.14.62-4.14,4.77l0,.27c1.19,4.28,6.73,6.57,17,7,12.68-.44,19.56-6.67,20.44-18.59C108.13,109.16,102.51,103.35,91.44,99.44Z"/><path class="cls-2" d="M131.35,76.14H117.49c-3.08,0-4.77,1.69-4.77,4.77v49.63c0,3.08,1.69,4.77,4.77,4.77h15.13c15.81-.86,24.27-10.91,25.13-29.94C156.9,86.62,148,76.79,131.35,76.14Zm16.87,29.23c-.61,14.38-6.25,21.57-17.24,22h-9V84.11h8.39C142,84.51,147.81,91.49,148.22,105.37Z"/><path class="cls-4" d="M67.42,91.41v-.08c-.88-11.84-7.54-18.17-19.79-18.83H33.75c-3.08,0-4.77,1.69-4.77,4.77v50.26c0,2.67,1.58,4.14,4.46,4.14s4.46-1.47,4.46-4.14V110.31H48c11.8-1.09,18.34-7.42,19.44-18.81Zm-9.23,0c-.41,6.75-3.89,10.23-10.65,10.62H37.89V80.46h9.34C54.19,80.66,57.78,84.24,58.19,91.4Z"/><path class="cls-4" d="M88.11,95.8h0C81,93.44,77.47,90.59,77.46,87.4c.37-4.5,3.05-6.87,8.11-7.25a15,15,0,0,1,7.61,2A6.81,6.81,0,0,0,97,83.6c2.61-.26,4-1.73,4-4.14l0-.27c-1.19-4.26-6.1-6.66-15-7.33h-.14c-10.55.66-16.57,5.92-17.89,15.63v.14c0,7.14,5.4,12.64,16.07,16.34,7.47,2.56,11.26,5.73,11.26,9.33-.58,6.82-4.18,10.32-10.94,10.71a18.69,18.69,0,0,1-9.24-3,8.25,8.25,0,0,0-3.64-1.39c-1.55,0-4.14.62-4.14,4.77l0,.27c1.19,4.28,6.73,6.57,17,7,12.68-.44,19.56-6.67,20.44-18.59C104.8,105.52,99.18,99.71,88.11,95.8Z"/><path class="cls-4" d="M128,72.5H114.16c-3.08,0-4.77,1.69-4.77,4.77V126.9c0,3.08,1.69,4.77,4.77,4.77h15.13c15.81-.86,24.27-10.91,25.13-29.94C153.56,83,144.68,73.15,128,72.5Zm16.87,29.23c-.61,14.38-6.25,21.57-17.24,22h-9V80.46H127C138.63,80.87,144.48,87.85,144.89,101.73Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#efa630;}.cls-2{fill:#9e5c0d;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>rar</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M32.68,136.33c2.87,0,4.46-1.47,4.46-4.14V112.76l20.28,22a5.23,5.23,0,0,0,3.85,1.55c3.6,0,4.14-2,4.14-3.2a5.24,5.24,0,0,0-1.52-3.81L47.18,110.88h.95c10.61-.66,16.11-6.49,16.33-17.31v-.11c-.89-9.94-7-15.42-18.27-16.3H33c-3.08,0-4.77,1.69-4.77,4.77v50.26C28.22,134.86,29.8,136.33,32.68,136.33Zm4.46-32.79V85.13h8.67c6,.39,9.18,3.28,9.75,8.77.09,3.36-.65,5.87-2.22,7.43s-4.08,2.31-7.46,2.22Z"/><path class="cls-2" d="M70.06,136.33c3,0,4-1.59,4.4-2.86L78,123.76h25.28l3.26,9.76a4.44,4.44,0,0,0,4.38,2.81c3.88,0,4.46-2.2,4.46-3.51a8.78,8.78,0,0,0-1-3.86L96.45,81.61c-1.22-4.2-3.92-5.08-6-5.08-2.76,0-4.77,1.7-6,5L66.94,129a8.78,8.78,0,0,0-1,3.85v.12C66.19,135.12,67.66,136.33,70.06,136.33ZM80.9,115.79l9.74-27.54,9.74,27.54Z"/><path class="cls-2" d="M123.15,136.33c2.87,0,4.46-1.47,4.46-4.14V112.76l20.28,22a5.23,5.23,0,0,0,3.85,1.55c3.6,0,4.14-2,4.14-3.2a5.27,5.27,0,0,0-1.53-3.83l-16.69-18.42h.95c10.61-.66,16.11-6.49,16.33-17.31v-.11c-.89-9.94-7-15.42-18.27-16.3H123.46c-3.08,0-4.77,1.69-4.77,4.77v50.26C118.69,134.86,120.27,136.33,123.15,136.33Zm4.46-32.79V85.13h8.67c6,.39,9.18,3.28,9.75,8.77.09,3.36-.65,5.87-2.22,7.43s-4.08,2.31-7.46,2.22Z"/><path class="cls-4" d="M29.47,133c2.87,0,4.46-1.47,4.46-4.14V109.38l20.28,22A5.23,5.23,0,0,0,58.06,133c3.6,0,4.14-2,4.14-3.2a5.24,5.24,0,0,0-1.52-3.81L44,107.51h.95C55.54,106.84,61,101,61.26,90.19v-.11c-.89-9.94-7-15.42-18.27-16.3H29.79c-3.08,0-4.77,1.69-4.77,4.77v50.26C25,131.48,26.6,133,29.47,133Zm4.46-32.79V81.75H42.6c6,.39,9.18,3.28,9.75,8.77.09,3.36-.65,5.87-2.22,7.43s-4.08,2.31-7.46,2.22Z"/><path class="cls-4" d="M66.85,133c3,0,4-1.59,4.4-2.86l3.53-9.71h25.28l3.26,9.76a4.44,4.44,0,0,0,4.38,2.81c3.88,0,4.46-2.2,4.46-3.51a8.78,8.78,0,0,0-1-3.86L93.25,78.24c-1.22-4.2-3.92-5.08-6-5.08-2.76,0-4.77,1.7-6,5L63.73,125.59a8.78,8.78,0,0,0-1,3.85v.12C63,131.75,64.46,133,66.85,133Zm10.84-20.53,9.74-27.54,9.74,27.54Z"/><path class="cls-4" d="M119.94,133c2.87,0,4.46-1.47,4.46-4.14V109.38l20.28,22a5.23,5.23,0,0,0,3.85,1.55c3.6,0,4.14-2,4.14-3.2a5.27,5.27,0,0,0-1.53-3.83l-16.69-18.42h.95c10.61-.66,16.11-6.49,16.33-17.31v-.11c-.89-9.94-7-15.42-18.27-16.3H120.25c-3.08,0-4.77,1.69-4.77,4.77v50.26C115.48,131.48,117.07,133,119.94,133Zm4.46-32.79V81.75h8.67c6,.39,9.18,3.28,9.75,8.77.09,3.36-.65,5.87-2.22,7.43s-4.08,2.31-7.46,2.22Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#0a9ecc;}.cls-2{fill:#046c77;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>资源 56</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M125.59,82.84a39.33,39.33,0,1,0-8.41,43.07A39.32,39.32,0,0,0,125.59,82.84Zm-20,19.75-25,16.63a3.76,3.76,0,0,1-2.29.68,4.23,4.23,0,0,1-4.16-4.16V82.45l0-.49a4.16,4.16,0,0,1,6.21-3.12l.15.09,25.19,16.8a4.23,4.23,0,0,1-.08,6.87Z"/><path class="cls-4" d="M121.54,80.8a39.33,39.33,0,1,0-8.41,43.07A39.32,39.32,0,0,0,121.54,80.8ZM102.73,99.6l-25,16.63a3.76,3.76,0,0,1-2.29.68,4.23,4.23,0,0,1-4.16-4.16V79.45l0-.49a4.16,4.16,0,0,1,6.21-3.12l.15.09,25.19,16.8a4.23,4.23,0,0,1-.08,6.87Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#1cb771;}.cls-2{fill:#04894a;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>xlsx</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M96.7,105.41"/><path class="cls-2" d="M117.21,127.19l-25-28.58L112.75,75.4a5.41,5.41,0,0,0-8.1-7.17L85,90.4,65.51,68.1a5.41,5.41,0,0,0-8.14,7.12L77.8,98.57,52.62,127a5.42,5.42,0,0,0,.47,7.63h0a5.42,5.42,0,0,0,7.63-.47L85,106.77l24.09,27.54a5.41,5.41,0,0,0,8.14-7.12Z"/><path class="cls-4" d="M113.75,124.45l-25-28.58,20.54-23.21a5.41,5.41,0,0,0-8.1-7.17L81.57,87.66,62.06,65.37a5.41,5.41,0,0,0-8.14,7.12L74.34,95.83,49.16,124.28a5.42,5.42,0,0,0,.47,7.63h0a5.42,5.42,0,0,0,7.63-.47L81.52,104l24.09,27.54a5.41,5.41,0,0,0,8.14-7.12Z"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 173.51 195.2"><defs><style>.cls-1{fill:#d6519a;}.cls-2{fill:#a82f77;}.cls-3{fill:#f26c38;}.cls-4{fill:#fff;}</style></defs><title>zip</title><g id="图层_2" data-name="图层 2"><g id="图层_1-2" data-name="图层 1"><path class="cls-1" d="M119.86,0H31.92C14.3,0,0,13.79,0,30.8V164.4c0,17,14.29,30.8,31.93,30.8H141.58c17.63,0,31.93-13.79,31.93-30.8V51.76a25.67,25.67,0,0,0-7.94-18.49L139,7.66A27.6,27.6,0,0,0,119.86,0Zm0,0"/><path class="cls-2" d="M165.56,33.27,139,7.66A27.43,27.43,0,0,0,125.08.49V29.23c0,9.13,7.67,16.53,17.12,16.53h30.58a25.91,25.91,0,0,0-7.22-12.48Z"/><path class="cls-3" d="M92.7,105.41"/><path class="cls-2" d="M79.19,137.77c2.87,0,4.46-1.47,4.46-4.14,0-1.43-.58-3.83-4.46-3.83h-27L80.61,87.12C82.29,84.95,83,83.29,82.69,82s-1-3.39-4.76-3.39H46.83c-4.15,0-4.77,2.4-4.77,3.83s.62,4.14,4.77,4.14H70.72L42.2,129.36a8.8,8.8,0,0,0-1.39,4.27c0,1.4.65,3.81,5.08,4.14Z"/><path class="cls-2" d="M97.15,133.63V82.74c0-3.08-1.58-4.77-4.46-4.77s-4.46,1.69-4.46,4.77v50.89c0,2.67,1.58,4.14,4.46,4.14S97.15,136.3,97.15,133.63Z"/><path class="cls-2" d="M123.22,78.6H109.34c-3.08,0-4.77,1.69-4.77,4.77v50.26c0,2.67,1.58,4.14,4.46,4.14s4.46-1.47,4.46-4.14V116.41h10.09c11.8-1.09,18.34-7.42,19.44-18.8v-.17C142.13,85.59,135.47,79.26,123.22,78.6Zm10.57,18.9c-.41,6.75-3.89,10.23-10.65,10.62h-9.65V86.57h9.34C129.79,86.76,133.38,90.34,133.79,97.5Z"/><path class="cls-4" d="M75.49,134.47c2.87,0,4.46-1.47,4.46-4.14,0-1.43-.58-3.83-4.46-3.83h-27L76.91,83.83C78.59,81.65,79.25,80,79,78.69s-1-3.39-4.76-3.39H43.13c-4.15,0-4.77,2.4-4.77,3.83s.62,4.14,4.77,4.14H67L38.5,126.07a8.8,8.8,0,0,0-1.39,4.27c0,1.4.65,3.81,5.08,4.14Z"/><path class="cls-4" d="M93.45,130.33V79.44c0-3.08-1.58-4.77-4.46-4.77s-4.46,1.69-4.46,4.77v50.89c0,2.67,1.58,4.14,4.46,4.14S93.45,133,93.45,130.33Z"/><path class="cls-4" d="M119.52,75.3H105.64c-3.08,0-4.77,1.69-4.77,4.77v50.26c0,2.67,1.58,4.14,4.46,4.14s4.46-1.47,4.46-4.14V113.11h10.09c11.8-1.09,18.34-7.42,19.44-18.8v-.17C138.43,82.3,131.77,76,119.52,75.3Zm10.57,18.9c-.41,6.75-3.89,10.23-10.65,10.62h-9.65V83.27h9.34C126.09,83.47,129.68,87,130.09,94.21Z"/></g></g></svg>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
@font-face {
font-family: 'icomoon';
src: url('./icomoon.eot?cmx7rw');
src: url('./icomoon.eot?cmx7rw#iefix') format('embedded-opentype'),
url('./icomoon.ttf?cmx7rw') format('truetype'),
url('./icomoon.woff?cmx7rw') format('woff'),
url('./icomoon.svg?cmx7rw#icomoon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"], [class*=" icon-"] {
/* use !important to prevent issues with browser extensions that change fonts */
font-family: 'icomoon' !important;
speak: never;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-1:before {
content: "\e9b2";
}
.icon-2:before {
content: "\e9ba";
}
.icon-3:before {
content: "\e9bb";
}
.icon-4:before {
content: "\e9bc";
}
.icon-5:before {
content: "\e9bd";
}
.icon-6:before {
content: "\e9be";
}
.icon-7:before {
content: "\e9bf";
}
.icon-8:before {
content: "\e9c0";
}
.icon-9:before {
content: "\e9f9";
}
.icon-10:before {
content: "\e9fa";
}
.icon-11:before {
content: "\e9fb";
}
.icon-12:before {
content: "\e9fc";
}
.icon-13:before {
content: "\e9fd";
}
.icon-14:before {
content: "\eb67";
}
.icon-15:before {
content: "\e9fe";
}
.icon-16:before {
content: "\e9ff";
}
.icon-17:before {
content: "\ea00";
}
.icon-18:before {
content: "\ea01";
}
.icon-19:before {
content: "\ea02";
}
.icon-20:before {
content: "\ea03";
}
.icon-21:before {
content: "\ea04";
}
.icon-22:before {
content: "\ea05";
}
.icon-23:before {
content: "\ea06";
}
.icon-24:before {
content: "\ea07";
}
.icon-25:before {
content: "\ea08";
}
.icon-26:before {
content: "\ea09";
}
.icon-27:before {
content: "\ea0a";
}
.icon-28:before {
content: "\ea0b";
}
.icon-29:before {
content: "\ea0c";
}
.icon-30:before {
content: "\ea0d";
}
.icon-31:before {
content: "\ea0e";
}
.icon-32:before {
content: "\ea0f";
}
.icon-33:before {
content: "\ead2";
}
.icon-34:before {
content: "\ea10";
}
.icon-35:before {
content: "\ea11";
}
.icon-36:before {
content: "\ea12";
}
.icon-37:before {
content: "\ea13";
}
.icon-38:before {
content: "\ea14";
}
.icon-39:before {
content: "\ea15";
}
.icon-40:before {
content: "\ea16";
}
.icon-41:before {
content: "\e965";
}
.icon-42:before {
content: "\e966";
}
.icon-43:before {
content: "\ea17";
}
.icon-44:before {
content: "\ea18";
}
.icon-45:before {
content: "\e967";
}
.icon-46:before {
content: "\ea19";
}
.icon-47:before {
content: "\ea1a";
}
.icon-48:before {
content: "\ea1b";
}
.icon-49:before {
content: "\ea1c";
}
.icon-50:before {
content: "\ea1d";
}
.icon-51:before {
content: "\ea1e";
}
.icon-52:before {
content: "\ea1f";
}
.icon-53:before {
content: "\ea20";
}
.icon-54:before {
content: "\ea21";
}
.icon-55:before {
content: "\ea22";
}
.icon-56:before {
content: "\ea23";
}
.icon-57:before {
content: "\ea24";
}
.icon-58:before {
content: "\ea25";
}
.icon-59:before {
content: "\ea26";
}
.icon-60:before {
content: "\ea27";
}
.icon-61:before {
content: "\ea28";
}
.icon-62:before {
content: "\ea29";
}
.icon-63:before {
content: "\ea2a";
}
.icon-64:before {
content: "\e968";
}
.icon-65:before {
content: "\ea2b";
}
.icon-66:before {
content: "\ea2c";
}
.icon-67:before {
content: "\ea2d";
}
.icon-68:before {
content: "\ea2e";
}
.icon-69:before {
content: "\ea2f";
}
.icon-70:before {
content: "\ea30";
}
.icon-71:before {
content: "\ea31";
}
.icon-72:before {
content: "\ea32";
}
.icon-73:before {
content: "\ea33";
}
.icon-74:before {
content: "\ea34";
}
.icon-75:before {
content: "\ea35";
}
.icon-76:before {
content: "\ea36";
}
.icon-77:before {
content: "\ea37";
}
.icon-78:before {
content: "\eacb";
}
.icon-79:before {
content: "\ea38";
}
.icon-80:before {
content: "\ea39";
}
.icon-81:before {
content: "\ea3a2";
}
.icon-82:before {
content: "\ea3b";
}
.icon-83:before {
content: "\ea3c";
}
.icon-84:before {
content: "\ea3d";
}
.icon-85:before {
content: "\ea3e";
}
.icon-86:before {
content: "\ea3f";
}
.icon-87:before {
content: "\ea40";
}
.icon-88:before {
content: "\ea41";
}
.icon-89:before {
content: "\ea42";
}
.icon-90:before {
content: "\ea43";
}
.icon-91:before {
content: "\ea44";
}
.icon-92:before {
content: "\e969";
}
.icon-93:before {
content: "\ea45";
}
.icon-94:before {
content: "\ea46";
}
.icon-95:before {
content: "\ea47";
}
.icon-96:before {
content: "\ea48";
}
.icon-97:before {
content: "\ea49";
}
.icon-98:before {
content: "\ea4a";
}
.icon-99:before {
content: "\ea4b";
}
.icon-100:before {
content: "\ea4c";
}
.icon-101:before {
content: "\ea4d";
}
.icon-102:before {
content: "\ea4e";
}
.icon-103:before {
content: "\ea4f";
}
.icon-104:before {
content: "\ea50";
}
.icon-105:before {
content: "\ea51";
}
.icon-106:before {
content: "\ea52";
}
.icon-107:before {
content: "\ea53";
}
.icon-108:before {
content: "\ea54";
}
.icon-109:before {
content: "\ea55";
}
.icon-110:before {
content: "\ea562";
}
.icon-111:before {
content: "\ea57";
}
.icon-112:before {
content: "\ea58";
}
.icon-113:before {
content: "\ea59";
}
.icon-114:before {
content: "\ea5a";
}
.icon-115:before {
content: "\ea5b";
}
.icon-116:before {
content: "\eb74";
}
.icon-117:before {
content: "\ea5c";
}
.icon-118:before {
content: "\ea5d";
}
.icon-119:before {
content: "\ea5e";
}
.icon-120:before {
content: "\ea5f";
}
.icon-121:before {
content: "\ea60";
}
.icon-122:before {
content: "\ea61";
}
.icon-123:before {
content: "\ea62";
}
.icon-124:before {
content: "\ea63";
}
.icon-125:before {
content: "\ea64";
}
.icon-126:before {
content: "\ea65";
}
.icon-127:before {
content: "\ea66";
}
.icon-128:before {
content: "\e96a";
}
.icon-129:before {
content: "\e96b";
}
.icon-130:before {
content: "\ea67";
}
.icon-131:before {
content: "\e96c";
}
.icon-132:before {
content: "\ea68";
}
.icon-133:before {
content: "\eadb";
}
.icon-134:before {
content: "\ea69";
}
.icon-135:before {
content: "\e9a2";
}
.icon-136:before {
content: "\e9a3";
}
.icon-137:before {
content: "\ea6a";
}
.icon-138:before {
content: "\ea6b";
}
.icon-139:before {
content: "\ea6c";
}
.icon-140:before {
content: "\ea6d";
}
.icon-141:before {
content: "\ea6e";
}
.icon-142:before {
content: "\ea6f";
}
.icon-143:before {
content: "\ea70";
}
.icon-144:before {
content: "\ea71";
}
.icon-145:before {
content: "\ea72";
}
.icon-146:before {
content: "\ea73";
}
.icon-147:before {
content: "\ea74";
}
.icon-148:before {
content: "\ea75";
}
.icon-149:before {
content: "\ea76";
}
.icon-150:before {
content: "\ea77";
}
.icon-151:before {
content: "\ea78";
}
.icon-152:before {
content: "\ea79";
}
.icon-153:before {
content: "\ea7a";
}
.icon-154:before {
content: "\ea7b";
}
.icon-155:before {
content: "\ea7c";
}
.icon-156:before {
content: "\eb86";
}
.icon-157:before {
content: "\ea7d";
}
.icon-158:before {
content: "\ea7e";
}
.icon-159:before {
content: "\ea7f";
}
.icon-160:before {
content: "\ea80";
}
.icon-161:before {
content: "\ebb8";
}
.icon-162:before {
content: "\ea81";
}
.icon-163:before {
content: "\ea82";
}
.icon-164:before {
content: "\ea83";
}
.icon-165:before {
content: "\ea84";
}
.icon-166:before {
content: "\eb73";
}
.icon-167:before {
content: "\ea85";
}
.icon-168:before {
content: "\ea86";
}
.icon-169:before {
content: "\ea87";
}
.icon-170:before {
content: "\ea88";
}
.icon-171:before {
content: "\ea89";
}
.icon-172:before {
content: "\ea8a";
}
.icon-173:before {
content: "\ea8b";
}
.icon-174:before {
content: "\ea8c";
}
.icon-175:before {
content: "\ea8d";
}
.icon-176:before {
content: "\ea8e";
}
.icon-177:before {
content: "\ea8f";
}
.icon-178:before {
content: "\ea90";
}
.icon-179:before {
content: "\ea91";
}
.icon-180:before {
content: "\ea92";
}
.icon-181:before {
content: "\ea93";
}
.icon-182:before {
content: "\ea94";
}
.icon-183:before {
content: "\ea95";
}
.icon-184:before {
content: "\ea96";
}
.icon-185:before {
content: "\e9a4";
}
.icon-186:before {
content: "\ebb9";
}
.icon-187:before {
content: "\e9a5";
}
.icon-188:before {
content: "\ea97";
}
.icon-189:before {
content: "\ea98";
}
.icon-190:before {
content: "\ea99";
}
.icon-191:before {
content: "\ea9a";
}
.icon-192:before {
content: "\ea9b";
}
.icon-193:before {
content: "\ea9c";
}
.icon-194:before {
content: "\ea9d";
}
.icon-195:before {
content: "\ea9e";
}
.icon-196:before {
content: "\ea9f";
}
.icon-197:before {
content: "\eaa0";
}
.icon-198:before {
content: "\eaa1";
}
.icon-199:before {
content: "\eaa2";
}
.icon-200:before {
content: "\eaa3";
}
.icon-201:before {
content: "\eaa4";
}
.icon-202:before {
content: "\eaa5";
}
.icon-203:before {
content: "\eaa6";
}
.icon-204:before {
content: "\eaa7";
}
.icon-205:before {
content: "\eaa8";
}
.icon-206:before {
content: "\eaa9";
}
.icon-207:before {
content: "\eaaa";
}
.icon-208:before {
content: "\eaab";
}
.icon-209:before {
content: "\eaac";
}
.icon-210:before {
content: "\eaad";
}
.icon-211:before {
content: "\eaae";
}
.icon-212:before {
content: "\eaaf";
}
.icon-213:before {
content: "\eab0";
}
.icon-214:before {
content: "\eab1";
}
.icon-215:before {
content: "\eab2";
}
.icon-216:before {
content: "\eab3";
}
.icon-217:before {
content: "\eab4";
}
.icon-218:before {
content: "\eab5";
}
.icon-219:before {
content: "\eab6";
}
.icon-220:before {
content: "\eab7";
}
.icon-221:before {
content: "\eab8";
}
.icon-222:before {
content: "\eab9";
}
.icon-223:before {
content: "\eaba";
}
.icon-224:before {
content: "\eabb";
}
.icon-225:before {
content: "\eb3c";
}
.icon-226:before {
content: "\eb3f";
}
.icon-227:before {
content: "\eb3e";
}
.icon-228:before {
content: "\eb40";
}
.icon-229:before {
content: "\eb41";
}
.icon-230:before {
content: "\eb42";
}
.icon-231:before {
content: "\eb43";
}
.icon-232:before {
content: "\eb44";
}
.icon-233:before {
content: "\eb46";
}
.icon-234:before {
content: "\eb45";
}
.icon-235:before {
content: "\eb48";
}
.icon-236:before {
content: "\eb47";
}
.icon-237:before {
content: "\e9a6";
}
.icon-238:before {
content: "\e9a7";
}
.icon-239:before {
content: "\eacc";
}
.icon-240:before {
content: "\eabd";
}
.icon-241:before {
content: "\eabe";
}
.icon-242:before {
content: "\eabf";
}
.icon-243:before {
content: "\eac0";
}
.icon-244:before {
content: "\eac1";
}
.icon-245:before {
content: "\eac2";
}
.icon-246:before {
content: "\eac3";
}
.icon-247:before {
content: "\eac4";
}
.icon-248:before {
content: "\eac5";
}
.icon-249:before {
content: "\eac6";
}
.icon-250:before {
content: "\eac7";
}
.icon-251:before {
content: "\eac8";
}
.icon-252:before {
content: "\eac9";
}
.icon-253:before {
content: "\eaca";
}
.icon-254:before {
content: "\eabc";
}
.icon-255:before {
content: "\eacd";
}
.icon-256:before {
content: "\eace";
}
.icon-257:before {
content: "\eacf";
}
.icon-258:before {
content: "\ead0";
}
.icon-259:before {
content: "\ead1";
}
.icon-260:before {
content: "\eb5c";
}
.icon-261:before {
content: "\eb4d";
}
.icon-262:before {
content: "\eb4e";
}
.icon-263:before {
content: "\eb4f";
}
.icon-264:before {
content: "\eb50";
}
.icon-265:before {
content: "\eb51";
}
.icon-266:before {
content: "\eb52";
}
.icon-267:before {
content: "\eb53";
}
.icon-268:before {
content: "\eb55";
}
.icon-269:before {
content: "\eb54";
}
.icon-270:before {
content: "\eb57";
}
.icon-271:before {
content: "\eb56";
}
.icon-272:before {
content: "\ead3";
}
.icon-273:before {
content: "\ead4";
}
.icon-274:before {
content: "\ead5";
}
.icon-275:before {
content: "\ead6";
}
.icon-276:before {
content: "\ead7";
}
.icon-277:before {
content: "\ead8";
}
.icon-278:before {
content: "\ead9";
}
.icon-279:before {
content: "\eada";
}
.icon-280:before {
content: "\eadc";
}
.icon-281:before {
content: "\eadd";
}
.icon-282:before {
content: "\eade";
}
.icon-283:before {
content: "\eadf";
}
.icon-284:before {
content: "\eae0";
}
.icon-285:before {
content: "\eae1";
}
.icon-286:before {
content: "\eae2";
}
.icon-287:before {
content: "\e9a8";
}
.icon-288:before {
content: "\e9a9";
}
.icon-289:before {
content: "\e9aa";
}
.icon-290:before {
content: "\e9ab";
}
.icon-291:before {
content: "\e9ac";
}
.icon-292:before {
content: "\e9ad";
}
.icon-293:before {
content: "\e9ae";
}
.icon-294:before {
content: "\e9af";
}
.icon-295:before {
content: "\e9b0";
}
.icon-296:before {
content: "\e9b1";
}
.icon-297:before {
content: "\e9c1";
}
.icon-298:before {
content: "\e9c2";
}
.icon-299:before {
content: "\e9c3";
}
.icon-300:before {
content: "\eae3";
}
.icon-301:before {
content: "\eae4";
}
.icon-302:before {
content: "\eae5";
}
.icon-303:before {
content: "\eae6";
}
.icon-304:before {
content: "\eae7";
}
.icon-305:before {
content: "\eae8";
}
.icon-306:before {
content: "\eae9";
}
.icon-307:before {
content: "\eaea";
}
.icon-308:before {
content: "\eaeb";
}
.icon-309:before {
content: "\eaec";
}
.icon-310:before {
content: "\eaed";
}
.icon-311:before {
content: "\eb75";
}
.icon-312:before {
content: "\eaee";
}
.icon-313:before {
content: "\eaef";
}
.icon-314:before {
content: "\eaf0";
}
.icon-315:before {
content: "\eaf1";
}
.icon-316:before {
content: "\eaf2";
}
.icon-317:before {
content: "\eaf3";
}
.icon-318:before {
content: "\eaf4";
}
.icon-319:before {
content: "\eaf5";
}
.icon-320:before {
content: "\eaf6";
}
.icon-321:before {
content: "\eaf7";
}
.icon-322:before {
content: "\eaf8";
}
.icon-323:before {
content: "\eaf9";
}
.icon-324:before {
content: "\eb3d";
}
.icon-325:before {
content: "\eafa";
}
.icon-326:before {
content: "\eafb";
}
.icon-327:before {
content: "\eafc";
}
.icon-328:before {
content: "\eafd";
}
.icon-329:before {
content: "\eafe";
}
.icon-330:before {
content: "\eaff";
}
.icon-331:before {
content: "\eb00";
}
.icon-332:before {
content: "\eb01";
}
.icon-333:before {
content: "\eb02";
}
.icon-334:before {
content: "\eb03";
}
.icon-335:before {
content: "\eb04";
}
.icon-336:before {
content: "\eb05";
}
.icon-337:before {
content: "\eb06";
}
.icon-338:before {
content: "\eb07";
}
.icon-339:before {
content: "\eb08";
}
.icon-340:before {
content: "\eb09";
}
.icon-341:before {
content: "\eb0a";
}
.icon-342:before {
content: "\eb0b";
}
.icon-343:before {
content: "\eb0c";
}
.icon-344:before {
content: "\eb0d";
}
.icon-345:before {
content: "\eb0e";
}
.icon-346:before {
content: "\eb0f";
}
.icon-347:before {
content: "\eb10";
}
.icon-348:before {
content: "\eb11";
}
.icon-349:before {
content: "\eb12";
}
.icon-350:before {
content: "\eb13";
}
.icon-351:before {
content: "\eb14";
}
.icon-352:before {
content: "\eb15";
}
.icon-353:before {
content: "\eb16";
}
.icon-354:before {
content: "\eb17";
}
.icon-355:before {
content: "\eb18";
}
.icon-356:before {
content: "\eb19";
}
.icon-357:before {
content: "\eb1a";
}
.icon-358:before {
content: "\eb1b";
}
.icon-359:before {
content: "\eb1c";
}
.icon-360:before {
content: "\eb1d";
}
.icon-361:before {
content: "\eb1e";
}
.icon-362:before {
content: "\eb1f";
}
.icon-363:before {
content: "\eb20";
}
.icon-681:before {
content: "\eb21";
}
.icon-365:before {
content: "\eb22";
}
.icon-366:before {
content: "\eb23";
}
.icon-367:before {
content: "\eb24";
}
.icon-368:before {
content: "\eb25";
}
.icon-369:before {
content: "\eb26";
}
.icon-370:before {
content: "\eb27";
}
.icon-371:before {
content: "\eb28";
}
.icon-372:before {
content: "\eb29";
}
.icon-373:before {
content: "\eb2a";
}
.icon-374:before {
content: "\eb2b";
}
.icon-375:before {
content: "\eb2c";
}
.icon-376:before {
content: "\eb2d";
}
.icon-377:before {
content: "\eb2e";
}
.icon-378:before {
content: "\eb2f";
}
.icon-379:before {
content: "\eb30";
}
.icon-380:before {
content: "\eb31";
}
.icon-381:before {
content: "\eb32";
}
.icon-382:before {
content: "\eb33";
}
.icon-383:before {
content: "\eb34";
}
.icon-384:before {
content: "\eb35";
}
.icon-385:before {
content: "\eb36";
}
.icon-386:before {
content: "\eb37";
}
.icon-387:before {
content: "\eb38";
}
.icon-388:before {
content: "\eb39";
}
.icon-389:before {
content: "\eb3a";
}
.icon-390:before {
content: "\eb3b";
}
.icon-391:before {
content: "\eb49";
}
.icon-392:before {
content: "\eb4a";
}
.icon-393:before {
content: "\eb4b";
}
.icon-394:before {
content: "\eb4c";
}
.icon-395:before {
content: "\eb58";
}
.icon-396:before {
content: "\eb6c";
}
.icon-397:before {
content: "\eb59";
}
.icon-398:before {
content: "\eb5a";
}
.icon-399:before {
content: "\eb5b";
}
.icon-400:before {
content: "\eb5d";
}
.icon-401:before {
content: "\eb5e";
}
.icon-402:before {
content: "\eb5f";
}
.icon-403:before {
content: "\eb60";
}
.icon-404:before {
content: "\eb61";
}
.icon-405:before {
content: "\eb62";
}
.icon-406:before {
content: "\eb63";
}
.icon-407:before {
content: "\eb64";
}
.icon-408:before {
content: "\eb65";
}
.icon-409:before {
content: "\eb66";
}
.icon-410:before {
content: "\eb68";
}
.icon-411:before {
content: "\eb69";
}
.icon-412:before {
content: "\eb6a";
}
.icon-413:before {
content: "\eb6b";
}
.icon-414:before {
content: "\eb6d";
}
.icon-415:before {
content: "\eb6e";
}
.icon-416:before {
content: "\eb6f";
}
.icon-417:before {
content: "\eb70";
}
.icon-418:before {
content: "\eb71";
}
.icon-419:before {
content: "\eb72";
}
.icon-420:before {
content: "\eb76";
}
.icon-421:before {
content: "\eb77";
}
.icon-422:before {
content: "\eb78";
}
.icon-423:before {
content: "\eb79";
}
.icon-424:before {
content: "\eb7a";
}
.icon-425:before {
content: "\eb7b";
}
.icon-426:before {
content: "\eb7c";
}
.icon-427:before {
content: "\eb7d";
}
.icon-428:before {
content: "\eb7e";
}
.icon-429:before {
content: "\eb7f";
}
.icon-430:before {
content: "\eb80";
}
.icon-431:before {
content: "\eb81";
}
.icon-432:before {
content: "\eb82";
}
.icon-433:before {
content: "\eb83";
}
.icon-434:before {
content: "\eb84";
}
.icon-435:before {
content: "\eb87";
}
.icon-436:before {
content: "\eb88";
}
.icon-437:before {
content: "\eb89";
}
.icon-438:before {
content: "\eb8a";
}
.icon-439:before {
content: "\eb8b";
}
.icon-440:before {
content: "\eb90";
}
.icon-441:before {
content: "\eb91";
}
.icon-442:before {
content: "\eb92";
}
.icon-443:before {
content: "\eb93";
}
.icon-444:before {
content: "\eb94";
}
.icon-445:before {
content: "\eb95";
}
.icon-446:before {
content: "\eb96";
}
.icon-447:before {
content: "\eb97";
}
.icon-448:before {
content: "\eb98";
}
.icon-449:before {
content: "\eb99";
}
.icon-450:before {
content: "\eb9a";
}
.icon-451:before {
content: "\eb9b";
}
.icon-452:before {
content: "\eb9c";
}
.icon-453:before {
content: "\eb9d";
}
.icon-454:before {
content: "\eb9e";
}
.icon-455:before {
content: "\eb9f";
}
.icon-456:before {
content: "\eba0";
}
.icon-457:before {
content: "\eba1";
}
.icon-458:before {
content: "\eba2";
}
.icon-459:before {
content: "\eba3";
}
.icon-460:before {
content: "\eba4";
}
.icon-461:before {
content: "\eba5";
}
.icon-462:before {
content: "\eba6";
}
.icon-463:before {
content: "\eba7";
}
.icon-464:before {
content: "\eba8";
}
.icon-465:before {
content: "\ebaa";
}
.icon-466:before {
content: "\ebab";
}
.icon-467:before {
content: "\ebac";
}
.icon-468:before {
content: "\ebad";
}
.icon-469:before {
content: "\ebb3";
}
.icon-470:before {
content: "\ebb4";
}
.icon-471:before {
content: "\ebb5";
}
.icon-472:before {
content: "\ebb6";
}
.icon-473:before {
content: "\ebb7";
}
.icon-474:before {
content: "\ebbc";
}
.icon-475:before {
content: "\ebbd";
}
.icon-476:before {
content: "\ebc1";
}
.icon-477:before {
content: "\ebc7";
}
.icon-478:before {
content: "\ebc8";
}
.icon-479:before {
content: "\ebc9";
}
.icon-480:before {
content: "\ebcc";
}
.icon-481:before {
content: "\ebcd";
}
.icon-482:before {
content: "\ebce";
}
.icon-483:before {
content: "\ebcf";
}
.icon-484:before {
content: "\ebd0";
}
.icon-485:before {
content: "\ebd1";
}
.icon-486:before {
content: "\ebd2";
}
.icon-487:before {
content: "\ebd3";
}
.icon-488:before {
content: "\ebd4";
}
.icon-489:before {
content: "\ebd5";
}
.icon-490:before {
content: "\ebd6";
}
.icon-491:before {
content: "\ebd7";
}
.icon-492:before {
content: "\ebd8";
}
.icon-493:before {
content: "\ebd9";
}
.icon-494:before {
content: "\ebda";
}
.icon-495:before {
content: "\ebdb";
}
.icon-496:before {
content: "\ebdc";
}
.icon-497:before {
content: "\ebdd";
}
.icon-498:before {
content: "\ebde";
}
.icon-499:before {
content: "\ebdf";
}
.icon-500:before {
content: "\ebe0";
}
.icon-501:before {
content: "\ebe1";
}
.icon-502:before {
content: "\ebe2";
}
.icon-503:before {
content: "\ebe3";
}
.icon-504:before {
content: "\ebe4";
}
.icon-505:before {
content: "\e937";
}
.icon-506:before {
content: "\e963";
}
.icon-507:before {
content: "\e964";
}
.icon-508:before {
content: "\e96d";
}
.icon-509:before {
content: "\e96e";
}
.icon-510:before {
content: "\e96f";
}
.icon-511:before {
content: "\e970";
}
.icon-512:before {
content: "\e971";
}
.icon-513:before {
content: "\e900";
}
.icon-514:before {
content: "\e973";
}
.icon-515:before {
content: "\e974";
}
.icon-516:before {
content: "\e975";
}
.icon-517:before {
content: "\e901";
}
.icon-518:before {
content: "\e902";
}
.icon-519:before {
content: "\e903";
}
.icon-520:before {
content: "\e904";
}
.icon-521:before {
content: "\e905";
}
.icon-522:before {
content: "\e906";
}
.icon-523:before {
content: "\e907";
}
.icon-524:before {
content: "\e908";
}
.icon-525:before {
content: "\e909";
}
.icon-526:before {
content: "\e90a";
}
.icon-527:before {
content: "\e90b";
}
.icon-528:before {
content: "\e90c";
}
.icon-529:before {
content: "\e90d";
}
.icon-530:before {
content: "\e90e";
}
.icon-531:before {
content: "\e90f";
}
.icon-532:before {
content: "\e910";
}
.icon-533:before {
content: "\e911";
}
.icon-534:before {
content: "\e912";
}
.icon-535:before {
content: "\e913";
}
.icon-536:before {
content: "\e914";
}
.icon-537:before {
content: "\e915";
}
.icon-538:before {
content: "\e916";
}
.icon-539:before {
content: "\e917";
}
.icon-540:before {
content: "\e918";
}
.icon-541:before {
content: "\e919";
}
.icon-542:before {
content: "\e91a";
}
.icon-543:before {
content: "\e91b";
}
.icon-544:before {
content: "\e91c";
}
.icon-545:before {
content: "\e91d";
}
.icon-546:before {
content: "\e91e";
}
.icon-547:before {
content: "\e91f";
}
.icon-548:before {
content: "\e920";
}
.icon-549:before {
content: "\e921";
}
.icon-550:before {
content: "\e922";
}
.icon-551:before {
content: "\e923";
}
.icon-552:before {
content: "\e924";
}
.icon-553:before {
content: "\e925";
}
.icon-554:before {
content: "\e926";
}
.icon-555:before {
content: "\e927";
}
.icon-556:before {
content: "\e928";
}
.icon-557:before {
content: "\e929";
}
.icon-558:before {
content: "\e92a";
}
.icon-559:before {
content: "\e92b";
}
.icon-560:before {
content: "\e92c";
}
.icon-561:before {
content: "\e92d";
}
.icon-562:before {
content: "\e92e";
}
.icon-563:before {
content: "\e92f";
}
.icon-564:before {
content: "\e930";
}
.icon-565:before {
content: "\e931";
}
.icon-566:before {
content: "\e932";
}
.icon-567:before {
content: "\e933";
}
.icon-568:before {
content: "\e934";
}
.icon-569:before {
content: "\e935";
}
.icon-570:before {
content: "\e936";
}
.icon-571:before {
content: "\e938";
}
.icon-572:before {
content: "\e939";
}
.icon-573:before {
content: "\e93a";
}
.icon-574:before {
content: "\e93b";
}
.icon-575:before {
content: "\e93c";
}
.icon-576:before {
content: "\e93d";
}
.icon-577:before {
content: "\e93e";
}
.icon-578:before {
content: "\e93f";
}
.icon-579:before {
content: "\e940";
}
.icon-580:before {
content: "\e941";
}
.icon-581:before {
content: "\e942";
}
.icon-582:before {
content: "\e943";
}
.icon-583:before {
content: "\e944";
}
.icon-584:before {
content: "\e945";
}
.icon-585:before {
content: "\e946";
}
<template>
<div
class="avatar"
:style="{
width: size,
height: size,
borderRadius: round ? '50%' : '5px',
}">
<img :src="src" v-if="src" />
<nameComp v-else :name="name!" :length="2" />
</div>
</template>
<script setup lang="ts">
interface Props {
src: string;
name: string;
size?: string;
round?: boolean;
}
withDefaults(defineProps<Props>(), {
size: "34px",
name: "",
src: "",
round: true,
});
</script>
<style lang="less" scoped>
.avatar {
display: flex;
align-items: center;
justify-content: center;
background-color: var(--blue);
border-radius: 50%;
color: white;
overflow: hidden;
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
</style>
<template>
<span>{{ name }}</span>
</template>
<script setup>
const props = defineProps({
name: String, // 人名
});
</script>
<style lang="less" scoped>
span {
white-space: nowrap;
}
</style>
<template>
<component v-bind="$attrs" :is="renderCom" :name="show_name" />
</template>
<script setup lang="ts">
import { computed } from "vue";
// import WxComp from "./wx.vue";
import DdComp from "./dd.vue";
interface Props {
name: string;
length?: number;
}
const props = defineProps<Props>();
const renderCom = computed(() => DdComp);
const show_name = computed(() => {
if (props.length) {
return props.name.slice(0, props.length);
} else {
return props.name;
}
});
</script>
<template>
<ww-open-data ref="wwEl" :type="type" :openid="name" />
</template>
<script setup lang="ts">
import { shallowRef, watch, nextTick, onMounted } from "vue";
const props = defineProps({
type: {
type: String,
default: "userName",
},
name: String,
});
const wwEl = shallowRef();
watch(
() => props.name,
() => {
nextTick(() => {
// WWOpenData.bind(wwEl.value);
});
}
);
onMounted(() => {
// WWOpenData.bind(wwEl.value);
});
</script>
<template>
<van-popup
v-model:show="show"
:round="round"
:position="position"
@closed="emit('closed')">
<div class="popup_header" v-if="show_header">
<span class="title">{{ title }}</span>
<span
class="button plain"
v-if="show_cancel"
@click="emit('cancel')">
取消
</span>
<span class="button" v-if="show_confirm" @click="emit('confirm')">
确认
</span>
</div>
<slot />
</van-popup>
</template>
<script setup lang="ts">
import { ref, onMounted } from "vue";
import { PopupPosition } from "vant";
interface PopupProps {
round?: boolean;
position?: PopupPosition;
show_header?: boolean;
title?: string;
show_cancel?: boolean;
show_confirm?: boolean;
}
withDefaults(defineProps<PopupProps>(), {
position: "bottom",
height: "30%",
round: true,
show_header: true,
show_cancel: true,
show_confirm: true,
});
const emit = defineEmits(["confirm", "cancel", "closed"]);
const show = ref(false);
onMounted(() => {
show.value = true;
});
defineExpose({
show,
});
</script>
<style lang="less" scoped>
.popup_header {
display: flex;
align-items: center;
padding: 14px;
box-sizing: border-box;
.title {
flex: 1;
font-size: 16px;
font-weight: bold;
}
}
</style>
import { createApp } from "vue";
import Comp from "./index.vue";
import type { Props } from "./index.vue";
export const $select = (options: Props) => {
const container = document.createElement("div");
options.onHide = () => {
vm.unmount();
document.body.removeChild(container);
container.remove();
};
const vm = createApp(Comp, options as any);
vm.mount(container);
document.body.appendChild(container);
};
<template>
<popupComp
ref="popup_comp"
:title="title"
@closed="onHide"
@cancel="close"
@confirm="confirm">
<van-picker v-model="data" :show-toolbar="false" :columns="options" />
</popupComp>
</template>
<script setup lang="ts">
import popupComp from "@/components/popup/index.vue";
import { ref } from "vue";
export interface Props {
value?: string;
title?: string;
options: { text: string; value: string }[];
onHide?(): void;
onConfirm?(value: string): void;
}
const props = withDefaults(defineProps<Props>(), {});
const popup_comp = ref();
const data = ref<string[]>(props.value ? [props.value] : []);
const close = () => {
popup_comp.value.show = false;
};
const confirm = () => {
props.onConfirm?.(data.value[0]);
close();
};
</script>
<style lang="less" scoped></style>
import { createApp } from "vue";
import Comp from "./index.vue";
import type { Props } from "./index.vue";
export const $selectTime = (options: Props) => {
const container = document.createElement("div");
options.onHide = () => {
vm.unmount();
document.body.removeChild(container);
container.remove();
};
const vm = createApp(Comp, options as any);
vm.mount(container);
document.body.appendChild(container);
};
<template>
<popupComp
ref="popup_comp"
:title="title"
@confirm="confirm"
@closed="onHide"
@cancel="close">
<div class="date_time">
<div class="header" v-if="type == 'time'">
<span
class="day"
:class="{ active: active_tab == 'date' }"
@click="active_tab = 'date'">
{{ show_date }}
</span>
<span
class="time"
:class="{ active: active_tab == 'time' }"
@click="active_tab = 'time'">
{{ show_time }}
</span>
</div>
<div class="content">
<van-date-picker
v-if="active_tab == 'date'"
v-model="date"
:show-toolbar="false" />
<van-time-picker
v-if="active_tab == 'time'"
v-model="time"
:show-toolbar="false"
:columns-type="['hour', 'minute', 'second']" />
</div>
</div>
</popupComp>
</template>
<script setup lang="ts">
import popupComp from "@/components/popup/index.vue";
import { computed, ref } from "vue";
export interface Props {
title?: string;
onHide?(): void;
type?: "date" | "time";
onConfirm?(time: string): void;
}
const props = withDefaults(defineProps<Props>(), {
type: "date",
title: "选择时间",
});
const active_tab = ref("date");
const date = ref([]);
const show_date = computed(() => date.value.join("-"));
const time = ref(["00", "00", "00"]);
const show_time = computed(() => time.value.join(":"));
const popup_comp = ref();
const close = () => {
popup_comp.value.show = false;
};
const confirm = () => {
let value = show_date.value;
if (props.type == "time") {
value += " " + show_time.value;
}
props.onConfirm?.(value);
close();
};
</script>
<style lang="less" scoped>
.date_time {
display: flex;
flex-direction: column;
.header {
display: flex;
padding: 0 20px;
margin-bottom: 20px;
span {
flex: 1;
border: 1px solid var(--border_color);
height: 30px;
border-radius: 4px;
padding: 0 10px;
display: flex;
align-items: center;
&.active {
border-color: var(--blue);
color: var(--blue);
}
}
span:nth-of-type(1) {
margin-right: 14px;
}
}
}
</style>
import { computed, ref } from "vue";
import api from "@/api";
import { showToast } from "vant";
import { Team } from "@/utils/hook";
/**
* 获取 部门/人员列表
*/
export interface DeptInfo {
dept_name: string;
id: string;
parent_id?: string;
have_children: boolean;
[k: string]: any;
}
export interface UserInfo {
id: string;
avatar: string;
nickname: string;
phone: string;
departments: { dept_name: string; id: string }[];
character: any[];
roles: any[];
team_id: Team[];
[k: string]: any;
}
interface Config {
type: ["user" | "dept"]; // 类型
key: string; // 返回的key
title?: string; // 显示的标题
size?: number; // 最多选中数量
show_default_text?: string; // 默认显示文字
value?: any[]; // 选中的数据
}
export interface Props {
title?: string; // 弹窗标题
mask?: boolean; // 是否显示黑色model框
class?: string;
config: Config[];
onHide?(): void; // 关闭
onConfirm?(list: { [k: string]: (DeptInfo | UserInfo)[] }): void; // 确认
}
export const useUserList = (props: Props) => {
// 根部门
const rootDept = ref<DeptInfo>({} as DeptInfo);
// 选中菜单项
const tabs = ref("");
// 当前部门id 1:默认企业下根部门/人员
const nowDept = ref<DeptInfo>({} as DeptInfo);
// 部门列表 (key:上级部门id value:部门列表)
const depts = ref<{ [k: string]: DeptInfo[] }>({});
// 所有部门
const allDepts = computed<DeptInfo[]>(() => {
return Object.values(depts.value).flat(1);
});
// 人员列表 (key:上级部门id value:部门下的人员列表)
const users = ref<{ [k: string]: UserInfo[] }>({});
// 选中选择的项
const select_item = ref<Config>({} as Config);
// 选中的部门/人员列表
const selectedList = ref<{ [k: string]: any[] }>({});
// 是否有选择人员
const needSelectUser = computed(() =>
select_item.value.type!.includes("user")
);
// 是否有选择部门
const needSelectDept = computed(() =>
select_item.value.type!.includes("dept")
);
// 修改选中项
const changeSelectItem = (item: Config) => {
select_item.value = {
...item,
size: item.size || 1000,
};
tabs.value = item.type[0];
};
/**
* 根据父级部门id获取子部门
* @param id
*/
const getId2Dept = async (dept_id: string) => {
if (depts.value[dept_id] != undefined) return;
const msg: any = await api.user.getDeptByParentId({
_parent_id: dept_id,
});
if (msg.code == 0) {
depts.value[dept_id] = msg.data.data || [];
}
};
/**
* 根据父级部门id获取人员
* @param dept_id
*/
const getId2User = async (dept_id: string) => {
if (users.value[dept_id] != undefined) return;
const msg: any = await api.user.getUsersByDeptId({
id: dept_id,
});
if (msg.code == 0) {
users.value[dept_id] = msg.data.data || [];
}
};
/**
* 改变选中部门
* @param dept object
*/
const changeNowDept = async (dept: DeptInfo) => {
nowDept.value = dept;
await getId2Dept(dept.id);
await getId2User(dept.id);
};
/** 获取根部门 */
const getRootDept = async () => {
const msg = await api.user.getDeptByParentId({});
if (msg.code == 0) {
rootDept.value = msg.data.data[0];
await changeNowDept(rootDept.value);
}
};
/** 展示内容 */
// 获取部门的子部门
const getDept = (dept_id: string) => {
return depts.value[dept_id] || [];
};
// 获取部门的成员
const getUsers = (dept_id: string) => {
return users.value[dept_id] || [];
};
// 获取面包屑
const getBreadCrumbs = (dept_id: string): DeptInfo[] => {
if (dept_id == rootDept.value.id || !rootDept.value.id) return [];
const dept = allDepts.value.find((it) => it.id == dept_id)!;
return [...getBreadCrumbs(dept!.parent_id!), dept];
};
// 选中/取消 部门/人员
const select = (user_or_dept: { id: string }) => {
if (isSelected(user_or_dept)) {
const index = selectedList.value[select_item.value.key].findIndex(
(it) => it.id == user_or_dept.id
);
selectedList.value[select_item.value.key].splice(index, 1);
} else {
if (select_item.value.size == 1) {
selectedList.value[select_item.value.key] = [user_or_dept];
}
if (
selectedList.value[select_item.value.key].length <
select_item.value.size!
) {
selectedList.value[select_item.value.key].push(user_or_dept);
}
}
console.log("selectedList", selectedList.value);
clearSearch();
};
// 是否选中部门/人员
const isSelected = (user_or_dept: { id: string }) => {
return !!selectedList.value[select_item.value.key].find(
(it) => it.id == user_or_dept.id
);
};
// 是否显示全选
const show_all_select = (dept_id: string) => {
if (needSelectDept.value && depts.value[dept_id]?.length) {
return true;
}
if (needSelectUser.value && users.value[dept_id]?.length) {
return true;
}
return false;
};
// 全选
const allSelected = (dept_id: string) => {
// 取消全选
if (isAllSelected(dept_id)) {
if (needSelectDept.value) {
depts.value[dept_id].forEach((it) => select(it));
}
if (needSelectUser.value) {
users.value[dept_id].forEach((it) => select(it));
}
} else {
// 全部选中
if (needSelectDept.value) {
// 超出限制
if (
selectedList.value[select_item.value.key].length +
depts.value[dept_id].length >
select_item.value.size!
) {
showToast({
message: "全选超出数量限制,请手动选择",
position: "top",
});
return;
}
depts.value[dept_id].forEach((it) => {
if (!isSelected(it)) {
select(it);
}
});
}
if (needSelectUser.value) {
// 超出限制
if (
selectedList.value[select_item.value.key].length +
users.value[dept_id].length >
select_item.value.size!
) {
showToast({
message: "全选超出数量限制,请手动选择",
position: "top",
});
return;
}
users.value[dept_id].forEach((it) => {
if (!isSelected(it)) {
select(it);
}
});
}
}
};
// 是否全选
const isAllSelected = (dept_id: string) => {
const deptAllSelected = needSelectDept.value
? depts.value[dept_id]?.every?.((it) => isSelected(it))
: true;
const userAllSelected = needSelectUser.value
? users.value[dept_id]?.every?.((it) => isSelected(it))
: true;
return deptAllSelected && userAllSelected;
};
// 清空
const clearSelected = () => {
selectedList.value = props.config.reduce((pre: any, now) => {
pre[now.key] = [];
return pre;
}, {});
};
// 是否是部门
const isDept = (user_or_dept: any) => {
return !!user_or_dept.dept_name;
};
// 搜索
const search_name = ref("");
const search_dept = ref<DeptInfo[]>([]);
const search_user = ref<UserInfo[]>([]);
const getDeptUser = async () => {
if (!search_name.value) {
clearSearch();
return;
}
};
const clearSearch = () => {
search_name.value = "";
search_dept.value = [];
search_user.value = [];
};
return {
tabs,
rootDept,
nowDept,
allDepts,
depts,
users,
changeNowDept,
getDept,
getUsers,
getBreadCrumbs,
select,
isSelected,
isDept,
selectedList,
isAllSelected,
show_all_select,
allSelected,
needSelectUser,
needSelectDept,
search_name,
getDeptUser,
search_dept,
search_user,
clearSearch,
clearSelected,
getRootDept,
getId2Dept,
select_item,
changeSelectItem,
};
};
import { createApp } from "vue";
import Comp from "./index.vue";
import { initApp } from "@/utils/init";
import { Props } from "./hook";
export const $selectUserDept = (options: Props) => {
const container = document.createElement("div");
options.onHide = () => {
vm.unmount();
document.body.removeChild(container);
container.remove();
};
const vm = createApp(Comp, options as any);
initApp(vm);
vm.mount(container);
document.body.appendChild(container);
};
<template>
<popupComp
:title="title"
ref="popup_comp"
@closed="onHide"
@cancel="close"
@confirm="confirm">
<div class="content">
<!-- 选中列表 -->
<div
v-for="(item, index) in config"
class="selected_list"
:class="{
active: config.length > 1 && item.key == select_item.key,
}"
:style="{
height: index < config.length - 1 ? '40px' : '',
}"
@click="changeSelectItem(item)">
<div class="user_list">
<span v-if="item.title" class="name title">
{{ item.title }}:
</span>
<template v-if="selectedList[item.key]?.length">
<div
class="name"
v-for="it in selectedList[item.key]"
:key="it.id"
@click="select(it)">
<nameComp
:name="it.nickname || it.dept_name"
:type="
isDept(it) ? 'departmentName' : 'userName'
" />
<i class="icon-69"></i>
</div>
</template>
<!-- 没有任何选中项时显示的默认项 -->
<template v-else-if="select_item.show_default_text">
<div class="name">
<span>{{ select_item.show_default_text }}</span>
</div>
</template>
</div>
<span
class="clear"
@click.stop="clearSelected"
v-if="index == config.length - 1">
清空
</span>
</div>
<!-- 可选列表 -->
<div class="selecte_content">
<div class="crumbs">
<span @click="changeNowDept(rootDept)">
{{ rootDept.dept_name }}
</span>
<template v-for="it in getBreadCrumbs(nowDept.id)">
/
<span @click="changeNowDept(it)">
{{ it.dept_name }}
</span>
</template>
</div>
<div class="user_dept_list">
<div
class="item"
v-if="show_all_select(nowDept.id)"
@click="allSelected(nowDept.id)">
<van-checkbox
:model-value="isAllSelected(nowDept.id)"
shape="square" />
<span class="name">全选</span>
</div>
<div class="item" v-for="it in getDept(nowDept.id)">
<van-checkbox
shape="square"
v-if="needSelectDept"
:model-value="isSelected(it)"
style="margin-right: 10px" />
<nameComp
style="flex: 1"
:name="it.dept_name"
type="departmentName" />
<span class="junior" @click="changeNowDept(it)">
下级
</span>
</div>
<div
class="item"
v-if="needSelectUser"
v-for="it in getUsers(nowDept.id)">
<avatarComp :src="it.avatar" :name="it.nickname" />
<nameComp class="name" :name="it.nickname" />
<van-checkbox
shape="square"
:model-value="isSelected(it)" />
</div>
</div>
</div>
</div>
</popupComp>
</template>
<script setup lang="ts">
import popupComp from "@/components/popup/index.vue";
import { useUserList, Props } from "./hook";
import { ref } from "vue";
const props = defineProps<Props>();
const emit = defineEmits(["close", "confirm"]);
const {
rootDept,
nowDept,
changeNowDept,
getDept,
getUsers,
select,
isSelected,
isDept,
selectedList,
isAllSelected,
show_all_select,
allSelected,
needSelectUser,
needSelectDept,
clearSelected,
getRootDept,
select_item,
changeSelectItem,
getBreadCrumbs,
} = useUserList(props);
getRootDept();
// 初始化
selectedList.value = JSON.parse(
JSON.stringify(
props.config.reduce((pre: any, now) => {
pre[now.key] = now.value || [];
return pre;
}, {})
)
);
changeSelectItem(props.config[0]);
const popup_comp = ref();
const close = () => {
popup_comp.value.show = false;
};
const confirm = () => {
props.onConfirm?.(selectedList.value);
close();
};
</script>
<style lang="less" scoped>
.content {
--border-radius: 6px;
display: flex;
flex-direction: column;
padding: 0 20px;
.selected_list {
border: 1px dotted #b7b8c0;
height: 100px;
padding: 0 0 10px 10px;
box-sizing: border-box;
border-radius: var(--border-radius);
position: relative;
margin-bottom: 10px;
.user_list {
height: 100%;
width: 100%;
overflow: auto;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
.name {
display: flex;
flex-wrap: wrap;
align-items: center;
background-color: var(--bg_gray);
padding: 4px 8px;
margin-right: 10px;
margin-top: 8px;
border-radius: 4px;
i {
color: #b7b8c0;
margin-left: 4px;
cursor: pointer;
}
&.title {
background: none;
}
}
}
.clear {
position: absolute;
color: var(--blue);
right: 10px;
bottom: 10px;
cursor: pointer;
}
&.active {
border: 1px solid var(--blue);
}
}
.selecte_content {
display: flex;
flex-direction: column;
margin-bottom: 10px;
.crumbs {
flex-wrap: nowrap;
overflow-y: auto;
margin-bottom: 10px;
}
.user_dept_list {
height: 340px;
overflow: auto;
border: 1px dotted #b7b8c0;
box-sizing: border-box;
border-radius: var(--border-radius);
padding: 10px;
.item {
display: flex;
align-items: center;
margin-bottom: 10px;
.name {
margin: 0 10px;
flex: 1;
}
.junior {
color: var(--blue);
}
}
}
}
}
</style>
<template>
<div class="user_dept_list">
<div
class="item"
:class="{
no_avatar: !show_avatar || type == 'dept',
}"
v-for="it in modelValue"
@click="removeUser(it)">
<avatarComp
v-if="show_avatar && type != 'dept'"
:src="it.avatar"
:name="it.nickname"
style="margin-bottom: 4px" />
<nameComp
:name="it.nickname || it.dept_name"
:type="type == 'dept' ? 'departmentName' : 'userName'"
class="name" />
<i class="icon-12 close"></i>
</div>
<template v-if="!disabled">
<div
class="item add"
@click="selectUser"
v-if="show_avatar && type != 'dept'">
<i class="icon-20"></i>
<span class="name">添加</span>
</div>
<div class="item add_no_avatar" v-else @click="selectUser">
<i class="icon-20"></i>
<span class="name">添加</span>
</div>
</template>
</div>
</template>
<script setup lang="ts">
import avatarComp from "@/components/avatar/index.vue";
import { $selectUserDept } from "@/components/select_user_dept/index";
interface Props {
modelValue?: any[];
disabled?: boolean;
show_avatar?: boolean;
size?: number;
type?: "user" | "dept";
}
const props = withDefaults(defineProps<Props>(), {
modelValue: () => [],
show_avatar: true,
show_add: true,
type: "user",
});
const emit = defineEmits(["update:modelValue"]);
const removeUser = (user: any) => {
const newUsers = props.modelValue.filter((it) => it.id != user.id);
emit("update:modelValue", newUsers);
};
const selectUser = () => {
$selectUserDept({
title: props.type == "dept" ? "选择部门" : "选择用户",
config: [
{
type: [props.type],
key: props.type,
value: props.modelValue,
size: props.size,
},
],
onConfirm: (data) => {
emit("update:modelValue", data[props.type]);
},
});
};
defineExpose({
selectUser,
});
</script>
<style lang="less" scoped>
.user_dept_list {
display: flex;
flex-wrap: wrap;
.item {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 10px;
margin-top: 6px;
position: relative;
color: var(--gray);
.close {
display: none;
}
}
.no_avatar {
background-color: var(--bg_gray);
padding: 5px 8px;
flex-direction: row;
.close {
display: inline-block;
font-size: 11px;
margin-left: 4px;
cursor: pointer;
color: var(--icon_gray);
}
}
.add {
cursor: pointer;
color: #7d7d7d;
.icon-20 {
width: 34px;
height: 34px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg_gray);
margin-bottom: 4px;
}
}
.add_no_avatar {
background-color: var(--hover_blue);
color: var(--blue);
display: flex;
flex-direction: row;
align-items: center;
padding: 5px 8px;
cursor: pointer;
i {
margin-right: 2px;
}
}
}
</style>
import { defineAsyncComponent, markRaw } from "vue";
// 字段props类型
export interface FieldProps {
config: FormItemConfig;
disabled?: boolean;
data: any;
required?: boolean;
}
// 基础字段配置
interface FieldConfig {
title: string;
icon: string;
key_type: number;
component: any;
disabledAdd?: boolean;
}
// 基础字段
export const baseFieldConfig: FieldConfig[] = [
{
title: "单行输入框",
icon: "icon-93",
key_type: 4,
component: markRaw(
defineAsyncComponent(() => import("./input/index.vue"))
),
},
{
title: "多行输入框",
icon: "icon-103",
key_type: 24,
component: markRaw(
defineAsyncComponent(() => import("./multiline/index.vue"))
),
},
{
title: "时间",
icon: "icon-43",
key_type: 8,
component: markRaw(
defineAsyncComponent(() => import("./date_time/index.vue"))
),
},
{
title: "时间区间",
icon: "icon-98",
key_type: 14,
component: markRaw(
defineAsyncComponent(() => import("./date_time_range/index.vue"))
),
},
{
title: "数字输入框",
icon: "icon-94",
key_type: 2,
component: markRaw(
defineAsyncComponent(() => import("./number/index.vue"))
),
},
{
title: "单选框",
icon: "icon-24",
key_type: 9,
component: markRaw(
defineAsyncComponent(() => import("./single_choice/index.vue"))
),
},
{
title: "人员选择",
icon: "icon-2",
key_type: 3,
component: markRaw(
defineAsyncComponent(() => import("./user/index.vue"))
),
},
{
title: "部门选择",
icon: "icon-248",
key_type: 29,
component: markRaw(
defineAsyncComponent(() => import("./dept/index.vue"))
),
},
{
title: "分割线",
icon: "icon-297",
key_type: 19,
component: markRaw(
defineAsyncComponent(() => import("./parting_line/index.vue"))
),
},
{
title: "附件",
icon: "icon-172",
key_type: 23,
component: markRaw(
defineAsyncComponent(() => import("./file/index.vue"))
),
},
{
title: "图片",
icon: "icon-449",
key_type: 5,
component: markRaw(
defineAsyncComponent(() => import("./image/index.vue"))
),
},
];
// 进阶字段
export const upgradeFieldConfig: FieldConfig[] = [];
// 自定义widget_key_name
export const widgetKeyName: { [key: string]: any } = {};
export const allFieldConfig = [...baseFieldConfig, ...upgradeFieldConfig];
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<span class="border value" @click="selectTime">
{{ data[config.key_id] }}
</span>
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
import { $selectTime } from "@/components/select_time/index";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (value: string) => {
emit("edit", { [props.config.key_id]: value });
};
const selectTime = () => {
$selectTime({
type: "time",
onConfirm: (value: string) => {
change(value);
},
});
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<span class="border" @click="selectTime(0)">
{{ start_time }}
</span>
<span></span>
<span class="border" @click="selectTime(1)">
{{ end_time }}
</span>
</div>
</div>
</template>
<script setup lang="ts">
import { computed } from "vue";
import { FieldProps } from "../config";
import { $selectTime } from "@/components/select_time/index";
import { dataFormat } from "@/utils/public";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (value: string[]) => {
emit("edit", { [props.config.key_id]: value });
};
const start_time = computed(() => props.data[props.config.key_id]?.[0]);
const end_time = computed(() => props.data[props.config.key_id]?.[1]);
const selectTime = (index: number) => {
$selectTime({
title: index == 0 ? "开始时间" : "结束时间",
type: "time",
onConfirm: (value: string) => {
console.log(value);
if (index == 0) {
let new_end_time = end_time.value;
if (!end_time.value || end_time.value < value) {
new_end_time = dataFormat(
new Date(value).getTime() + 1000 * 60 * 60 * 24
);
}
change([value, new_end_time]);
} else {
let new_start_time = start_time.value;
if (!start_time.value || start_time.value > value) {
new_start_time = dataFormat(
new Date(value).getTime() - 1000 * 60 * 60 * 24
);
}
change([new_start_time, value]);
}
},
});
};
</script>
<style lang="less" scoped>
@import "../global.less";
.content {
display: flex;
flex-wrap: nowrap;
align-items: center;
span:nth-of-type(2) {
margin: 0 6px;
margin-top: 10px;
}
}
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<div class="border" style="padding-top: 4px">
<userDeptListComp
:model-value="data[config.key_id]"
type="dept"
@update:model-value="change" />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
import userDeptListComp from "@/components/user_dept_list/index.vue";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (list: any[]) => {
emit("edit", { [props.config.key_id]: list });
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
<div class="add" @click="upload">
<i class="icon-20"></i>
上传附件
</div>
</div>
<div class="content">
<div class="file_item" v-for="it in files">
<img v-if="it.type == 1" v-signature:src="it.file_url" />
<img v-else :src="getFileIcon(it.file_name)" />
<div class="info">
<span class="title">{{ it.file_name }}</span>
<div class="user_time">
<span>{{ it.create_date }}</span>
</div>
</div>
<div class="controls">
<i class="icon-113" @click="remove(it)"></i>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { FieldProps } from "../config";
import { uploadFile, File, getFileIcon } from "@/utils/public";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const files = ref<File[]>([]);
const change = () => {
emit("edit", { [props.config.key_id]: files.value.map((it) => it.id) });
};
const upload = () => {
uploadFile({
onConfirm: (file) => {
files.value.push(file);
change();
},
});
};
const remove = (file: File) => {
const index = files.value.findIndex((it) => it.id == file.id);
files.value.splice(index, 1);
change();
};
const init = () => {
files.value = props.data[props.config.key_id] || [];
};
init();
</script>
<style lang="less" scoped>
@import "../global.less";
.label {
width: 100% !important;
.title {
flex: 1;
}
.add {
color: var(--blue);
font-size: 14px;
}
}
.content {
display: flex;
flex-direction: column;
.file_item {
display: flex;
align-items: center;
border: 1px dotted var(--border_color);
padding: 10px 12px;
border-radius: 4px;
margin-top: 10px;
&:hover {
border-color: var(--blue);
}
img {
width: 26px;
height: 29px;
}
.info {
flex: 1;
margin: 0 10px;
display: flex;
flex-direction: column;
.title {
font-size: 15px;
margin-bottom: 4px;
}
.user_time {
font-size: 13px;
color: rgb(154, 153, 153);
span {
margin-right: 10px;
}
}
}
.controls {
display: flex;
i {
cursor: pointer;
&:hover {
color: var(--blue);
}
}
}
}
}
</style>
.box {
display: flex;
flex-direction: column;
width: 100%;
padding: 0 16px;
margin-top: 20px;
box-sizing: border-box;
overflow: hidden;
.label {
width: 120px;
display: flex;
.title {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.content {
width: 100%;
overflow: hidden;
.border {
border-radius: 6px;
border: 1px solid var(--border_color);
margin-top: 10px;
width: 100%;
box-sizing: border-box;
padding: 10px;
font-size: 15px;
min-height: 39px;
display: inline-block;
}
}
}
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
<el-tooltip
:content="config.key_text"
placement="top"
v-if="config.key_text">
<i class="icon-22"></i>
</el-tooltip>
</div>
<div class="content">
<div class="img" v-for="it in files">
<img v-signature:src="it.file_url" />
<i class="icon-12 remove" @click="remove(it)"></i>
</div>
<div class="img add" @click="upload">
<i class="icon-20"></i>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import { FieldProps } from "../config";
import { uploadFile, File } from "@/utils/public";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const files = ref<File[]>([]);
const change = () => {
emit("edit", { [props.config.key_id]: files.value.map((it) => it.id) });
};
const upload = () => {
uploadFile({
onConfirm: (file) => {
files.value.push(file);
change();
},
});
};
const remove = (file: File) => {
const index = files.value.findIndex((it) => it.id == file.id);
files.value.splice(index, 1);
change();
};
const init = () => {
files.value = props.data[props.config.key_id] || [];
};
init();
</script>
<style lang="less" scoped>
@import "../global.less";
.content {
display: flex;
flex-wrap: wrap;
.img {
width: 100px;
height: 100px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
border: 1px dotted var(--icon_gray);
margin: 8px 8px 0 0;
position: relative;
img {
width: 100px;
height: 100px;
object-fit: cover;
border-radius: 10px;
overflow: hidden;
}
&.add {
color: var(--icon_gray);
cursor: pointer;
font-size: 20px;
&:hover {
border-color: var(--blue);
color: var(--blue);
}
}
&:hover {
.remove {
display: inline-block;
}
}
.remove {
display: none;
position: absolute;
right: 4px;
top: 4px;
background-color: white;
padding: 4px;
font-size: 10px;
border-radius: 50%;
cursor: pointer;
}
}
}
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<input
type="text"
class="border"
:model-value="data[config.key_id]"
@input="change" />
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (e: any) => {
emit("edit", { [props.config.key_id]: e.target.modelValue });
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<textarea
class="border"
:rows="5"
:model-value="data[config.key_id]"
@input="change"></textarea>
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (e: any) => {
emit("edit", { [props.config.key_id]: e.target.modelValue });
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<input
type="text"
class="border"
:model-value="data[config.key_id]"
@input="change" />
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (e: any) => {
const value = e.target.value.replace(/[^0-9]/g, "");
e.target.value = value;
emit("edit", { [props.config.key_id]: value });
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="line"> <span></span> </div>
</template>
<style lang="less" scoped>
.line {
width: 100%;
display: flex;
margin: 10px 0;
span {
display: inline-block;
width: 100%;
height: 4px;
background-color: var(--border_color);
}
}
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<span class="border" @click="select">
{{ data[config.key_id] }}
</span>
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
import { $select } from "@/components/select";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (value: string) => {
emit("edit", { [props.config.key_id]: value });
};
const select = () => {
$select({
title: "选择选项",
value: props.data[props.config.key_id],
options: (props.config?.conf?.val || []).map((it: any) => ({
text: it.text,
value: it.text,
})),
onConfirm: (e) => {
change(e);
},
});
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="box">
<div class="label">
<span class="required" v-if="required">*</span>
<span class="title">{{ config.key_name }}</span>
</div>
<div class="content">
<userDeptListComp
style="margin-top: 10px"
:model-value="data[config.key_id]"
@update:model-value="change" />
</div>
</div>
</template>
<script setup lang="ts">
import { FieldProps } from "../config";
import userDeptListComp from "@/components/user_dept_list/index.vue";
const props = defineProps<FieldProps>();
const emit = defineEmits(["edit"]);
const change = (list: any[]) => {
emit("edit", { [props.config.key_id]: list });
};
</script>
<style lang="less" scoped>
@import "../global.less";
</style>
<template>
<div class="widget_main">
<template v-for="it in form_content" :key="it.key_id">
<component
v-if="it.hidden != '1'"
:key="it.key_id"
:is="getShowComp(it)"
:config="it"
:disabled="disabled"
:data="modelValue"
@edit="edit" />
</template>
</div>
</template>
<script setup lang="ts">
import { computed } from "vue";
import { allFieldConfig, widgetKeyName } from "./field/config";
interface Props {
modelValue?: any; // 数据
form_detail: FormDetail; // 表单详情
disabled?: boolean; // 是否禁用
}
const props = withDefaults(defineProps<Props>(), {
modelValue: {},
});
const emit = defineEmits([
"addNewFormItem",
"sortFormItem",
"selectFormField",
"removeFormField",
"update:modelValue",
"editData",
]);
const edit = (editData: object) => {
emit("update:modelValue", { ...props.modelValue, ...editData });
emit("editData", editData);
};
// 表单字段列表
const form_content = computed(() =>
(props.form_detail.form_content || []).sort((a, b) => a.sort - b.sort)
);
// 获取需要显示的组件
const getShowComp = (formItem: FormItemConfig) => {
if (formItem?.widget_key_name) {
return widgetKeyName[formItem.widget_key_name];
}
return allFieldConfig.find((filed) => filed.key_type == formItem.key_type)
?.component;
};
</script>
<style lang="less" scoped>
.widget_main {
width: 100%;
height: 100%;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
box-sizing: border-box;
overflow: auto;
}
</style>
// 自定义字段配置
interface FormItemConfig {
key_id: string;
key_name: string;
key_type: number;
client_width?: number;
create_hidden?: string;
default_val?: any;
widget_key_name?: string;
hidden: "0" | "1";
x?: any;
[key: string]: any;
}
// form表单配置
interface FormDetail {
form_name: string;
id: number;
form_id: string;
form_content: FormItemConfig[];
}
// 表单列表
interface FormInfo {
default_config: string;
flow_config: string;
form_id: string;
id: string;
is_default: string;
is_open: string;
is_system: string;
node_info: any[];
power: string;
status: string | number;
template_type: string;
title: string;
update_time: string;
}
import { createApp } from "vue";
import App from "./App.vue";
import { initApp } from "@/utils/init";
import router from "@/router";
import { createPinia } from "pinia";
// css
import "./assets/css/reset.css";
import "./assets/css/global.less";
import "./assets/icon/style.css";
import "vant/lib/toast/index.css";
const app = createApp(App);
app.use(createPinia());
app.use(router);
initApp(app);
app.mount("#app");
import { RouteRecordRaw, createWebHashHistory, createRouter } from "vue-router";
import { getUrlKey, getToken, setToken } from "@/utils/public";
import { login } from "@/utils/container";
import { useUserStore } from "@/store/user";
import { useOssStore } from "@/store/oss";
const routers: RouteRecordRaw[] = [
{
path: "/",
name: "home",
component: () => import("@/view/ceshi.vue"),
},
];
const router = createRouter({
history: createWebHashHistory(),
routes: routers,
});
// 白名单列表
const whitelist: string[] = [];
let first = true; // 首次进入
router.beforeEach(async (to, from, next) => {
console.log("router.beforeEach", to, from);
// 是否是白名单
if (whitelist.includes(to.path)) {
next();
return;
}
if (first) {
const USER = useUserStore();
const OSS = useOssStore();
// 获取token 登陆
let token = getUrlKey("token") || getToken();
if (!token) {
await login();
token = getToken()!;
}
setToken(token);
await USER.getUserInfo(token); // 获取用户信息
OSS.getOss(); // 获取oss
first = false;
}
next();
});
export default router;
import { computed, ref } from "vue";
import { defineStore } from "pinia";
import api from "@/api";
export interface OssConfig {
accessid: string;
callback: string;
dir: string;
expire: number;
host: string;
policy: string;
signature: string;
type: number;
}
export const useOssStore = defineStore("oss", () => {
const oss = ref<OssConfig[]>([]);
const base_oss = computed(() => oss.value[0] || {});
const temporarily_oss = computed(() => oss.value[1] || {});
const getOss = async () => {
if (oss.value.length) return;
const msg = await api.oss.getOssConfig();
if (msg.code == 0) {
oss.value = msg.data;
}
};
// 获取文件地址
const getFileKey = (dir: string, file_name: string) => {
return `${dir}${new Date().getTime()}/${file_name}`;
};
// 获取data
const getBaseData = (file: File) => {
const call_back = JSON.parse(base_oss.value.callback);
const call_back_body = call_back.callbackBody.replace(
"${callbackid}",
new Date().getTime().toString()
);
const new_call_back = window.btoa(
JSON.stringify({
...call_back,
callbackBody: call_back_body,
})
);
return {
key: getFileKey(base_oss.value.dir, file.name),
policy: base_oss.value.policy,
OSSAccessKeyId: base_oss.value.accessid,
success_action_status: 200,
signature: base_oss.value.signature,
callback: new_call_back,
};
};
return {
oss,
base_oss,
temporarily_oss,
getOss,
getFileKey,
getBaseData,
};
});
import { ref } from "vue";
import { defineStore } from "pinia";
import api from "@/api";
import { UserInfo } from "@/components/select_user_dept/hook";
interface UserStatus {
color: string;
id: string;
name: string;
}
export const useUserStore = defineStore("user", () => {
const user_info = ref<UserInfo>({} as UserInfo);
const user_status = ref<UserStatus>({} as UserStatus);
// 获取用户信息
const getUserInfo = async (token: string) => {
if (user_info.value.id || !token) return;
console.log("login... ", token);
const msg = await api.user.getByToken();
if (msg.code == 0) {
user_info.value = msg.data;
}
getWorkStatus();
};
// 获取用户工作状态
const getWorkStatus = async () => {
const msg = await api.user.getMyWorkStatus();
if (msg.code == 0) {
user_status.value = msg.data;
}
};
return {
user_info,
getUserInfo,
user_status,
getWorkStatus,
};
});
import * as dd from "dingtalk-jsapi"; // 此方式为整体加载,也可按需进行加载
import { getUrlKey, setToken } from "@/utils/public";
// import openLink from "dingtalk-jsapi/api/biz/util/openLink";
import api from "@/api";
const corpId = getUrlKey("corp_id")!;
// 登陆
export const login = () => {
return new Promise((resolve) => {
dd.ready(async () => {
const info = await dd.runtime.permission.requestAuthCode({
corpId: corpId, // 企业id
});
const token_msg = await api.platform.loginByAuthCode({
relate_corp_id: corpId,
auth_code: info.code,
});
if (token_msg.code == 0) {
setToken(token_msg.data.token);
resolve(true);
}
});
});
};
import * as dd_util from "./dd";
import * as wx_util from "./wx";
/**
* 判断打开程序的容器
* dd : 钉钉
* wx : 企业微信
* browser : 浏览器
*/
const openContainer = navigator.userAgent.toLowerCase();
export const container = {
dd: openContainer.includes("dingtalk"),
wx: openContainer.includes("wxwork"),
browser:
!openContainer.includes("dingtalk") &&
!openContainer.includes("wxwork"),
};
// 登陆
export const login = async () => {
if (container.dd) {
await dd_util.login();
} else if (container.wx) {
await wx_util.login();
} else if (container.browser) {
// router.push({ name: "codeLogin" });
}
};
export const login = async () => {};
import { App, DirectiveBinding } from "vue";
import { ossSignature } from "./ossSignature";
// 签名图片
interface SignatureImg {
src: string; // 图片地址
scale?: boolean; // 是否显示缩略图
}
export const signature = (el: any, binding: DirectiveBinding<any>) => {
let image_info: SignatureImg = binding.value;
if (typeof binding.value == "string") {
image_info = { src: binding.value };
}
if (image_info.src) {
// 要操作的属性 src图片url bg背景图
const type = binding.arg || "src";
// 文件后缀
const suffix = image_info?.src.substring(
image_info?.src.lastIndexOf(".") + 1
);
// 是否是缩略图
const scaleText = "x-oss-process=image/resize,l_100,m_lfit";
let scale = image_info?.scale ?? false;
if (
["png", "jpg", "bmp", "gif", "webp", "tiff"].indexOf(
suffix.toLowerCase()
) == -1
) {
scale = false;
}
const file_url = `${image_info.src}${scale ? `?${scaleText}` : ""}`;
ossSignature(file_url).then((url: string) => {
if (type == "src") {
el.src = url;
} else {
el.style.backgroundImage = `url(${url})`;
}
});
}
};
const installSignature = (app: App<Element>) => {
app.directive("signature", signature);
};
// 自定义指令
export default (app: App<Element>) => {
installSignature(app);
};
import { ref, ComputedRef } from "vue";
import { showToast } from "vant";
import { throttle } from "./public";
import api from "@/api";
import { UserInfo } from "@/components/select_user_dept/hook";
// 数据列表
interface UseDataList {
api: Function;
params?: any;
deleteApi?: Function;
}
export const useDataList = (props: ComputedRef<UseDataList>) => {
const list = ref<any[]>([]);
const count = ref(0);
const page = ref(1);
const getList = async () => {
const msg = await props.value.api({
page: page.value,
size: 20,
...(props.value.params || {}),
});
if (msg.code == 0) {
list.value = msg.data.data || [];
count.value = msg.data.count || 0;
console.log("list", list.value);
}
};
const deleteData = async (params: any) => {
const msg = await props.value?.deleteApi?.(params);
if (msg?.code == 0) {
showToast({ message: "删除成功", position: "top" });
getList();
}
};
return {
list,
count,
page,
getList,
deleteData,
};
};
// 滚动底部请求下一页
interface useScrollProps {
distance?: number; // 出发距离
callback(): void; // 回调函数
}
export const useScroll = (props: useScrollProps) => {
// 滚动分页
const handleScroll = throttle(() => {
props.callback();
}, 1000);
const scroll = (e: any) => {
if (
e.target.scrollHeight -
e.target.offsetHeight -
e.target.scrollTop <=
(props.distance || 50)
) {
handleScroll();
}
};
return { scroll };
};
// 地址
interface Address {
adcode: string;
center: string;
citycode: string;
districts: Address[];
level: string;
name: string;
}
export const useAddress = () => {
const addressList = ref<Address[]>([]);
const getAddressList = async () => {
const msg = await api.form.GetAddress();
if (msg.code == 0) {
addressList.value = msg.data.lists;
}
};
getAddressList();
return {
addressList,
};
};
// 获取团队
export interface Team {
fuze_area: any;
fuze_user: UserInfo;
team_members: UserInfo[];
id: string;
team_name: string;
team_remark: string;
children: Team[];
_parent_id: string;
}
export const useTeam = () => {
const team_list = ref<Team[]>([]);
const getTeamList = async () => {
const msg = await api.user.listTeam();
if (msg.code == 0) {
team_list.value = msg.data;
}
};
return {
team_list,
getTeamList,
};
};
// 获取角色
export interface Role {
id: string;
is_system: "0" | "1";
part_name: string;
part_power: { [k: string]: number };
status: "0" | "1";
user_ids: UserInfo[];
}
export const useRole = () => {
const role_list = ref<Role[]>([]);
const getRole = async () => {
const msg = await api.power.PartList({
page: 1,
size: 1000,
});
if (msg.code == 0) {
role_list.value = msg.data.lists;
}
};
return {
role_list,
getRole,
};
};
// 获取表单类型 0,3,4工单类型 5回执模版 6评价模版
interface Props {
params: object;
}
export const useTypeList = (props: ComputedRef<Props>) => {
const list = ref<FormInfo[]>([]);
const getList = async () => {
const msg = await api.form.TemplateLists(props.value.params);
if (msg.code == 0) {
list.value = msg.data.lists;
}
};
return {
list,
getList,
};
};
import { App } from "vue";
// 指令
import directive from "@/utils/directive";
// 全局组件
import avatarComp from "@/components/avatar/index.vue";
import nameComp from "@/components/name/index.vue";
export const initApp = (app: App<Element>) => {
app.component("avatarComp", avatarComp);
app.component("nameComp", nameComp);
app.use(directive);
};
import api from "@/api";
interface UrlList {
[k: number]: string;
}
let url_list: UrlList = {}; // 等待请求的地址
let call_back: any = {}; // 回调
let timer: any = null; // 定时器
let id = 0; // 请求的唯一key
// 签名
export const ossSignature = (url: string): Promise<string> => {
return new Promise(async (resolve) => {
if (timer) {
clearTimeout(timer);
timer = null;
}
const _id = id++;
url_list[_id] = url;
call_back[_id] = resolve;
timer = setTimeout(() => {
if (Object.keys(url_list).length) {
const get_sign_list = JSON.parse(JSON.stringify(url_list));
url_list = {};
getSign(get_sign_list);
}
}, 100);
});
};
// 获取签名
export const getSign = async (url_list: UrlList) => {
const msg = await api.oss.getSignByMap({ data: url_list });
if (msg.code == 0) {
Object.keys(msg.data.sign || {}).forEach((key) => {
call_back[key]?.(msg.data.sign[key]);
});
}
};
import { useOssStore } from "@/store/oss";
import axios from "axios";
import file_icon from "@/assets/file_icon/index";
import { showToast } from "vant";
/**
* 格式化文件大小
* @param size 比特数据
*/
export function formatFileSize(size: number): string {
if (!size) {
return "0";
}
let temp: number | string = 0;
if (size < 1024) {
return size + "B";
} else if (size < 1024 * 1024) {
temp = size / 1024;
temp = temp.toFixed(2);
return temp + "KB";
} else if (size < 1024 * 1024 * 1024) {
temp = size / (1024 * 1024);
temp = temp.toFixed(2);
return temp + "MB";
} else {
temp = size / (1024 * 1024 * 1024);
temp = temp.toFixed(2);
return temp + "GB";
}
}
/**
* 获取url参数
* @param name key名
*/
export function getUrlKey(name: string): string {
return decodeURIComponent(
(new RegExp("[?|&]" + name + "=" + "([^&;]+?)(&|#|;|$)").exec(
location.href
) || [, ""])[1].replace(/\+/g, "%20")
);
}
// 防抖
export function debounce(func: Function, delay: number = 200) {
let timerId: any;
return function (...args: any[]) {
clearTimeout(timerId);
timerId = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
// 节流
export function throttle(func: Function, delay: number = 200) {
let timeoutId: any;
return function () {
const args = arguments;
// 如果已经设置了定时器,则不执行函数
if (timeoutId) {
return;
}
// 延迟一定时间后执行函数
func.apply(this, args);
timeoutId = setTimeout(function () {
timeoutId = null; // 清除定时器
}, delay);
};
}
// Token
interface Token {
token: string;
expired_time: number;
}
const corpId = getUrlKey("corp_id")!;
const token_key = `gongdan_token_${corpId}`;
// 获取有效token
export const getToken = () => {
const tokenStr = window.localStorage.getItem(token_key);
if (tokenStr) {
const token: Token = JSON.parse(tokenStr);
// 判断token是否过期
if (token.expired_time > Math.floor(new Date().getTime() / 1000)) {
return token.token;
} else {
window.localStorage.removeItem(token_key);
}
}
return null;
};
// 设置token
export const setToken = (token: string) => {
window.localStorage.setItem(
token_key,
JSON.stringify({
token,
expired_time:
Math.floor(new Date().getTime() / 1000) + 24 * 60 * 60,
})
);
};
// 移除token
export const removeToken = () => {
window.localStorage.removeItem(token_key);
};
// 上传附件
interface UploadFile {
ext?: string[]; // 允许上传的文件格式
size?: number; // 允许上传的文件大小(mb)
onConfirm(file: File): void;
}
export interface File {
extension: string;
file_name: string;
file_url: string;
id: string;
size: number;
create_date: string;
type: number; // 文件类型 1=>图片 2=>文档 3=>音视频 4=>压缩包 5=>其他
}
export const uploadFile = (props: UploadFile) => {
const Oss = useOssStore();
const input = document.createElement("input");
input.type = "file";
input.accept = "";
input.addEventListener("change", async (event: any) => {
const file = event.target.files[0];
// 验证文件格式
const ext = file.name.split(".").pop().toLowerCase();
if (props.ext && !props.ext.includes(ext)) {
showToast({ message: "请上传正确格式的文件", position: "top" });
return;
}
// 验证文件大小
if (file.size > (props?.size || 5) * 1024 * 1024) {
showToast({
message: `文件大小不能超过 ${props.size}MB`,
position: "top",
});
return;
}
// 上传文件
const data: any = Oss.getBaseData(file);
const params = new FormData();
Object.keys(data).forEach((key) => {
params.set(key, data[key]);
});
params.append("file", file);
const msg = await axios.post(Oss.base_oss.host, params);
if (msg.data.code == 0) {
props.onConfirm(msg.data.data.data);
}
input.remove();
});
input.click();
};
// 获取文件icon
export const getFileIcon = (file_name: string) => {
let suffix = file_name
?.substring?.(file_name.lastIndexOf("."))
?.toLowerCase();
if ([".docx", ".doc"].includes(suffix)) {
return file_icon.doc;
} else if ([".xls", ".csv", ".xlsx"].includes(suffix)) {
return file_icon.xlsx;
} else if ([".ppt", ".pptx"].includes(suffix)) {
return file_icon.ppt;
} else if ([".pdf"].includes(suffix)) {
return file_icon.pdf;
} else if (
[".mp4", ".mov", ".avi", ".wmv", ".webm", ".mkv"].includes(suffix)
) {
return file_icon.video;
} else if ([".zip"].includes(suffix)) {
return file_icon.zip;
} else if ([".rar"].includes(suffix)) {
return file_icon.rar;
} else if ([".psd"].includes(suffix)) {
return file_icon.psd;
} else if ([".dwg"].includes(suffix)) {
return file_icon.dwg;
} else {
return file_icon.file;
}
};
// 下载附件
export const downFile = (url: string, name: string) => {
const link = document.createElement("a");
link.href = url;
link.download = name;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
// 16进制颜色修改透明度
export const hexToRgba = (hex: string, alpha: string | number = ".2") => {
if (!hex) return "";
const r = parseInt(hex.slice(1, 3), 16);
const g = parseInt(hex.slice(3, 5), 16);
const b = parseInt(hex.slice(5, 7), 16);
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};
// 平铺树形数据
export const flatTree = (list: any[], key: string) => {
const arr: any[] = [...(list || [])];
list.forEach((it) => {
if (it[key]?.length) {
arr.push(...flatTree(it[key], key));
}
});
return arr;
};
// 时间转换
export const dataFormat = (date: any, fmt: string = "YYYY-MM-DD HH:mm:ss") => {
const dateObj = new Date(date);
if (isNaN(dateObj.getTime())) {
return "";
}
const formatMap: { [key: string]: () => string } = {
YYYY: () => dateObj.getFullYear().toString(),
MM: () => (dateObj.getMonth() + 1).toString().padStart(2, "0"),
DD: () => dateObj.getDate().toString().padStart(2, "0"),
HH: () => dateObj.getHours().toString().padStart(2, "0"),
mm: () => dateObj.getMinutes().toString().padStart(2, "0"),
ss: () => dateObj.getSeconds().toString().padStart(2, "0"),
};
return fmt.replace(/YYYY|MM|DD|HH|mm|ss/g, (match) => formatMap[match]());
};
import { ref } from "vue";
import api from "@/api";
import { showToast } from "vant";
export const user_tag_colors = [
"#02B092",
"#F75E5E",
"#BC84CC",
"#6AB5CE",
"#F59820",
"#FF8E6B",
"#A1887F",
"#C4CB62",
"#1679FC",
"#F75E8D",
"#5C6BC0",
"#9A88B8",
"#5DC8F6",
"#626262",
];
// 客户标签列表
export interface UserTag {
id: string;
label_color: string;
label_icon: string;
label_name: string;
label_type: string;
}
export interface AddTag {
label_color: string;
label_icon: string;
label_name: string;
}
export const useUserTag = () => {
const user_tags = ref<UserTag[]>([]);
const getTags = async () => {
const msg = await api.customer.listCustomerLabel();
if (msg.code == 0) {
user_tags.value = msg.data.data;
}
};
getTags();
// 客户标签统计
const user_tags_count = ref<{ [k: string]: number }>({});
const getUserTagsCount = async (params: { form_id: string }) => {
const msg = await api.customer.getCustomCount(params);
if (msg.code == 0) {
user_tags_count.value = msg.data;
}
};
// 删除
const deleteUserTag = async (id: string) => {
const msg = await api.customer.deleteCustomerLabel({ ids: [id] });
if (msg.code == 0) {
showToast({ message: "删除成功", position: "top" });
getTags();
}
};
// 添加
const addUserTag = async (tag: AddTag) => {
if (!tag.label_name) {
showToast({ message: "标签名未填写", position: "top" });
return;
}
const msg = await api.customer.saveCustomLabel(tag);
if (msg.code == 0) {
showToast({ message: "添加成功", position: "top" });
getTags();
}
};
return {
user_tags,
getTags,
user_tags_count,
getUserTagsCount,
deleteUserTag,
addUserTag,
};
};
// 产品分类
export interface ProductClass {
classify_name: string;
id: string;
_parent_id?: string;
edit?: boolean;
}
export const useProductClass = () => {
const product_class = ref<ProductClass[]>([]);
const getProductClass = async () => {
const msg = await api.product.listClassify({});
if (msg.code == 0) {
product_class.value = msg.data.data;
}
};
getProductClass();
// 获取树形子节点
const getChildren = (id: string): ProductClass[] => {
const children = product_class.value.filter((it) => it._parent_id == id);
if (!children.length) return [];
return children.map((it) => ({
...it,
children: getChildren(it.id),
}));
};
// 产品分类统计
const product_class_count = ref<{ [k: string]: number }>({});
const getProductClassCount = async (params: { form_id: string }) => {
const msg = await api.product.getClassifyCount(params);
if (msg.code == 0) {
product_class_count.value = msg.data;
}
};
// 删除产品分类
const deleteClassify = async (id: string) => {
const msg = await api.product.deleteClassify({
ids: [id],
});
if (msg.code == 0) {
showToast({ message: "删除成功", position: "top" });
getProductClass();
}
};
// 添加产品分类
const addClassify = async (data: ProductClass) => {
const msg = await api.product.saveClassify({
id: data.id == "edit" ? undefined : data.id,
classify_name: data.classify_name,
_parent_id: data._parent_id,
});
if (msg.code == 0) {
showToast({ message: `${data.id ? "添加" : "修改"}成功`, position: "top" });
getProductClass();
}
};
return {
product_class,
getProductClass,
getChildren,
product_class_count,
getProductClassCount,
deleteClassify,
addClassify,
};
};
// 工单标签
export interface OrderTag extends UserTag {}
export const useOrderTag = () => {
const order_tag = ref<OrderTag[]>([]);
const getOrderTag = async () => {
const msg = await api.order.listOrderLabel({
page: 1,
size: 1000,
});
if (msg.code == 0) {
order_tag.value = msg.data.data;
console.log("order_tag", order_tag.value);
}
};
getOrderTag();
return {
order_tag,
getOrderTag,
};
};
// 工作状态
export interface WorkStatusTag {
id: string;
color: string;
is_system: "0" | "1";
name: string;
}
export const useWorkStatusTag = () => {
const work_status_tag = ref<WorkStatusTag[]>([]);
const getWorkStatusTag = async () => {
const msg = await api.user.listWorkStatus();
if (msg.code == 0) {
work_status_tag.value = msg.data.data;
}
};
// 添加
const addWorkStatusTag = async (data: { name: string; color: string }) => {
const msg = await api.user.addWorkStatus(data);
if (msg.code == 0) {
showToast({ message: "添加成功", position: "top" });
getWorkStatusTag();
}
};
// 删除
const delWorkStatusTag = async (id: string) => {
const msg = await api.user.deleteWorkStatus({ ids: [id] });
if (msg.code == 0) {
showToast({ message: "删除成功", position: "top" });
getWorkStatusTag();
}
};
return {
work_status_tag,
getWorkStatusTag,
addWorkStatusTag,
delWorkStatusTag,
};
};
// 优先级
interface Priority {
label: string;
color: string;
}
export const priority: Priority[] = [
{
label: "一般",
color: "",
},
{
label: "紧急",
color: "#FF8F47",
},
{
label: "非常紧急",
color: "#F14637",
},
];
export const getPriority = (label: string): Priority => {
return priority.find((it) => it.label == label) || ({} as Priority);
};
// 工单状态
export interface OrderType {
label: string;
value: string;
key: string;
bg_color?: string;
color?: string;
}
export const order_type: OrderType[] = [
{
label: "待指派",
value: "0",
key: "WaitOrder",
bg_color: "#EB6539",
color: "white",
},
{
label: "待接单",
value: "1",
key: "MissOrder",
bg_color: "#323F54",
color: "white",
},
{
label: "待开始",
value: "2",
key: "WaitBegin",
bg_color: "#8DA4CE",
color: "white",
},
{
label: "处理中",
value: "3",
key: "Dealing",
bg_color: "#3B8CF7",
color: "white",
},
// {
// label: "待确认",
// value: "4",
// key: "Confirm",
// },
{
label: "已完成",
value: "5",
key: "Finish",
bg_color: "#3E9586",
color: "white",
},
{
label: "已评价",
value: "6",
key: "Evaluate",
bg_color: "#3F93B7",
color: "white",
},
// {
// label: "已确认",
// value: "7",
// key: "Confirming",
// },
{
label: "已取消",
value: "8",
key: "Cancel",
bg_color: "#F24537",
color: "white",
},
// {
// label: "已退回",
// value: "9",
// key: "Return",
// },
{
label: "已挂起",
value: "10",
key: "HangUp",
bg_color: "#856CA8",
color: "white",
},
];
export const getType = (type: string) => {
return order_type.find((it) => it.value == type);
};
<template>
<div> <widgetComp v-model="data" :form_detail="form_detail" /> </div>
</template>
<script setup lang="ts">
import api from "@/api";
import widgetComp from "@/components/widget/index.vue";
import { ref } from "vue";
const form_detail = ref<FormDetail>({} as FormDetail);
const getFormDetail = async () => {
const msg = await api.form.FormDetail({
id: "4499f2474998c295",
});
if (msg.code == 0) {
form_detail.value = msg.data[0] || {};
}
};
getFormDetail();
const data = ref({});
</script>
<style lang="less" scoped></style>
/// <reference types="vite/client" />
declare module "*.vue" {
import { ComponentOptions } from "vue";
const componentOptions: ComponentOptions;
export default componentOptions;
}
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
// 不提示this有any类型
"noImplicitThis": false,
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": "./",
//路径映射,相对于baseUrl
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
"references": [{ "path": "./tsconfig.node.json" }]
}
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true
},
"include": ["vite.config.ts"]
}
import { defineConfig, loadEnv } from "vite";
import vue from "@vitejs/plugin-vue";
import path from "path";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { VantResolver } from "@vant/auto-import-resolver";
// https://vitejs.dev/config/
export default ({ mode }: any) => {
const { VITE_APP_BASE_URL } = loadEnv(mode, process.cwd());
console.log("VITE_APP_BASE_URL", VITE_APP_BASE_URL);
return defineConfig({
base: "./",
plugins: [
vue(),
AutoImport({
resolvers: [VantResolver()],
}),
Components({
resolvers: [VantResolver()],
}),
],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
server: {
host: "0.0.0.0",
proxy: {
"/api": {
target: VITE_APP_BASE_URL,
changeOrigin: true,
},
},
},
});
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment