From ff1eb2982e4467a87ac6d391fecaf8eaa246b68d Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 26 Oct 2026 23:39:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E7=89=88=E9=98=B6=E6=AE=B5=20?= =?UTF-8?q?1=EF=BC=9A=E7=BB=9F=E4=B8=80=E9=A1=B6=E6=A0=8F=E5=92=8C?= =?UTF-8?q?=E6=95=99=E5=AD=A6=E4=BE=A7=E6=A0=8F=E3=80=81=E9=85=8D=E8=89=B2?= =?UTF-8?q?=E5=92=8C=E5=9B=BE=E6=A0=87=E8=A7=84=E8=8C=83=E3=80=81=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E8=A7=92=E8=89=B2=E5=AE=88=E5=8D=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 所有页面共用顶栏(教程 / 挑战 / 自由创作 / 作品展,右边“教学”和用户菜单); 没登录时顶栏有“登录”按钮,关掉登录框不再白屏;/submission/:id 全屏页不带顶栏 - 后台改成“教学”侧栏,分出题 / 班级 / 管理三组;“全部提交”留在侧栏里打开; admin 也能进作品展管理(后端本来就允许) - 路由按角色守卫:meta.role 为 staff / super,学生和 admin 进不了无权页面 - 配色只在 theme.ts 定义,同时生成 --wp-* CSS 变量和 Naive UI 主题,暗色值先定好 - 图标改用打包进来的 lucide(断网也能显示),去掉 @iconify/vue 和 PUBLIC_ICONIFY_URL; 代码字体换成打包的 JetBrains Mono,编辑器默认字号 24 → 16 - 教程面板去掉和顶栏重复的切换和图标按钮,图标按钮都补上文字或提示 Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 5 +- bun.lock | 27 +-- client/.env.production | 1 - client/.env.staging | 1 - client/index.html | 1 - client/package.json | 3 +- client/public/Monaco.ttf | Bin 48116 -> 0 bytes client/public/style.css | 4 - client/src/App.vue | 33 +-- client/src/components/ai/GuidancePanel.vue | 6 +- .../src/components/ai/PromptHistoryPanel.vue | 4 +- client/src/components/ai/PromptPanel.vue | 6 +- client/src/components/editor/Editor.vue | 14 +- client/src/components/editor/Editors.vue | 71 ++++--- client/src/components/editor/Preview.vue | 2 +- client/src/components/editor/Toolbar.vue | 99 +-------- client/src/components/layout/AppShell.vue | 200 ++++++++++++++++++ .../src/components/submissions/ChainModal.vue | 2 +- .../src/components/task/TaskAssetManager.vue | 2 +- client/src/components/task/TaskPanel.vue | 141 +++++------- client/src/components/task/TaskStatsModal.vue | 2 +- .../src/components/task/TutorialContent.vue | 6 +- client/src/env.d.ts | 1 - client/src/global.css | 25 ++- client/src/icons.ts | 99 +++++++++ client/src/main.ts | 11 +- client/src/pages/ChallengeDetail.vue | 56 ++--- client/src/pages/ChallengeEditor.vue | 12 +- client/src/pages/CreationDetail.vue | 15 +- client/src/pages/CreationHome.vue | 9 +- client/src/pages/Dashboard.vue | 187 +++++++++------- client/src/pages/Gradebook.vue | 2 +- client/src/pages/Showcase.vue | 2 +- client/src/pages/ShowcaseManage.vue | 6 +- client/src/pages/Submissions.vue | 2 +- client/src/pages/TutorialEditor.vue | 12 +- client/src/pages/UserManage.vue | 2 +- client/src/router.ts | 44 +++- client/src/store/editors.ts | 2 +- client/src/store/session.ts | 31 +++ client/src/store/user.ts | 2 + client/src/theme.ts | 113 ++++++++++ client/src/utils/const.ts | 3 +- 43 files changed, 837 insertions(+), 429 deletions(-) delete mode 100644 client/public/Monaco.ttf delete mode 100644 client/public/style.css create mode 100644 client/src/components/layout/AppShell.vue create mode 100644 client/src/icons.ts create mode 100644 client/src/store/session.ts create mode 100644 client/src/theme.ts diff --git a/CLAUDE.md b/CLAUDE.md index f3f197e..c5ece64 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -26,7 +26,10 @@ The backend was rewritten from Django in 2026-10 to cut memory use (~25 MB vs. 1 - UI framework: **Naive UI** (auto-imported via `unplugin-vue-components`) - `src/token.ts` — tokens in localStorage; refreshes the access token shortly before expiry (one request at a time) and builds WebSocket URLs - `src/api.ts` — Axios-based API client; adds the Bearer header, on 401 refreshes once and retries, otherwise clears login and goes home; 403 alerts and goes home - - `src/router.ts` — Vue Router with auth guards + - `src/router.ts` — Vue Router; `meta.auth` needs login, `meta.role` (`staff` = admin+super, `super`) is checked in the guard after `store/session.loadUser()`, `meta.bare` pages render without the top bar + - `src/theme.ts` — the only place colors are defined: one palette (light + dark values) becomes both `--wp-*` CSS variables and Naive UI `themeOverrides`; use `var(--wp-...)` in styles, never hard-coded colors. No `color-mix()` (Chrome 105) + - `src/icons.ts` — `` renders bundled `lucide-vue-next` icons (works offline); register new names in its map. Fonts are bundled too (`@fontsource/jetbrains-mono`) + - `components/layout/AppShell.vue` — top bar for every page; `pages/Dashboard.vue` is the teaching sidebar (“教学”) under `/dashboard` - `src/store/` — Reactive state (plain Vue refs, not Vuex/Pinia); `prompt.ts` / `guidance.ts` own the WebSockets - `src/pages/`, `src/components/` — user management uses `components/dashboard/UserFormModal.vue` (there is no Django Admin anymore) diff --git a/bun.lock b/bun.lock index e9c361b..f110987 100644 --- a/bun.lock +++ b/bun.lock @@ -13,12 +13,14 @@ "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/view": "^6.41.1", + "@fontsource/jetbrains-mono": "^5.3.0", "@vueuse/core": "^15.0.0", "axios": "^1.20.0", "codemirror": "^6.0.2", "copy-text-to-clipboard": "^3.2.2", "github-markdown-css": "^5.9.0", "highlight.js": "^11.12.0", + "lucide-vue-next": "^1.0.0", "marked": "^18.1.1", "marked-alert": "^2.1.2", "marked-code-preview": "^1.3.7", @@ -30,7 +32,6 @@ "vue-router": "^5.4.0", }, "devDependencies": { - "@iconify/vue": "^5.0.4", "@vitejs/plugin-legacy": "^8.2.3", "@vitejs/plugin-vue": "^6.0.10", "@vue/tsconfig": "^0.9.1", @@ -302,9 +303,7 @@ "@emotion/hash": ["@emotion/hash@0.8.0", "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz", {}, "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="], - "@iconify/types": ["@iconify/types@2.0.0", "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], - - "@iconify/vue": ["@iconify/vue@5.0.4", "https://registry.npmjs.com/@iconify/vue/-/vue-5.0.4.tgz", { "dependencies": { "@iconify/types": "^2.0.0" }, "peerDependencies": { "vue": ">=3.0.0" } }, "sha512-9yP5PjOv5G9vStHfyPtQ69Ay1CSNAC3AZTRDJ4LX3UMX7nEH0GO8OKhc3qhcrXp1KS2GnlLufGbFCwD+U4Fi5A=="], + "@fontsource/jetbrains-mono": ["@fontsource/jetbrains-mono@5.3.0", "https://registry.npmjs.com/@fontsource/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", {}, "sha512-fqDfB5I9f1p1TV486aUgB9t8zP84P0O1FtQR5Ol9vjwPy+S+EIGlVYm1cvj2W5shcZMTg2nZFdVMoH5wFu8a1A=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -460,11 +459,11 @@ "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.10", "https://registry.npmjs.com/@vitejs/plugin-vue/-/plugin-vue-6.0.10.tgz", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25 || ^3.6.0-rc.10" } }, "sha512-b80aUQh3n+qEzzZm5oQp3rT2QImeCx58K6eFl/RkJ3d65KW0kTuv5lNsLRVAjbW9YRUpo/wzmvzMgV34bTAItA=="], - "@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], + "@volar/language-core": ["@volar/language-core@2.4.28", "https://registry.npmjs.com/@volar/language-core/-/language-core-2.4.28.tgz", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], - "@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="], + "@volar/source-map": ["@volar/source-map@2.4.28", "https://registry.npmjs.com/@volar/source-map/-/source-map-2.4.28.tgz", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="], - "@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="], + "@volar/typescript": ["@volar/typescript@2.4.28", "https://registry.npmjs.com/@volar/typescript/-/typescript-2.4.28.tgz", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="], "@vue-macros/common": ["@vue-macros/common@3.1.4", "https://registry.npmjs.com/@vue-macros/common/-/common-3.1.4.tgz", { "dependencies": { "@vue/compiler-sfc": "^3.5.22", "ast-kit": "^2.1.2", "local-pkg": "^1.1.2", "magic-string-ast": "^1.0.2", "unplugin-utils": "^0.3.0" }, "peerDependencies": { "vue": "^2.7.0 || ^3.2.25" }, "optionalPeers": ["vue"] }, "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw=="], @@ -482,7 +481,7 @@ "@vue/devtools-shared": ["@vue/devtools-shared@8.2.1", "https://registry.npmjs.com/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", {}, "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g=="], - "@vue/language-core": ["@vue/language-core@3.3.13", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.2.1", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.4" } }, "sha512-axA0Xemn5LuUKuKWob0/kVq7xQ2mJJM6VqA9Exvt35nM9yRC31goWVve/G/Zb2ZCLsXC8FHYjjfXlnshknSCew=="], + "@vue/language-core": ["@vue/language-core@3.3.13", "https://registry.npmjs.com/@vue/language-core/-/language-core-3.3.13.tgz", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.2.1", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.4" } }, "sha512-axA0Xemn5LuUKuKWob0/kVq7xQ2mJJM6VqA9Exvt35nM9yRC31goWVve/G/Zb2ZCLsXC8FHYjjfXlnshknSCew=="], "@vue/reactivity": ["@vue/reactivity@3.5.44", "https://registry.npmjs.com/@vue/reactivity/-/reactivity-3.5.44.tgz", { "dependencies": { "@vue/shared": "3.5.44" } }, "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw=="], @@ -506,7 +505,7 @@ "agent-base": ["agent-base@6.0.2", "https://registry.npmjs.com/agent-base/-/agent-base-6.0.2.tgz", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], - "alien-signals": ["alien-signals@3.2.1", "", {}, "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g=="], + "alien-signals": ["alien-signals@3.2.1", "https://registry.npmjs.com/alien-signals/-/alien-signals-3.2.1.tgz", {}, "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g=="], "argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -684,6 +683,8 @@ "lru-cache": ["lru-cache@5.1.1", "https://registry.npmjs.com/lru-cache/-/lru-cache-5.1.1.tgz", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "lucide-vue-next": ["lucide-vue-next@1.0.0", "https://registry.npmjs.com/lucide-vue-next/-/lucide-vue-next-1.0.0.tgz", { "peerDependencies": { "vue": ">=3.0.1" } }, "sha512-V6SPvx1IHTj/UY+FrIYWV5faISsPSb8BnWSFDxAtezWKvWc9ZZ40PDrdu1/Qb5vg4lHWr1hs1BAMGVGm6V1Xdg=="], + "magic-string": ["magic-string@1.4.4", "https://registry.npmjs.com/magic-string/-/magic-string-1.4.4.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-jQz9sVhrZuphH4NrAIHSgkDJCluQO7Ioi4KGRLa7aTUjAODQ13hENX0YIytqYE/rIkO485gQG2LeBxJaW53kkQ=="], "magic-string-ast": ["magic-string-ast@1.0.3", "https://registry.npmjs.com/magic-string-ast/-/magic-string-ast-1.0.3.tgz", { "dependencies": { "magic-string": "^0.30.19" } }, "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA=="], @@ -736,7 +737,7 @@ "obug": ["obug@2.1.1", "https://registry.npmmirror.com/obug/-/obug-2.1.1.tgz", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + "path-browserify": ["path-browserify@1.0.1", "https://registry.npmjs.com/path-browserify/-/path-browserify-1.0.1.tgz", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], "path-parse": ["path-parse@1.0.7", "https://registry.npmjs.com/path-parse/-/path-parse-1.0.7.tgz", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -802,7 +803,7 @@ "treemate": ["treemate@0.3.11", "https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz", {}, "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typescript": ["typescript@5.9.3", "https://registry.npmjs.com/typescript/-/typescript-5.9.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "uc.micro": ["uc.micro@2.1.0", "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], @@ -832,7 +833,7 @@ "vooks": ["vooks@0.2.12", "https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz", { "dependencies": { "evtd": "^0.2.2" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q=="], - "vscode-uri": ["vscode-uri@3.2.0", "", {}, "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg=="], + "vscode-uri": ["vscode-uri@3.2.0", "https://registry.npmjs.com/vscode-uri/-/vscode-uri-3.2.0.tgz", {}, "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg=="], "vue": ["vue@3.5.44", "https://registry.npmjs.com/vue/-/vue-3.5.44.tgz", { "dependencies": { "@vue/compiler-dom": "3.5.44", "@vue/compiler-sfc": "3.5.44", "@vue/runtime-dom": "3.5.44", "@vue/server-renderer": "3.5.44", "@vue/shared": "3.5.44" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ=="], @@ -840,7 +841,7 @@ "vue-router": ["vue-router@5.4.0", "https://registry.npmjs.com/vue-router/-/vue-router-5.4.0.tgz", { "dependencies": { "@vue-macros/common": "^3.1.3", "@vue/devtools-api": "^8.1.5", "ast-walker-scope": "^0.10.0", "chokidar": "^5.0.0", "confbox": "^0.3.1", "local-pkg": "^1.2.1", "magic-string": "^1.4.3", "mlly": "^1.8.2", "muggle-string": "^0.4.1", "nostics": "^1.3.0", "pathe": "^2.0.3", "picomatch": "^4.0.7", "scule": "^1.3.0", "tinyglobby": "^0.2.17", "unplugin": "^3.4.0", "unplugin-utils": "^0.3.2" }, "peerDependencies": { "@pinia/colada": ">=0.21.2", "@vue/compiler-sfc": "^3.5.34 || ^4.0.0", "pinia": "^3.0.4 || ^4.0.2", "vite": "^7.3.0 || ^8.0.0", "vue": "^3.5.34 || ^4.0.0" }, "optionalPeers": ["@pinia/colada", "@vue/compiler-sfc", "pinia", "vite"] }, "sha512-pFvcYcxinDHjZUlf7AzFBrT8r8Xqvv4uMHoJnjc+EqPawXQvHTkF8S4tfSmQLpriVHUGfkaKlI7Et0KRjTMTdw=="], - "vue-tsc": ["vue-tsc@3.3.13", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.13" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" } }, "sha512-jE4/bXdOMSHVxEGgQCqNllJy+9N3Gx6tfSAsg0yhFK/MAN6eXqISihupnDEKSCt12VVnjN2gI3AqLYcqoh5x/A=="], + "vue-tsc": ["vue-tsc@3.3.13", "https://registry.npmjs.com/vue-tsc/-/vue-tsc-3.3.13.tgz", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.13" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "bin/vue-tsc.js" } }, "sha512-jE4/bXdOMSHVxEGgQCqNllJy+9N3Gx6tfSAsg0yhFK/MAN6eXqISihupnDEKSCt12VVnjN2gI3AqLYcqoh5x/A=="], "vueuc": ["vueuc@0.4.66", "https://registry.npmjs.com/vueuc/-/vueuc-0.4.66.tgz", { "dependencies": { "@css-render/vue3-ssr": "^0.15.10", "@juggle/resize-observer": "^3.3.1", "css-render": "^0.15.10", "evtd": "^0.2.4", "seemly": "^0.3.6", "vdirs": "^0.1.4", "vooks": "^0.2.4" }, "peerDependencies": { "vue": "^3.0.11" } }, "sha512-hHrZl+0AsrUvqYPBXSXQ2QaSrO3razjeUseLAhJWlOS/Hdfw/Y2MU05fOTP1qn1A3121gMxsHLaEz2V6CkWdTg=="], diff --git a/client/.env.production b/client/.env.production index 5e53276..458cc8b 100644 --- a/client/.env.production +++ b/client/.env.production @@ -1,3 +1,2 @@ PUBLIC_WEB_URL=https://web.xuyue.cc PUBLIC_BASE_URL=https://web.xuyue.cc/api -PUBLIC_ICONIFY_URL=https://icon.xuyue.cc \ No newline at end of file diff --git a/client/.env.staging b/client/.env.staging index e8ead97..bb52afe 100644 --- a/client/.env.staging +++ b/client/.env.staging @@ -1,3 +1,2 @@ PUBLIC_WEB_URL=http://10.13.114.114:91 PUBLIC_BASE_URL=http://10.13.114.114:91/api -PUBLIC_ICONIFY_URL=http://10.13.114.114:8098 \ No newline at end of file diff --git a/client/index.html b/client/index.html index 630c2d3..ceb375f 100644 --- a/client/index.html +++ b/client/index.html @@ -6,7 +6,6 @@ 前端开发学习平台 -
diff --git a/client/package.json b/client/package.json index 0a79835..aebd17d 100644 --- a/client/package.json +++ b/client/package.json @@ -15,12 +15,14 @@ "@codemirror/lang-html": "^6.4.12", "@codemirror/lang-javascript": "^6.2.5", "@codemirror/view": "^6.41.1", + "@fontsource/jetbrains-mono": "^5.3.0", "@vueuse/core": "^15.0.0", "axios": "^1.20.0", "codemirror": "^6.0.2", "copy-text-to-clipboard": "^3.2.2", "github-markdown-css": "^5.9.0", "highlight.js": "^11.12.0", + "lucide-vue-next": "^1.0.0", "marked": "^18.1.1", "marked-alert": "^2.1.2", "marked-code-preview": "^1.3.7", @@ -32,7 +34,6 @@ "vue-router": "^5.4.0" }, "devDependencies": { - "@iconify/vue": "^5.0.4", "@vitejs/plugin-legacy": "^8.2.3", "@vitejs/plugin-vue": "^6.0.10", "@vue/tsconfig": "^0.9.1", diff --git a/client/public/Monaco.ttf b/client/public/Monaco.ttf deleted file mode 100644 index c19946cb7c34be99a973b5d6d7748c29fa107841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48116 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

{_5u4p?N1)jV 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 import { dateZhCN, zhCN } from "naive-ui" -import type { GlobalThemeOverrides } from "naive-ui" import Login from "./components/Login.vue" +import AppShell from "./components/layout/AppShell.vue" import { onMounted } from "vue" -import { Account } from "./api" -import { user } from "./store/user" +import { useRoute } from "vue-router" +import { loadUser } from "./store/session" +import { light, naiveOverrides } from "./theme" import hljs from "highlight.js/lib/core" -const themeOverrides: GlobalThemeOverrides = { - common: { - borderRadius: "6px", - borderRadiusSmall: "4px", - }, - Card: { - borderRadius: "8px", - }, -} +const route = useRoute() +const themeOverrides = naiveOverrides(light) -onMounted(async () => { - try { - const data = await Account.getMyProfile() - user.loaded = true - user.username = data.username - user.role = data.role - } catch { - user.loaded = true - } -}) +onMounted(loadUser)