Files
CID/scripts/package/README.md

160 lines
4.1 KiB
Markdown
Raw Normal View History

2025-10-30 19:34:04 +08:00
# 综述
目前菜单鉴权由套餐管理提供,由租户购买套餐->分发授权到角色,个人的权限是角色授权与套餐包授权的交集。
本脚本方案依赖 `appList` `navList``menuList` 三个模块生成完整的路由和菜单管理。
- `appList` 负责管理功能模块与下属的页面列表
- `navList` 负责管理由 `appName` 组合成的复合菜单
- `menuList` 负责使用 `appName``navName` 组合完整的菜单列表,控制菜单排序
最终生成 **禁止手动修改生成产物!**
- scripts/package/sql/sys_app.sql // 提供给后端做应用权限管理
- scripts/package/sql/sys_function.sql // 提供给后端做应用权限管理
- src/i18n/pages/route/zh-cn.ts // 路由i18n信息
- src/i18n/pages/route/en.ts // 路由i18n信息
- src/router/modules.ts // 作为前端路由集合
- src/router/menus.ts // 作为前端菜单集合
- src/router/powers.ts // 作为授权树集合
### appList
- 描述
应用程序列表
- 数据结构
数组
- 属性说明
```ts
interface AppItem {
name: string; // 应用程序名称
zhCn: string; // 应用程序中文名称
en: string; // 应用程序英文名称
functions?: string[]; // 额外功能点列表(可能不存在)
pages?: PageItem[]; // 应用程序页面列表(可能不存在)
}
interface PageItem {
name: string; // 应用程序名称
zhCn: string; // 应用程序中文名称
en: string; // 应用程序英文名称
path: string; // 路由地址
component: () => Promise<typeof import('**/*.vue')>; // 组件地址 路径为src下的有效路径
meta: {
icon: string; // 页面图标
parentName?: PageItem['name']; // 页面父节点名称(可能不存在)
isDev: boolean; // 页面开发中忽略授权信息
};
}
```
- 示例数据
```typescript
[
{
name: 'task',
zhCn: '任务中心',
en: 'Task Center',
functions: ['shutdown'],
pages: [
{
name: 'taskPending',
zhCn: '待办任务',
en: 'Pending Task',
path: '/task/pending',
component: '/@/views/flow/task/pending.vue',
meta: {
icon: 'fa fa-flag-checkered',
},
},
{
name: 'taskStarted',
zhCn: '发起任务',
en: 'Started Task',
path: '/task/started',
component: '/@/views/flow/task/started.vue',
meta: {
icon: 'fa fa-plane',
},
},
],
},
];
```
如上述示例 functions 的值为['shutdown'] 那么它最终生成的功能点为: task_view、task_add、task_edit、task_del、task_shutdown.
```typescript
{
name: 'meiyun_packageSample',
zhCn: '包装样品',
en: 'Package Samples',
},
```
如上述示例 appList 的值可以没有 pages那么它仅仅产生功能点而不产生对应路由
### menuList
- 描述
用于针对 appList 来进行路由组装的菜单列表
- 数据结构
数组
- 属性说明
appName: 必须包含appList 的节点 name
subApps: 可能包含,子应用列表,作用与 appName 相同
- 作用
把所有的 pages 的路由都包含进来
如果 pages 里的路由 meta 包含了 parentName则不会产生 menu
- 示例数据
```typescript
[
{
appName: 'meiyun_product',
subApps: [
'meiyun_formula',
'meiyun_formulaMakeupDemo',
'meiyun_formulaComparison',
'meiyun_sampleTesting',
'meiyun_packMaterialProofing',
'meiyun_material',
'meiyun_manufacturer',
'meiyun_supplier',
'meiyun_formulation_review',
'meiyun_packing',
],
},
];
```
### 开发过程
```flow
start=>start: 开始
cond1=>condition: 是否已存在app(是或否?)
sub1=>operation: 在appList中添加app
cond2=>condition: 是否已存在page(是或否?)
sub2=>operation: 在app中添加page
cond3=>condition: 是否需要添加进navList(是或否?)
sub3=>operation: 在navList中添加app
cond4=>condition: 是否需要添加进menuList(是或否?)
sub4=>operation: 在menuList中添加app或nav
sub5=>operation: 执行scripts/package/build.sh生成相关信息
e=>end: 结束框
start->cond1
cond1(no)->sub1->cond2
cond1(yes)->cond2
cond2(no)->sub2->cond3
cond2(yes)->cond3
cond3(yes)->sub3->cond4
cond3(no)->cond4
cond4(yes)->sub4->sub5
cond4(no)->sub5->e
```