路由验证id

This commit is contained in:
李志鹏
2025-10-31 14:41:07 +08:00
parent 5484848572
commit 1f8051a266
3 changed files with 67 additions and 18 deletions

View File

@@ -1,13 +1,38 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import { useGenerateStore } from '@/stores/modules/generate'
/** /**
* 路由缓存机制: * 路由缓存机制:
* 1. 设置路由的meta属性为{ cache: true },表示需要缓存 * 1. 设置路由的meta属性为{ cache: true },表示需要缓存
* 2. App.vue中使用RouteCache组件通过路由的name来进行匹配 * 2. App.vue中使用RouteCache组件通过路由的name来进行匹配
* 3. 路由的name默认是文件名,如果文件名与name不一致,通过defineOptions({ name: 'componentName' })来设置 * 3. 路由的name默认是文件名,如果文件名与name不一致,通过defineOptions({ name: 'componentName' })来设置
*
* 自定义验证规则:
* meta{ verify: => boolean || string }
* 1. boolean true 跳转 false 不跳转
* 2. string 跳转的路由path
*/ */
/** 验证id
* @param num 验证id的数量1-5
* 1. 顾客id
* 2. 进店记录id
* 3. 服装id
* 4. 模特照片id
* 5. 原始试穿id-优先AI魔改
* @returns boolean
*/
const VerifyIDs = (num: number) => {
const ids = [
!!useGenerateStore().customerId,
!!useGenerateStore().visitRecordId,
!!useGenerateStore().styleId,
// !!useGenerateStore().modelPhotoId,
true,
!!useGenerateStore().originalTryOnId,
];
return ids.splice(0, num).every(id => id) ? true : "/stylist/customer";
}
const router = createRouter({ const router = createRouter({
history: createWebHistory('/'), history: createWebHistory('/'),
// history: createWebHistory(import.meta.env.VITE_APP_URL), // history: createWebHistory(import.meta.env.VITE_APP_URL),
@@ -45,22 +70,25 @@ const router = createRouter({
{ {
path: 'index', path: 'index',
name: 'index', name: 'index',
component: () => import('@/views/stylist/index.vue') component: () => import('@/views/stylist/index.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
path: 'sex', path: 'sex',
name: 'sex', name: 'sex',
component: () => import('@/views/stylist/sex.vue') component: () => import('@/views/stylist/sex.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
path: 'dressfor', path: 'dressfor',
name: 'dressfor', name: 'dressfor',
component: () => import('@/views/stylist/dressfor.vue') component: () => import('@/views/stylist/dressfor.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
path: 'customer', path: 'customer',
name: 'customer', name: 'customer',
component: () => import('@/views/stylist/customer.vue') component: () => import('@/views/stylist/customer.vue'),
} }
] ]
}, },
@@ -68,7 +96,7 @@ const router = createRouter({
path: '/asistant', path: '/asistant',
name: 'asistant', name: 'asistant',
component: () => import('../views/asistant/index.vue'), component: () => import('../views/asistant/index.vue'),
meta: { cache: true } meta: { cache: true, verify: ()=> VerifyIDs(2) }
}, },
{ {
path: '/workshop', path: '/workshop',
@@ -83,57 +111,67 @@ const router = createRouter({
path: '/workshop/selectStyle', path: '/workshop/selectStyle',
name: 'SelectStyle', name: 'SelectStyle',
component: () => import('../views/Workshop/selectStyle.vue'), component: () => import('../views/Workshop/selectStyle.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
path: '/workshop/selectModel', path: '/workshop/selectModel',
name: 'SelectModel', name: 'SelectModel',
component: () => import('../views/Workshop/selectModel.vue') component: () => import('../views/Workshop/selectModel.vue'),
meta: { verify: ()=> VerifyIDs(3) }
}, },
{ {
path: '/workshop/product', path: '/workshop/product',
name: 'Product', name: 'Product',
component: () => import('../views/Workshop/product.vue') component: () => import('../views/Workshop/product.vue'),
meta: { verify: ()=> VerifyIDs(4) }
}, },
{ {
// 上传照片1 // 上传照片1
path: '/workshop/uploadFace', path: '/workshop/uploadFace',
name: 'uploadFace', name: 'uploadFace',
component: () => import('../views/Workshop/uploadFace1.vue') component: () => import('../views/Workshop/uploadFace1.vue'),
meta: { verify: ()=> VerifyIDs(5) }
}, },
{ {
// 上传照片2 // 上传照片2
path: '/workshop/uploadFace2', path: '/workshop/uploadFace2',
name: 'uploadFace2', name: 'uploadFace2',
component: () => import('../views/Workshop/uploadFace2.vue') component: () => import('../views/Workshop/uploadFace2.vue'),
meta: { verify: ()=> VerifyIDs(5) }
}, },
{ {
// 自定义创作 // 自定义创作
path: '/workshop/customize', path: '/workshop/customize',
name: 'customize', name: 'customize',
component: () => import('../views/Workshop/customize.vue') component: () => import('../views/Workshop/customize.vue'),
meta: { verify: ()=> VerifyIDs(5) }
}, },
{ {
// library // library
path: '/workshop/library', path: '/workshop/library',
name: 'library', name: 'library',
component: () => import('../views/Workshop/library.vue') component: () => import('../views/Workshop/library.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
path: '/workshop/profile', path: '/workshop/profile',
name: 'profile', name: 'profile',
component: () => import('../views/Workshop/profile.vue') component: () => import('../views/Workshop/profile.vue'),
meta: { verify: ()=> VerifyIDs(1) }
}, },
{ {
// creation // creation
path: '/workshop/creation', path: '/workshop/creation',
name: 'creation', name: 'creation',
component: () => import('../views/Workshop/creation/index.vue') component: () => import('../views/Workshop/creation/index.vue'),
meta: { verify: ()=> VerifyIDs(2) }
}, },
{ {
// 完成创建 // 完成创建
path: '/workshop/end', path: '/workshop/end',
name: 'end', name: 'end',
component: () => import('../views/Workshop/end.vue') component: () => import('../views/Workshop/end.vue'),
meta: { verify: ()=> VerifyIDs(2) }
} }
] ]
} }

View File

@@ -5,10 +5,20 @@ const whiteList = ['/login']
console.log(whiteList) console.log(whiteList)
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
next() const verify = to.meta?.verify;
if (typeof verify === 'function') {
let res = verify()
if (res === false) {
return next(false)
} else if (typeof res === 'string') {
console.log(res)
return next({ path: res })
}
}
next()
}) })
router.afterEach(() => { router.afterEach(() => {
// finish progress bar // finish progress bar
// NProgress.done() // NProgress.done()
}) })

View File

@@ -179,6 +179,7 @@ const { isLoading } = toRefs(data);
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: contain;
display: block;
} }
> .operation{ > .operation{
position: absolute; position: absolute;