diff --git a/package-lock.json b/package-lock.json
index 174834e..ced8913 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,9 +10,8 @@
"dependencies": {
"@element-plus/icons-vue": "^2.0.10",
"@monaco-editor/loader": "^1.3.2",
- "@vueuse/core": "^9.11.0",
- "@vueuse/integrations": "^9.11.0",
- "axios": "1.2.2",
+ "@vueuse/core": "^9.11.1",
+ "axios": "1.2.3",
"copy-text-to-clipboard": "^3.0.1",
"date-fns": "^2.29.3",
"highlight.js": "^11.7.0",
@@ -26,7 +25,7 @@
"@iconify-json/ep": "^1.1.8",
"@types/node": "^18.11.18",
"@vitejs/plugin-vue": "^4.0.0",
- "markdown-it-highlightjs": "^4.0.1",
+ "markdown-it-shiki": "^0.7.2",
"monaco-editor": "^0.34.1",
"prettier": "^2.8.3",
"typescript": "^4.9.4",
@@ -560,6 +559,23 @@
"node": ">= 8"
}
},
+ "node_modules/@pkgr/utils": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.3.1.tgz",
+ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "is-glob": "^4.0.3",
+ "open": "^8.4.0",
+ "picocolors": "^1.0.0",
+ "tiny-glob": "^0.2.9",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ }
+ },
"node_modules/@rollup/pluginutils": {
"version": "5.0.2",
"resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
@@ -835,13 +851,13 @@
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
},
"node_modules/@vueuse/core": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.11.0.tgz",
- "integrity": "sha512-7yZJ8LNOssA8ZmeSjd4F+wbFBA4csiP4TiaXgruqg1H4PAtzSkv93PPwFLvQkSnfo3Bar+e+6QoRvWjhz7l2Xg==",
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.11.1.tgz",
+ "integrity": "sha512-E/cizD1w9ILkq4axYjZrXLkKaBfzloaby2n3NMjUfd6yI/jkfTVgc6iwy/Cw2e++Ld4LphGbO+3MhzizvwUslQ==",
"dependencies": {
"@types/web-bluetooth": "^0.0.16",
- "@vueuse/metadata": "9.11.0",
- "@vueuse/shared": "9.11.0",
+ "@vueuse/metadata": "9.11.1",
+ "@vueuse/shared": "9.11.1",
"vue-demi": "*"
}
},
@@ -867,95 +883,15 @@
}
}
},
- "node_modules/@vueuse/integrations": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-9.11.0.tgz",
- "integrity": "sha512-t6ox9R1sDOBzHWaycv5bti4t8o0oFyAQx98zDjCxtcrwkyib0ZKtyf/dIHGFS9kHk4ycOT3nwS47A/jXOGfxaQ==",
- "dependencies": {
- "@vueuse/core": "9.11.0",
- "@vueuse/shared": "9.11.0",
- "vue-demi": "*"
- },
- "peerDependencies": {
- "async-validator": "*",
- "axios": "*",
- "change-case": "*",
- "drauu": "*",
- "focus-trap": "*",
- "fuse.js": "*",
- "idb-keyval": "*",
- "jwt-decode": "*",
- "nprogress": "*",
- "qrcode": "*",
- "universal-cookie": "*"
- },
- "peerDependenciesMeta": {
- "async-validator": {
- "optional": true
- },
- "axios": {
- "optional": true
- },
- "change-case": {
- "optional": true
- },
- "drauu": {
- "optional": true
- },
- "focus-trap": {
- "optional": true
- },
- "fuse.js": {
- "optional": true
- },
- "idb-keyval": {
- "optional": true
- },
- "jwt-decode": {
- "optional": true
- },
- "nprogress": {
- "optional": true
- },
- "qrcode": {
- "optional": true
- },
- "universal-cookie": {
- "optional": true
- }
- }
- },
- "node_modules/@vueuse/integrations/node_modules/vue-demi": {
- "version": "0.13.11",
- "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
- "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
- "hasInstallScript": true,
- "bin": {
- "vue-demi-fix": "bin/vue-demi-fix.js",
- "vue-demi-switch": "bin/vue-demi-switch.js"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "@vue/composition-api": "^1.0.0-rc.1",
- "vue": "^3.0.0-0 || ^2.6.0"
- },
- "peerDependenciesMeta": {
- "@vue/composition-api": {
- "optional": true
- }
- }
- },
"node_modules/@vueuse/metadata": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.11.0.tgz",
- "integrity": "sha512-HhtG2SWkcfZBLbamHdvLn7jKOCFpw/ifXjVTd5ilFkj98WVUk/3UTQ03wF1XIkuhSO4+b45hD2lfG9/GdKCF7w=="
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.11.1.tgz",
+ "integrity": "sha512-ABjkrG+VXggNhjfGyw5e/sekxTZfXTwjrYXkkWQmQ7Biyv+Gq9UD6IDNfeGvQZEINI0Qzw6nfuO2UFCd3hlrxQ=="
},
"node_modules/@vueuse/shared": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.11.0.tgz",
- "integrity": "sha512-8lO7wD5abYxupKy2KynH1pSgP715ky6iCrWYb8aX2AuAVi9uHXj7qE1dw6BnmArSaLHci4x9iuzWPCpAzUkC/A==",
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.11.1.tgz",
+ "integrity": "sha512-UTZYGAjT96hWn4buf4wstZbeheBVNcKPQuej6qpoSkjF1atdaeCD6kqm9uGL2waHfisSgH9mq0qCRiBOk5C/2w==",
"dependencies": {
"vue-demi": "*"
}
@@ -1027,9 +963,9 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios": {
- "version": "1.2.2",
- "resolved": "https://registry.npmmirror.com/axios/-/axios-1.2.2.tgz",
- "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.2.3.tgz",
+ "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==",
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
@@ -1179,6 +1115,15 @@
}
}
},
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -1414,6 +1359,18 @@
"node": ">= 6"
}
},
+ "node_modules/globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
+ "dev": true
+ },
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
"node_modules/gray-matter": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz",
@@ -1488,6 +1445,18 @@
"has": "^1.0.3"
}
},
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -1536,6 +1505,18 @@
"node": ">=8"
}
},
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -1644,13 +1625,14 @@
"markdown-it": "bin/markdown-it.js"
}
},
- "node_modules/markdown-it-highlightjs": {
- "version": "4.0.1",
- "resolved": "https://registry.npmmirror.com/markdown-it-highlightjs/-/markdown-it-highlightjs-4.0.1.tgz",
- "integrity": "sha512-EPXwFEN6P5nqR3G4KjT20r20xbGYKMMA/360hhSYFmeoGXTE6hsLtJAiB/8ID8slVH4CWHHEL7GX0YenyIstVQ==",
+ "node_modules/markdown-it-shiki": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmmirror.com/markdown-it-shiki/-/markdown-it-shiki-0.7.2.tgz",
+ "integrity": "sha512-CJucoEMqDg3RJ4R+Oep20Rfsa1MYUebEDxppYyXy4wLmHDktqDd5+7qt51xMnyJkwtIJfmEETjsU7GqBXi5z0g==",
"dev": true,
"dependencies": {
- "highlight.js": "^11.5.1"
+ "shiki": "^0.11.1",
+ "synckit": "^0.8.4"
}
},
"node_modules/markdown-it/node_modules/argparse": {
@@ -1834,6 +1816,20 @@
"node": ">=6"
}
},
+ "node_modules/open": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmmirror.com/open/-/open-8.4.0.tgz",
+ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "dev": true,
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
@@ -2104,6 +2100,17 @@
"node": ">=8"
}
},
+ "node_modules/shiki": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmmirror.com/shiki/-/shiki-0.11.1.tgz",
+ "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.0.0",
+ "vscode-oniguruma": "^1.6.1",
+ "vscode-textmate": "^6.0.0"
+ }
+ },
"node_modules/signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -2179,6 +2186,29 @@
"node": ">= 0.4"
}
},
+ "node_modules/synckit": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.8.4.tgz",
+ "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/utils": "^2.3.1",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ }
+ },
+ "node_modules/tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmmirror.com/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dev": true,
+ "dependencies": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2196,6 +2226,12 @@
"resolved": "https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz",
"integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg=="
},
+ "node_modules/tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
+ },
"node_modules/typescript": {
"version": "4.9.4",
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz",
@@ -2431,6 +2467,18 @@
"vue": "^3.0.0"
}
},
+ "node_modules/vscode-oniguruma": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
+ "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
+ "dev": true
+ },
+ "node_modules/vscode-textmate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz",
+ "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==",
+ "dev": true
+ },
"node_modules/vue": {
"version": "3.2.45",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz",
@@ -2838,6 +2886,20 @@
"fastq": "^1.6.0"
}
},
+ "@pkgr/utils": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/@pkgr/utils/-/utils-2.3.1.tgz",
+ "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "is-glob": "^4.0.3",
+ "open": "^8.4.0",
+ "picocolors": "^1.0.0",
+ "tiny-glob": "^0.2.9",
+ "tslib": "^2.4.0"
+ }
+ },
"@rollup/pluginutils": {
"version": "5.0.2",
"resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
@@ -3099,31 +3161,13 @@
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
},
"@vueuse/core": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.11.0.tgz",
- "integrity": "sha512-7yZJ8LNOssA8ZmeSjd4F+wbFBA4csiP4TiaXgruqg1H4PAtzSkv93PPwFLvQkSnfo3Bar+e+6QoRvWjhz7l2Xg==",
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.11.1.tgz",
+ "integrity": "sha512-E/cizD1w9ILkq4axYjZrXLkKaBfzloaby2n3NMjUfd6yI/jkfTVgc6iwy/Cw2e++Ld4LphGbO+3MhzizvwUslQ==",
"requires": {
"@types/web-bluetooth": "^0.0.16",
- "@vueuse/metadata": "9.11.0",
- "@vueuse/shared": "9.11.0",
- "vue-demi": "*"
- },
- "dependencies": {
- "vue-demi": {
- "version": "0.13.11",
- "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz",
- "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
- "requires": {}
- }
- }
- },
- "@vueuse/integrations": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-9.11.0.tgz",
- "integrity": "sha512-t6ox9R1sDOBzHWaycv5bti4t8o0oFyAQx98zDjCxtcrwkyib0ZKtyf/dIHGFS9kHk4ycOT3nwS47A/jXOGfxaQ==",
- "requires": {
- "@vueuse/core": "9.11.0",
- "@vueuse/shared": "9.11.0",
+ "@vueuse/metadata": "9.11.1",
+ "@vueuse/shared": "9.11.1",
"vue-demi": "*"
},
"dependencies": {
@@ -3136,14 +3180,14 @@
}
},
"@vueuse/metadata": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.11.0.tgz",
- "integrity": "sha512-HhtG2SWkcfZBLbamHdvLn7jKOCFpw/ifXjVTd5ilFkj98WVUk/3UTQ03wF1XIkuhSO4+b45hD2lfG9/GdKCF7w=="
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.11.1.tgz",
+ "integrity": "sha512-ABjkrG+VXggNhjfGyw5e/sekxTZfXTwjrYXkkWQmQ7Biyv+Gq9UD6IDNfeGvQZEINI0Qzw6nfuO2UFCd3hlrxQ=="
},
"@vueuse/shared": {
- "version": "9.11.0",
- "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.11.0.tgz",
- "integrity": "sha512-8lO7wD5abYxupKy2KynH1pSgP715ky6iCrWYb8aX2AuAVi9uHXj7qE1dw6BnmArSaLHci4x9iuzWPCpAzUkC/A==",
+ "version": "9.11.1",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.11.1.tgz",
+ "integrity": "sha512-UTZYGAjT96hWn4buf4wstZbeheBVNcKPQuej6qpoSkjF1atdaeCD6kqm9uGL2waHfisSgH9mq0qCRiBOk5C/2w==",
"requires": {
"vue-demi": "*"
},
@@ -3192,9 +3236,9 @@
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"axios": {
- "version": "1.2.2",
- "resolved": "https://registry.npmmirror.com/axios/-/axios-1.2.2.tgz",
- "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.2.3.tgz",
+ "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==",
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
@@ -3311,6 +3355,12 @@
"ms": "2.1.2"
}
},
+ "define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true
+ },
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3484,6 +3534,18 @@
"is-glob": "^4.0.1"
}
},
+ "globalyzer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/globalyzer/-/globalyzer-0.1.0.tgz",
+ "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==",
+ "dev": true
+ },
+ "globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmmirror.com/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true
+ },
"gray-matter": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz",
@@ -3540,6 +3602,12 @@
"has": "^1.0.3"
}
},
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true
+ },
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz",
@@ -3573,6 +3641,15 @@
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true
},
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -3671,13 +3748,14 @@
}
}
},
- "markdown-it-highlightjs": {
- "version": "4.0.1",
- "resolved": "https://registry.npmmirror.com/markdown-it-highlightjs/-/markdown-it-highlightjs-4.0.1.tgz",
- "integrity": "sha512-EPXwFEN6P5nqR3G4KjT20r20xbGYKMMA/360hhSYFmeoGXTE6hsLtJAiB/8ID8slVH4CWHHEL7GX0YenyIstVQ==",
+ "markdown-it-shiki": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmmirror.com/markdown-it-shiki/-/markdown-it-shiki-0.7.2.tgz",
+ "integrity": "sha512-CJucoEMqDg3RJ4R+Oep20Rfsa1MYUebEDxppYyXy4wLmHDktqDd5+7qt51xMnyJkwtIJfmEETjsU7GqBXi5z0g==",
"dev": true,
"requires": {
- "highlight.js": "^11.5.1"
+ "shiki": "^0.11.1",
+ "synckit": "^0.8.4"
}
},
"mdurl": {
@@ -3819,6 +3897,17 @@
"mimic-fn": "^2.1.0"
}
},
+ "open": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmmirror.com/open/-/open-8.4.0.tgz",
+ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "dev": true,
+ "requires": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ }
+ },
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
@@ -4012,6 +4101,17 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
+ "shiki": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmmirror.com/shiki/-/shiki-0.11.1.tgz",
+ "integrity": "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.0.0",
+ "vscode-oniguruma": "^1.6.1",
+ "vscode-textmate": "^6.0.0"
+ }
+ },
"signal-exit": {
"version": "3.0.7",
"resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -4071,6 +4171,26 @@
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
+ "synckit": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.8.4.tgz",
+ "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==",
+ "dev": true,
+ "requires": {
+ "@pkgr/utils": "^2.3.1",
+ "tslib": "^2.4.0"
+ }
+ },
+ "tiny-glob": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmmirror.com/tiny-glob/-/tiny-glob-0.2.9.tgz",
+ "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
+ "dev": true,
+ "requires": {
+ "globalyzer": "0.1.0",
+ "globrex": "^0.1.2"
+ }
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4085,6 +4205,12 @@
"resolved": "https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz",
"integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg=="
},
+ "tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "dev": true
+ },
"typescript": {
"version": "4.9.4",
"resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz",
@@ -4225,6 +4351,18 @@
"evtd": "^0.2.2"
}
},
+ "vscode-oniguruma": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
+ "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
+ "dev": true
+ },
+ "vscode-textmate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/vscode-textmate/-/vscode-textmate-6.0.0.tgz",
+ "integrity": "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==",
+ "dev": true
+ },
"vue": {
"version": "3.2.45",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz",
diff --git a/package.json b/package.json
index a4bcd03..d772915 100644
--- a/package.json
+++ b/package.json
@@ -12,9 +12,8 @@
"dependencies": {
"@element-plus/icons-vue": "^2.0.10",
"@monaco-editor/loader": "^1.3.2",
- "@vueuse/core": "^9.11.0",
- "@vueuse/integrations": "^9.11.0",
- "axios": "1.2.2",
+ "@vueuse/core": "^9.11.1",
+ "axios": "1.2.3",
"copy-text-to-clipboard": "^3.0.1",
"date-fns": "^2.29.3",
"highlight.js": "^11.7.0",
@@ -28,7 +27,7 @@
"@iconify-json/ep": "^1.1.8",
"@types/node": "^18.11.18",
"@vitejs/plugin-vue": "^4.0.0",
- "markdown-it-highlightjs": "^4.0.1",
+ "markdown-it-shiki": "^0.7.2",
"monaco-editor": "^0.34.1",
"prettier": "^2.8.3",
"typescript": "^4.9.4",
diff --git a/src/learn/index.vue b/src/learn/index.vue
index a3b86b4..ea9c58d 100644
--- a/src/learn/index.vue
+++ b/src/learn/index.vue
@@ -29,4 +29,39 @@ function change(value: string) {
-
+
diff --git a/src/learn/step-1/index.md b/src/learn/step-1/index.md
index ad099de..f8f1878 100644
--- a/src/learn/step-1/index.md
+++ b/src/learn/step-1/index.md
@@ -1 +1,15 @@
# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
diff --git a/src/main.ts b/src/main.ts
index b7ee4ee..eb5e525 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -19,7 +19,6 @@ router.beforeEach((to, from, next) => {
if (to.matched.some((record) => record.meta.requiresAuth)) {
if (!storage.get(STORAGE_KEY.AUTHED)) {
toggleLogin(true)
- next("/")
} else {
next()
}
diff --git a/src/oj/api.ts b/src/oj/api.ts
index 1e51113..705b037 100644
--- a/src/oj/api.ts
+++ b/src/oj/api.ts
@@ -1,4 +1,3 @@
-import { useAxios } from "@vueuse/integrations/useAxios"
import http from "utils/http"
import { getACRate } from "utils/functions"
import { DIFFICULTY } from "utils/constants"
@@ -53,7 +52,7 @@ export async function getProblemList(
}
export function getProblemTagList() {
- return useAxios<{ id: number; name: string }[]>("problem/tags", http)
+ return http.get("problem/tags")
}
export function getRandomProblemID() {
@@ -61,7 +60,7 @@ export function getRandomProblemID() {
}
export function getProblem(id: string) {
- return useAxios("problem", { params: { problem_id: id } }, http)
+ return http.get("problem", { params: { problem_id: id } })
}
export function getSubmission(id: string) {
@@ -71,12 +70,7 @@ export function getSubmission(id: string) {
}
export function submissionExists(problemID: number) {
- return useAxios(
- "submission_exists",
- { params: { problem_id: problemID } },
- http,
- { immediate: false }
- )
+ return http.get("submission_exists", { params: { problem_id: problemID } })
}
export function submitCode(data: SubmitCodePayload) {
@@ -107,3 +101,7 @@ export function getContestList(query: {
}) {
return http.get("contests", { params: query })
}
+
+export function getContest(id: string) {
+ return http.get("contest", { params: { id } })
+}
diff --git a/src/oj/contest/detail.vue b/src/oj/contest/detail.vue
index 41c0521..d37ed58 100644
--- a/src/oj/contest/detail.vue
+++ b/src/oj/contest/detail.vue
@@ -1,5 +1,7 @@
-
+
-contest detail
+
diff --git a/src/oj/contest/list.vue b/src/oj/contest/list.vue
index d352f7a..6a23db8 100644
--- a/src/oj/contest/list.vue
+++ b/src/oj/contest/list.vue
@@ -126,9 +126,9 @@ function rowProps(row: Contest) {
v-model:value="query.status"
/>
-
+
diff --git a/src/oj/problem/components/ProblemContent.vue b/src/oj/problem/components/ProblemContent.vue
index 9309379..f5a5f9c 100644
--- a/src/oj/problem/components/ProblemContent.vue
+++ b/src/oj/problem/components/ProblemContent.vue
@@ -23,10 +23,14 @@ const route = useRoute()
const contestID = route.params.contestID
const theme = useThemeVars()
const style = computed(() => "color: " + theme.value.primaryColor)
-const { data: hasSolved, execute } = submissionExists(props.problem.id)
-if (contestID) {
- execute()
-}
+const solved = ref(false)
+
+onMounted(() => {
+ if (contestID) {
+ checkSubmisson()
+ }
+})
+
const samples = ref(
props.problem.samples.map((sample, index) => ({
...sample,
@@ -45,6 +49,12 @@ const disabled = computed(
code.value === SOURCES[code.language]
)
)
+
+async function checkSubmisson() {
+ const res = await submissionExists(props.problem.id)
+ solved.value = res.data
+}
+
async function test(sample: Sample, index: number) {
samples.value = samples.value.map((sample) => {
if (sample.id === index) {
@@ -87,7 +97,7 @@ const type = (status: ProblemStatus) =>
diff --git a/src/oj/problem/detail.vue b/src/oj/problem/detail.vue
index 84b4943..6813fd5 100644
--- a/src/oj/problem/detail.vue
+++ b/src/oj/problem/detail.vue
@@ -1,6 +1,7 @@
-
+
diff --git a/src/oj/problem/list.vue b/src/oj/problem/list.vue
index 749f07e..cd710f8 100644
--- a/src/oj/problem/list.vue
+++ b/src/oj/problem/list.vue
@@ -39,12 +39,11 @@ const theme = useThemeVars()
const userStore = useUserStore()
const problems = ref([])
const total = ref(0)
-
-const { data } = getProblemTagList()
+const tags = ref<{ id: number; name: string }[]>([])
const tagOptions = computed(() => [
{ label: "全部", value: "" },
- ...(data.value?.map((t) => ({ label: t.name, value: t.name })) || []),
+ ...(tags.value?.map((t) => ({ label: t.name, value: t.name })) || []),
])
const query = reactive({
@@ -73,6 +72,11 @@ async function listProblems() {
problems.value = res.results
}
+async function listTags() {
+ const res = await getProblemTagList()
+ tags.value = res.data
+}
+
function routerPush() {
router.push({
path: route.path,
@@ -115,13 +119,16 @@ watch(
// TODO: 这里会在登录时候执行两次,有BUG
watch(() => userStore.isFinished && userStore.isAuthed, listProblems)
-onMounted(listProblems)
+onMounted(() => {
+ listProblems()
+ listTags()
+})
const columns: DataTableColumn[] = [
{
title: "状态",
key: "status",
- width: 80,
+ width: 60,
render: (row) => {
if (row.status === "passed") {
return h(NIcon, { color: theme.value.successColor }, () => h(Select))
diff --git a/src/oj/rank/list.vue b/src/oj/rank/list.vue
index 1a86630..4d18e77 100644
--- a/src/oj/rank/list.vue
+++ b/src/oj/rank/list.vue
@@ -22,14 +22,14 @@ const columns: DataTableColumn[] = [
{
title: "排名",
key: "index",
- minWidth: 60,
+ width: 100,
render: (_, index) =>
h("span", {}, index + (query.page - 1) * query.limit + 1),
},
{
title: "用户",
key: "username",
- minWidth: 100,
+ width: 200,
render: (row) =>
h(
NButton,
@@ -38,12 +38,12 @@ const columns: DataTableColumn[] = [
),
},
{ title: "骚话", key: "mood", minWidth: 200 },
- { title: "已解决", key: "accepted_number", minWidth: 80 },
- { title: "提交数", key: "submission_number", minWidth: 80 },
+ { title: "已解决", key: "accepted_number", width: 100 },
+ { title: "提交数", key: "submission_number", width: 100 },
{
title: "正确率",
key: "rate",
- minWidth: 80,
+ width: 100,
render: (row) => getACRate(row.accepted_number, row.submission_number),
},
]
diff --git a/src/routes.ts b/src/routes.ts
index 8b8b6e6..a23639b 100644
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -18,6 +18,7 @@ export const routes = [
path: "submission/:submissionID",
component: () => import("oj/submission/detail.vue"),
props: true,
+ meta: { requiresAuth: true },
},
{
path: "contest",
diff --git a/src/shared/Login.vue b/src/shared/Login.vue
index 1158794..8632964 100644
--- a/src/shared/Login.vue
+++ b/src/shared/Login.vue
@@ -6,6 +6,8 @@ import type { FormRules } from "naive-ui"
const userStore = useUserStore()
const loginRef = ref()
+const [isLoading] = useToggle()
+const error = ref()
const form = reactive({
username: "",
password: "",
@@ -17,13 +19,21 @@ const rules: FormRules = {
{ min: 6, max: 20, message: "长度在6到20位之间", trigger: "input" },
],
}
-const { isLoading, error, execute } = login(form)
+
const msg = computed(() => error.value && "用户名或密码不正确")
async function submit() {
loginRef.value?.validate(async (errors: FormRules | undefined) => {
if (!errors) {
- await execute()
+ try {
+ error.value = null
+ isLoading.value = true
+ await login(form)
+ } catch (err) {
+ error.value = err
+ } finally {
+ isLoading.value = false
+ }
if (!error.value) {
toggleLogin(false)
userStore.getMyProfile()
diff --git a/src/shared/api.ts b/src/shared/api.ts
index 12d9d98..348ebf3 100644
--- a/src/shared/api.ts
+++ b/src/shared/api.ts
@@ -1,18 +1,13 @@
-import { useAxios } from "@vueuse/integrations/useAxios"
import http from "utils/http"
export function login(data: { username: string; password: string }) {
- return useAxios("login", { method: "post", data }, http, {
- immediate: false,
- })
+ return http.post("login", data)
}
export function logout() {
return http.get("logout")
}
-export function getUserInfo(username: string) {
- return useAxios("profile", { params: { username } }, http, {
- immediate: false,
- })
+export function getProfile(username: string = "") {
+ return http.get("profile", { params: { username } })
}
diff --git a/src/shared/store/user.ts b/src/shared/store/user.ts
index d12e804..7955aa1 100644
--- a/src/shared/store/user.ts
+++ b/src/shared/store/user.ts
@@ -1,9 +1,10 @@
import { PROBLEM_PERMISSION, STORAGE_KEY, USER_TYPE } from "utils/constants"
import storage from "utils/storage"
-import { getUserInfo } from "../api"
+import { getProfile } from "../api"
export const useUserStore = defineStore("user", () => {
- const { data: profile, isFinished, execute } = getUserInfo("")
+ const profile = ref()
+ const [isFinished] = useToggle(false)
const user = computed(() => profile?.value?.user ?? {})
const isAuthed = computed(() => !!user.value.email)
const isAdminRole = computed(
@@ -19,7 +20,10 @@ export const useUserStore = defineStore("user", () => {
)
async function getMyProfile() {
- await execute()
+ isFinished.value = false
+ const res = await getProfile()
+ profile.value = res.data
+ isFinished.value = true
storage.set(STORAGE_KEY.AUTHED, !!user.value.email)
}
diff --git a/src/utils/types.ts b/src/utils/types.ts
index b299325..ccdee53 100644
--- a/src/utils/types.ts
+++ b/src/utils/types.ts
@@ -1,3 +1,49 @@
+export interface Profile {
+ id: number
+ user: User
+ real_name: string
+ acm_problems_status: {
+ problems: {
+ [key: string]: {
+ _id: string
+ status: number
+ }
+ }
+ }
+ oi_problems_status: {
+ problems: {
+ [key: string]: {
+ _id: string
+ score: number
+ status: number
+ }
+ }
+ }
+ avatar: string
+ blog: null
+ mood: string
+ github: string
+ school: string
+ major: string
+ language: string
+ accepted_number: number
+ total_score: number
+ submission_number: number
+}
+
+export interface User {
+ id: number
+ username: string
+ email: string
+ admin_type: string
+ problem_permission: string
+ create_time: Date
+ last_login: Date
+ two_factor_auth: boolean
+ open_api: boolean
+ is_disabled: boolean
+}
+
export type LANGUAGE =
| "C"
| "C++"
diff --git a/vite.config.ts b/vite.config.ts
index 2373218..6811732 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -7,8 +7,7 @@ import { NaiveUiResolver } from "unplugin-vue-components/resolvers"
import IconsResolver from "unplugin-icons/resolver"
import Icons from "unplugin-icons/vite"
import Markdown from "vite-plugin-vue-markdown"
-import Highlight from "markdown-it-highlightjs"
-import c from "highlight.js/lib/languages/c"
+import Shiki from "markdown-it-shiki"
const url = "https://ojtest.hyyz.izhai.net"
const proxyConfig = {
@@ -56,9 +55,11 @@ export default defineConfig({
Icons({ autoInstall: true }),
Markdown({
markdownItSetup(md) {
- md.use(Highlight, {
- register: {
- c,
+ md.use(Shiki, {
+ highlightLines: true,
+ theme: {
+ dark: "vitesse-dark",
+ light: "vitesse-light",
},
})
},