- 新增 registration_packages 表:管理员配置注册套餐(名称/角色) - AuthController 新增 register() 和 registrationPackages() 公开接口 - UserController 新增 approve() / reject() 审核接口 - StoreController 新增 publicList() 公开门店列表 - 前端 /register 注册页:选门店→选岗位套餐→填信息→提交 - 前端 system/registration-packages:套餐 CRUD - 用户管理页:待审核状态展示 + 通过/拒绝快捷操作 - 登录页底部加「申请注册」跳转链接 - 路由白名单加 /register
70 lines
1.8 KiB
JavaScript
70 lines
1.8 KiB
JavaScript
import { createRouter, createWebHistory } from 'vue-router'
|
|
import NProgress from 'nprogress'
|
|
import 'nprogress/nprogress.css'
|
|
import { constantRoutes } from '@/router/routes.js'
|
|
|
|
NProgress.configure({ showSpinner: false })
|
|
|
|
const router = createRouter({
|
|
history: createWebHistory(),
|
|
routes: constantRoutes,
|
|
scrollBehavior(to, from, savedPosition) {
|
|
if (savedPosition) {
|
|
return savedPosition
|
|
}
|
|
return { top: 0 }
|
|
}
|
|
})
|
|
|
|
// Whitelist paths that don't require authentication
|
|
const WHITE_LIST = ['/login', '/register', '/404']
|
|
|
|
router.beforeEach(async (to, from, next) => {
|
|
NProgress.start()
|
|
|
|
// Lazily import stores to avoid circular dependency at module init time
|
|
const { useUserStore } = await import('@/stores/user.js')
|
|
const { usePermissionStore } = await import('@/stores/permission.js')
|
|
const userStore = useUserStore()
|
|
const permissionStore = usePermissionStore()
|
|
|
|
const token = userStore.token
|
|
|
|
if (token) {
|
|
if (to.path === '/login') {
|
|
// Already logged in — redirect to home
|
|
next({ path: '/' })
|
|
} else {
|
|
// Check if user info has been fetched
|
|
if (!userStore.userInfo) {
|
|
try {
|
|
await userStore.getInfo()
|
|
const accessRoutes = permissionStore.generateRoutes(userStore.menus)
|
|
accessRoutes.forEach((route) => router.addRoute(route))
|
|
// Replace so the new routes are active
|
|
next({ ...to, replace: true })
|
|
} catch (err) {
|
|
// Token invalid — clear and redirect
|
|
await userStore.logout()
|
|
next(`/login?redirect=${to.path}`)
|
|
}
|
|
} else {
|
|
next()
|
|
}
|
|
}
|
|
} else {
|
|
// No token
|
|
if (WHITE_LIST.includes(to.path)) {
|
|
next()
|
|
} else {
|
|
next(`/login?redirect=${to.path}`)
|
|
}
|
|
}
|
|
})
|
|
|
|
router.afterEach(() => {
|
|
NProgress.done()
|
|
})
|
|
|
|
export default router
|