update [router]: 添加路由拦截参数from ,to.meta,使用to.meta实现登录拦截
This commit is contained in:
@@ -3,6 +3,7 @@ import { isArray, parse } from "../utils";
|
||||
type Page = {
|
||||
path: string;
|
||||
style?: UTSJSONObject;
|
||||
meta?: UTSJSONObject;
|
||||
};
|
||||
|
||||
type SubPackage = {
|
||||
@@ -62,7 +63,8 @@ if (isArray(ctx.subPackages)) {
|
||||
a.pages.forEach((b) => {
|
||||
PAGES.push({
|
||||
path: a.root + "/" + b.path, // 拼接子包根路径和页面路径
|
||||
style: b.style
|
||||
style: b.style,
|
||||
meta: b.meta ?? {},
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -5,10 +5,11 @@ import { storage, last, isNull, isEmpty, get, isFunction, toArray, map, debounce
|
||||
// 路由信息类型
|
||||
type RouteInfo = {
|
||||
path: string;
|
||||
meta: UTSJSONObject;
|
||||
};
|
||||
|
||||
// 跳转前钩子类型
|
||||
type BeforeEach = (to: RouteInfo, next: () => void) => void;
|
||||
type BeforeEach = (to: RouteInfo, from: PageInstance, next: () => void) => void;
|
||||
// 登录后回调类型
|
||||
type AfterLogin = () => void;
|
||||
|
||||
@@ -53,7 +54,9 @@ export class Router {
|
||||
path = "/" + path;
|
||||
}
|
||||
// 获取页面样式
|
||||
const style = PAGES.find((e) => e.path == path)?.style;
|
||||
const page = PAGES.find((e) => e.path == path);
|
||||
const style = page?.style ?? {};
|
||||
const meta = page?.meta ?? {};
|
||||
// 获取页面暴露的方法
|
||||
// @ts-ignore
|
||||
let exposed = e.vm as any;
|
||||
@@ -69,6 +72,7 @@ export class Router {
|
||||
// @ts-ignore
|
||||
exposed,
|
||||
style,
|
||||
meta,
|
||||
query,
|
||||
isCustomNavbar: style?.navigationStyle == "custom"
|
||||
} as PageInstance;
|
||||
@@ -173,10 +177,12 @@ export class Router {
|
||||
|
||||
// 跳转前钩子处理
|
||||
if (isFunction(this._events["beforeEach"])) {
|
||||
const meta = PAGES.find((e) => e.path == path)?.meta;
|
||||
const from = this.getPages().slice(-1)[0];
|
||||
const to: RouteInfo = { path, meta: meta ?? {} };
|
||||
(this._events["beforeEach"] as BeforeEach)(
|
||||
{
|
||||
path
|
||||
},
|
||||
to,
|
||||
from,
|
||||
next
|
||||
);
|
||||
} else {
|
||||
@@ -193,12 +199,30 @@ export class Router {
|
||||
|
||||
// 返回上一页,若为首页则回首页
|
||||
back(options: BackOptions | null = null) {
|
||||
let path = ''
|
||||
const next = ()=>{
|
||||
if (this.isFirstPage()) {
|
||||
this.home();
|
||||
path = this.defaultPath("home")
|
||||
} else {
|
||||
path = this.getPages().slice(-2)[0].path;
|
||||
uni.navigateBack({ ...(options ?? {}) });
|
||||
}
|
||||
}
|
||||
// 跳转前钩子处理
|
||||
if (isFunction(this._events["beforeEach"])) {
|
||||
const meta = PAGES.find((e) => e.path == path)?.meta;
|
||||
const from = this.getPages().slice(-1)[0];
|
||||
const to: RouteInfo = { path, meta: meta ?? {} };
|
||||
(this._events["beforeEach"] as BeforeEach)(
|
||||
to,
|
||||
from,
|
||||
next
|
||||
);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
}
|
||||
|
||||
// 执行当前页面暴露的方法
|
||||
callMethod(name: string, data?: any): any | null {
|
||||
|
||||
24
pages.json
24
pages.json
@@ -27,30 +27,45 @@
|
||||
"path": "index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "设置"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "general",
|
||||
"style": {
|
||||
"navigationBarTitleText": "通用设置"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "notice",
|
||||
"style": {
|
||||
"navigationBarTitleText": "通知设置"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "about",
|
||||
"style": {
|
||||
"navigationBarTitleText": ""
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "cs",
|
||||
"style": {
|
||||
"navigationBarTitleText": "联系客服"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -62,18 +77,27 @@
|
||||
"path": "edit",
|
||||
"style": {
|
||||
"navigationBarTitleText": "编辑资料"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "edit-name",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "edit-description",
|
||||
"style": {
|
||||
"navigationStyle": "custom"
|
||||
},
|
||||
"meta":{
|
||||
"isAuth": true
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,20 +1,9 @@
|
||||
import { router, useStore } from "@/cool";
|
||||
|
||||
const ignoreToken = [
|
||||
"/pages/index/home",
|
||||
"/pages/index/my",
|
||||
"/pages/index/template",
|
||||
"/pages/user/login",
|
||||
"/pages/user/doc"
|
||||
];
|
||||
|
||||
router.beforeEach((to, next) => {
|
||||
router.beforeEach((to, _, next) => {
|
||||
const { user } = useStore();
|
||||
|
||||
if (
|
||||
ignoreToken.some((e) => to.path.includes(e)) ||
|
||||
to.path.startsWith("/pages/demo") ||
|
||||
to.path.startsWith("/pages/template")
|
||||
!to.meta.isAuth
|
||||
) {
|
||||
next();
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user