@jnrs/vue-core 1.0.4 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -0
- package/dist/vueRouter/createVueRouter.cjs +158 -0
- package/dist/vueRouter/createVueRouter.cjs.map +1 -0
- package/dist/{router → vueRouter}/createVueRouter.d.ts +7 -4
- package/dist/{router → vueRouter}/createVueRouter.js +7 -3
- package/dist/vueRouter/createVueRouter.js.map +1 -0
- package/dist/vueRouter/defaults.cjs +16 -0
- package/dist/vueRouter/defaults.cjs.map +1 -0
- package/dist/{router → vueRouter}/defaults.js +3 -0
- package/dist/vueRouter/defaults.js.map +1 -0
- package/dist/vueRouter/index.cjs +20 -0
- package/dist/vueRouter/index.cjs.map +1 -0
- package/dist/vueRouter/index.d.ts +4 -0
- package/dist/vueRouter/index.js +5 -0
- package/dist/vueRouter/index.js.map +1 -0
- package/dist/vueRouter/types.d.ts +34 -0
- package/package.json +9 -5
- package/dist/router/createRouter.d.ts +0 -20
- package/dist/router/createRouter.js +0 -146
- package/dist/router/index.d.ts +0 -11
- package/dist/router/index.js +0 -2
- package/dist/router/router.d.ts +0 -20
- package/dist/router/router.js +0 -146
- package/dist/router/types.d.ts +0 -21
- package/dist/router/types.js +0 -1
- package/dist/utils/router/defaults.d.ts +0 -15
- package/dist/utils/router/defaults.js +0 -16
- package/dist/utils/router/index.d.ts +0 -20
- package/dist/utils/router/index.js +0 -146
- package/dist/utils/router/types.d.ts +0 -14
- package/dist/utils/router/types.js +0 -8
- /package/dist/{router → vueRouter}/defaults.d.ts +0 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var createVueRouter = require('./vueRouter/createVueRouter.cjs');
|
|
4
|
+
|
|
5
|
+
console.log('%c✨ 欢迎使用 @jnrs/vue-core', 'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;');
|
|
6
|
+
|
|
7
|
+
exports.router = createVueRouter;
|
|
8
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AACA,OAAO,CAAC,GAAG,CACT,yBAAyB,EACzB,0IAA0I,CAC3I;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import * as createVueRouter from './vueRouter/createVueRouter.js';
|
|
2
|
+
export { createVueRouter as router };
|
package/dist/index.js
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import * as createVueRouter from './vueRouter/createVueRouter.js';
|
|
2
|
+
export { createVueRouter as router };
|
|
3
|
+
|
|
4
|
+
console.log('%c✨ 欢迎使用 @jnrs/vue-core', 'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;');
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AACA,OAAO,CAAC,GAAG,CACT,yBAAyB,EACzB,0IAA0I,CAC3I"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vueRouter = require('vue-router');
|
|
4
|
+
var defaults = require('./defaults.cjs');
|
|
5
|
+
|
|
6
|
+
let router;
|
|
7
|
+
let _fileModules;
|
|
8
|
+
let _layoutName;
|
|
9
|
+
let _globalComponent;
|
|
10
|
+
/**
|
|
11
|
+
* 创建 vue-router 实例
|
|
12
|
+
* @param options 配置项
|
|
13
|
+
* @param fileModules 文件模块
|
|
14
|
+
* @param layoutName 布局组件名称
|
|
15
|
+
* @param globalComponent 全局 Layout 组件(mate.global=true时需传入)
|
|
16
|
+
* @param handleBeforeEach 路由前置守卫处理函数
|
|
17
|
+
* @returns router 实例
|
|
18
|
+
*/
|
|
19
|
+
const createVueRouter = ({ options, fileModules, layoutName, globalComponent, handleBeforeEach }) => {
|
|
20
|
+
_fileModules = fileModules;
|
|
21
|
+
if (layoutName) {
|
|
22
|
+
_layoutName = layoutName;
|
|
23
|
+
}
|
|
24
|
+
if (globalComponent) {
|
|
25
|
+
_globalComponent = globalComponent;
|
|
26
|
+
}
|
|
27
|
+
router = vueRouter.createRouter({ ...defaults.DEFAULT_OPTIONS, ...options });
|
|
28
|
+
router.beforeEach(async (to, from) => handleBeforeEach?.(to, from));
|
|
29
|
+
return router;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 路由跳转或替换
|
|
33
|
+
* @param to 路由跳转参数
|
|
34
|
+
* @param type 默认为push, push | replace
|
|
35
|
+
* @returns Promise<boolean | void>
|
|
36
|
+
*/
|
|
37
|
+
const handleRouter = async (to, type = 'push') => {
|
|
38
|
+
try {
|
|
39
|
+
const failure = await router[type](to);
|
|
40
|
+
return failure;
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
console.warn(`router.${type} 失败`, {
|
|
44
|
+
code: 'ROUTER_NOT_MATCH',
|
|
45
|
+
message: '未匹配到有效路由',
|
|
46
|
+
error: to || e,
|
|
47
|
+
timestamp: new Date().toISOString()
|
|
48
|
+
});
|
|
49
|
+
router[type]({ name: '404' });
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* 组件加载器
|
|
54
|
+
* @param safePath 安全处理后的组件路径
|
|
55
|
+
* @param fileModules 文件模块
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
58
|
+
const getComponentLoader = (safePath) => {
|
|
59
|
+
return _fileModules[`/src/views${safePath}.vue`];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 设置动态路由,生成路由记录
|
|
63
|
+
* @param menus 菜单项
|
|
64
|
+
* @param parent 父级菜单项
|
|
65
|
+
*/
|
|
66
|
+
const asyncGenerateRoute = async (menus, parent) => {
|
|
67
|
+
for (const menu of menus) {
|
|
68
|
+
menu.meta.fullPathTitle = parent
|
|
69
|
+
? parent.meta.fullPathTitle + ',' + menu.meta.title
|
|
70
|
+
: menu.meta.title;
|
|
71
|
+
// 当前项若没有component,则为目录,直接递归处理
|
|
72
|
+
if (!menu.component) {
|
|
73
|
+
if (menu.children && menu.children.length > 0) {
|
|
74
|
+
asyncGenerateRoute(menu.children, menu);
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// 安全处理组件路径
|
|
79
|
+
const safePath = menu.component.replace(/[^a-zA-Z0-9/._-]/g, '');
|
|
80
|
+
if (!safePath.startsWith('/') || safePath.includes('..')) {
|
|
81
|
+
console.warn('[Router] 组件加载失败', {
|
|
82
|
+
code: 'INVALID_COMPONENT_PATH',
|
|
83
|
+
message: `组件路径拼写不符合规则,应以 '/' 开头且不能包含 '..',请检查 component 字段是否配置正确`,
|
|
84
|
+
menu: {
|
|
85
|
+
path: menu.path,
|
|
86
|
+
name: menu.name,
|
|
87
|
+
component: menu.component
|
|
88
|
+
},
|
|
89
|
+
timestamp: new Date().toISOString()
|
|
90
|
+
});
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// 获取组件加载器
|
|
94
|
+
const loader = getComponentLoader(safePath);
|
|
95
|
+
if (!loader) {
|
|
96
|
+
console.warn('[Router] 组件加载失败', {
|
|
97
|
+
code: 'COMPONENT_NOT_FOUND',
|
|
98
|
+
message: `组件加载器无效,请检查 component 字段是否配置正确`,
|
|
99
|
+
menu: {
|
|
100
|
+
path: menu.path,
|
|
101
|
+
name: menu.name,
|
|
102
|
+
component: menu.component
|
|
103
|
+
},
|
|
104
|
+
timestamp: new Date().toISOString()
|
|
105
|
+
});
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// 根据 global 字段决定添加为全局路由还是布局子路由
|
|
109
|
+
let routeRecord = {
|
|
110
|
+
name: menu.name,
|
|
111
|
+
path: menu.path,
|
|
112
|
+
meta: menu.meta,
|
|
113
|
+
redirect: menu.redirect,
|
|
114
|
+
component: () => loader()
|
|
115
|
+
};
|
|
116
|
+
if (menu.meta?.global) {
|
|
117
|
+
if (_globalComponent !== undefined) {
|
|
118
|
+
routeRecord = {
|
|
119
|
+
name: '_globalComponent_' + menu.name,
|
|
120
|
+
path: menu.path,
|
|
121
|
+
meta: menu.meta,
|
|
122
|
+
redirect: menu.redirect,
|
|
123
|
+
component: () => _globalComponent,
|
|
124
|
+
children: [
|
|
125
|
+
{
|
|
126
|
+
path: '',
|
|
127
|
+
name: menu.name,
|
|
128
|
+
meta: menu.meta,
|
|
129
|
+
component: () => loader()
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
router.addRoute(routeRecord);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
router.addRoute(_layoutName, routeRecord);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// 获取路由
|
|
142
|
+
const getRoutes = () => {
|
|
143
|
+
const temp = [];
|
|
144
|
+
for (const route of router.getRoutes()) {
|
|
145
|
+
temp.push({
|
|
146
|
+
name: route.name,
|
|
147
|
+
path: route.path,
|
|
148
|
+
meta: route.meta
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return temp;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
exports.asyncGenerateRoute = asyncGenerateRoute;
|
|
155
|
+
exports.createVueRouter = createVueRouter;
|
|
156
|
+
exports.getRoutes = getRoutes;
|
|
157
|
+
exports.handleRouter = handleRouter;
|
|
158
|
+
//# sourceMappingURL=createVueRouter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createVueRouter.cjs","sources":["../../src/vueRouter/createVueRouter.ts"],"sourcesContent":[null],"names":["createRouter","DEFAULT_OPTIONS"],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as vue_router from 'vue-router';
|
|
2
|
+
import { Router, RouteLocationRaw } from 'vue-router';
|
|
3
|
+
import { CreateVueRouter, MenuItem } from './types.js';
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
6
|
* 创建 vue-router 实例
|
|
5
7
|
* @param options 配置项
|
|
@@ -16,7 +18,7 @@ declare const createVueRouter: ({ options, fileModules, layoutName, globalCompon
|
|
|
16
18
|
* @param type 默认为push, push | replace
|
|
17
19
|
* @returns Promise<boolean | void>
|
|
18
20
|
*/
|
|
19
|
-
declare const handleRouter: (to: RouteLocationRaw, type?: "push" | "replace") => Promise<void |
|
|
21
|
+
declare const handleRouter: (to: RouteLocationRaw, type?: "push" | "replace") => Promise<void | vue_router.NavigationFailure>;
|
|
20
22
|
/**
|
|
21
23
|
* 设置动态路由,生成路由记录
|
|
22
24
|
* @param menus 菜单项
|
|
@@ -24,4 +26,5 @@ declare const handleRouter: (to: RouteLocationRaw, type?: "push" | "replace") =>
|
|
|
24
26
|
*/
|
|
25
27
|
declare const asyncGenerateRoute: (menus: MenuItem[], parent?: MenuItem) => Promise<void>;
|
|
26
28
|
declare const getRoutes: () => MenuItem[];
|
|
27
|
-
|
|
29
|
+
|
|
30
|
+
export { asyncGenerateRoute, createVueRouter, getRoutes, handleRouter };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createRouter } from 'vue-router';
|
|
2
|
-
import { DEFAULT_OPTIONS } from './defaults';
|
|
2
|
+
import { DEFAULT_OPTIONS } from './defaults.js';
|
|
3
|
+
|
|
3
4
|
let router;
|
|
4
5
|
let _fileModules;
|
|
5
6
|
let _layoutName;
|
|
@@ -22,7 +23,7 @@ const createVueRouter = ({ options, fileModules, layoutName, globalComponent, ha
|
|
|
22
23
|
_globalComponent = globalComponent;
|
|
23
24
|
}
|
|
24
25
|
router = createRouter({ ...DEFAULT_OPTIONS, ...options });
|
|
25
|
-
router.beforeEach(async (to) => handleBeforeEach?.(to));
|
|
26
|
+
router.beforeEach(async (to, from) => handleBeforeEach?.(to, from));
|
|
26
27
|
return router;
|
|
27
28
|
};
|
|
28
29
|
/**
|
|
@@ -113,6 +114,7 @@ const asyncGenerateRoute = async (menus, parent) => {
|
|
|
113
114
|
if (menu.meta?.global) {
|
|
114
115
|
if (_globalComponent !== undefined) {
|
|
115
116
|
routeRecord = {
|
|
117
|
+
name: '_globalComponent_' + menu.name,
|
|
116
118
|
path: menu.path,
|
|
117
119
|
meta: menu.meta,
|
|
118
120
|
redirect: menu.redirect,
|
|
@@ -146,4 +148,6 @@ const getRoutes = () => {
|
|
|
146
148
|
}
|
|
147
149
|
return temp;
|
|
148
150
|
};
|
|
149
|
-
|
|
151
|
+
|
|
152
|
+
export { asyncGenerateRoute, createVueRouter, getRoutes, handleRouter };
|
|
153
|
+
//# sourceMappingURL=createVueRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createVueRouter.js","sources":["../../src/vueRouter/createVueRouter.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vueRouter = require('vue-router');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 默认配置项
|
|
7
|
+
* @property history - 路由历史模式
|
|
8
|
+
* @property routes - 路由记录数组
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_OPTIONS = {
|
|
11
|
+
history: vueRouter.createWebHistory(),
|
|
12
|
+
routes: []
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.DEFAULT_OPTIONS = DEFAULT_OPTIONS;
|
|
16
|
+
//# sourceMappingURL=defaults.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.cjs","sources":["../../src/vueRouter/defaults.ts"],"sourcesContent":[null],"names":["createWebHistory"],"mappings":";;;;AAEA;;;;AAIG;AACH,MAAM,eAAe,GAAG;IACtB,OAAO,EAAEA,0BAAgB,EAAE;AAC3B,IAAA,MAAM,EAAE;;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createWebHistory } from 'vue-router';
|
|
2
|
+
|
|
2
3
|
/**
|
|
3
4
|
* 默认配置项
|
|
4
5
|
* @property history - 路由历史模式
|
|
@@ -8,4 +9,6 @@ const DEFAULT_OPTIONS = {
|
|
|
8
9
|
history: createWebHistory(),
|
|
9
10
|
routes: []
|
|
10
11
|
};
|
|
12
|
+
|
|
11
13
|
export { DEFAULT_OPTIONS };
|
|
14
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sources":["../../src/vueRouter/defaults.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;AAIG;AACH,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,gBAAgB,EAAE;AAC3B,IAAA,MAAM,EAAE;;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vueRouter = require('vue-router');
|
|
4
|
+
var createVueRouter = require('./createVueRouter.cjs');
|
|
5
|
+
|
|
6
|
+
console.log('%c✨ 欢迎使用 @jnrs/vue-core/router', 'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;');
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "useRoute", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return vueRouter.useRoute; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "useRouter", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return vueRouter.useRouter; }
|
|
15
|
+
});
|
|
16
|
+
exports.asyncGenerateRoute = createVueRouter.asyncGenerateRoute;
|
|
17
|
+
exports.createVueRouter = createVueRouter.createVueRouter;
|
|
18
|
+
exports.getRoutes = createVueRouter.getRoutes;
|
|
19
|
+
exports.handleRouter = createVueRouter.handleRouter;
|
|
20
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/vueRouter/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAWA,OAAO,CAAC,GAAG,CACT,gCAAgC,EAChC,0IAA0I,CAC3I;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { useRoute, useRouter } from 'vue-router';
|
|
2
|
+
export { asyncGenerateRoute, createVueRouter, getRoutes, handleRouter } from './createVueRouter.js';
|
|
3
|
+
|
|
4
|
+
console.log('%c✨ 欢迎使用 @jnrs/vue-core/router', 'background: #42B883; color: #39495C; font-weight: bold; padding: 4px 8px; border-radius: 4px; font-family: "Helvetica Neue", sans-serif;');
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/vueRouter/index.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAWA,OAAO,CAAC,GAAG,CACT,gCAAgC,EAChC,0IAA0I,CAC3I"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RouterOptions, RouteRecordRaw, RouteLocationNormalizedGeneric, RouteMeta } from 'vue-router';
|
|
2
|
+
|
|
3
|
+
declare module 'vue-router' {
|
|
4
|
+
interface RouteMeta {
|
|
5
|
+
uuid?: string;
|
|
6
|
+
title: string;
|
|
7
|
+
icon?: string;
|
|
8
|
+
noAuth?: boolean;
|
|
9
|
+
global?: boolean;
|
|
10
|
+
fullPathTitle?: string;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
interface MenuItem {
|
|
14
|
+
meta: RouteMeta;
|
|
15
|
+
path: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
todoCount?: number;
|
|
18
|
+
component?: string;
|
|
19
|
+
redirect?: string;
|
|
20
|
+
children?: MenuItem[];
|
|
21
|
+
}
|
|
22
|
+
interface RouteModule {
|
|
23
|
+
default: RouteRecordRaw | RouteRecordRaw[];
|
|
24
|
+
}
|
|
25
|
+
type FileModules = Record<string, () => Promise<RouteModule>>;
|
|
26
|
+
interface CreateVueRouter<GC = unknown> {
|
|
27
|
+
options: Partial<RouterOptions>;
|
|
28
|
+
fileModules: FileModules;
|
|
29
|
+
layoutName?: string;
|
|
30
|
+
globalComponent?: Promise<GC>;
|
|
31
|
+
handleBeforeEach?: (to: RouteLocationNormalizedGeneric, from: RouteLocationNormalizedGeneric) => void;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type { CreateVueRouter, FileModules, MenuItem, RouteModule };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jnrs/vue-core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "As the name suggests.",
|
|
5
5
|
"author": "Talia-Tan",
|
|
6
6
|
"license": "ISC",
|
|
@@ -26,20 +26,24 @@
|
|
|
26
26
|
"types": "./dist/index.d.ts"
|
|
27
27
|
},
|
|
28
28
|
"./router": {
|
|
29
|
-
"import": "./dist/
|
|
30
|
-
"types": "./dist/
|
|
29
|
+
"import": "./dist/vueRouter/index.js",
|
|
30
|
+
"types": "./dist/vueRouter/index.d.ts"
|
|
31
31
|
}
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"vue-router": "^4.5.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
38
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
39
|
+
"rollup": "^4.53.2",
|
|
40
|
+
"rollup-plugin-dts": "^6.2.3",
|
|
37
41
|
"rimraf": "^6.0.1",
|
|
38
42
|
"typescript": "^5.9.3"
|
|
39
43
|
},
|
|
40
44
|
"scripts": {
|
|
41
|
-
"dev": "
|
|
42
|
-
"build": "rimraf dist &&
|
|
45
|
+
"dev": "rollup -c -w",
|
|
46
|
+
"build": "rimraf dist && rollup -c",
|
|
43
47
|
"release": "node ./scripts/release.mjs"
|
|
44
48
|
}
|
|
45
49
|
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { useRoute, type Router, type RouterOptions, type RouteLocationRaw } from 'vue-router';
|
|
9
|
-
import type { MenuItem, ModulesFileList } from './types';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
declare const createVueRouter: (options: Partial<RouterOptions>) => Router;
|
|
16
|
-
declare const routerPush: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
17
|
-
declare const routerReplace: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
18
|
-
declare const getRoutes: (router: Router) => MenuItem[];
|
|
19
|
-
declare const setupDynamicRoutes: (router: Router, layoutName: string | undefined, userRoutes: MenuItem[], modulesFileList: ModulesFileList) => Promise<void>;
|
|
20
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute, type ModulesFileList };
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { createRouter, useRoute } from 'vue-router';
|
|
9
|
-
import { DEFAULT_OPTIONS, LAYOUT_NAME } from './defaults';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
const createVueRouter = (options) => {
|
|
16
|
-
const router = createRouter({ ...DEFAULT_OPTIONS, ...options });
|
|
17
|
-
// 获取用户权限
|
|
18
|
-
// const canUserAccess = async (to: RouteLocationNormalized) => {
|
|
19
|
-
// const isAuthenticated = true
|
|
20
|
-
// return to.name === 'Login' || to.meta.noAuth || isAuthenticated
|
|
21
|
-
// }
|
|
22
|
-
// 全局前置守卫
|
|
23
|
-
router.beforeEach(async (to) => {
|
|
24
|
-
// const canAccess = await canUserAccess(to)
|
|
25
|
-
// if (!canAccess) {
|
|
26
|
-
// return {
|
|
27
|
-
// name: 'Login',
|
|
28
|
-
// query: { redirect: to.name?.toString() }
|
|
29
|
-
// }
|
|
30
|
-
// }
|
|
31
|
-
});
|
|
32
|
-
return router;
|
|
33
|
-
};
|
|
34
|
-
// 路由跳转
|
|
35
|
-
const routerPush = async (to, router) => {
|
|
36
|
-
try {
|
|
37
|
-
const failure = await router.push(to);
|
|
38
|
-
return failure;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
console.warn('[router.push] 失败', {
|
|
42
|
-
code: 'ROUTER_NOT_MATCH',
|
|
43
|
-
message: '未匹配到有效路由',
|
|
44
|
-
error: to || e,
|
|
45
|
-
timestamp: new Date().toISOString()
|
|
46
|
-
});
|
|
47
|
-
router.push({ name: '404' });
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
// 路由替换
|
|
51
|
-
const routerReplace = async (to, router) => {
|
|
52
|
-
try {
|
|
53
|
-
const failure = await router.replace(to);
|
|
54
|
-
return failure;
|
|
55
|
-
}
|
|
56
|
-
catch (e) {
|
|
57
|
-
console.warn('[router.replace] 失败', {
|
|
58
|
-
code: 'ROUTER_NOT_MATCH',
|
|
59
|
-
message: '未匹配到有效路由',
|
|
60
|
-
error: to || e,
|
|
61
|
-
timestamp: new Date().toISOString()
|
|
62
|
-
});
|
|
63
|
-
router.replace({ name: '404' });
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
// 获取路由
|
|
67
|
-
const getRoutes = (router) => {
|
|
68
|
-
const temp = [];
|
|
69
|
-
for (const route of router.getRoutes()) {
|
|
70
|
-
temp.push({
|
|
71
|
-
name: route.name,
|
|
72
|
-
path: route.path,
|
|
73
|
-
meta: route.meta
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return temp;
|
|
77
|
-
};
|
|
78
|
-
// 加载动态路由
|
|
79
|
-
const setupDynamicRoutes = async (router, layoutName = LAYOUT_NAME, userRoutes, modulesFileList) => {
|
|
80
|
-
menuToRoute(router, layoutName, modulesFileList, userRoutes, undefined);
|
|
81
|
-
};
|
|
82
|
-
// 组件加载器
|
|
83
|
-
const getComponentLoader = (safePath, modulesFileList) => {
|
|
84
|
-
return modulesFileList[`/src/views${safePath}.vue`];
|
|
85
|
-
};
|
|
86
|
-
// 将菜单项转换为路由记录
|
|
87
|
-
const menuToRoute = async (router, layoutName, modulesFileList, menus, parent) => {
|
|
88
|
-
for (const menu of menus) {
|
|
89
|
-
menu.meta.fullPathTitle = parent
|
|
90
|
-
? parent.meta.fullPathTitle + ',' + menu.meta.title
|
|
91
|
-
: menu.meta.title;
|
|
92
|
-
// 当前项若没有component,则为目录,直接递归处理
|
|
93
|
-
if (!menu.component) {
|
|
94
|
-
if (menu.children && menu.children.length > 0) {
|
|
95
|
-
await menuToRoute(router, layoutName, modulesFileList, menu.children, menu);
|
|
96
|
-
}
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
// 安全处理组件路径
|
|
100
|
-
const safePath = menu.component.replace(/[^a-zA-Z0-9/._-]/g, '');
|
|
101
|
-
if (!safePath.startsWith('/') || safePath.includes('..')) {
|
|
102
|
-
console.warn('[Router] 组件加载失败', {
|
|
103
|
-
code: 'INVALID_COMPONENT_PATH',
|
|
104
|
-
message: `组件路径拼写不符合规则,应以 '/' 开头且不能包含 '..',请检查 component 字段是否配置正确`,
|
|
105
|
-
menu: {
|
|
106
|
-
path: menu.path,
|
|
107
|
-
name: menu.name,
|
|
108
|
-
component: menu.component
|
|
109
|
-
},
|
|
110
|
-
timestamp: new Date().toISOString()
|
|
111
|
-
});
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
// 获取组件加载器
|
|
115
|
-
const loader = getComponentLoader(safePath, modulesFileList);
|
|
116
|
-
if (!loader) {
|
|
117
|
-
console.warn('[Router] 组件加载失败', {
|
|
118
|
-
code: 'COMPONENT_NOT_FOUND',
|
|
119
|
-
message: `组件加载器无效,请检查 component 字段是否配置正确`,
|
|
120
|
-
menu: {
|
|
121
|
-
path: menu.path,
|
|
122
|
-
name: menu.name,
|
|
123
|
-
component: menu.component
|
|
124
|
-
},
|
|
125
|
-
timestamp: new Date().toISOString()
|
|
126
|
-
});
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
// 构建路由记录
|
|
130
|
-
const routeRecord = {
|
|
131
|
-
name: menu.name,
|
|
132
|
-
path: menu.path,
|
|
133
|
-
meta: menu.meta,
|
|
134
|
-
redirect: menu.redirect,
|
|
135
|
-
component: () => loader()
|
|
136
|
-
};
|
|
137
|
-
// 根据 global 字段决定添加为全局路由还是布局子路由
|
|
138
|
-
if (menu.meta?.global) {
|
|
139
|
-
router.addRoute(routeRecord);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
router.addRoute(layoutName, routeRecord);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute };
|
package/dist/router/index.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : @jnrs/vue-core/router
|
|
5
|
-
* @Date : 2025/11/05
|
|
6
|
-
* @Desc. : vue-router 封装
|
|
7
|
-
*/
|
|
8
|
-
export type * from 'vue-router';
|
|
9
|
-
export type * from './types';
|
|
10
|
-
export { useRouter, useRoute } from 'vue-router';
|
|
11
|
-
export { createVueRouter, asyncGenerateRoute, handleRouter, getRoutes } from './createVueRouter';
|
package/dist/router/index.js
DELETED
package/dist/router/router.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { useRoute, type Router, type RouterOptions, type RouteLocationRaw } from 'vue-router';
|
|
9
|
-
import type { MenuItem, ModulesFileList } from './types';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
declare const createVueRouter: (options: Partial<RouterOptions>) => Router;
|
|
16
|
-
declare const routerPush: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
17
|
-
declare const routerReplace: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
18
|
-
declare const getRoutes: (router: Router) => MenuItem[];
|
|
19
|
-
declare const setupDynamicRoutes: (router: Router, layoutName: string | undefined, userRoutes: MenuItem[], modulesFileList: ModulesFileList) => Promise<void>;
|
|
20
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute, type ModulesFileList };
|
package/dist/router/router.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { createRouter, useRoute } from 'vue-router';
|
|
9
|
-
import { DEFAULT_OPTIONS, LAYOUT_NAME } from './defaults';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
const createVueRouter = (options) => {
|
|
16
|
-
const router = createRouter({ ...DEFAULT_OPTIONS, ...options });
|
|
17
|
-
// 获取用户权限
|
|
18
|
-
// const canUserAccess = async (to: RouteLocationNormalized) => {
|
|
19
|
-
// const isAuthenticated = true
|
|
20
|
-
// return to.name === 'Login' || to.meta.noAuth || isAuthenticated
|
|
21
|
-
// }
|
|
22
|
-
// 全局前置守卫
|
|
23
|
-
router.beforeEach(async (to) => {
|
|
24
|
-
// const canAccess = await canUserAccess(to)
|
|
25
|
-
// if (!canAccess) {
|
|
26
|
-
// return {
|
|
27
|
-
// name: 'Login',
|
|
28
|
-
// query: { redirect: to.name?.toString() }
|
|
29
|
-
// }
|
|
30
|
-
// }
|
|
31
|
-
});
|
|
32
|
-
return router;
|
|
33
|
-
};
|
|
34
|
-
// 路由跳转
|
|
35
|
-
const routerPush = async (to, router) => {
|
|
36
|
-
try {
|
|
37
|
-
const failure = await router.push(to);
|
|
38
|
-
return failure;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
console.warn('[router.push] 失败', {
|
|
42
|
-
code: 'ROUTER_NOT_MATCH',
|
|
43
|
-
message: '未匹配到有效路由',
|
|
44
|
-
error: to || e,
|
|
45
|
-
timestamp: new Date().toISOString()
|
|
46
|
-
});
|
|
47
|
-
router.push({ name: '404' });
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
// 路由替换
|
|
51
|
-
const routerReplace = async (to, router) => {
|
|
52
|
-
try {
|
|
53
|
-
const failure = await router.replace(to);
|
|
54
|
-
return failure;
|
|
55
|
-
}
|
|
56
|
-
catch (e) {
|
|
57
|
-
console.warn('[router.replace] 失败', {
|
|
58
|
-
code: 'ROUTER_NOT_MATCH',
|
|
59
|
-
message: '未匹配到有效路由',
|
|
60
|
-
error: to || e,
|
|
61
|
-
timestamp: new Date().toISOString()
|
|
62
|
-
});
|
|
63
|
-
router.replace({ name: '404' });
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
// 获取路由
|
|
67
|
-
const getRoutes = (router) => {
|
|
68
|
-
const temp = [];
|
|
69
|
-
for (const route of router.getRoutes()) {
|
|
70
|
-
temp.push({
|
|
71
|
-
name: route.name,
|
|
72
|
-
path: route.path,
|
|
73
|
-
meta: route.meta
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return temp;
|
|
77
|
-
};
|
|
78
|
-
// 加载动态路由
|
|
79
|
-
const setupDynamicRoutes = async (router, layoutName = LAYOUT_NAME, userRoutes, modulesFileList) => {
|
|
80
|
-
menuToRoute(router, layoutName, modulesFileList, userRoutes, undefined);
|
|
81
|
-
};
|
|
82
|
-
// 组件加载器
|
|
83
|
-
const getComponentLoader = (safePath, modulesFileList) => {
|
|
84
|
-
return modulesFileList[`/src/views${safePath}.vue`];
|
|
85
|
-
};
|
|
86
|
-
// 将菜单项转换为路由记录
|
|
87
|
-
const menuToRoute = async (router, layoutName, modulesFileList, menus, parent) => {
|
|
88
|
-
for (const menu of menus) {
|
|
89
|
-
menu.meta.fullPathTitle = parent
|
|
90
|
-
? parent.meta.fullPathTitle + ',' + menu.meta.title
|
|
91
|
-
: menu.meta.title;
|
|
92
|
-
// 当前项若没有component,则为目录,直接递归处理
|
|
93
|
-
if (!menu.component) {
|
|
94
|
-
if (menu.children && menu.children.length > 0) {
|
|
95
|
-
await menuToRoute(router, layoutName, modulesFileList, menu.children, menu);
|
|
96
|
-
}
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
// 安全处理组件路径
|
|
100
|
-
const safePath = menu.component.replace(/[^a-zA-Z0-9/._-]/g, '');
|
|
101
|
-
if (!safePath.startsWith('/') || safePath.includes('..')) {
|
|
102
|
-
console.warn('[Router] 组件加载失败', {
|
|
103
|
-
code: 'INVALID_COMPONENT_PATH',
|
|
104
|
-
message: `组件路径拼写不符合规则,应以 '/' 开头且不能包含 '..',请检查 component 字段是否配置正确`,
|
|
105
|
-
menu: {
|
|
106
|
-
path: menu.path,
|
|
107
|
-
name: menu.name,
|
|
108
|
-
component: menu.component
|
|
109
|
-
},
|
|
110
|
-
timestamp: new Date().toISOString()
|
|
111
|
-
});
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
// 获取组件加载器
|
|
115
|
-
const loader = getComponentLoader(safePath, modulesFileList);
|
|
116
|
-
if (!loader) {
|
|
117
|
-
console.warn('[Router] 组件加载失败', {
|
|
118
|
-
code: 'COMPONENT_NOT_FOUND',
|
|
119
|
-
message: `组件加载器无效,请检查 component 字段是否配置正确`,
|
|
120
|
-
menu: {
|
|
121
|
-
path: menu.path,
|
|
122
|
-
name: menu.name,
|
|
123
|
-
component: menu.component
|
|
124
|
-
},
|
|
125
|
-
timestamp: new Date().toISOString()
|
|
126
|
-
});
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
// 构建路由记录
|
|
130
|
-
const routeRecord = {
|
|
131
|
-
name: menu.name,
|
|
132
|
-
path: menu.path,
|
|
133
|
-
meta: menu.meta,
|
|
134
|
-
redirect: menu.redirect,
|
|
135
|
-
component: () => loader()
|
|
136
|
-
};
|
|
137
|
-
// 根据 global 字段决定添加为全局路由还是布局子路由
|
|
138
|
-
if (menu.meta?.global) {
|
|
139
|
-
router.addRoute(routeRecord);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
router.addRoute(layoutName, routeRecord);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute };
|
package/dist/router/types.d.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { RouteRecordRaw, RouteMeta, RouterOptions, RouteLocationNormalizedGeneric } from 'vue-router';
|
|
2
|
-
export interface MenuItem {
|
|
3
|
-
meta: RouteMeta;
|
|
4
|
-
path: string;
|
|
5
|
-
name?: string;
|
|
6
|
-
todoCount?: number;
|
|
7
|
-
component?: string;
|
|
8
|
-
redirect?: string;
|
|
9
|
-
children?: MenuItem[];
|
|
10
|
-
}
|
|
11
|
-
export interface RouteModule {
|
|
12
|
-
default: RouteRecordRaw | RouteRecordRaw[];
|
|
13
|
-
}
|
|
14
|
-
export type FileModules = Record<string, () => Promise<RouteModule>>;
|
|
15
|
-
export interface CreateVueRouter<GC = unknown> {
|
|
16
|
-
options: Partial<RouterOptions>;
|
|
17
|
-
fileModules: FileModules;
|
|
18
|
-
layoutName?: string;
|
|
19
|
-
globalComponent?: Promise<GC>;
|
|
20
|
-
handleBeforeEach?: (to: RouteLocationNormalizedGeneric) => void;
|
|
21
|
-
}
|
package/dist/router/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 默认配置项
|
|
3
|
-
* @property history - 路由历史模式
|
|
4
|
-
* @property routes - 路由记录数组
|
|
5
|
-
*/
|
|
6
|
-
declare const DEFAULT_OPTIONS: {
|
|
7
|
-
history: import("vue-router").RouterHistory;
|
|
8
|
-
routes: never[];
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* 默认布局名称
|
|
12
|
-
* @description 用于标识应用的主布局组件
|
|
13
|
-
*/
|
|
14
|
-
declare const LAYOUT_NAME = "Layout";
|
|
15
|
-
export { DEFAULT_OPTIONS, LAYOUT_NAME };
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { createWebHistory } from 'vue-router';
|
|
2
|
-
/**
|
|
3
|
-
* 默认配置项
|
|
4
|
-
* @property history - 路由历史模式
|
|
5
|
-
* @property routes - 路由记录数组
|
|
6
|
-
*/
|
|
7
|
-
const DEFAULT_OPTIONS = {
|
|
8
|
-
history: createWebHistory(),
|
|
9
|
-
routes: []
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* 默认布局名称
|
|
13
|
-
* @description 用于标识应用的主布局组件
|
|
14
|
-
*/
|
|
15
|
-
const LAYOUT_NAME = 'Layout';
|
|
16
|
-
export { DEFAULT_OPTIONS, LAYOUT_NAME };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { useRoute, type Router, type RouterOptions, type RouteLocationRaw } from 'vue-router';
|
|
9
|
-
import type { MenuItem, ModulesFileList } from './types';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
declare const createVueRouter: (options: Partial<RouterOptions>) => Router;
|
|
16
|
-
declare const routerPush: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
17
|
-
declare const routerReplace: (to: RouteLocationRaw, router: Router) => Promise<void | import("vue-router").NavigationFailure>;
|
|
18
|
-
declare const getRoutes: (router: Router) => MenuItem[];
|
|
19
|
-
declare const setupDynamicRoutes: (router: Router, layoutName: string | undefined, userRoutes: MenuItem[], modulesFileList: ModulesFileList) => Promise<void>;
|
|
20
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute, type ModulesFileList };
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author : TanRui
|
|
3
|
-
* @WeChat : Tan578853789
|
|
4
|
-
* @File : index.ts
|
|
5
|
-
* @Date : 2025/11/07
|
|
6
|
-
* @Desc. : 路由
|
|
7
|
-
*/
|
|
8
|
-
import { createRouter, useRoute } from 'vue-router';
|
|
9
|
-
import { DEFAULT_OPTIONS, LAYOUT_NAME } from './defaults';
|
|
10
|
-
/**
|
|
11
|
-
* 创建 vue-router 实例
|
|
12
|
-
* @param options - 配置项
|
|
13
|
-
* @returns router 实例
|
|
14
|
-
*/
|
|
15
|
-
const createVueRouter = (options) => {
|
|
16
|
-
const router = createRouter({ ...DEFAULT_OPTIONS, ...options });
|
|
17
|
-
// 获取用户权限
|
|
18
|
-
// const canUserAccess = async (to: RouteLocationNormalized) => {
|
|
19
|
-
// const isAuthenticated = true
|
|
20
|
-
// return to.name === 'Login' || to.meta.noAuth || isAuthenticated
|
|
21
|
-
// }
|
|
22
|
-
// 全局前置守卫
|
|
23
|
-
router.beforeEach(async (to) => {
|
|
24
|
-
// const canAccess = await canUserAccess(to)
|
|
25
|
-
// if (!canAccess) {
|
|
26
|
-
// return {
|
|
27
|
-
// name: 'Login',
|
|
28
|
-
// query: { redirect: to.name?.toString() }
|
|
29
|
-
// }
|
|
30
|
-
// }
|
|
31
|
-
});
|
|
32
|
-
return router;
|
|
33
|
-
};
|
|
34
|
-
// 路由跳转
|
|
35
|
-
const routerPush = async (to, router) => {
|
|
36
|
-
try {
|
|
37
|
-
const failure = await router.push(to);
|
|
38
|
-
return failure;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
console.warn('[router.push] 失败', {
|
|
42
|
-
code: 'ROUTER_NOT_MATCH',
|
|
43
|
-
message: '未匹配到有效路由',
|
|
44
|
-
error: to || e,
|
|
45
|
-
timestamp: new Date().toISOString()
|
|
46
|
-
});
|
|
47
|
-
router.push({ name: '404' });
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
// 路由替换
|
|
51
|
-
const routerReplace = async (to, router) => {
|
|
52
|
-
try {
|
|
53
|
-
const failure = await router.replace(to);
|
|
54
|
-
return failure;
|
|
55
|
-
}
|
|
56
|
-
catch (e) {
|
|
57
|
-
console.warn('[router.replace] 失败', {
|
|
58
|
-
code: 'ROUTER_NOT_MATCH',
|
|
59
|
-
message: '未匹配到有效路由',
|
|
60
|
-
error: to || e,
|
|
61
|
-
timestamp: new Date().toISOString()
|
|
62
|
-
});
|
|
63
|
-
router.replace({ name: '404' });
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
// 获取路由
|
|
67
|
-
const getRoutes = (router) => {
|
|
68
|
-
const temp = [];
|
|
69
|
-
for (const route of router.getRoutes()) {
|
|
70
|
-
temp.push({
|
|
71
|
-
name: route.name,
|
|
72
|
-
path: route.path,
|
|
73
|
-
meta: route.meta
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
return temp;
|
|
77
|
-
};
|
|
78
|
-
// 加载动态路由
|
|
79
|
-
const setupDynamicRoutes = async (router, layoutName = LAYOUT_NAME, userRoutes, modulesFileList) => {
|
|
80
|
-
menuToRoute(router, layoutName, modulesFileList, userRoutes, undefined);
|
|
81
|
-
};
|
|
82
|
-
// 组件加载器
|
|
83
|
-
const getComponentLoader = (safePath, modulesFileList) => {
|
|
84
|
-
return modulesFileList[`/src/views${safePath}.vue`];
|
|
85
|
-
};
|
|
86
|
-
// 将菜单项转换为路由记录
|
|
87
|
-
const menuToRoute = async (router, layoutName, modulesFileList, menus, parent) => {
|
|
88
|
-
for (const menu of menus) {
|
|
89
|
-
menu.meta.fullPathTitle = parent
|
|
90
|
-
? parent.meta.fullPathTitle + ',' + menu.meta.title
|
|
91
|
-
: menu.meta.title;
|
|
92
|
-
// 当前项若没有component,则为目录,直接递归处理
|
|
93
|
-
if (!menu.component) {
|
|
94
|
-
if (menu.children && menu.children.length > 0) {
|
|
95
|
-
await menuToRoute(router, layoutName, modulesFileList, menu.children, menu);
|
|
96
|
-
}
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
// 安全处理组件路径
|
|
100
|
-
const safePath = menu.component.replace(/[^a-zA-Z0-9/._-]/g, '');
|
|
101
|
-
if (!safePath.startsWith('/') || safePath.includes('..')) {
|
|
102
|
-
console.warn('[Router] 组件加载失败', {
|
|
103
|
-
code: 'INVALID_COMPONENT_PATH',
|
|
104
|
-
message: `组件路径拼写不符合规则,应以 '/' 开头且不能包含 '..',请检查 component 字段是否配置正确`,
|
|
105
|
-
menu: {
|
|
106
|
-
path: menu.path,
|
|
107
|
-
name: menu.name,
|
|
108
|
-
component: menu.component
|
|
109
|
-
},
|
|
110
|
-
timestamp: new Date().toISOString()
|
|
111
|
-
});
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
// 获取组件加载器
|
|
115
|
-
const loader = getComponentLoader(safePath, modulesFileList);
|
|
116
|
-
if (!loader) {
|
|
117
|
-
console.warn('[Router] 组件加载失败', {
|
|
118
|
-
code: 'COMPONENT_NOT_FOUND',
|
|
119
|
-
message: `组件加载器无效,请检查 component 字段是否配置正确`,
|
|
120
|
-
menu: {
|
|
121
|
-
path: menu.path,
|
|
122
|
-
name: menu.name,
|
|
123
|
-
component: menu.component
|
|
124
|
-
},
|
|
125
|
-
timestamp: new Date().toISOString()
|
|
126
|
-
});
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
// 构建路由记录
|
|
130
|
-
const routeRecord = {
|
|
131
|
-
name: menu.name,
|
|
132
|
-
path: menu.path,
|
|
133
|
-
meta: menu.meta,
|
|
134
|
-
redirect: menu.redirect,
|
|
135
|
-
component: () => loader()
|
|
136
|
-
};
|
|
137
|
-
// 根据 global 字段决定添加为全局路由还是布局子路由
|
|
138
|
-
if (menu.meta?.global) {
|
|
139
|
-
router.addRoute(routeRecord);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
router.addRoute(layoutName, routeRecord);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
export { createVueRouter, setupDynamicRoutes, routerPush, routerReplace, getRoutes, useRoute };
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { RouteRecordNameGeneric, RouteRecordRaw, RouteMeta } from 'vue-router';
|
|
2
|
-
export interface MenuItem {
|
|
3
|
-
name: string | RouteRecordNameGeneric;
|
|
4
|
-
path: string;
|
|
5
|
-
meta: RouteMeta;
|
|
6
|
-
todoCount?: number;
|
|
7
|
-
component?: string;
|
|
8
|
-
redirect?: string;
|
|
9
|
-
children?: MenuItem[];
|
|
10
|
-
}
|
|
11
|
-
export interface RouteModule {
|
|
12
|
-
default: RouteRecordRaw | RouteRecordRaw[];
|
|
13
|
-
}
|
|
14
|
-
export type ModulesFileList = Record<string, () => Promise<RouteModule>>;
|
|
File without changes
|