路由跳转
DVHA 框架提供了便捷的路由跳转功能,支持管理端内跳转、跨管理端跳转和路径生成等功能。
功能特点
- 🔗 智能路径生成 - 自动添加管理端前缀
- 🏗️ 管理端感知 - 自动识别当前管理端
- 🌐 跨管理端跳转 - 支持在不同管理端间跳转
- 📍 路径标准化 - 统一的路径处理逻辑
- 🔄 编程式导航 - 支持代码控制的路由跳转
- 📋 参数传递 - 支持路由参数和查询参数
基础路由跳转
使用 vue-router
vue
<template>
<!-- 声明式导航 -->
<router-link to="/admin/users">用户管理</router-link>
<!-- 编程式导航 -->
<button @click="goToUsers">跳转到用户管理</button>
</template>
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter()
const goToUsers = () => {
router.push('/admin/users')
}
</script>
使用 useManage 路径生成
vue
<template>
<!-- 使用自动生成的路径 -->
<router-link :to="manage.getRoutePath('users')">用户管理</router-link>
<button @click="goToUsers">跳转到用户管理</button>
</template>
<script setup>
import { useRouter } from 'vue-router'
import { useManage } from '@duxweb/dvha-core'
const router = useRouter()
const manage = useManage()
const goToUsers = () => {
// 自动添加当前管理端前缀
router.push(manage.getRoutePath('users'))
}
</script>
路径生成功能
getRoutePath 方法
useManage
hook 提供的 getRoutePath
方法可以自动生成带有管理端前缀的完整路径:
js
import { useManage } from '@duxweb/dvha-core'
const manage = useManage()
// 基础路径生成
manage.getRoutePath('users') // 返回: '/admin/users'
manage.getRoutePath('system/roles') // 返回: '/admin/system/roles'
// 带参数的路径
manage.getRoutePath('users/123') // 返回: '/admin/users/123'
// 绝对路径(不会添加前缀)
manage.getRoutePath('/external') // 返回: '/external'
// 空路径处理
manage.getRoutePath('') // 返回: '/admin'
manage.getRoutePath('/') // 返回: '/admin'
参数化路径
js
// 动态生成参数路径
const userId = 123
const userPath = manage.getRoutePath(`users/${userId}`) // '/admin/users/123'
// 带查询参数
const usersPath = manage.getRoutePath('users') + '?page=2&size=10'
// '/admin/users?page=2&size=10'
不同跳转方式
声明式导航
vue
<template>
<!-- 基础跳转 -->
<router-link :to="manage.getRoutePath('dashboard')">
仪表盘
</router-link>
<!-- 带参数跳转 -->
<router-link
:to="{
path: manage.getRoutePath('users'),
query: { page: 1, size: 20 }
}"
>
用户列表
</router-link>
<!-- 命名路由跳转 -->
<router-link
:to="{
name: 'admin.users',
params: { id: 123 }
}"
>
用户详情
</router-link>
</template>
<script setup>
import { useManage } from '@duxweb/dvha-core'
const manage = useManage()
</script>
编程式导航
js
import { useRouter } from 'vue-router'
import { useManage } from '@duxweb/dvha-core'
const router = useRouter()
const manage = useManage()
// push 方法(会保留历史记录)
const navigateToUsers = () => {
router.push(manage.getRoutePath('users'))
}
// replace 方法(替换当前记录)
const replaceToUsers = () => {
router.replace(manage.getRoutePath('users'))
}
// go 方法(历史记录导航)
const goBack = () => {
router.go(-1) // 后退一步
}
const goForward = () => {
router.go(1) // 前进一步
}
带参数的跳转
js
// 路径参数
const goToUserDetail = (userId) => {
router.push(manage.getRoutePath(`users/${userId}`))
}
// 查询参数
const goToUsersWithFilter = (filters) => {
router.push({
path: manage.getRoutePath('users'),
query: filters
})
}
// 命名路由 + 参数
const goToUserEdit = (userId) => {
router.push({
name: 'admin.users.edit',
params: { id: userId }
})
}
// 混合参数
const goToUserPage = (userId, page = 1) => {
router.push({
path: manage.getRoutePath(`users/${userId}`),
query: { page, tab: 'profile' }
})
}
跨管理端跳转
跳转到其他管理端
js
import { useRouter } from 'vue-router'
import { useManage } from '@duxweb/dvha-core'
const router = useRouter()
// 获取特定管理端的 manage 实例
const adminManage = useManage('admin')
const userManage = useManage('user')
// 跳转到其他管理端
const goToAdminDashboard = () => {
router.push(adminManage.getRoutePath('dashboard')) // '/admin/dashboard'
}
const goToUserProfile = () => {
router.push(userManage.getRoutePath('profile')) // '/user/profile'
}
管理端切换
js
// 从当前管理端跳转到另一个管理端
const switchToAdmin = () => {
const adminManage = useManage('admin')
router.push(adminManage.getRoutePath('')) // 跳转到 admin 管理端首页
}
const switchToUser = () => {
const userManage = useManage('user')
router.push(userManage.getRoutePath('')) // 跳转到 user 管理端首页
}
路由守卫中的跳转
认证检查跳转
js
// 在路由守卫中进行跳转
router.beforeEach((to, from, next) => {
const manageName = to.meta.manageName
const manage = useManage(manageName)
if (!isAuthenticated(manageName)) {
// 跳转到登录页
next(manage.getRoutePath('login'))
} else {
next()
}
})
权限检查跳转
js
router.beforeEach((to, from, next) => {
const manageName = to.meta.manageName
const manage = useManage(manageName)
if (!hasPermission(to.meta.permissions)) {
// 跳转到无权限页面
next(manage.getRoutePath('notAuthorized'))
} else {
next()
}
})
实际应用示例
用户管理页面
vue
<template>
<div class="user-management">
<!-- 面包屑导航 -->
<nav class="breadcrumb">
<router-link :to="manage.getRoutePath('')">首页</router-link>
<span> / </span>
<span>用户管理</span>
</nav>
<!-- 操作按钮 -->
<div class="actions">
<button @click="createUser">新建用户</button>
<button @click="exportUsers">导出用户</button>
</div>
<!-- 用户列表 -->
<div class="user-list">
<div
v-for="user in users"
:key="user.id"
class="user-item"
@click="viewUser(user.id)"
>
<span>{{ user.name }}</span>
<button @click.stop="editUser(user.id)">编辑</button>
<button @click.stop="deleteUser(user.id)">删除</button>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useManage } from '@duxweb/dvha-core'
const router = useRouter()
const manage = useManage()
const users = ref([])
// 新建用户
const createUser = () => {
router.push(manage.getRoutePath('users/create'))
}
// 查看用户详情
const viewUser = (userId) => {
router.push(manage.getRoutePath(`users/${userId}`))
}
// 编辑用户
const editUser = (userId) => {
router.push(manage.getRoutePath(`users/${userId}/edit`))
}
// 导出功能(新窗口打开)
const exportUsers = () => {
const exportUrl = manage.getRoutePath('users/export')
window.open(exportUrl, '_blank')
}
// 删除用户后的跳转
const deleteUser = async (userId) => {
if (confirm('确定删除此用户?')) {
await deleteUserApi(userId)
// 删除成功后刷新当前页面
router.go(0)
}
}
</script>
表单页面跳转
vue
<template>
<form @submit.prevent="handleSubmit">
<!-- 表单内容 -->
<div class="form-actions">
<button type="submit" :disabled="loading">
{{ isEdit ? '更新' : '创建' }}
</button>
<button type="button" @click="cancel">取消</button>
</div>
</form>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useManage } from '@duxweb/dvha-core'
const route = useRoute()
const router = useRouter()
const manage = useManage()
const loading = ref(false)
const isEdit = computed(() => !!route.params.id)
// 表单提交
const handleSubmit = async () => {
loading.value = true
try {
if (isEdit.value) {
await updateUser(route.params.id, formData)
} else {
await createUser(formData)
}
// 成功后跳转到列表页
router.push(manage.getRoutePath('users'))
} catch (error) {
console.error(error)
} finally {
loading.value = false
}
}
// 取消操作
const cancel = () => {
// 返回上一页或跳转到列表页
if (window.history.length > 1) {
router.go(-1)
} else {
router.push(manage.getRoutePath('users'))
}
}
</script>
条件跳转
js
import { useRouter } from 'vue-router'
import { useManage, useIsLogin } from '@duxweb/dvha-core'
const router = useRouter()
const manage = useManage()
const isLogin = useIsLogin()
// 根据登录状态跳转
const conditionalRedirect = () => {
if (isLogin.value) {
router.push(manage.getRoutePath('dashboard'))
} else {
router.push(manage.getRoutePath('login'))
}
}
// 根据用户角色跳转
const roleBasedRedirect = (userRole) => {
switch (userRole) {
case 'admin':
router.push(manage.getRoutePath('admin/dashboard'))
break
case 'user':
router.push(manage.getRoutePath('user/profile'))
break
default:
router.push(manage.getRoutePath(''))
}
}
// 根据权限跳转
const permissionBasedRedirect = (permissions) => {
if (permissions.includes('user.manage')) {
router.push(manage.getRoutePath('users'))
} else if (permissions.includes('content.manage')) {
router.push(manage.getRoutePath('content'))
} else {
router.push(manage.getRoutePath('dashboard'))
}
}
注意事项
- 路径一致性: 使用
getRoutePath
确保路径格式一致 - 管理端识别: 跨管理端跳转时要指定正确的管理端名称
- 参数处理: 注意路径参数和查询参数的区别
- 历史记录: 选择合适的导航方法(push vs replace)
- 错误处理: 跳转失败时要有适当的错误处理
- 性能考虑: 避免不必要的路由跳转
- 用户体验: 提供合适的加载状态和反馈