This commit is contained in:
owenchen committed 2026-10-13 10:47:39 +08:00
1 parent 6a8258ac4b
commit a7b25d49c4
29 files changed
+1960 -649

No files matched your search

+5 -1
View File
@@ -12,6 +12,7 @@
*/
import type { ErrorPageName, PageName } from "@/router/routes";
import { getJwtInfo } from "@/common/http.interceptor";
import { canVisitPage } from "@/permission/permission-context";
import {
errorPageUrl,
isAuthFree,
@@ -32,7 +33,7 @@ function isLoggedIn(): boolean {
* 判定目标地址该被拦成哪个错误页;返回 null 表示放行
*
* 顺序即语义:地址不存在(404) -> 没登录(401) -> 没权限(403)
* 403 这层要等 PAGE_PERMISSIONS 与 PermissionContext 移植后接在这里
* 403 必须排在 401 之后:未登录时权限档案多半也是空的,先给 401 才谈得上"去登录"
*/
function evaluate(url: string): ErrorPageName | null {
const name: PageName | null = resolvePageName(url);
@@ -45,6 +46,9 @@ function evaluate(url: string): ErrorPageName | null {
if (!isLoggedIn()) {
return "error401";
}
if (!canVisitPage(name)) {
return "error403";
}
return null;
}
+11 -2
View File
@@ -7,6 +7,8 @@
* 因此"路径比较"必须用 toRealPath(),只有"跳转用的 URL"才允许用 pageUrl();
* - 详细设计与源码证据见 src/md/page-routing.md。
*/
import type { PermissionNames } from "@/permission/permission-kernel";
export const PAGE_PATHS = {
login: "pages/login/login",
dashboard: "pages/dashboard/dashboard",
@@ -43,9 +45,11 @@ export const AUTH_FREE_PAGES: PageName[] = [
/**
* 页面所需权限名(权限守卫用,格式同旧系统 meta.permission)。
* 暂未接入:等菜单/功能权限体系移植时逐条填进来,缺省表示不校验
* 取值必须是后端 security_function.permission_name 里存在的功能名(如 ActorEnquiry、
* DmsFileEnquiry),写错等于该页永远进不去;登记流程与反查方法见 src/md/permission.md。
* 数组表示任一命中即放行。缺省(未登记)表示该页不做权限校验,登录校验照旧。
*/
export const PAGE_PERMISSIONS: Partial<Record<PageName, string>> = {};
export const PAGE_PERMISSIONS: Partial<Record<PageName, PermissionNames>> = {};
/** 带前导斜杠的真实路径,供 uni.* API 之外的路径比较、日志使用 */
export function toRealPath(name: PageName): string {
@@ -97,6 +101,11 @@ export function normalizePath(url: string): string {
* 认不出即返回 null,调用方据此判定"地址不存在"
*/
export function resolvePageName(url: string): PageName | null {
// 空地址不算页面:normalizePath 会把 "" 归一成 "/",于是 "" 曾被认成入口页放行,
// 登录页缺 ?redirect= 时就顺着这条判断把落地地址覆盖成了空串,reLaunch 直接 fail
if (!String(url || "").trim()) {
return null;
}
const path = normalizePath(url);
const names = Object.keys(PAGE_PATHS) as PageName[];
// "/" 是 H5 入口页(登录页)的路由 path,不对应任何字面配置