外观
路由约定
前端路由
在 apps/_base/src/router/router.ts
中我们定义了一个 createRouter
函数,用于创建路由实例。对于路由的 meta
配置,有如下约定:
meta.title
:必填项,表示页面标题,string
类型。meta.requireAuth
:必填项,控制路由是否需要登录或者需要什么权限才能访问。只能为boolean
类型或string[]
类型。若为string[]
,该数组中的值只能是系统支持的角色的key
值,默认为:'guest'
,'normal'
,'vip'
,'svip'
,'admin'
,'super_admin'
。
你可以在 apps
目录下的其他子应用中使用 createRouter
函数。该函数除了创建路由,还会附带以下逻辑:
- 读取路由的
meta.title
信息,将其作为标题显示到浏览器的标签页中,若传空字符串会使用项目根目录下的.env
文件中通过APP_TITLE_*
定义的子应用标题作为默认值。 - 读取路由的
meta.requireAuth
信息,根据其值进行路由守卫的配置。- 若为
true
,则会在路由守卫中检查用户是否登录。若用户未登录,则会弹一个确认框,让用户选择是去登录还是返回首页。 - 若为
false
,则不会检查用户是否登录。直接放行,允许用户访问页面。 - 若为字符串数组,则会检查用户角色是否在该数组中。若传入的是个空数组,则表示不管用户是否登录、是什么角色,都不允许访问该页面。
- 若为
下面我们以 apps/todos/src/router/router.ts
为例,来看看路由的配置:
typescript
import { generateRouter } from "@base/router/router.ts";
import { getPageTitle } from "@base/scripts/MetaUtils";
const router = generateRouter({
routes: [
{
path: "/",
redirect: { name: "kanban" },
meta: { title: "跳转中...", requireAuth: false },
},
{
path: "/kanban",
name: "kanban",
component: () => import("../views/KanbanView.vue"),
meta: { requireAuth: true, title: getPageTitle("看板") },
},
{
path: "/list",
name: "list",
component: () => import("../views/ListView.vue"),
meta: { requireAuth: true, title: getPageTitle("列表") },
},
],
});
export default router;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
后端路由
后端路由定义文件统一保存在 src/routes
中。定义后端路由时,具体 业务逻辑的实现,需要在 src/controllers/*.mts
中定义,不要放在路由定义文件中。路由定义文件应当简洁,主要定义路由及对应的参数和权限校验规则。
一个典型示例如下:
typescript
import express from "express";
import { cGetTodoList, sQueryTodoList } from "#controllers/todo";
import { userMiddleware } from "#middlewares/UserMiddleware";
import { authMiddleware } from "#middlewares/AuthMiddleware";
import { bodyValidateMiddleware } from "#middlewares/BodyValidateMiddleware";
const router = express.Router();
// 查询待办项列表
router.get(
"/list",
bodyValidateMiddleware({ query: sQueryTodoList }),
userMiddleware(),
authMiddleware(),
cGetTodoList,
);
// ...
export default router;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
其中,有几个中间件简单介绍下其作用:
bodyValidateMiddleware
:用于校验请求体参数是否符合定义的 schema,支持校验req.query
、req.body
和req.params
。userMiddleware
:用于从请求中提取用户信息,将其挂载到请求对象上(可通过req.user
访问)。authMiddleware
:用于校验用户是否登录,以及对应角色是否有访问该路由的权限。