1 Commits

Author SHA1 Message Date
603e81853d fix: 退出登录后在受保护页面跳转到配方查询页面
Some checks failed
Test / unit-test (push) Successful in 4s
PR Preview / teardown-preview (pull_request) Has been skipped
Test / build-check (push) Successful in 3s
Test / e2e-test (push) Failing after 1m7s
PR Preview / test (pull_request) Successful in 7s
PR Preview / deploy-preview (pull_request) Successful in 14s
在 router/index.js 中为需要登录才能访问的路由(manage、inventory、
projects、mydiary、audit、bugs、users)添加 meta.requiresAuth 标记。

在 UserMenu.vue 的 handleLogout() 中检查当前路由是否需要登录,
如果是则 router.push('/') 跳回配方查询页,否则原地 reload。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 19:38:06 +00:00
3 changed files with 17 additions and 7 deletions

View File

@@ -350,7 +350,6 @@ import { useUiStore } from '../stores/ui'
import { useDiaryStore } from '../stores/diary' import { useDiaryStore } from '../stores/diary'
import { api } from '../composables/useApi' import { api } from '../composables/useApi'
import { oilEn, recipeNameEn } from '../composables/useOilTranslation' import { oilEn, recipeNameEn } from '../composables/useOilTranslation'
import { showPrompt } from '../composables/useDialog'
// TagPicker replaced with inline tag editing // TagPicker replaced with inline tag editing
const props = defineProps({ const props = defineProps({
@@ -577,16 +576,16 @@ async function saveToDiary() {
ui.openLogin() ui.openLogin()
return return
} }
const name = await showPrompt('保存为我的配方,名称:', recipe.value.name) const name = prompt('保存为我的配方,名称:', recipe.value.name)
if (!name) return if (!name) return
try { try {
await recipesStore.saveRecipe({ await api.post('/api/diary', {
name, name,
source_recipe_id: recipe.value._id || null,
ingredients: recipe.value.ingredients.map(i => ({ oil: i.oil, drops: i.drops })),
note: recipe.value.note || '', note: recipe.value.note || '',
ingredients: recipe.value.ingredients.map(i => ({ oil_name: i.oil, drops: i.drops })),
tags: recipe.value.tags || [],
}) })
ui.showToast('已保存到「我的配方」') ui.showToast('已保存到「我的配方日记」')
} catch (e) { } catch (e) {
ui.showToast('保存失败: ' + (e?.message || '未知错误')) ui.showToast('保存失败: ' + (e?.message || '未知错误'))
} }

View File

@@ -136,7 +136,11 @@ function handleLogout() {
auth.logout() auth.logout()
ui.showToast('已退出登录') ui.showToast('已退出登录')
emit('close') emit('close')
window.location.reload() if (router.currentRoute.value.meta.requiresAuth) {
router.push('/')
} else {
window.location.reload()
}
} }
onMounted(loadNotifications) onMounted(loadNotifications)

View File

@@ -10,11 +10,13 @@ const routes = [
path: '/manage', path: '/manage',
name: 'RecipeManager', name: 'RecipeManager',
component: () => import('../views/RecipeManager.vue'), component: () => import('../views/RecipeManager.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/inventory', path: '/inventory',
name: 'Inventory', name: 'Inventory',
component: () => import('../views/Inventory.vue'), component: () => import('../views/Inventory.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/oils', path: '/oils',
@@ -25,26 +27,31 @@ const routes = [
path: '/projects', path: '/projects',
name: 'Projects', name: 'Projects',
component: () => import('../views/Projects.vue'), component: () => import('../views/Projects.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/mydiary', path: '/mydiary',
name: 'MyDiary', name: 'MyDiary',
component: () => import('../views/MyDiary.vue'), component: () => import('../views/MyDiary.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/audit', path: '/audit',
name: 'AuditLog', name: 'AuditLog',
component: () => import('../views/AuditLog.vue'), component: () => import('../views/AuditLog.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/bugs', path: '/bugs',
name: 'BugTracker', name: 'BugTracker',
component: () => import('../views/BugTracker.vue'), component: () => import('../views/BugTracker.vue'),
meta: { requiresAuth: true },
}, },
{ {
path: '/users', path: '/users',
name: 'UserManagement', name: 'UserManagement',
component: () => import('../views/UserManagement.vue'), component: () => import('../views/UserManagement.vue'),
meta: { requiresAuth: true },
}, },
] ]