Merge pull request #30 from ll-huihui/main

[router]: 添加路由拦截beforeEach参数from ,to.meta,使用to.meta实现登录拦截
This commit is contained in:
COOL
2025-09-23 14:21:14 +08:00
committed by GitHub
6 changed files with 66 additions and 28 deletions

View File

@@ -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 ?? {},
});
});
});

View File

@@ -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 {

View File

@@ -53,4 +53,5 @@ export type PageInstance = {
query: UTSJSONObject;
exposed: any;
isCustomNavbar: boolean;
meta?: UTSJSONObject;
};

View File

@@ -1,6 +1,6 @@
{
"name": "cool-unix",
"appid": "__UNI__651711F",
"appid": "__UNI__EC807C1",
"description": "完全开源、永久免费、上手容易、效率极高的开发脚手架",
"versionName": "1.0.0",
"versionCode": "100",

View File

@@ -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
}
},
{

View File

@@ -1,27 +1,14 @@
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")
) {
next();
} else {
if (to.meta?.isAuth == true) {
if (!user.isNull()) {
next();
} else {
router.login();
}
} else {
next();
}
});