diff --git a/front-end/XDShare-FE/.gitignore b/front-end/XDShare-FE/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..574a4987f21eb938c49a8e7ff75cfe5a7c4d44cf --- /dev/null +++ b/front-end/XDShare-FE/.gitignore @@ -0,0 +1,27 @@ +# 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/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +components.d.ts +.vite \ No newline at end of file diff --git a/front-end/XDShare-FE/README.md b/front-end/XDShare-FE/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c02eb704a154a04e5eeeb3445f95631956df4c48 --- /dev/null +++ b/front-end/XDShare-FE/README.md @@ -0,0 +1,46 @@ +# XDShare-FE + +## 版本 +Node v18.20.0 +npm v10.5.0 + +安装依赖: `npm install` + +本地运行: `npm run dev` + +构建: `npm run build` + +## 主要依赖 + - vue3 & vue-router4 & vuex4 + - Typescript + - less + - ant-design-vue + - axios & qs + +## 目录说明 +src +├─api # 接口 + +├─assets # 静态文件 + +├─components # 公用组件 + +├─constant # 常量 + +├─lib # 工具模块 + +├─pages # 页面 + +├─router # 路由 + +├─store # 状态管理 + +├─styles # 公用样式 + +└─types # 公用类型 + +## 规范 + +## 测试账号 +account: linds123 +password: 123456 \ No newline at end of file diff --git a/front-end/XDShare-FE/index.html b/front-end/XDShare-FE/index.html new file mode 100644 index 0000000000000000000000000000000000000000..173a0b72df5743fc0c3b0e79ed49c94f7ba2bc3d --- /dev/null +++ b/front-end/XDShare-FE/index.html @@ -0,0 +1,16 @@ + + + + + + + + X-Share + + + +
+ + + + \ No newline at end of file diff --git a/front-end/XDShare-FE/package-lock.json b/front-end/XDShare-FE/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..288514f41ef526ff8e9bb228249a575792492b02 --- /dev/null +++ b/front-end/XDShare-FE/package-lock.json @@ -0,0 +1,2180 @@ +{ + "name": "xdshare-fe", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "xdshare-fe", + "version": "0.0.0", + "dependencies": { + "ant-design-vue": "^4.1.2", + "axios": "^1.6.8", + "lodash": "^4.17.21", + "qs": "^6.12.0", + "vue": "^3.3.4", + "vue-router": "^4.3.0", + "vuex": "^4.1.0" + }, + "devDependencies": { + "@types/lodash": "^4.17.0", + "@types/node": "^20.12.4", + "@vitejs/plugin-vue": "^4.2.3", + "less": "^4.2.0", + "typescript": "^5.0.2", + "unplugin-vue-components": "^0.27.0", + "vite": "^4.4.0", + "vue-tsc": "^1.8.3" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.8", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.8.tgz", + "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==", + "dev": true + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.4", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.12.4.tgz", + "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" + }, + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ant-design-vue": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-4.1.2.tgz", + "integrity": "sha512-ynFkDJLlHgumeK6Hr1UZ7PvQNZ1uBcri/pmejBdS3kRqHeA5VRsxneYDwa8YxA+uYB5YfT2jpYsSHsiMiCjRGg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js": { + "version": "3.36.1", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "optional": true + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.0.tgz", + "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/qs": { + "version": "6.12.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.4.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unplugin": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.27.0.tgz", + "integrity": "sha512-77eTEy23sQ0UpzGWnZ9I2mY3cnmXwklz4ITcn3JfxjCoX643ghImkiZ4nFm58sxbdVcc4Fo/o4LIoFnlqEqsSg==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.7", + "@rollup/pluginutils": "^5.1.0", + "chokidar": "^3.6.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.10", + "minimatch": "^9.0.4", + "resolve": "^1.22.8", + "unplugin": "^1.10.1" + }, + "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 + } + } + }, + "node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.3.0.tgz", + "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.1" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vuex": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz", + "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/front-end/XDShare-FE/package.json b/front-end/XDShare-FE/package.json new file mode 100644 index 0000000000000000000000000000000000000000..6d34d32d96dc23514ed6c62bce50715bcd09eaa5 --- /dev/null +++ b/front-end/XDShare-FE/package.json @@ -0,0 +1,30 @@ +{ + "name": "xdshare-fe", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "ant-design-vue": "^4.1.2", + "axios": "^1.6.8", + "lodash": "^4.17.21", + "qs": "^6.12.0", + "vue": "^3.3.4", + "vue-router": "^4.3.0", + "vuex": "^4.1.0" + }, + "devDependencies": { + "@types/lodash": "^4.17.0", + "@types/node": "^20.12.4", + "@vitejs/plugin-vue": "^4.2.3", + "less": "^4.2.0", + "typescript": "^5.0.2", + "unplugin-vue-components": "^0.27.0", + "vite": "^4.4.0", + "vue-tsc": "^1.8.3" + } +} diff --git a/front-end/XDShare-FE/public/vite.svg b/front-end/XDShare-FE/public/vite.svg new file mode 100644 index 0000000000000000000000000000000000000000..e7b8dfb1b2a60bd50538bec9f876511b9cac21e3 --- /dev/null +++ b/front-end/XDShare-FE/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front-end/XDShare-FE/src/App.vue b/front-end/XDShare-FE/src/App.vue new file mode 100644 index 0000000000000000000000000000000000000000..30e1257605d1fa6575bcd49d8195dfedd3468369 --- /dev/null +++ b/front-end/XDShare-FE/src/App.vue @@ -0,0 +1,10 @@ + + + + + + diff --git a/front-end/XDShare-FE/src/api/apis.ts b/front-end/XDShare-FE/src/api/apis.ts new file mode 100644 index 0000000000000000000000000000000000000000..9e45ad4223944a4d7140497f0c450b2bf5c43c76 --- /dev/null +++ b/front-end/XDShare-FE/src/api/apis.ts @@ -0,0 +1,172 @@ +import type { apiInfo } from "./axios"; +// export const isMock = true; // 此处判断是否开启mock +export const isMock = false; // 此处判断是否开启mock +const host = isMock + ? "https://mock.apifox.com/m1/4301594-0-default" + : "//8.130.23.148:8080"; +const userPreStr = host + "/user"; +const adminPreStr = host + "/admin"; +const filePreStr = host + "/file"; +export const userApis: Record = { + // 用户登录 + login: { + url: userPreStr + "/sign_in", + method: "post", + }, + // 用户注册 + register: { + url: userPreStr + "/sign_up", + method: "post", + }, + // 获取用户信息 + getUserInfo: { + url: userPreStr + "/getUserInfo", + method: "post", + }, + // 更改用户信息 + changeUserInfo: { + url: userPreStr + "/changeUserInfo", + method: "post", + }, + // 获取历史记录 + getHistory: { + url: userPreStr + "/history", + method: "get", + }, + // 获取用户点赞过的文章 + getLikePosts: { + url: userPreStr + "/like", + method: "get", + }, + // 获取用户收藏的文章 + getFavouritePosts: { + url: userPreStr + "/getFavorite", + method: "get", + }, + // 获取用户评论过的文章 + getCommentedPosts: { + url: userPreStr + "/getCommented", + method: "get", + }, + // 获取用户发布的文章 + getOwnArticles: { + url: userPreStr + "/own/articles", + method: "get", + }, + // 获取文章详情 + getArticleDetail: { + url: userPreStr + "/getArticleDetail", + method: "post", + }, + // 获取文章封面 + getArticleCover: { + url: userPreStr + "/get/articleTitlePage", + method: "post", + }, + // 收藏和取消收藏文章 + StarAndUnstar: { + url: userPreStr + "/StarAndUnstar", + method: "post", + }, + // 点赞和取消点赞文章 + LikeAndUnlike: { + url: userPreStr + "/LikeAndUnlike", + method: "post", + }, + // 关注/取消关注他人 + followAndUnfollow: { + url: userPreStr + "/FollowAndUnfollow", + method: "post", + }, + // 编写新文章 + editArticle: { + url: userPreStr + "/editArticle", + method: "post", + }, + // 获取一个人的关注列表 + getFollowing: { + url: userPreStr + "/following", + method: "get", + }, + // 获取一个人的粉丝列表 + getFans: { + url: userPreStr + "/fans", + method: "get", + }, + // 添加新评论 + createComment: { + url: userPreStr + "/newComment", + method: "post", + }, + // 获取文章评论 + getArticleComments: { + url: userPreStr + "/getArticleComments", + method: "post", + }, + // 获取所有文章简要信息 + getAllArticleBrief: { + url: userPreStr + "/getAllArticleBrief", + method: "get", + }, + // 获取所有文章标签 + getAllTags: { + url: userPreStr + "/get/allTags", + method: "get", + }, + // 向文章添加 tag + addTagToArticle: { + url: userPreStr + "/addTagToArticle", + method: "post", + }, + // 从文章删除 tag + deleteTagFromArticle: { + url: userPreStr + "/deleteTagFromArticle", + method: "post", + }, + // 删除文章 + deleteArticle: { + url: userPreStr + "/deleteArticle", + method: "post", + }, +}; + +export const adminApis: Record = { + // 审核推文 + approve: { + url: adminPreStr + "/approve", + method: "post", + }, + // 封禁文章 + banArticle: { + url: adminPreStr + "/banArticle", + method: "post", + }, + // 添加tag + addTag: { + url: adminPreStr + "/addTag", + method: "post", + }, + // 删除tag + deleteTag: { + url: adminPreStr + "/deleteTag", + method: "post", + }, +}; + +export const fileApis: Record = { + // 上传用户头像 + uploadProfilePhoto: { + url: filePreStr + "/upload/profilePhoto", + method: "post", + }, + // 上传文章图片 + uploadArticlePhoto: { + url: filePreStr + "/upload/articlePhoto", + method: "post", + }, + // 删除文章图片 + deleteArticlePhoto: { + url: filePreStr + "/delete/articlePhoto", + method: "post", + }, +}; diff --git a/front-end/XDShare-FE/src/api/axios.ts b/front-end/XDShare-FE/src/api/axios.ts new file mode 100644 index 0000000000000000000000000000000000000000..144863c9e41a6aa603c4d6ee7f054a5b4ba3564c --- /dev/null +++ b/front-end/XDShare-FE/src/api/axios.ts @@ -0,0 +1,100 @@ +import axios from "axios"; +// import qs from "qs"; +import { message } from "ant-design-vue"; +import { isMock } from "./apis.ts"; + +const instance = axios.create({ + timeout: 20000, + validateStatus(status) { + return status >= 200 && status < 300; + }, +}); + +// 请求拦截器:获取 jwt,每次发送请求都加入到请求头中 +instance.interceptors.request.use( + (config) => { + const jwt = sessionStorage.getItem("jwt"); + if (jwt) { + config.headers["token"] = jwt; + } + return config; + }, + (err) => { + return Promise.reject(err); + } +); + +const backendSuccessCodes = [1, 1000]; + +// 响应拦截器:失败时(后端返回的code为1)报错 +instance.interceptors.response.use( + (res) => { + if (isMock || backendSuccessCodes.includes(res.data?.code)) { + return Promise.resolve(res.data?.data || {}); + } else { + console.error("fetch response error", res); + message.error(res.data.msg || "请求响应失败"); + return Promise.reject(res.data); + } + }, + (error) => { + return Promise.reject(error); + } +); + +// 清除掉对象中的空值 +const shakeData = (data: any) => { + const _data = { ...data }; + const nils = [undefined, null, ""]; // 清除掉对象中的空值 + for (let key in _data) { + let val = _data[key]; + + // 对于data的每一个属性进行检查 + if (typeof val === "object" && val !== null) { + // 如果是空对象,删除 + if (!Array.isArray(val) && !Object.keys(val).length) { + delete _data[key]; + } + } else { + // 如果不是对象,则删除空值 + if (nils.includes(val)) { + delete _data[key]; + } + } + } + + return _data; +}; + +export interface apiInfo { + url: string; + method: "get" | "post" | "postJson" | "delete" | "put"; +} + +const contentTypeMap: Record = { + post: "multipart/form-data", + postJson: "application/json", +}; + +const request = ( + api: apiInfo, // apis.ts中的api对象 + payload?: any, // 传给后端的数据 + extraConfig?: any // 手动修改config +): Promise => { + const { method, url } = api; + if (payload) payload = shakeData(payload); + const config = { + method, + url, + headers: { + "Content-Type": contentTypeMap[method] || null, + }, + data: method === "post" ? payload : null, // TEMP: 后端现在只有get和post,暂时这样写 + params: method !== "post" ? payload : null, + ...extraConfig, + }; + + return instance(config); +}; + +export default request; diff --git a/front-end/XDShare-FE/src/api/postServices.ts b/front-end/XDShare-FE/src/api/postServices.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf9867acdab5e8e7d3dc78f39792774ca369c729 --- /dev/null +++ b/front-end/XDShare-FE/src/api/postServices.ts @@ -0,0 +1,45 @@ +// 帖文模块请求封装 +import request from "./axios"; +import { userApis } from "./apis"; +import store from "@/store"; +import { ARTICLE_FETCH_TYPE } from "@/constant"; + +// 获取全部帖文简要信息 +export const getAllArticleBrief = () => { + return request(userApis.getAllArticleBrief).then((data) => { + store.dispatch("setAllPostBriefInfo", data); + }); +}; + +// 获取全部文章标签 +export const getAllTags = async () => { + await request(userApis.getAllTags).then((data) => { + store.dispatch("setAllTags", data); + }); +}; + +// 获取指定文章的详细信息 +export const getArticleDetail = async (id: number, editType: EditType) => { + await request(userApis.getArticleDetail, { articleId: id }).then((data) => { + store.dispatch( + editType === ARTICLE_FETCH_TYPE.DETAIL + ? "setSelectedArticle" + : "setSelectedDraft", + data + ); + }); +}; + +// 编辑文章 +export const editArticle = async (content: IPostContent): Promise => { + return await request(userApis.editArticle, content).then((data) => { + console.log("editArticle payload", content); + console.log("editArticle reponse", data); + return Number(data.id); + }); +}; + +export const initAllPostInfo = () => { + getAllArticleBrief(); + getAllTags(); +}; diff --git a/front-end/XDShare-FE/src/assets/testImg.jpg b/front-end/XDShare-FE/src/assets/testImg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..172cc6ba35ac5c5c199d56719ccd627abd87b9a7 Binary files /dev/null and b/front-end/XDShare-FE/src/assets/testImg.jpg differ diff --git a/front-end/XDShare-FE/src/assets/vue.svg b/front-end/XDShare-FE/src/assets/vue.svg new file mode 100644 index 0000000000000000000000000000000000000000..770e9d333ee70e75fe7c0bad7fb13e4f6ed4627a --- /dev/null +++ b/front-end/XDShare-FE/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front-end/XDShare-FE/src/components/HelloWorld.vue b/front-end/XDShare-FE/src/components/HelloWorld.vue new file mode 100644 index 0000000000000000000000000000000000000000..2b4c004c30c9abc116e7abeafa4e70b40b8b96b0 --- /dev/null +++ b/front-end/XDShare-FE/src/components/HelloWorld.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/front-end/XDShare-FE/src/constant/index.ts b/front-end/XDShare-FE/src/constant/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..db635dcef4290e23be48f83ce15eb00b07107848 --- /dev/null +++ b/front-end/XDShare-FE/src/constant/index.ts @@ -0,0 +1,52 @@ +interface ITest {} + +type TTest = string; + +// 获取的文章详情类型 +export const ARTICLE_FETCH_TYPE: IEditConfig = { + CREATE: 0, + DETAIL: 1, +}; + +// 编辑中文章类型 +export const ARTICLE_EDIT_TYPE: IEditConfig = { + DRAFT: 0, // 存为草稿 + UPDATE: 1, // 更新草稿 + POST: 2, // 提交审核 +}; + +// 用户身份 +export enum UserTypeEnum { + ADMIN = 1, + USER = 2, +} + +// 文章状态 +export enum ArticleStatusEnum { + WAITING_FOR_APPROVAL = 0, + PASS = 1, + NOT_PASS = 2, + BAN = 3, + DRAFT = 4, + DELETED = 5, +} + +// 文章状态的中文名称 +export const ArticleStatusEnumLabel = { + [ArticleStatusEnum.WAITING_FOR_APPROVAL]: "等待审核", + [ArticleStatusEnum.PASS]: "审核通过", + [ArticleStatusEnum.NOT_PASS]: "审核不通过", + [ArticleStatusEnum.BAN]: "已封禁", + [ArticleStatusEnum.DRAFT]: "草稿", + [ArticleStatusEnum.DELETED]: "已删除", +}; + +// 文章状态展示的颜色 +export const ArticleStatusColor = { + [ArticleStatusEnum.WAITING_FOR_APPROVAL]: "blue", + [ArticleStatusEnum.PASS]: "green", + [ArticleStatusEnum.NOT_PASS]: "orange", + [ArticleStatusEnum.BAN]: "black", + [ArticleStatusEnum.DRAFT]: "orange", + [ArticleStatusEnum.DELETED]: "red", +}; diff --git a/front-end/XDShare-FE/src/lib/imgHelper.ts b/front-end/XDShare-FE/src/lib/imgHelper.ts new file mode 100644 index 0000000000000000000000000000000000000000..5791926391ca26510a7496b326e9078de28e5662 --- /dev/null +++ b/front-end/XDShare-FE/src/lib/imgHelper.ts @@ -0,0 +1,5 @@ +export const getBase64 = (img: Blob, callback: (base64Url: string) => void) => { + const reader = new FileReader(); + reader.addEventListener("load", () => callback(reader.result as string)); + reader.readAsDataURL(img); +}; diff --git a/front-end/XDShare-FE/src/main.ts b/front-end/XDShare-FE/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba50fa22c8417a31d522dd3088ac1f62a4826937 --- /dev/null +++ b/front-end/XDShare-FE/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from "vue"; +import "@/styles/common.less"; +import App from "./App.vue"; +import router from "./router"; + +createApp(App).use(router).mount("#app"); diff --git a/front-end/XDShare-FE/src/pages/Home/Header/index.vue b/front-end/XDShare-FE/src/pages/Home/Header/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..481771617acbd6751b0618a9f005b9224a2eb0a1 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Header/index.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Info/components/postList.vue b/front-end/XDShare-FE/src/pages/Home/Info/components/postList.vue new file mode 100644 index 0000000000000000000000000000000000000000..2a52356c3134504c9f49c8a2e174925dd30ed88f --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Info/components/postList.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Info/components/userList.vue b/front-end/XDShare-FE/src/pages/Home/Info/components/userList.vue new file mode 100644 index 0000000000000000000000000000000000000000..4e99b316c817719e1ed6ec4ba82134924db07280 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Info/components/userList.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Info/index.vue b/front-end/XDShare-FE/src/pages/Home/Info/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..dcc3ce8d27734df33b5e3b11e5443885643044c2 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Info/index.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Info/mock.ts b/front-end/XDShare-FE/src/pages/Home/Info/mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d1f63780db56c2069843a6f033426e58466595a --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Info/mock.ts @@ -0,0 +1,618 @@ +export const postList1: IPostInfo[] = [ + { + id: 1, + author: 11, + title: "测试文章1", + text: "测试文章1的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, + { + id: 2, + author: 12, + title: "测试文章2", + text: "测试文章2的内容", + status: 0, + publishTime: "发布时间", + additionalInfo: "额外信息", + cover: "http://dummyimage.com/400x400", + likeNum: 200, + favourNum: 300, + commentNum: 400, + }, +]; + +export const userList1: IUserInfo[] = [ + { + id: 1, + account: "账户1", + nickname: "昵称1", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, + { + id: 2, + account: "账户2", + nickname: "昵称2", + profilePhoto: "http://dummyimage.com/400x400", + followingNum: 111, + fansNum: 222, + }, +]; + +export const followingList = [ + { + id: 1, + account: "acc1", + nickname: "关注者1", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 111, + followingCount: 1111, + }, + { + id: 2, + account: "acc2", + nickname: "关注者2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "关注者2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "关注者2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, +]; + +export const fansList = [ + { + id: 1, + account: "acc1", + nickname: "粉丝1", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 111, + followingCount: 1111, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, + { + id: 2, + account: "acc2", + nickname: "粉丝2", + email: "string", + type: 0, + profile_photo: "http://dummyimage.com/400x400", + fansCount: 222, + followingCount: 2222, + }, +]; diff --git a/front-end/XDShare-FE/src/pages/Home/Info/user.vue b/front-end/XDShare-FE/src/pages/Home/Info/user.vue new file mode 100644 index 0000000000000000000000000000000000000000..846e126e354b12ab61006d372bc88ac841a660c3 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Info/user.vue @@ -0,0 +1,672 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Post/components/comment.vue b/front-end/XDShare-FE/src/pages/Home/Post/components/comment.vue new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/front-end/XDShare-FE/src/pages/Home/Post/create.vue b/front-end/XDShare-FE/src/pages/Home/Post/create.vue new file mode 100644 index 0000000000000000000000000000000000000000..cadd53130fc5b6897277ad107c797d12d300aa4d --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Post/create.vue @@ -0,0 +1,547 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Post/detail.vue b/front-end/XDShare-FE/src/pages/Home/Post/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..1e18c785800546598bcc6c4c8c73c430efd517d6 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Post/detail.vue @@ -0,0 +1,482 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Post/index.vue b/front-end/XDShare-FE/src/pages/Home/Post/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2a17dc4ae8bef9a26e471c12a6de806223666a47 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Post/index.vue @@ -0,0 +1,10 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/Post/list.vue b/front-end/XDShare-FE/src/pages/Home/Post/list.vue new file mode 100644 index 0000000000000000000000000000000000000000..849629919951d92247836c932e4a976cac86fe52 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/Post/list.vue @@ -0,0 +1,450 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Home/index.vue b/front-end/XDShare-FE/src/pages/Home/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..cc3d9229c15bcf4a479e32d961d29e3690f77a1b --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Home/index.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/front-end/XDShare-FE/src/pages/Login/index.vue b/front-end/XDShare-FE/src/pages/Login/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0023611fd8906f3f04a202c204d3a057da568968 --- /dev/null +++ b/front-end/XDShare-FE/src/pages/Login/index.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/front-end/XDShare-FE/src/router/index.ts b/front-end/XDShare-FE/src/router/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ba96a63d90910fe85a31701a8d1a03cfa38dc5d --- /dev/null +++ b/front-end/XDShare-FE/src/router/index.ts @@ -0,0 +1,119 @@ +import { + createRouter, + createWebHashHistory, + RouteRecordRaw, + ScrollPosition, +} from "vue-router"; +import Login from "@/pages/Login/index.vue"; +import Home from "@/pages/Home/index.vue"; +import InfoIndex from "@/pages/Home/Info/index.vue"; +import InfoUser from "@/pages/Home/Info/user.vue"; +import PostIndex from "@/pages/Home/Post/index.vue"; +import PostList from "@/pages/Home/Post/list.vue"; +import PostCreate from "@/pages/Home/Post/create.vue"; +import PostDetail from "@/pages/Home/Post/detail.vue"; +import { + getAllArticleBrief, + getAllTags, + getArticleDetail, +} from "@/api/postServices"; +import { ARTICLE_FETCH_TYPE } from "@/constant"; + +export const routes: RouteRecordRaw[] = [ + { name: "default", path: "/", redirect: "/login" }, + { name: "login", path: "/login", component: Login }, + { + name: "home", + path: "/home", + component: Home, + children: [ + { + name: "home_default", + path: "", + redirect: "/home/post", + }, + { + name: "post", + path: "post", + component: PostIndex, + children: [ + { + name: "post_default", + path: "", + redirect: "/home/post/list", + }, + { + name: "list", + path: "list", + component: PostList, + beforeEnter: async () => { + await getAllArticleBrief(); + await getAllTags(); + }, + }, + { + name: "create", + path: "create", + component: PostCreate, + beforeEnter: async (route) => { + if (route.query.id) { + await getArticleDetail( + Number(route.query.id), + ARTICLE_FETCH_TYPE.CREATE + ); + } + }, + }, + { + name: "detail", + path: "detail", + component: PostDetail, + beforeEnter: async (route) => { + await getArticleDetail( + Number(route.query.id), + ARTICLE_FETCH_TYPE.DETAIL + ); + }, + }, + ], + }, + { + name: "info", + path: "info", + component: InfoIndex, + children: [ + { + name: "info_default", + path: "", + redirect: "/home/info/user", + }, + { + name: "user", + path: "user", + component: InfoUser, + }, + ], + }, + ], + }, +]; + +const router = createRouter({ + history: createWebHashHistory(), + routes, + // scrollBehavior() { + // const el = document.querySelector(".home-content"); + // console.log("el", el); + // return { el, top: 0 }; + // }, +}); + +// 切换路由的时候滚到到页面顶部 +router.afterEach((to, from) => { + setTimeout(() => { + const el = document.querySelector(".home-content"); + el?.scrollTo({ top: 0, behavior: "smooth" }); + }); +}); + +export default router; diff --git a/front-end/XDShare-FE/src/store/index.ts b/front-end/XDShare-FE/src/store/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f18fd3ef2c555fb67af82e5cba27e3d13ca7401 --- /dev/null +++ b/front-end/XDShare-FE/src/store/index.ts @@ -0,0 +1,217 @@ +import { createStore, ActionTree, MutationTree } from "vuex"; +import { cloneDeep } from "lodash"; +import { computed } from "vue"; +import request from "@/api/axios"; +import { isMock, userApis } from "@/api/apis"; +import { message } from "ant-design-vue"; +import { ARTICLE_EDIT_TYPE, UserTypeEnum } from "@/constant"; + +interface IState extends RecordType { + isTest?: boolean; // 是否为测试环境,一般用于控制显隐 + count: number; + userInfo: IUserInfo; + briefPostList?: Array; // 所有帖文简要信息 + postTags?: Array; // 所有帖文标签 + selectedArticle?: any; + selectedDraft?: any; + userFollowingList?: IUserInfo[]; // 当前登录用户关注的人 + userLikePostList?: any; + userFavorPostList?: any; +} + +const defaultState: IState = { + count: 0, + userInfo: { + nickname: "默认用户", + } as IUserInfo, + userFollowingList: [], +}; + +const state: IState = { + isTest: true, + ...cloneDeep(defaultState), +}; + +// Mutation的名称 +export const ADD_COUNT = "ADD_COUNT"; +export const UPDATE_USER_INFO = "UPDATE_USER_INFO"; +export const CLEAR_USER_INFO = "CLEAR_USER_INFO"; +export const SET_ALL_POST_BRIEF = "SET_ALL_POST_BRIEF"; +export const SET_ALL_TAGS = "SET_ALL_TAGS"; +export const SET_SELECTED_ARTICLE = "SET_SELECTED_ARTICLE"; +export const SET_SELECTED_DRAFT = "SET_SELECTED_DRAFT"; +export const RESET_SELECTED_DRAFT = "RESET_SELECTED_DRAFT"; +export const UPDATE_USER_FOLLOWING = "UPDATE_USER_FOLLOWING"; +export const UPDATE_USER_LIKE = "UPDATE_USER_LIKE"; +export const UPDATE_USER_FAVOR = "UPDATE_USER_FAVOR"; + +const actions: ActionTree = { + // action 函数的第一个参数 + // { + // state, // 等同于 `store.state`,若在模块中则为局部状态 + // rootState, // 等同于 `store.state`,只存在于模块中 + // commit, // 等同于 `store.commit` + // dispatch, // 等同于 `store.dispatch` + // getters, // 等同于 `store.getters` + // rootGetters // 等同于 `store.getters`,只存在于模块中 + // } + addCount({ commit }) { + commit(ADD_COUNT); + }, + // 发送请求给后端,获取用户信息 + async fetchUserInfo({ state, commit }, id?: number) { + console.log("获取用户信息"); + try { + request(userApis.getUserInfo, { userId: id || state.userInfo.id }).then( + (data) => { + commit(UPDATE_USER_INFO, data); + } + ); + } catch (e) { + console.error(e); + } + }, + clearUserInfo({ commit }) { + commit(CLEAR_USER_INFO); + }, + // 帖文相关 + setAllPostBriefInfo({ commit }, data) { + commit(SET_ALL_POST_BRIEF, data); + }, + setAllTags({ commit }, data) { + commit(SET_ALL_TAGS, data); + }, + setSelectedArticle({ commit }, info) { + commit(SET_SELECTED_ARTICLE, info); + }, + setSelectedDraft({ commit }, info) { + commit(SET_SELECTED_DRAFT, info); + }, + // 重置文章信息 + resetSelectedDraft({ commit }) { + commit(RESET_SELECTED_DRAFT); + }, + // 获取当前登录用户的关注列表 + async fetchUserFollowingList({ commit }) { + try { + request(userApis.getFollowing, { id: state.userInfo.id }).then((data) => { + commit(UPDATE_USER_FOLLOWING, data); + }); + } catch (e) { + console.error(e); + } + }, + // 获取当前登录用户的点赞列表 + async fetchUserLikePostList({ commit }) { + try { + request(userApis.getLikePosts).then((data) => { + commit(UPDATE_USER_LIKE, data); + }); + } catch (e) { + console.error(e); + } + }, + // 获取当前登录用户的收藏列表 + async fetchUserFavorPostList({ commit }) { + try { + request(userApis.getFavouritePosts).then((data) => { + commit(UPDATE_USER_FAVOR, data); + }); + } catch (e) { + console.error(e); + } + }, + + // 关注用户,并刷新关注列表 + async followAuthor({ dispatch }, id: number) { + const _hasFollowed = hasFollowed(id); + request(userApis.followAndUnfollow, { id, follow: !_hasFollowed }).then( + () => { + message.success(_hasFollowed ? "取消关注成功" : "关注成功"); + dispatch("fetchUserFollowingList"); + } + ); + }, + + // 获取所有tag + async fetchAllTags({ commit }) { + request(userApis.getAllTags).then((data) => { + commit(SET_ALL_TAGS, data); + }); + }, +}; + +const mutations: MutationTree = { + [ADD_COUNT](state) { + state.count++; + console.log("commit", state.count); + }, + [UPDATE_USER_INFO](state, userInfo) { + state.userInfo = { ...userInfo }; + console.log("update userInfo", userInfo, state.userInfo); + }, + [CLEAR_USER_INFO](state) { + state.userInfo = cloneDeep(defaultState.userInfo); + }, + // 帖文相关 + [SET_ALL_POST_BRIEF](state, data) { + state.briefPostList = data; + }, + [SET_ALL_TAGS](state, data) { + state.postTags = data; + }, + [SET_SELECTED_ARTICLE](state, info) { + state.selectedArticle = info; + }, + [SET_SELECTED_DRAFT](state, info) { + state.selectedDraft = info; + }, + [RESET_SELECTED_DRAFT](state) { + console.log("commit RESET_SELECTED_DRAFT"); + state.selectedDraft = { + newId: undefined, + title: "", + text: "", + type: ARTICLE_EDIT_TYPE.DRAFT, + }; + }, + [UPDATE_USER_FOLLOWING](state, list) { + state.userFollowingList = list || []; + console.log("新的userFollowingList", state.userFollowingList); + }, + [UPDATE_USER_LIKE](state, list) { + state.userLikePostList = list || []; + console.log("userLikePostList", state.userLikePostList); + }, + [UPDATE_USER_FAVOR](state, list) { + state.userFavorPostList = list || []; + console.log("userFavorPostList", state.userFavorPostList); + }, +}; + +const store = createStore({ + state, + mutations, + actions, +}); + +export default store; +export const isTest = store.state.isTest; +export const userInfo = computed(() => store.state.userInfo); +export const userFollowingList = computed(() => store.state.userFollowingList); +export const userLikePostList = computed(() => store.state.userLikePostList); +export const userFavorPostList = computed(() => store.state.userFavorPostList); +export const briefPostList = computed(() => store.state.briefPostList); +// 判断用户是否关注 +export const hasFollowed = (id: number) => { + console.log( + `id为${id}的用户是否被关注?`, + Boolean(userFollowingList.value?.find((item) => item.id === id)), + userFollowingList.value + ); + return Boolean(userFollowingList.value?.find((item) => item.id === id)); +}; +export const postTags = computed(() => store.state.postTags); +export const isAdmin = computed(() => + isMock ? true : userInfo.value.type === UserTypeEnum.ADMIN +); diff --git a/front-end/XDShare-FE/src/styles/common.less b/front-end/XDShare-FE/src/styles/common.less new file mode 100644 index 0000000000000000000000000000000000000000..829c7b1e45a98d79a2e4981ad81181d27eae2d9d --- /dev/null +++ b/front-end/XDShare-FE/src/styles/common.less @@ -0,0 +1,52 @@ +@import "./theme.less"; + +// 公用的样式 +* { + padding: 0; + margin: 0; + box-sizing: border-box; +} + +body { + min-width: 800px; + width: 100vw; + height: 100vh; + background-color: #fff; +} + +#app { + display: flex; + flex-direction: column; + align-items: center; + height: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +// Post 模块公用样式 +.post-container { + width: 100%; + background-color: #fff; + padding: 16px 5%; + border-radius: @home-content-border-radius; +} + +// 清除 Edge 浏览器input自带的眼睛icon +.ant-input[type="password"]::-ms-reveal, +.ant-input[type="password"]::-ms-clear { + display: none; + pointer-events: none !important; +} + +// cursor改为pointer +.allow-click { + cursor: pointer; +} diff --git a/front-end/XDShare-FE/src/styles/theme.less b/front-end/XDShare-FE/src/styles/theme.less new file mode 100644 index 0000000000000000000000000000000000000000..5df50c784ce95ec70e7d206d88a7999d2676614d --- /dev/null +++ b/front-end/XDShare-FE/src/styles/theme.less @@ -0,0 +1,23 @@ +@common-pink: #f39baf; +@common-blue: #5da1ff; +@border-pink: #f59696; +@hover-blue: #1677ff; +@border-grey: rgba(228, 230, 235); +@bkc-grey: #f2f3f5; +@text-grey: #909090; +@home-content-border-radius: 6px; + +.item-hover-grey() { + transition: background-color 0.6s; + background-color: #eaeaea; + cursor: pointer; +} + +.link-grey-hover-blue() { + color: @text-grey; + cursor: pointer; + + &:hover { + color: @hover-blue; + } +} diff --git a/front-end/XDShare-FE/src/types/index.d.ts b/front-end/XDShare-FE/src/types/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5328f9e2708bcfe29107cfbacc78580aa696de45 --- /dev/null +++ b/front-end/XDShare-FE/src/types/index.d.ts @@ -0,0 +1,39 @@ +// 使用 declare 声明, 在项目中可以不引入类型直接使用 +type RecordType = { + [props: string]: any; +}; + +type URLString = string; +type EditType = number; + +interface IPostInfo extends RecordType { + id: number; + author: number; + title: string; + text?: string; + status?: number; + publishTime?: string; + additionalInfo?: string; + cover?: string; +} + +interface IUserInfo extends RecordType { + id: number; + account?: string; + nickname: string; + password?: string; + email?: string; + type?: number; + profile_photo?: URLString; +} + +interface IEditConfig extends RecordType { + [typename: string]: EditType; +} + +interface IPostContent extends RecordType { + title: string; + content: string; + id?: number; + type: number; +} diff --git a/front-end/XDShare-FE/src/vite-env.d.ts b/front-end/XDShare-FE/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..11f02fe2a0061d6e6e1f271b21da95423b448b32 --- /dev/null +++ b/front-end/XDShare-FE/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/front-end/XDShare-FE/tsconfig.json b/front-end/XDShare-FE/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..604e9ec5871e07b1e4d7175f10cd99b5d7c1ffee --- /dev/null +++ b/front-end/XDShare-FE/tsconfig.json @@ -0,0 +1,32 @@ +{ + "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", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": "./", // 解析非相对模块的基础地址,默认是当前目录 + "paths": { + // 路径映射,相对于baseUrl + "@/*": ["src/*"], + "vuex": ["./node_modules/vuex/types"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/front-end/XDShare-FE/tsconfig.node.json b/front-end/XDShare-FE/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..42872c59f5b01c9155864572bc2fbd5833a7406c --- /dev/null +++ b/front-end/XDShare-FE/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/front-end/XDShare-FE/vite.config.ts b/front-end/XDShare-FE/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..115b46f217f38b3fb119bb1ff2edb374d8a0be5b --- /dev/null +++ b/front-end/XDShare-FE/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' +import Components from "unplugin-vue-components/vite"; +import { AntDesignVueResolver } from "unplugin-vue-components/resolvers"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + Components({ + resolvers: [ + AntDesignVueResolver({ + importStyle: false, + }), + ], + }), + ], + resolve: { + alias: { + "@": path.resolve(__dirname, "src"), + }, + }, +});