From e306e6b4630ac43e66676c90038eb98b48fcf238 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 8 Jan 2023 14:42:54 +0800 Subject: [PATCH] refactor axios. --- package-lock.json | 99 +++++++++++++++++++ package.json | 1 + src/main.ts | 8 ++ src/oj/api.ts | 27 +++-- src/oj/components/header.vue | 4 +- src/oj/problem/components/editor.vue | 48 ++++++--- src/oj/problem/components/problem-content.vue | 4 +- src/oj/problem/components/problem-info.vue | 18 ++-- src/oj/problem/detail.vue | 32 ++---- src/oj/problem/list.vue | 23 ++--- src/shared/api.ts | 9 +- src/shared/stores/user.ts | 12 +-- src/shared/user/login.vue | 39 +++----- src/utils/constants.ts | 2 - src/utils/functions.ts | 6 ++ src/utils/types.ts | 51 ++++++++++ 16 files changed, 270 insertions(+), 113 deletions(-) create mode 100644 src/utils/types.ts diff --git a/package-lock.json b/package-lock.json index 2e4351b..e65b6a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@element-plus/icons-vue": "^2.0.10", "@monaco-editor/loader": "^1.3.2", "@vueuse/core": "^9.10.0", + "@vueuse/integrations": "^9.10.0", "axios": "^1.2.2", "element-plus": "^2.2.28", "normalize.css": "^8.0.1", @@ -778,6 +779,86 @@ } } }, + "node_modules/@vueuse/integrations": { + "version": "9.10.0", + "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-9.10.0.tgz", + "integrity": "sha512-MLGVbN3i9gRq3pb8VRZXgPvbNJcUUvgR5pmbc1QZj4Z1vvsvxam159AwWEJdyX2I39a1E7EkmBujtiXtVckO5g==", + "dependencies": { + "@vueuse/core": "9.10.0", + "@vueuse/shared": "9.10.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.10.0", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.10.0.tgz", @@ -2639,6 +2720,24 @@ } } }, + "@vueuse/integrations": { + "version": "9.10.0", + "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-9.10.0.tgz", + "integrity": "sha512-MLGVbN3i9gRq3pb8VRZXgPvbNJcUUvgR5pmbc1QZj4Z1vvsvxam159AwWEJdyX2I39a1E7EkmBujtiXtVckO5g==", + "requires": { + "@vueuse/core": "9.10.0", + "@vueuse/shared": "9.10.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/metadata": { "version": "9.10.0", "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.10.0.tgz", diff --git a/package.json b/package.json index 9ef762a..1bdb5fd 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@element-plus/icons-vue": "^2.0.10", "@monaco-editor/loader": "^1.3.2", "@vueuse/core": "^9.10.0", + "@vueuse/integrations": "^9.10.0", "axios": "^1.2.2", "element-plus": "^2.2.28", "normalize.css": "^8.0.1", diff --git a/src/main.ts b/src/main.ts index a1c46e4..c9833f2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -21,6 +21,7 @@ const routes = [ { path: "problem/:problemID", component: () => import("./oj/problem/detail.vue"), + props: true, }, { path: "status", @@ -30,6 +31,7 @@ const routes = [ { path: "status/:statusID", component: () => import("./oj/status/detail.vue"), + props: true, }, { path: "contest", @@ -39,6 +41,12 @@ const routes = [ { path: "contest/:contestID", component: () => import("./oj/contest/detail.vue"), + props: true, + }, + { + path: "contest/:contestID/problem/:problemID", + component: () => import("./oj/problem/detail.vue"), + props: true, }, { path: "rank", diff --git a/src/oj/api.ts b/src/oj/api.ts index 81cc39c..b5aa610 100644 --- a/src/oj/api.ts +++ b/src/oj/api.ts @@ -1,12 +1,14 @@ import { getACRate } from "./../utils/functions" import { DIFFICULTY } from "./../utils/constants" +import { Problem, LANGUAGE } from "./../utils/types" import http from "./../utils/http" +import { useAxios } from "@vueuse/integrations/useAxios" -function filterResult(result: any) { +function filterResult(result: Problem) { const newResult: any = { - displayID: result._id, + _id: result._id, title: result.title, - difficulty: DIFFICULTY[<"Low" | "Mid" | "High">result.difficulty], + difficulty: DIFFICULTY[result.difficulty], tags: result.tags, submission: result.submission_number, rate: getACRate(result.accepted_number, result.submission_number), @@ -46,7 +48,7 @@ export async function getProblemList( } export function getProblemTagList() { - return http.get("problem/tags") + return useAxios<{ id: number; name: string }[]>("problem/tags", http) } export function getRandomProblemID() { @@ -54,11 +56,20 @@ export function getRandomProblemID() { } export function getProblem(id: string) { - return http.get("problem", { - params: { problem_id: id }, + return useAxios("problem", { params: { problem_id: id } }, http) +} + +export function getSubmission(id: string) { + return http.get("submission", { + params: { id }, }) } -export function getWebsite() { - return http.get("website") +export function submitCode(data: { + problem_id: number + contest_id?: number + language: LANGUAGE + code: string +}) { + return http.post("submission", data) } diff --git a/src/oj/components/header.vue b/src/oj/components/header.vue index 7c84dd8..a8ee7da 100644 --- a/src/oj/components/header.vue +++ b/src/oj/components/header.vue @@ -35,11 +35,11 @@ onMounted(userStore.getMyProfile) 提交 排名 -
+
登录 注册
-
+
{{ userStore.user.username }}