Bläddra i källkod

update [router]: 添加路由拦截参数from ,to.meta,使用to.meta实现登录拦截

刘辉 6 månader sedan
förälder
incheckning
dfad4ff040
4 ändrade filer med 61 tillägg och 22 borttagningar
  1. 3 1
      cool/ctx/index.ts
  2. 32 8
      cool/router/index.ts
  3. 24 0
      pages.json
  4. 2 13
      router/index.ts

+ 3 - 1
cool/ctx/index.ts

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

+ 32 - 8
cool/router/index.ts

@@ -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,10 +199,28 @@ export class Router {
 
 	// 返回上一页,若为首页则回首页
 	back(options: BackOptions | null = null) {
-		if (this.isFirstPage()) {
-			this.home();
+		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 {
-			uni.navigateBack({ ...(options ?? {}) });
+			next();
 		}
 	}
 

+ 24 - 0
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
 					}
 				},
 				{

+ 2 - 13
router/index.ts

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