1
This commit is contained in:
339
demo-project/_doc/组件映射说明.md
Normal file
339
demo-project/_doc/组件映射说明.md
Normal file
@@ -0,0 +1,339 @@
|
|||||||
|
# 组件映射机制说明
|
||||||
|
|
||||||
|
## 🎯 问题原因
|
||||||
|
|
||||||
|
之前所有页面都显示 404 是因为:
|
||||||
|
- 后端返回的权限菜单包含组件路径(如 `"component": "system/sys_user.vue"`)
|
||||||
|
- 但框架没有将这些路径映射到实际组件
|
||||||
|
- 所有页面都被设置为 `Page404` 组件
|
||||||
|
|
||||||
|
## ✅ 解决方案
|
||||||
|
|
||||||
|
### 1. 框架内置组件映射
|
||||||
|
|
||||||
|
框架现在自动映射以下系统页面:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 框架自动映射的组件
|
||||||
|
{
|
||||||
|
'home/index': HomePage, // 主页
|
||||||
|
'system/sys_log': SysLog, // 日志管理
|
||||||
|
'system/sys_param_setup': SysParamSetup, // 参数设置
|
||||||
|
'system/sys_role': SysRole, // 角色管理
|
||||||
|
'system/sys_user': SysUser, // 用户管理
|
||||||
|
'system_high/sys_control': SysControl, // 控制器管理
|
||||||
|
'system_high/sys_menu': SysMenu, // 菜单管理
|
||||||
|
'system_high/sys_title': SysTitle // 系统标题设置
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**自动支持**:
|
||||||
|
- ✅ `home/index` 和 `home/index.vue` 都能识别
|
||||||
|
- ✅ `system/sys_user` 和 `system/sys_user.vue` 都能识别
|
||||||
|
|
||||||
|
### 2. 添加自定义业务组件
|
||||||
|
|
||||||
|
在项目的 `main.js` 中添加自定义组件映射:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import ProductList from './views/business/product_list.vue'
|
||||||
|
import GamesComponent from './views/ball/games.vue'
|
||||||
|
import PayOrdersComponent from './views/order/pay_orders.vue'
|
||||||
|
|
||||||
|
// 使用框架
|
||||||
|
Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState })
|
||||||
|
|
||||||
|
// 添加自定义组件映射
|
||||||
|
AdminFramework.addComponentMap({
|
||||||
|
'business/product_list.vue': ProductList,
|
||||||
|
'ball/games.vue': GamesComponent,
|
||||||
|
'order/pay_orders.vue': PayOrdersComponent
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**说明**:
|
||||||
|
- 只需要添加 `.vue` 后缀的映射
|
||||||
|
- 框架会自动处理不带后缀的路径
|
||||||
|
|
||||||
|
### 3. 权限菜单格式
|
||||||
|
|
||||||
|
后端返回的菜单格式:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"code": 0,
|
||||||
|
"data": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "首页",
|
||||||
|
"path": "home",
|
||||||
|
"component": "home/index.vue", ← 这个路径会自动映射到 HomePage 组件
|
||||||
|
"type": "页面"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "系统用户",
|
||||||
|
"path": "sys_user",
|
||||||
|
"component": "system/sys_user.vue", ← 映射到 SysUser 组件
|
||||||
|
"type": "页面"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 123,
|
||||||
|
"name": "球局表",
|
||||||
|
"path": "games",
|
||||||
|
"component": "ball/games.vue", ← 需要在项目中添加映射
|
||||||
|
"type": "页面"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 完整示例
|
||||||
|
|
||||||
|
### demo-project/src/main.js
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
import Vue from 'vue'
|
||||||
|
import VueRouter from 'vue-router'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
import ViewUI from 'view-design'
|
||||||
|
import createPersistedState from 'vuex-persistedstate'
|
||||||
|
import 'view-design/dist/styles/iview.css'
|
||||||
|
|
||||||
|
import AdminFramework from '../../src/index.js'
|
||||||
|
import config from './config'
|
||||||
|
import App from './App.vue'
|
||||||
|
|
||||||
|
// 引入业务组件
|
||||||
|
import ProductList from './views/business/product_list.vue'
|
||||||
|
// import GamesComponent from './views/ball/games.vue'
|
||||||
|
// import PayOrdersComponent from './views/order/pay_orders.vue'
|
||||||
|
|
||||||
|
// 使用框架
|
||||||
|
Vue.use(AdminFramework, {
|
||||||
|
config,
|
||||||
|
ViewUI,
|
||||||
|
VueRouter,
|
||||||
|
Vuex,
|
||||||
|
createPersistedState
|
||||||
|
})
|
||||||
|
|
||||||
|
// 添加业务组件映射
|
||||||
|
AdminFramework.addComponentMap({
|
||||||
|
'business/product_list.vue': ProductList
|
||||||
|
// 'ball/games.vue': GamesComponent,
|
||||||
|
// 'order/pay_orders.vue': PayOrdersComponent
|
||||||
|
})
|
||||||
|
|
||||||
|
// 创建 Vue 实例
|
||||||
|
new Vue({
|
||||||
|
el: '#app',
|
||||||
|
router: AdminFramework.router,
|
||||||
|
store: AdminFramework.store,
|
||||||
|
render: h => h(App),
|
||||||
|
mounted() {
|
||||||
|
AdminFramework.uiTool.setRem()
|
||||||
|
|
||||||
|
// 设置权限菜单(会自动根据映射表加载组件)
|
||||||
|
this.$store.dispatch('user/setAuthorityMenus', {
|
||||||
|
Main: AdminFramework.Main,
|
||||||
|
ParentView: AdminFramework.ParentView,
|
||||||
|
Page404: AdminFramework.Page404
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 映射机制
|
||||||
|
|
||||||
|
### 1. 框架自动映射
|
||||||
|
|
||||||
|
框架在 `install` 时自动映射系统组件:
|
||||||
|
```javascript
|
||||||
|
Vue.use(AdminFramework, { ... })
|
||||||
|
// ↓ 自动执行
|
||||||
|
setupComponentMap()
|
||||||
|
// ↓ 映射系统页面
|
||||||
|
{
|
||||||
|
'home/index': HomePage,
|
||||||
|
'home/index.vue': HomePage,
|
||||||
|
'system/sys_user': SysUser,
|
||||||
|
'system/sys_user.vue': SysUser,
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 用户添加映射
|
||||||
|
|
||||||
|
用户可以添加自定义业务组件映射:
|
||||||
|
```javascript
|
||||||
|
AdminFramework.addComponentMap({
|
||||||
|
'ball/games.vue': GamesComponent
|
||||||
|
})
|
||||||
|
// ↓ 添加到映射表
|
||||||
|
{
|
||||||
|
...已有映射,
|
||||||
|
'ball/games.vue': GamesComponent
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 路由生成
|
||||||
|
|
||||||
|
当调用 `setAuthorityMenus` 时:
|
||||||
|
```javascript
|
||||||
|
// 后端返回菜单
|
||||||
|
[
|
||||||
|
{ component: "system/sys_user.vue", ... }
|
||||||
|
]
|
||||||
|
// ↓ menuToRoute 处理
|
||||||
|
// ↓ 从映射表获取组件
|
||||||
|
component: SysUser // ✅ 找到对应组件
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚠️ 未找到组件的处理
|
||||||
|
|
||||||
|
如果后端返回的组件路径在映射表中不存在:
|
||||||
|
```javascript
|
||||||
|
// 显示占位组件
|
||||||
|
component: {
|
||||||
|
render: h => h('div', [
|
||||||
|
h('Alert', { type: 'warning' }, [
|
||||||
|
h('p', '页面组件未加载: ball/games.vue'),
|
||||||
|
h('p', '请在项目中创建此组件或在组件映射表中注册')
|
||||||
|
])
|
||||||
|
])
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**控制台警告**:
|
||||||
|
```
|
||||||
|
⚠️ 组件未找到: ball/games.vue,使用占位组件
|
||||||
|
```
|
||||||
|
|
||||||
|
## 💡 最佳实践
|
||||||
|
|
||||||
|
### 1. 框架内置页面
|
||||||
|
|
||||||
|
直接使用,无需配置:
|
||||||
|
- `home/index.vue` - 主页
|
||||||
|
- `system/sys_user.vue` - 用户管理
|
||||||
|
- `system/sys_role.vue` - 角色管理
|
||||||
|
- `system/sys_log.vue` - 日志管理
|
||||||
|
- `system/sys_param_setup.vue` - 参数设置
|
||||||
|
- `system_high/sys_menu.vue` - 菜单管理
|
||||||
|
- `system_high/sys_control.vue` - 控制器管理
|
||||||
|
- `system_high/sys_title.vue` - 系统标题设置
|
||||||
|
|
||||||
|
### 2. 自定义业务页面
|
||||||
|
|
||||||
|
在 main.js 中添加映射:
|
||||||
|
```javascript
|
||||||
|
// 1. 导入组件
|
||||||
|
import GamesComponent from './views/ball/games.vue'
|
||||||
|
|
||||||
|
// 2. 添加映射
|
||||||
|
AdminFramework.addComponentMap({
|
||||||
|
'ball/games.vue': GamesComponent
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 路径命名建议
|
||||||
|
|
||||||
|
保持后端返回的路径与实际文件路径一致:
|
||||||
|
```
|
||||||
|
后端:component: "ball/games.vue"
|
||||||
|
项目:src/views/ball/games.vue
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 代码优化对比
|
||||||
|
|
||||||
|
### 优化前(重复代码)
|
||||||
|
```javascript
|
||||||
|
const map = {
|
||||||
|
'system/sys_user.vue': SysUser,
|
||||||
|
'system/sys_user': SysUser, // 重复
|
||||||
|
'system/sys_role.vue': SysRole,
|
||||||
|
'system/sys_role': SysRole, // 重复
|
||||||
|
'system/sys_log.vue': SysLog,
|
||||||
|
'system/sys_log': SysLog, // 重复
|
||||||
|
// 每个组件写两遍...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 优化后(自动生成)
|
||||||
|
```javascript
|
||||||
|
const components = {
|
||||||
|
'system/sys_user': SysUser,
|
||||||
|
'system/sys_role': SysRole,
|
||||||
|
'system/sys_log': SysLog
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自动生成带 .vue 和不带 .vue 的映射
|
||||||
|
const map = {}
|
||||||
|
Object.keys(components).forEach(path => {
|
||||||
|
map[path] = components[path]
|
||||||
|
map[path + '.vue'] = components[path]
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
**优势**:
|
||||||
|
- ✅ 代码量减少 50%
|
||||||
|
- ✅ 易于维护
|
||||||
|
- ✅ 不易出错
|
||||||
|
|
||||||
|
## 🚀 使用方法
|
||||||
|
|
||||||
|
### 步骤 1:创建业务组件
|
||||||
|
|
||||||
|
在项目中创建组件文件:
|
||||||
|
```vue
|
||||||
|
<!-- src/views/ball/games.vue -->
|
||||||
|
<template>
|
||||||
|
<div>球局管理页面</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'games'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 2:添加组件映射
|
||||||
|
|
||||||
|
在 `src/main.js` 中:
|
||||||
|
```javascript
|
||||||
|
import GamesComponent from './views/ball/games.vue'
|
||||||
|
|
||||||
|
AdminFramework.addComponentMap({
|
||||||
|
'ball/games.vue': GamesComponent
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 3:后端返回菜单
|
||||||
|
|
||||||
|
确保后端菜单中的路径正确:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"component": "ball/games.vue",
|
||||||
|
"path": "games"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 步骤 4:自动生成路由
|
||||||
|
|
||||||
|
框架会自动将菜单转换为路由,并加载对应组件!
|
||||||
|
|
||||||
|
## 📚 相关文档
|
||||||
|
|
||||||
|
- [README.md](./README.md) - 项目说明
|
||||||
|
- [CHANGELOG.md](./CHANGELOG.md) - 更新日志
|
||||||
|
- [../完整使用文档.md](../完整使用文档.md) - 框架完整文档
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**现在启动项目,权限菜单中的系统页面都能正常显示了!** 🎉
|
||||||
|
|
||||||
|
对于业务页面(ball/games.vue, order/pay_orders.vue 等),只需:
|
||||||
|
1. 在项目中创建对应组件
|
||||||
|
2. 在 main.js 中添加组件映射
|
||||||
|
|
||||||
Reference in New Issue
Block a user