feat(登录): 增加通过URL参数直接登录的功能
在路由守卫和登录逻辑中添加对URL参数的处理,当URL中包含token、username和level时,可以直接登录并跳转到对应页面,无需API验证。同时启用路由的认证元信息配置。
This commit is contained in:
@@ -17,37 +17,37 @@ const routes = [
|
|||||||
path: '/login',
|
path: '/login',
|
||||||
name: 'Login',
|
name: 'Login',
|
||||||
component: Login,
|
component: Login,
|
||||||
// meta: { requiresAuth: false }
|
meta: { requiresAuth: false }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/sale',
|
path: '/sale',
|
||||||
name: 'Sale',
|
name: 'Sale',
|
||||||
component: Sale,
|
component: Sale,
|
||||||
// meta: { requiresAuth: true, minLevel: 1 }
|
meta: { requiresAuth: true, minLevel: 1 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/manager',
|
path: '/manager',
|
||||||
name: 'Manager',
|
name: 'Manager',
|
||||||
component: Manager,
|
component: Manager,
|
||||||
// meta: { requiresAuth: true, minLevel: 2 }
|
meta: { requiresAuth: true, minLevel: 2 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/senior-manager',
|
path: '/senior-manager',
|
||||||
name: 'SeniorManager',
|
name: 'SeniorManager',
|
||||||
component: SeniorManager,
|
component: SeniorManager,
|
||||||
// meta: { requiresAuth: true, minLevel: 3 }
|
meta: { requiresAuth: true, minLevel: 3 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/second-top',
|
path: '/second-top',
|
||||||
name: 'SecondTop',
|
name: 'SecondTop',
|
||||||
component: SecondTop,
|
component: SecondTop,
|
||||||
// meta: { requiresAuth: true, minLevel: 4 }
|
meta: { requiresAuth: true, minLevel: 4 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/top',
|
path: '/top',
|
||||||
name: 'Top',
|
name: 'Top',
|
||||||
component: TopOne,
|
component: TopOne,
|
||||||
// meta: { requiresAuth: true, minLevel: 5 }
|
meta: { requiresAuth: true, minLevel: 5 }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -57,9 +57,47 @@ const router = createRouter({
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 路由守卫
|
// 路由守卫
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
|
|
||||||
|
// 检查URL参数中是否包含token和用户信息(来自其他页面的跳转)
|
||||||
|
const urlToken = to.query.token
|
||||||
|
const urlUsername = to.query.username
|
||||||
|
const urlLevel = to.query.level
|
||||||
|
|
||||||
|
// 如果URL中包含token和用户信息,进行自动登录
|
||||||
|
if (urlToken && urlUsername && urlLevel) {
|
||||||
|
try {
|
||||||
|
// 解码用户名(URL编码的中文)
|
||||||
|
const decodedUsername = decodeURIComponent(urlUsername)
|
||||||
|
|
||||||
|
// 直接设置用户信息到store(跳过API验证,因为token来自可信源)
|
||||||
|
userStore.login(urlToken, decodedUsername, parseInt(urlLevel), '', '')
|
||||||
|
|
||||||
|
// 根据用户等级跳转到对应页面
|
||||||
|
const defaultRoutes = {
|
||||||
|
1: '/sale',
|
||||||
|
2: '/manager',
|
||||||
|
3: '/senior-manager',
|
||||||
|
4: '/second-top',
|
||||||
|
5: '/top'
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetRoute = defaultRoutes[parseInt(urlLevel)] || '/sale'
|
||||||
|
|
||||||
|
// 如果当前路由就是目标路由,直接通过;否则重定向
|
||||||
|
if (to.path === targetRoute) {
|
||||||
|
next()
|
||||||
|
} else {
|
||||||
|
next(targetRoute)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
} catch (error) {
|
||||||
|
console.error('自动登录失败:', error)
|
||||||
|
// 如果自动登录失败,继续正常的路由守卫逻辑
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 如果路由不需要认证,直接通过
|
// 如果路由不需要认证,直接通过
|
||||||
if (!to.meta.requiresAuth) {
|
if (!to.meta.requiresAuth) {
|
||||||
next()
|
next()
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ service.interceptors.request.use(
|
|||||||
_t: Date.now()
|
_t: Date.now()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// https://mldash.nycjy.cn/login
|
||||||
// 显示加载状态
|
// 显示加载状态
|
||||||
if (config.showLoading !== false) {
|
if (config.showLoading !== false) {
|
||||||
// 可以在这里添加全局loading
|
// 可以在这里添加全局loading
|
||||||
|
|||||||
@@ -552,12 +552,25 @@ const cancelSecuritySetup = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Token验证登录函数
|
// Token验证登录函数
|
||||||
const handleTokenLogin = async (token) => {
|
const handleTokenLogin = async (token, username = null, userLevel = null) => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
errorMessage.value = ''
|
errorMessage.value = ''
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// 使用token进行验证登录
|
// 如果URL中包含用户信息,直接使用(跳过API验证)
|
||||||
|
if (username && userLevel) {
|
||||||
|
// 解码用户名
|
||||||
|
const decodedUsername = decodeURIComponent(username)
|
||||||
|
|
||||||
|
// 直接设置用户信息到store
|
||||||
|
userStore.login(token, decodedUsername, parseInt(userLevel), '', '')
|
||||||
|
|
||||||
|
// 根据用户等级跳转到对应页面
|
||||||
|
navigateToUserPage(parseInt(userLevel))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用token进行API验证登录
|
||||||
const response = await http.post('/api/v1/token_login', {
|
const response = await http.post('/api/v1/token_login', {
|
||||||
token: token
|
token: token
|
||||||
})
|
})
|
||||||
@@ -586,9 +599,13 @@ const handleTokenLogin = async (token) => {
|
|||||||
// 组件挂载时检查路由参数中的token
|
// 组件挂载时检查路由参数中的token
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const token = route.query.token
|
const token = route.query.token
|
||||||
|
const username = route.query.username
|
||||||
|
const userLevel = route.query.level
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
// 如果路由参数中有token,直接进行token验证登录
|
// 如果路由参数中有token,进行token验证登录
|
||||||
handleTokenLogin(token)
|
// 如果同时有用户信息,直接使用;否则通过API验证
|
||||||
|
handleTokenLogin(token, username, userLevel)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user