From 521a602a51bf56c129da9ef0c71bb2c922aabb0b Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Wed, 4 Jan 2023 17:54:01 +0800 Subject: [PATCH] problem list. --- components.d.ts | 3 + package-lock.json | 690 +++++++++++++++++++++++++++++++---- package.json | 13 +- src/.prettierrc.toml | 1 + src/App.vue | 26 +- src/admin/index.vue | 17 +- src/main.ts | 46 +-- src/oj/api.ts | 127 ++++--- src/oj/components/header.vue | 137 +++---- src/oj/contest/list.vue | 15 +- src/oj/contests/index.vue | 10 - src/oj/index.vue | 44 +-- src/oj/problem/detail.vue | 15 +- src/oj/problem/list.vue | 465 ++++++++++++----------- src/oj/rank/list.vue | 15 +- src/oj/status/list.vue | 15 +- src/oj/stores/signup.ts | 32 +- src/oj/user/signup.vue | 32 +- src/shared/api.ts | 30 +- src/shared/stores/login.ts | 32 +- src/shared/stores/user.ts | 102 +++--- src/shared/user/login.vue | 186 +++++----- src/utils/constants.ts | 22 +- src/utils/functions.ts | 28 +- src/utils/http.ts | 52 +-- src/utils/storage.ts | 16 +- vite.config.ts | 32 +- 27 files changed, 1401 insertions(+), 802 deletions(-) create mode 100644 src/.prettierrc.toml delete mode 100644 src/oj/contests/index.vue diff --git a/components.d.ts b/components.d.ts index f198836..bf4cac3 100644 --- a/components.d.ts +++ b/components.d.ts @@ -18,6 +18,7 @@ declare module '@vue/runtime-core' { ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] ElHeader: typeof import('element-plus/es')['ElHeader'] + ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] ElMain: typeof import('element-plus/es')['ElMain'] ElMenu: typeof import('element-plus/es')['ElMenu'] @@ -29,6 +30,8 @@ declare module '@vue/runtime-core' { ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] ElTag: typeof import('element-plus/es')['ElTag'] + IEpSelect: typeof import('~icons/ep/select')['default'] + IEpSemiSelect: typeof import('~icons/ep/semi-select')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] } diff --git a/package-lock.json b/package-lock.json index 7f8cf9f..95ccda0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "oj-next", "version": "0.0.0", "dependencies": { + "@element-plus/icons-vue": "^2.0.10", "axios": "^1.2.2", "element-plus": "^2.2.28", "pinia": "^2.0.28", @@ -15,12 +16,25 @@ "vue-router": "^4.1.6" }, "devDependencies": { + "@iconify-json/ep": "^1.1.8", "@vitejs/plugin-vue": "^4.0.0", - "typescript": "^4.9.3", + "prettier": "^2.8.1", + "typescript": "^4.9.4", "unplugin-auto-import": "^0.12.1", + "unplugin-icons": "^0.15.0", "unplugin-vue-components": "^0.22.12", - "vite": "^4.0.0", - "vue-tsc": "^1.0.11" + "vite": "^4.0.4", + "vue-tsc": "^1.0.20" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", + "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==", + "dev": true, + "dependencies": { + "execa": "^5.1.1", + "find-up": "^5.0.0" } }, "node_modules/@antfu/utils": { @@ -421,6 +435,35 @@ "@floating-ui/core": "^1.0.5" } }, + "node_modules/@iconify-json/ep": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/@iconify-json/ep/-/ep-1.1.8.tgz", + "integrity": "sha512-pHCrsWU1R9/pTDU+Fps4+mjqOQFLtpGdXWegkhQ1P1DlgQAlCPyICtl6E1s8b7VwJMeZXaK84HA02UF6WD0o/Q==", + "dev": true, + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, + "node_modules/@iconify/utils": { + "version": "2.0.9", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-2.0.9.tgz", + "integrity": "sha512-ropNqaeamoxZvXxvaTJXrI0MrqdWdDVIs/mW7/sEQbNi0aXYUGL2iuLs1da3QR163gyG63kiyTsqw2oQYamw3Q==", + "dev": true, + "dependencies": { + "@antfu/install-pkg": "^0.1.1", + "@antfu/utils": "^0.7.2", + "@iconify/types": "^2.0.0", + "debug": "^4.3.4", + "kolorist": "^1.6.0", + "local-pkg": "^0.4.2" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -528,41 +571,41 @@ } }, "node_modules/@volar/language-core": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.19.tgz", - "integrity": "sha512-BRxhwqn66VHeLIxxgV4ybY9NDtwMp2bl1w7085qlK7i1pa4jeFR5lJG2U5qd0oI3e0PIWML+PryxSrKNd3+SZw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.20.tgz", + "integrity": "sha512-FU6TC+xQDLkBmp226NTeZ454MTb8VFLga6CIzWP+TsxuxGwB9Exvzof9TKpilIhTdF4IGVJJ4X1aCP6ycnLMbg==", "dev": true, "dependencies": { - "@volar/source-map": "1.0.19", + "@volar/source-map": "1.0.20", "muggle-string": "^0.1.0" } }, "node_modules/@volar/source-map": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.19.tgz", - "integrity": "sha512-5fYKsl1evR/QAZ9LADto3kzbYKfpjZLWS9reNpxGR3ODPFTpaJgYk4lqghFyq4yU7/e/ZPZ1zLXjEsnL526URw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.20.tgz", + "integrity": "sha512-6wwrvAjuy7HepvHW7CqCw5b57YIFrj9mcfJvjic1WCX9TqjnXAcuHFqiUPid7EdZ4SCRKCYQbWmWreThYbHaZw==", "dev": true, "dependencies": { "muggle-string": "^0.1.0" } }, "node_modules/@volar/typescript": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.19.tgz", - "integrity": "sha512-S6n945uhpc5J1qCVXVV4tz4k1nyxWaoG+wqy9TYdRDazPHeq9l45WDg58g/ehblUWux85TZN8i3zdsLRLkFrdw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.20.tgz", + "integrity": "sha512-98D2+rC4igqPL7emqIf0NtIx3UYXZ8xqILiP/ihwP7G2T4oyoGr2vKEOwo49sUzvgUvQl2AI5p8ZQ71mFJfP7w==", "dev": true, "dependencies": { - "@volar/language-core": "1.0.19" + "@volar/language-core": "1.0.20" } }, "node_modules/@volar/vue-language-core": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.19.tgz", - "integrity": "sha512-3mIjJvQ+0tNOp+U9+Nggy92HYIqnltf882UMG9RuNHrd0Jn/rdvjRBs0jNTzwYDV9tn3tjDHGIfQak9XrUCaRg==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.20.tgz", + "integrity": "sha512-Zz6yuxtA6BG6YU8KPwV4qhO5kh3e2Et6+YOu0QC43SiDgjIw2Vzzi+qAqm8UYofg9UBn82OArO1L+VrZPCCK8A==", "dev": true, "dependencies": { - "@volar/language-core": "1.0.19", - "@volar/source-map": "1.0.19", + "@volar/language-core": "1.0.20", + "@volar/source-map": "1.0.20", "@vue/compiler-dom": "^3.2.45", "@vue/compiler-sfc": "^3.2.45", "@vue/reactivity": "^3.2.45", @@ -572,13 +615,13 @@ } }, "node_modules/@volar/vue-typescript": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.19.tgz", - "integrity": "sha512-HKaLCz/lb5xkJ1SyaMmms0Ww/OVStQ16qWttSbHRnnyRV/IDMFrwlovA/bIAPzHUq8EVoDAznRVsCysr2QCOGA==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.20.tgz", + "integrity": "sha512-FxucnAIZc503CfkdEGmUSw8EQfT31gi0DST7YmCNBK3cWOqJTF7UaHaBDpejnYGbsB568KZQbWTLNSpid5S/lA==", "dev": true, "dependencies": { - "@volar/typescript": "1.0.19", - "@volar/vue-language-core": "1.0.19" + "@volar/typescript": "1.0.20", + "@volar/vue-language-core": "1.0.20" } }, "node_modules/@vue/compiler-core": { @@ -869,6 +912,20 @@ "node": ">= 0.8" } }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/csstype": { "version": "2.6.21", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz", @@ -991,6 +1048,26 @@ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz", @@ -1028,6 +1105,19 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -1074,6 +1164,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1107,6 +1206,15 @@ "he": "bin/he" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.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", @@ -1158,12 +1266,33 @@ "node": ">=0.12.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "node_modules/kolorist": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.6.0.tgz", + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", + "dev": true + }, "node_modules/local-pkg": { "version": "0.4.2", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz", @@ -1173,6 +1302,18 @@ "node": ">=14" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", @@ -1206,6 +1347,12 @@ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", @@ -1247,6 +1394,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.2.tgz", @@ -1308,6 +1464,72 @@ "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", @@ -1402,6 +1624,18 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -1480,6 +1714,33 @@ "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", "dev": true }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", @@ -1502,6 +1763,15 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-literal": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.0.tgz", @@ -1631,6 +1901,41 @@ "node": ">=12" } }, + "node_modules/unplugin-icons": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/unplugin-icons/-/unplugin-icons-0.15.0.tgz", + "integrity": "sha512-/BGtBL8y/2wjey4GLyb0w90mhc9d7XKlewWGMxBPROHS7mR84AV1Y0zDapYK0Q/cc/+u4WUcloreev5cABDa5w==", + "dev": true, + "dependencies": { + "@antfu/install-pkg": "^0.1.1", + "@antfu/utils": "^0.7.2", + "@iconify/utils": "^2.0.3", + "debug": "^4.3.4", + "kolorist": "^1.6.0", + "local-pkg": "^0.4.2", + "unplugin": "^1.0.1" + }, + "peerDependencies": { + "@svgr/core": ">=5.5.0", + "@vue/compiler-sfc": "^3.0.2", + "vue-template-compiler": "^2.6.12", + "vue-template-es2015-compiler": "^1.9.0" + }, + "peerDependenciesMeta": { + "@svgr/core": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + }, + "vue-template-es2015-compiler": { + "optional": true + } + } + }, "node_modules/unplugin-vue-components": { "version": "0.22.12", "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz", @@ -1674,9 +1979,9 @@ } }, "node_modules/vite": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.3.tgz", - "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", "dev": true, "dependencies": { "esbuild": "^0.16.3", @@ -1756,13 +2061,13 @@ } }, "node_modules/vue-tsc": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.19.tgz", - "integrity": "sha512-UuI4G9PwV07Q2U+xYDLP5y3aUXTfuIF0Exy0qXT8+BbLlahubQ2r2PGSodSBnHxAhm/XsrD0KleC2rSzLKXDfQ==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.20.tgz", + "integrity": "sha512-AApewYXozAD7v4Iz9I0QzQebSVgvlUvpfbGe2e9TwtBdcw5gBsGiX8Oj5BdxRRiGnOdDG3BHPK8msl7Qhmy/1A==", "dev": true, "dependencies": { - "@volar/vue-language-core": "1.0.19", - "@volar/vue-typescript": "1.0.19" + "@volar/vue-language-core": "1.0.20", + "@volar/vue-typescript": "1.0.20" }, "bin": { "vue-tsc": "bin/vue-tsc.js" @@ -1785,9 +2090,43 @@ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } } }, "dependencies": { + "@antfu/install-pkg": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz", + "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==", + "dev": true, + "requires": { + "execa": "^5.1.1", + "find-up": "^5.0.0" + } + }, "@antfu/utils": { "version": "0.7.2", "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.2.tgz", @@ -1977,6 +2316,35 @@ "@floating-ui/core": "^1.0.5" } }, + "@iconify-json/ep": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/@iconify-json/ep/-/ep-1.1.8.tgz", + "integrity": "sha512-pHCrsWU1R9/pTDU+Fps4+mjqOQFLtpGdXWegkhQ1P1DlgQAlCPyICtl6E1s8b7VwJMeZXaK84HA02UF6WD0o/Q==", + "dev": true, + "requires": { + "@iconify/types": "*" + } + }, + "@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, + "@iconify/utils": { + "version": "2.0.9", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-2.0.9.tgz", + "integrity": "sha512-ropNqaeamoxZvXxvaTJXrI0MrqdWdDVIs/mW7/sEQbNi0aXYUGL2iuLs1da3QR163gyG63kiyTsqw2oQYamw3Q==", + "dev": true, + "requires": { + "@antfu/install-pkg": "^0.1.1", + "@antfu/utils": "^0.7.2", + "@iconify/types": "^2.0.0", + "debug": "^4.3.4", + "kolorist": "^1.6.0", + "local-pkg": "^0.4.2" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", @@ -2057,41 +2425,41 @@ "requires": {} }, "@volar/language-core": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.19.tgz", - "integrity": "sha512-BRxhwqn66VHeLIxxgV4ybY9NDtwMp2bl1w7085qlK7i1pa4jeFR5lJG2U5qd0oI3e0PIWML+PryxSrKNd3+SZw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.20.tgz", + "integrity": "sha512-FU6TC+xQDLkBmp226NTeZ454MTb8VFLga6CIzWP+TsxuxGwB9Exvzof9TKpilIhTdF4IGVJJ4X1aCP6ycnLMbg==", "dev": true, "requires": { - "@volar/source-map": "1.0.19", + "@volar/source-map": "1.0.20", "muggle-string": "^0.1.0" } }, "@volar/source-map": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.19.tgz", - "integrity": "sha512-5fYKsl1evR/QAZ9LADto3kzbYKfpjZLWS9reNpxGR3ODPFTpaJgYk4lqghFyq4yU7/e/ZPZ1zLXjEsnL526URw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.20.tgz", + "integrity": "sha512-6wwrvAjuy7HepvHW7CqCw5b57YIFrj9mcfJvjic1WCX9TqjnXAcuHFqiUPid7EdZ4SCRKCYQbWmWreThYbHaZw==", "dev": true, "requires": { "muggle-string": "^0.1.0" } }, "@volar/typescript": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.19.tgz", - "integrity": "sha512-S6n945uhpc5J1qCVXVV4tz4k1nyxWaoG+wqy9TYdRDazPHeq9l45WDg58g/ehblUWux85TZN8i3zdsLRLkFrdw==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.20.tgz", + "integrity": "sha512-98D2+rC4igqPL7emqIf0NtIx3UYXZ8xqILiP/ihwP7G2T4oyoGr2vKEOwo49sUzvgUvQl2AI5p8ZQ71mFJfP7w==", "dev": true, "requires": { - "@volar/language-core": "1.0.19" + "@volar/language-core": "1.0.20" } }, "@volar/vue-language-core": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.19.tgz", - "integrity": "sha512-3mIjJvQ+0tNOp+U9+Nggy92HYIqnltf882UMG9RuNHrd0Jn/rdvjRBs0jNTzwYDV9tn3tjDHGIfQak9XrUCaRg==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.20.tgz", + "integrity": "sha512-Zz6yuxtA6BG6YU8KPwV4qhO5kh3e2Et6+YOu0QC43SiDgjIw2Vzzi+qAqm8UYofg9UBn82OArO1L+VrZPCCK8A==", "dev": true, "requires": { - "@volar/language-core": "1.0.19", - "@volar/source-map": "1.0.19", + "@volar/language-core": "1.0.20", + "@volar/source-map": "1.0.20", "@vue/compiler-dom": "^3.2.45", "@vue/compiler-sfc": "^3.2.45", "@vue/reactivity": "^3.2.45", @@ -2101,13 +2469,13 @@ } }, "@volar/vue-typescript": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.19.tgz", - "integrity": "sha512-HKaLCz/lb5xkJ1SyaMmms0Ww/OVStQ16qWttSbHRnnyRV/IDMFrwlovA/bIAPzHUq8EVoDAznRVsCysr2QCOGA==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.20.tgz", + "integrity": "sha512-FxucnAIZc503CfkdEGmUSw8EQfT31gi0DST7YmCNBK3cWOqJTF7UaHaBDpejnYGbsB568KZQbWTLNSpid5S/lA==", "dev": true, "requires": { - "@volar/typescript": "1.0.19", - "@volar/vue-language-core": "1.0.19" + "@volar/typescript": "1.0.20", + "@volar/vue-language-core": "1.0.20" } }, "@vue/compiler-core": { @@ -2344,6 +2712,17 @@ "delayed-stream": "~1.0.0" } }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "csstype": { "version": "2.6.21", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz", @@ -2442,6 +2821,23 @@ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz", @@ -2473,6 +2869,16 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -2501,6 +2907,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", @@ -2525,6 +2937,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2564,18 +2982,45 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, + "kolorist": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.6.0.tgz", + "integrity": "sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==", + "dev": true + }, "local-pkg": { "version": "0.4.2", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz", "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", "dev": true }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", @@ -2605,6 +3050,12 @@ "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", @@ -2634,6 +3085,12 @@ "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.2.tgz", @@ -2683,6 +3140,54 @@ "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", @@ -2744,6 +3249,12 @@ "source-map-js": "^1.0.2" } }, + "prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2805,6 +3316,27 @@ "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", @@ -2820,6 +3352,12 @@ "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-literal": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.0.tgz", @@ -2923,6 +3461,21 @@ } } }, + "unplugin-icons": { + "version": "0.15.0", + "resolved": "https://registry.npmmirror.com/unplugin-icons/-/unplugin-icons-0.15.0.tgz", + "integrity": "sha512-/BGtBL8y/2wjey4GLyb0w90mhc9d7XKlewWGMxBPROHS7mR84AV1Y0zDapYK0Q/cc/+u4WUcloreev5cABDa5w==", + "dev": true, + "requires": { + "@antfu/install-pkg": "^0.1.1", + "@antfu/utils": "^0.7.2", + "@iconify/utils": "^2.0.3", + "debug": "^4.3.4", + "kolorist": "^1.6.0", + "local-pkg": "^0.4.2", + "unplugin": "^1.0.1" + } + }, "unplugin-vue-components": { "version": "0.22.12", "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.22.12.tgz", @@ -2953,9 +3506,9 @@ } }, "vite": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.3.tgz", - "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", "dev": true, "requires": { "esbuild": "^0.16.3", @@ -2996,13 +3549,13 @@ } }, "vue-tsc": { - "version": "1.0.19", - "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.19.tgz", - "integrity": "sha512-UuI4G9PwV07Q2U+xYDLP5y3aUXTfuIF0Exy0qXT8+BbLlahubQ2r2PGSodSBnHxAhm/XsrD0KleC2rSzLKXDfQ==", + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.20.tgz", + "integrity": "sha512-AApewYXozAD7v4Iz9I0QzQebSVgvlUvpfbGe2e9TwtBdcw5gBsGiX8Oj5BdxRRiGnOdDG3BHPK8msl7Qhmy/1A==", "dev": true, "requires": { - "@volar/vue-language-core": "1.0.19", - "@volar/vue-typescript": "1.0.19" + "@volar/vue-language-core": "1.0.20", + "@volar/vue-typescript": "1.0.20" } }, "webpack-sources": { @@ -3016,6 +3569,21 @@ "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index d314414..6b7c53e 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,11 @@ "scripts": { "start": "vite", "build": "vue-tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "fmt": "prettier --write src *.d.ts *.ts" }, "dependencies": { + "@element-plus/icons-vue": "^2.0.10", "axios": "^1.2.2", "element-plus": "^2.2.28", "pinia": "^2.0.28", @@ -16,11 +18,14 @@ "vue-router": "^4.1.6" }, "devDependencies": { + "@iconify-json/ep": "^1.1.8", "@vitejs/plugin-vue": "^4.0.0", - "typescript": "^4.9.3", + "prettier": "^2.8.1", + "typescript": "^4.9.4", "unplugin-auto-import": "^0.12.1", + "unplugin-icons": "^0.15.0", "unplugin-vue-components": "^0.22.12", - "vite": "^4.0.0", - "vue-tsc": "^1.0.11" + "vite": "^4.0.4", + "vue-tsc": "^1.0.20" } } diff --git a/src/.prettierrc.toml b/src/.prettierrc.toml new file mode 100644 index 0000000..d165b8d --- /dev/null +++ b/src/.prettierrc.toml @@ -0,0 +1 @@ +semi=false \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index ce15d8d..1e743db 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,13 +1,13 @@ - - - - - + + + + + diff --git a/src/admin/index.vue b/src/admin/index.vue index 40ff7d8..78e61fb 100644 --- a/src/admin/index.vue +++ b/src/admin/index.vue @@ -1,10 +1,7 @@ - - - - - + + + + + diff --git a/src/main.ts b/src/main.ts index da45a42..5af6b04 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,14 @@ -import { createApp } from "vue"; -import { createRouter, createWebHistory } from "vue-router"; -import { createPinia } from "pinia"; -import "element-plus/theme-chalk/display.css"; -import App from "./App.vue"; +import { createApp } from "vue" +import { createRouter, createWebHistory } from "vue-router" +import { createPinia } from "pinia" +import "element-plus/theme-chalk/display.css" +import App from "./App.vue" -import Home from "./oj/index.vue"; -import Problems from "./oj/problem/list.vue"; -import storage from "./utils/storage"; -import { STORAGE_KEY } from "./utils/constants"; -import { useLoginStore } from "./shared/stores/login"; +import Home from "./oj/index.vue" +import Problems from "./oj/problem/list.vue" +import storage from "./utils/storage" +import { STORAGE_KEY } from "./utils/constants" +import { useLoginStore } from "./shared/stores/login" const routes = [ { @@ -45,30 +45,30 @@ const routes = [ ], }, { path: "/admin", component: () => import("./admin/index.vue") }, -]; +] const router = createRouter({ history: createWebHistory(), routes, -}); +}) router.beforeEach((to, from, next) => { if (to.matched.some((record) => record.meta.requiresAuth)) { if (!storage.get(STORAGE_KEY.AUTHED)) { - const login = useLoginStore(); - login.show(); - next("/"); + const login = useLoginStore() + login.show() + next("/") } else { - next(); + next() } } else { - next(); + next() } -}); +}) -const pinia = createPinia(); +const pinia = createPinia() -const app = createApp(App); -app.use(router); -app.use(pinia); -app.mount("#app"); +const app = createApp(App) +app.use(router) +app.use(pinia) +app.mount("#app") diff --git a/src/oj/api.ts b/src/oj/api.ts index 3f9d2db..d84cc9a 100644 --- a/src/oj/api.ts +++ b/src/oj/api.ts @@ -1,58 +1,69 @@ -import { getACRate } from "./../utils/functions"; -import http from "./../utils/http"; - -const difficultDict = { - Low: "简单", - Mid: "中等", - High: "困难", -}; - -function filterResult(result: any) { - const newResult = { - displayID: result._id, - title: result.title, - difficulty: difficultDict[<"Low" | "Mid" | "High">result.difficulty], - tags: result.tags, - submission: result.submission_number, - rate: getACRate(result.accepted_number, result.submission_number), - }; - return newResult; -} - -export async function getProblemList( - offset = 0, - limit = 10, - searchParams: any = {} -) { - let params: any = { - paging: true, - offset, - limit, - }; - Object.keys(searchParams).forEach((element) => { - if (searchParams[element]) { - params[element] = searchParams[element]; - } - }); - const res = await http.get("problem", { - params, - }); - return { - results: res.data.results.map(filterResult), - total: res.data.total, - }; -} - -export function getProblemTagList() { - return http.get("problem/tags"); -} - -export function getProblem(id: number) { - return http.get("problem", { - params: { problem_id: id }, - }); -} - -export function getWebsite() { - return http.get("website"); -} +import { getACRate } from "./../utils/functions" +import http from "./../utils/http" + +const difficultDict = { + Low: "简单", + Mid: "中等", + High: "困难", +} + +function filterResult(result: any) { + const newResult: any = { + displayID: result._id, + title: result.title, + difficulty: difficultDict[<"Low" | "Mid" | "High">result.difficulty], + tags: result.tags, + submission: result.submission_number, + rate: getACRate(result.accepted_number, result.submission_number), + } + if (result.my_status === null || result.my_status === undefined) { + newResult.status = "none" + } else if (result.my_status === 0) { + newResult.status = "done" + } else { + newResult.status = "tried" + } + return newResult +} + +export async function getProblemList( + offset = 0, + limit = 10, + searchParams: any = {} +) { + let params: any = { + paging: true, + offset, + limit, + } + Object.keys(searchParams).forEach((element) => { + if (searchParams[element]) { + params[element] = searchParams[element] + } + }) + const res = await http.get("problem", { + params, + }) + return { + results: res.data.results.map(filterResult), + total: res.data.total, + } +} + +export function getProblemTagList() { + return http.get("problem/tags") +} + +export function getRandomProblemID() { + return http.get("pickone") +} + +export function getProblem(id: number) { + return http.get("problem", { + params: { problem_id: id }, + }) +} + +export function getWebsite() { + return http.get("website") +} diff --git a/src/oj/components/header.vue b/src/oj/components/header.vue index 211e4db..7c84dd8 100644 --- a/src/oj/components/header.vue +++ b/src/oj/components/header.vue @@ -1,68 +1,69 @@ - - - - - + + + + + diff --git a/src/oj/contest/list.vue b/src/oj/contest/list.vue index e03392a..8474813 100644 --- a/src/oj/contest/list.vue +++ b/src/oj/contest/list.vue @@ -1,10 +1,5 @@ - - - - - + + + + + diff --git a/src/oj/contests/index.vue b/src/oj/contests/index.vue deleted file mode 100644 index 7235471..0000000 --- a/src/oj/contests/index.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/src/oj/index.vue b/src/oj/index.vue index 45ba99b..1a8bd7f 100644 --- a/src/oj/index.vue +++ b/src/oj/index.vue @@ -1,22 +1,22 @@ - - - - - + + + + + diff --git a/src/oj/problem/detail.vue b/src/oj/problem/detail.vue index 79529c8..120821e 100644 --- a/src/oj/problem/detail.vue +++ b/src/oj/problem/detail.vue @@ -1,10 +1,5 @@ - - - - - + + + + + diff --git a/src/oj/problem/list.vue b/src/oj/problem/list.vue index 9ba1cdb..af46db1 100644 --- a/src/oj/problem/list.vue +++ b/src/oj/problem/list.vue @@ -1,211 +1,254 @@ - - - - - + + + + + diff --git a/src/oj/rank/list.vue b/src/oj/rank/list.vue index a255015..0872d64 100644 --- a/src/oj/rank/list.vue +++ b/src/oj/rank/list.vue @@ -1,10 +1,5 @@ - - - - - + + + + + diff --git a/src/oj/status/list.vue b/src/oj/status/list.vue index 73f84df..467340b 100644 --- a/src/oj/status/list.vue +++ b/src/oj/status/list.vue @@ -1,10 +1,5 @@ - - - - - + + + + + diff --git a/src/oj/stores/signup.ts b/src/oj/stores/signup.ts index 980e654..37d2b64 100644 --- a/src/oj/stores/signup.ts +++ b/src/oj/stores/signup.ts @@ -1,16 +1,16 @@ -import { defineStore } from "pinia"; -import { ref } from "vue"; - -export const useSignupStore = defineStore("signup", () => { - const visible = ref(false); - - function show() { - visible.value = true; - } - - function hide() { - visible.value = false; - } - - return { visible, show, hide }; -}); +import { defineStore } from "pinia" +import { ref } from "vue" + +export const useSignupStore = defineStore("signup", () => { + const visible = ref(false) + + function show() { + visible.value = true + } + + function hide() { + visible.value = false + } + + return { visible, show, hide } +}) diff --git a/src/oj/user/signup.vue b/src/oj/user/signup.vue index e2e496a..68edec9 100644 --- a/src/oj/user/signup.vue +++ b/src/oj/user/signup.vue @@ -1,16 +1,16 @@ - - - - - + + + + + diff --git a/src/shared/api.ts b/src/shared/api.ts index 10d7274..1649cda 100644 --- a/src/shared/api.ts +++ b/src/shared/api.ts @@ -1,15 +1,15 @@ -import http from "../utils/http"; - -export function login(data: { username: string; password: string }) { - return http.post("login", data); -} - -export function logout() { - return http.get("logout"); -} - -export function getUserInfo(username: string) { - return http.get("profile", { - params: { username }, - }); -} +import http from "../utils/http" + +export function login(data: { username: string; password: string }) { + return http.post("login", data) +} + +export function logout() { + return http.get("logout") +} + +export function getUserInfo(username: string) { + return http.get("profile", { + params: { username }, + }) +} diff --git a/src/shared/stores/login.ts b/src/shared/stores/login.ts index 63fd5b3..f4f00a4 100644 --- a/src/shared/stores/login.ts +++ b/src/shared/stores/login.ts @@ -1,16 +1,16 @@ -import { defineStore } from "pinia"; -import { ref } from "vue"; - -export const useLoginStore = defineStore("login", () => { - const visible = ref(false); - - function show() { - visible.value = true; - } - - function hide() { - visible.value = false; - } - - return { visible, show, hide }; -}); +import { defineStore } from "pinia" +import { ref } from "vue" + +export const useLoginStore = defineStore("login", () => { + const visible = ref(false) + + function show() { + visible.value = true + } + + function hide() { + visible.value = false + } + + return { visible, show, hide } +}) diff --git a/src/shared/stores/user.ts b/src/shared/stores/user.ts index 026140a..7ea4919 100644 --- a/src/shared/stores/user.ts +++ b/src/shared/stores/user.ts @@ -1,51 +1,51 @@ -import { defineStore } from "pinia"; -import { computed, ref } from "vue"; -import { - PROBLEM_PERMISSION, - STORAGE_KEY, - USER_TYPE, -} from "../../utils/constants"; -import storage from "../../utils/storage"; -import { getUserInfo } from "../api"; - -export const useUserStore = defineStore("user", () => { - const profile = ref({}); - const isLoaded = ref(false); - const user = computed(() => profile.value.user || {}); - const isAuthed = computed(() => !!user.value.email); - const isAdminRole = computed( - () => - user.value.admin_type === USER_TYPE.ADMIN || - user.value.admin_type === USER_TYPE.SUPER_ADMIN - ); - const isSuperAdmin = computed( - () => user.value.admin_type === USER_TYPE.SUPER_ADMIN - ); - const hasProblemPermission = computed( - () => user.value.problem_permission !== PROBLEM_PERMISSION.NONE - ); - - async function getMyProfile() { - isLoaded.value = false; - const res = await getUserInfo(""); - isLoaded.value = true; - profile.value = res.data || {}; - storage.set(STORAGE_KEY.AUTHED, !!user.value.email); - } - - function clearMyProfile() { - profile.value = {}; - storage.clear(); - } - return { - profile, - isLoaded, - user, - isAdminRole, - isSuperAdmin, - hasProblemPermission, - isAuthed, - getMyProfile, - clearMyProfile, - }; -}); +import { defineStore } from "pinia" +import { computed, ref } from "vue" +import { + PROBLEM_PERMISSION, + STORAGE_KEY, + USER_TYPE, +} from "../../utils/constants" +import storage from "../../utils/storage" +import { getUserInfo } from "../api" + +export const useUserStore = defineStore("user", () => { + const profile = ref({}) + const isLoaded = ref(false) + const user = computed(() => profile.value.user || {}) + const isAuthed = computed(() => !!user.value.email) + const isAdminRole = computed( + () => + user.value.admin_type === USER_TYPE.ADMIN || + user.value.admin_type === USER_TYPE.SUPER_ADMIN + ) + const isSuperAdmin = computed( + () => user.value.admin_type === USER_TYPE.SUPER_ADMIN + ) + const hasProblemPermission = computed( + () => user.value.problem_permission !== PROBLEM_PERMISSION.NONE + ) + + async function getMyProfile() { + isLoaded.value = false + const res = await getUserInfo("") + isLoaded.value = true + profile.value = res.data || {} + storage.set(STORAGE_KEY.AUTHED, !!user.value.email) + } + + function clearMyProfile() { + profile.value = {} + storage.clear() + } + return { + profile, + isLoaded, + user, + isAdminRole, + isSuperAdmin, + hasProblemPermission, + isAuthed, + getMyProfile, + clearMyProfile, + } +}) diff --git a/src/shared/user/login.vue b/src/shared/user/login.vue index 9be7ef9..e1538af 100644 --- a/src/shared/user/login.vue +++ b/src/shared/user/login.vue @@ -1,93 +1,93 @@ - - - - - + + + + + diff --git a/src/utils/constants.ts b/src/utils/constants.ts index b4cbb0f..4989711 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -68,13 +68,13 @@ export const JUDGE_STATUS = { color: "yellow", type: "warning", }, -}; +} export const CONTEST_STATUS = { NOT_START: "1", UNDERWAY: "0", ENDED: "-1", -}; +} export const CONTEST_STATUS_REVERSE = { "1": { @@ -89,41 +89,41 @@ export const CONTEST_STATUS_REVERSE = { name: "Ended", color: "red", }, -}; +} export const RULE_TYPE = { ACM: "ACM", OI: "OI", -}; +} export const CONTEST_TYPE = { PUBLIC: "Public", PRIVATE: "Password Protected", -}; +} export const USER_TYPE = { REGULAR_USER: "Regular User", ADMIN: "Admin", SUPER_ADMIN: "Super Admin", -}; +} export const PROBLEM_PERMISSION = { NONE: "None", OWN: "Own", ALL: "All", -}; +} export const STORAGE_KEY = { AUTHED: "authed", PROBLEM_CODE: "problemCode", USER: "user", -}; +} export function buildProblemCodeKey(problemID: number, contestID = null) { if (contestID) { - return `${STORAGE_KEY.PROBLEM_CODE}_${contestID}_${problemID}`; + return `${STORAGE_KEY.PROBLEM_CODE}_${contestID}_${problemID}` } - return `${STORAGE_KEY.PROBLEM_CODE}_NaN_${problemID}`; + return `${STORAGE_KEY.PROBLEM_CODE}_NaN_${problemID}` } -export const GOOGLE_ANALYTICS_ID = "UA-111499601-1"; +export const GOOGLE_ANALYTICS_ID = "UA-111499601-1" diff --git a/src/utils/functions.ts b/src/utils/functions.ts index 0dc9d0d..a9fb5f6 100644 --- a/src/utils/functions.ts +++ b/src/utils/functions.ts @@ -1,14 +1,14 @@ -export function getACRate(acCount: number, totalCount: number) { - let rate = totalCount === 0 ? 0.0 : ((acCount / totalCount) * 100).toFixed(2); - return `${rate}%`; -} - -export function filterEmptyValue(object: any) { - let query: any = {}; - Object.keys(object).forEach((key) => { - if (object[key] || object[key] === 0 || object[key] === false) { - query[key] = object[key]; - } - }); - return query; -} +export function getACRate(acCount: number, totalCount: number) { + let rate = totalCount === 0 ? 0.0 : ((acCount / totalCount) * 100).toFixed(2) + return `${rate}%` +} + +export function filterEmptyValue(object: any) { + let query: any = {} + Object.keys(object).forEach((key) => { + if (object[key] || object[key] === 0 || object[key] === false) { + query[key] = object[key] + } + }) + return query +} diff --git a/src/utils/http.ts b/src/utils/http.ts index fc34b76..2c27faf 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -1,26 +1,26 @@ -import axios from "axios"; - -const http = axios.create({ - baseURL: "/api", - xsrfHeaderName: "X-CSRFToken", - xsrfCookieName: "csrftoken", -}); - -// TODO -http.interceptors.response.use( - (res) => { - if (res.data.error) { - // 若后端返回为登录,则为session失效,应退出当前登录用户 - if (res.data.data.startsWith("Please login")) { - } - return Promise.reject(res.data); - } else { - return Promise.resolve(res.data); - } - }, - (err) => { - return Promise.reject(err); - } -); - -export default http; +import axios from "axios" + +const http = axios.create({ + baseURL: "/api", + xsrfHeaderName: "X-CSRFToken", + xsrfCookieName: "csrftoken", +}) + +// TODO +http.interceptors.response.use( + (res) => { + if (res.data.error) { + // 若后端返回为登录,则为session失效,应退出当前登录用户 + if (res.data.data.startsWith("Please login")) { + } + return Promise.reject(res.data) + } else { + return Promise.resolve(res.data) + } + }, + (err) => { + return Promise.reject(err) + } +) + +export default http diff --git a/src/utils/storage.ts b/src/utils/storage.ts index 5280514..feb1ca5 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -1,21 +1,21 @@ -const localStorage = window.localStorage; +const localStorage = window.localStorage export default { set(key: string, value: any) { - localStorage.setItem(key, JSON.stringify(value)); + localStorage.setItem(key, JSON.stringify(value)) }, get(key: string) { - const content = localStorage.getItem(key); + const content = localStorage.getItem(key) if (content) { - return JSON.parse(content); + return JSON.parse(content) } else { - return null; + return null } }, remove(key: string) { - localStorage.removeItem(key); + localStorage.removeItem(key) }, clear() { - localStorage.clear(); + localStorage.clear() }, -}; +} diff --git a/vite.config.ts b/vite.config.ts index 51e26e3..a5d7f07 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,35 +3,35 @@ import vue from "@vitejs/plugin-vue"; import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; +import IconsResolver from "unplugin-icons/resolver"; +import Icons from "unplugin-icons/vite"; const url = "https://oj.hyyz.izhai.net"; +const proxyConfig = { + target: url, + changeOrigin: true, + headers: { Referer: url }, +}; + // https://vitejs.dev/config/ export default defineConfig({ plugins: [ vue(), AutoImport({ - resolvers: [ElementPlusResolver()], + resolvers: [ElementPlusResolver(), IconsResolver()], }), Components({ - resolvers: [ElementPlusResolver()], + resolvers: [ + ElementPlusResolver(), + IconsResolver({ enabledCollections: ["ep"] }), + ], }), + Icons({ autoInstall: true }), ], server: { proxy: { - "/api": { - target: url, - changeOrigin: true, - headers: { - Referer: url, - }, - }, - "/public": { - target: url, - changeOrigin: true, - headers: { - Referer: url, - }, - }, + "/api": proxyConfig, + "/public": proxyConfig, }, }, });