diff --git a/package-lock.json b/package-lock.json
index ced8913..cb713b6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,6 +12,7 @@
"@monaco-editor/loader": "^1.3.2",
"@vueuse/core": "^9.11.1",
"axios": "1.2.3",
+ "chart.js": "^4.2.0",
"copy-text-to-clipboard": "^3.0.1",
"date-fns": "^2.29.3",
"highlight.js": "^11.7.0",
@@ -19,6 +20,7 @@
"party-js": "^2.2.0",
"pinia": "^2.0.29",
"vue": "^3.2.45",
+ "vue-chartjs": "^5.2.0",
"vue-router": "^4.1.6"
},
"devDependencies": {
@@ -485,6 +487,11 @@
"resolved": "https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
"integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
},
+ "node_modules/@kurkle/color": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
+ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+ },
"node_modules/@mdit-vue/plugin-component": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/@mdit-vue/plugin-component/-/plugin-component-0.11.2.tgz",
@@ -1008,6 +1015,17 @@
"node": ">=8"
}
},
+ "node_modules/chart.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.2.0.tgz",
+ "integrity": "sha512-wbtcV+QKeH0F7gQZaCJEIpsNriFheacouJQTVIjITi3eQA8bTlIBoknz0+dgV79aeKLNMAX+nDslIVE/nJ3rzA==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": "^7.0.0"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
@@ -2491,6 +2509,15 @@
"@vue/shared": "3.2.45"
}
},
+ "node_modules/vue-chartjs": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/vue-chartjs/-/vue-chartjs-5.2.0.tgz",
+ "integrity": "sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==",
+ "peerDependencies": {
+ "chart.js": "^4.1.1",
+ "vue": "^3.0.0-0 || ^2.7.0"
+ }
+ },
"node_modules/vue-router": {
"version": "4.1.6",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz",
@@ -2824,6 +2851,11 @@
"resolved": "https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
"integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
},
+ "@kurkle/color": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.2.tgz",
+ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+ },
"@mdit-vue/plugin-component": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/@mdit-vue/plugin-component/-/plugin-component-0.11.2.tgz",
@@ -3275,6 +3307,14 @@
"fill-range": "^7.0.1"
}
},
+ "chart.js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.2.0.tgz",
+ "integrity": "sha512-wbtcV+QKeH0F7gQZaCJEIpsNriFheacouJQTVIjITi3eQA8bTlIBoknz0+dgV79aeKLNMAX+nDslIVE/nJ3rzA==",
+ "requires": {
+ "@kurkle/color": "^0.3.0"
+ }
+ },
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
@@ -4375,6 +4415,12 @@
"@vue/shared": "3.2.45"
}
},
+ "vue-chartjs": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/vue-chartjs/-/vue-chartjs-5.2.0.tgz",
+ "integrity": "sha512-d3zpKmGZr2OWHQ1xmxBcAn5ShTG917+/UCLaSpaCDDqT0U7DBsvFzTs69ZnHCgKoXT55GZDW8YEj9Av+dlONLA==",
+ "requires": {}
+ },
"vue-router": {
"version": "4.1.6",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz",
diff --git a/package.json b/package.json
index d772915..a49332b 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"@monaco-editor/loader": "^1.3.2",
"@vueuse/core": "^9.11.1",
"axios": "1.2.3",
+ "chart.js": "^4.2.0",
"copy-text-to-clipboard": "^3.0.1",
"date-fns": "^2.29.3",
"highlight.js": "^11.7.0",
@@ -21,6 +22,7 @@
"party-js": "^2.2.0",
"pinia": "^2.0.29",
"vue": "^3.2.45",
+ "vue-chartjs": "^5.2.0",
"vue-router": "^4.1.6"
},
"devDependencies": {
diff --git a/src/learn/index.vue b/src/learn/index.vue
index ea9c58d..eccbfe3 100644
--- a/src/learn/index.vue
+++ b/src/learn/index.vue
@@ -1,32 +1,72 @@
-
-
-
-
- 上一步
- 下一步
-
+
+
+
+
+
+
+ 上一步
+
+
+ 下一步
+
+
+
-
+
+ 运行
+
+
diff --git a/src/learn/step-1/index.md b/src/learn/step-1/index.md
index f8f1878..bb5f29f 100644
--- a/src/learn/step-1/index.md
+++ b/src/learn/step-1/index.md
@@ -13,3 +13,99 @@ int main() {
```
123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
+
+# 11
+
+## 1
+
+哈哈
+
+```c {3-4}
+#include
+
+int main() {
+ return 0;
+}
+```
+
+123
diff --git a/src/learn/step-1/1.c b/src/learn/step-1/main.c
similarity index 100%
rename from src/learn/step-1/1.c
rename to src/learn/step-1/main.c
diff --git a/src/learn/step-2/index.md b/src/learn/step-2/index.md
new file mode 100644
index 0000000..e11ff4f
--- /dev/null
+++ b/src/learn/step-2/index.md
@@ -0,0 +1 @@
+asas
diff --git a/src/learn/step-2/main.c b/src/learn/step-2/main.c
new file mode 100644
index 0000000..b3a6166
--- /dev/null
+++ b/src/learn/step-2/main.c
@@ -0,0 +1 @@
+1212121212
\ No newline at end of file
diff --git a/src/learn/step-3/index.md b/src/learn/step-3/index.md
new file mode 100644
index 0000000..e69de29
diff --git a/src/learn/step-3/main.c b/src/learn/step-3/main.c
new file mode 100644
index 0000000..e69de29
diff --git a/src/main.ts b/src/main.ts
index eb5e525..f814db1 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -8,7 +8,19 @@ import { routes } from "./routes"
import App from "./App.vue"
import { toggleLogin } from "./shared/composables/modal"
-import { init } from "./shared/composables/monaco"
+import { init as monacoInit } from "./shared/composables/monaco"
+
+import {
+ Chart as ChartJS,
+ Title,
+ Colors,
+ Tooltip,
+ Legend,
+ BarElement,
+ ArcElement,
+ CategoryScale,
+ LinearScale,
+} from "chart.js"
const router = createRouter({
history: createWebHistory(),
@@ -26,7 +38,19 @@ router.beforeEach((to, from, next) => {
next()
}
})
-init()
+
+monacoInit()
+
+ChartJS.register(
+ CategoryScale,
+ LinearScale,
+ BarElement,
+ ArcElement,
+ Colors,
+ Title,
+ Tooltip,
+ Legend
+)
const pinia = createPinia()
const app = createApp(App)
app.use(router)
diff --git a/src/oj/problem/components/ProblemInfo.vue b/src/oj/problem/components/ProblemInfo.vue
index 8bc9144..fddf8ee 100644
--- a/src/oj/problem/components/ProblemInfo.vue
+++ b/src/oj/problem/components/ProblemInfo.vue
@@ -1,5 +1,6 @@
@@ -49,4 +73,14 @@ defineProps()
+
+
diff --git a/src/oj/rank/components/Chart.vue b/src/oj/rank/components/Chart.vue
new file mode 100644
index 0000000..879b4d7
--- /dev/null
+++ b/src/oj/rank/components/Chart.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
diff --git a/src/oj/rank/list.vue b/src/oj/rank/list.vue
index 4d18e77..62c89e4 100644
--- a/src/oj/rank/list.vue
+++ b/src/oj/rank/list.vue
@@ -1,5 +1,6 @@
+
import("~/shared/layout/default.vue"),
@@ -41,7 +43,12 @@ export const routes = [
},
{
path: "learn",
+ redirect: "learn/step-1",
+ },
+ {
+ path: "learn/:step+",
component: () => import("learn/index.vue"),
+ name: "learn",
},
],
},
diff --git a/src/shared/Header.vue b/src/shared/Header.vue
index 773980b..00d67df 100644
--- a/src/shared/Header.vue
+++ b/src/shared/Header.vue
@@ -36,7 +36,7 @@ const defaultValue = computed(() => route.path.split("/")[1] || "problem")
const menus: MenuOption[] = [
{
label: () =>
- h(RouterLink, { to: "/learn#step-1" }, { default: () => "自学" }),
+ h(RouterLink, { to: "/learn/step-1" }, { default: () => "自学" }),
key: "learn",
},
{
diff --git a/src/utils/types.ts b/src/utils/types.ts
index 43b33cd..84375e8 100644
--- a/src/utils/types.ts
+++ b/src/utils/types.ts
@@ -96,7 +96,7 @@ export interface Problem {
total_score: number
submission_number: number
accepted_number: number
- statistic_info: {}
+ statistic_info: { [key in string]: number }
share_submission: boolean
contest: null
my_status: number