From f35baf4a67a120f9935f251fd91cef7568baeaf1 Mon Sep 17 00:00:00 2001 From: Mplan Date: Fri, 22 May 2026 00:09:00 +0800 Subject: [PATCH] feat: add fallback pages and refine page interactions --- package-lock.json | 58 +++++++++++++++++++++ package.json | 2 + src/router/index.ts | 12 ++++- src/views/encyclopedia/EncyclopediaView.vue | 17 ++++-- src/views/gallery/GalleryView.vue | 25 +++++++-- src/views/map/MapView.vue | 17 +++++- src/views/system/ForbiddenView.vue | 26 +++++++++ src/views/system/NotFoundView.vue | 26 +++++++++ src/views/upload/UploadView.vue | 8 +-- 9 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 src/views/system/ForbiddenView.vue create mode 100644 src/views/system/NotFoundView.vue diff --git a/package-lock.json b/package-lock.json index 979bc86..770cafc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,8 @@ "devDependencies": { "@tailwindcss/vite": "^4.3.0", "@types/node": "^24.12.3", + "@vicons/tabler": "^0.13.0", + "@vicons/utils": "^0.1.4", "@vitejs/plugin-vue": "^6.0.6", "@vue/tsconfig": "^0.9.1", "tailwindcss": "^4.3.0", @@ -971,6 +973,26 @@ "undici-types": "~7.16.0" } }, + "node_modules/@vicons/tabler": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@vicons/tabler/-/tabler-0.13.0.tgz", + "integrity": "sha512-AykuhiqjszkIoAL/7knIFm6RDOBS1ZmQdJfQ+RNLEah0fVsxykUFCfMBSNZh8lOzC85EtdD1k5g/sv5GYk0Ohg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vicons/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/@vicons/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-OHI19qVNN6i+uPQ+Y3f2s0dUxwsYnOCcKBW7XOU4yXXO1aU3ZoKpblCc3+4N0qmgoJs5rWKRAaMisipqEXJwAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xicons/utils": "^0.1.4" + }, + "peerDependencies": { + "vue": "^3.0.6" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "6.0.7", "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.7.tgz", @@ -1212,6 +1234,42 @@ } } }, + "node_modules/@xicons/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/@xicons/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-uXxKDLz9abr80yJC05XSTq6wlyFcdW+N/1IYJkeHjzzXVc4VQ0sEYMoMMTjAH7HQBOyOkzOB4pf5NGF72lwa8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-render": "^0.13.2" + } + }, + "node_modules/@xicons/utils/node_modules/@types/node": { + "version": "14.14.45", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-14.14.45.tgz", + "integrity": "sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@xicons/utils/node_modules/css-render": { + "version": "0.13.9", + "resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.13.9.tgz", + "integrity": "sha512-n3C4ZH59rveBrUlAD7n0Ze9/gUMKa4dlH1C9CWKpGcIHR/xRcIVXzBGy1iw8WWq2ySmn2/ZqOpySQNAK5Pb6sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emotion/hash": "~0.8.0", + "@types/node": "~14.14.31", + "csstype": "~3.0.5" + } + }, + "node_modules/@xicons/utils/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "dev": true, + "license": "MIT" + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", diff --git a/package.json b/package.json index 3519cfc..025e2e6 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "devDependencies": { "@tailwindcss/vite": "^4.3.0", "@types/node": "^24.12.3", + "@vicons/tabler": "^0.13.0", + "@vicons/utils": "^0.1.4", "@vitejs/plugin-vue": "^6.0.6", "@vue/tsconfig": "^0.9.1", "tailwindcss": "^4.3.0", diff --git a/src/router/index.ts b/src/router/index.ts index 68b33bf..c4aad45 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -62,6 +62,16 @@ const router = createRouter({ component: () => import('@/views/admin/AdminView.vue'), meta: { requiresAuth: true, requiresAdmin: true }, }, + { + path: '/403', + name: 'forbidden', + component: () => import('@/views/system/ForbiddenView.vue'), + }, + { + path: '/:pathMatch(.*)*', + name: 'not-found', + component: () => import('@/views/system/NotFoundView.vue'), + }, ], scrollBehavior() { return { top: 0 } @@ -74,7 +84,7 @@ router.beforeEach((to, _from, next) => { if (to.meta.requiresAuth && !authStore.isLoggedIn) { next({ name: 'login', query: { redirect: to.fullPath } }) } else if (to.meta.requiresAdmin && !authStore.isAdmin) { - next({ name: 'map' }) + next({ name: 'forbidden' }) } else if ((to.name === 'login' || to.name === 'register') && authStore.isLoggedIn) { next({ name: 'map' }) } else { diff --git a/src/views/encyclopedia/EncyclopediaView.vue b/src/views/encyclopedia/EncyclopediaView.vue index 11f66a9..c4c71e2 100644 --- a/src/views/encyclopedia/EncyclopediaView.vue +++ b/src/views/encyclopedia/EncyclopediaView.vue @@ -1,9 +1,10 @@ + + diff --git a/src/views/system/NotFoundView.vue b/src/views/system/NotFoundView.vue new file mode 100644 index 0000000..0c6615a --- /dev/null +++ b/src/views/system/NotFoundView.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/views/upload/UploadView.vue b/src/views/upload/UploadView.vue index 7192545..5b2ea5f 100644 --- a/src/views/upload/UploadView.vue +++ b/src/views/upload/UploadView.vue @@ -447,7 +447,7 @@ onUnmounted(() => { @@ -517,7 +517,7 @@ onUnmounted(() => { -

选填,可手动输入,或点击右侧小地图图标选点

+

选填,可手动输入,或点击右侧小地图图标选择

@@ -545,7 +545,7 @@ onUnmounted(() => {
- +
@@ -553,7 +553,7 @@ onUnmounted(() => {
-

共 {{ items.length }} 张图片,类别和拍摄时间为必填项

+

共 {{ items.length }} 张图片

清空