1
This commit is contained in:
233
demo-project/_doc/组件映射修复总结.md
Normal file
233
demo-project/_doc/组件映射修复总结.md
Normal file
@@ -0,0 +1,233 @@
|
||||
# 组件映射修复总结
|
||||
|
||||
## ✅ 问题解决
|
||||
|
||||
### 问题:所有页面都显示 404
|
||||
|
||||
**原因**:
|
||||
1. 权限菜单接口返回的组件路径(如 `ball/games.vue`)没有映射到实际组件
|
||||
2. 之前的代码将所有未知组件都设置为 `Page404`
|
||||
|
||||
### 解决方案
|
||||
|
||||
创建了完整的组件映射机制:
|
||||
- ✅ 框架自动映射系统组件
|
||||
- ✅ 支持用户配置业务组件映射
|
||||
- ✅ 自动处理带和不带 `.vue` 后缀的路径
|
||||
- ✅ 未映射组件显示友好提示
|
||||
|
||||
## 🔧 核心修改
|
||||
|
||||
### 1. `src/utils/uiTool.js`
|
||||
|
||||
#### 添加组件映射功能
|
||||
|
||||
```javascript
|
||||
// 组件映射表
|
||||
const componentMap = {}
|
||||
|
||||
// 设置组件映射
|
||||
static setComponentMap(map) {
|
||||
Object.assign(componentMap, map)
|
||||
}
|
||||
|
||||
// 获取组件
|
||||
static getComponent(componentPath) {
|
||||
const normalizedPath = componentPath.replace(/\.vue$/, '')
|
||||
return componentMap[normalizedPath] || componentMap[componentPath]
|
||||
}
|
||||
```
|
||||
|
||||
#### 优化 menuToRoute 方法
|
||||
|
||||
```javascript
|
||||
static menuToRoute(menus, ParentView, Page404) {
|
||||
menus.forEach(item => {
|
||||
if (item.type === '页面') {
|
||||
// 从映射表获取组件
|
||||
let component = uiTool.getComponent(item.component)
|
||||
|
||||
if (component) {
|
||||
item.component = component // ✅ 使用映射的组件
|
||||
} else {
|
||||
// 显示友好提示
|
||||
console.warn(`组件未找到: ${item.component}`)
|
||||
item.component = PlaceholderComponent
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### 2. `src/index.js`
|
||||
|
||||
#### 添加 setupComponentMap 方法
|
||||
|
||||
```javascript
|
||||
setupComponentMap(customMap = {}) {
|
||||
// 框架内置组件
|
||||
const components = {
|
||||
'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,
|
||||
// 合并用户传入的业务组件
|
||||
...customMap
|
||||
}
|
||||
|
||||
// 自动生成带 .vue 和不带 .vue 的映射
|
||||
const map = {}
|
||||
Object.keys(components).forEach(path => {
|
||||
const cleanPath = path.replace(/\.vue$/, '')
|
||||
map[cleanPath] = components[path]
|
||||
map[cleanPath + '.vue'] = components[path]
|
||||
})
|
||||
|
||||
uiTool.setComponentMap(map)
|
||||
}
|
||||
```
|
||||
|
||||
#### 支持在 install 时传入 componentMap
|
||||
|
||||
```javascript
|
||||
install(Vue, options = {}) {
|
||||
const { config, ViewUI, VueRouter, Vuex, createPersistedState, componentMap } = options
|
||||
|
||||
// 设置组件映射(包含用户传入的映射)
|
||||
this.setupComponentMap(componentMap)
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
#### 添加 addComponentMap 方法
|
||||
|
||||
```javascript
|
||||
addComponentMap(customMap) {
|
||||
uiTool.setComponentMap(customMap)
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 代码优化
|
||||
|
||||
### 优化前(重复代码多)
|
||||
|
||||
```javascript
|
||||
const map = {
|
||||
'system/sys_user.vue': SysUser,
|
||||
'system/sys_user': SysUser, // ← 重复
|
||||
'system/sys_role.vue': SysRole,
|
||||
'system/sys_role': SysRole, // ← 重复
|
||||
// ...每个组件都写两遍
|
||||
}
|
||||
```
|
||||
|
||||
### 优化后(自动生成)
|
||||
|
||||
```javascript
|
||||
const components = {
|
||||
'system/sys_user': SysUser,
|
||||
'system/sys_role': SysRole
|
||||
}
|
||||
|
||||
// 自动生成带 .vue 的映射
|
||||
Object.keys(components).forEach(path => {
|
||||
map[path] = components[path]
|
||||
map[path + '.vue'] = components[path]
|
||||
})
|
||||
```
|
||||
|
||||
**代码量减少 50%** ✅
|
||||
|
||||
## 🚀 使用方法
|
||||
|
||||
### 方法一:在 Vue.use 时配置(推荐)
|
||||
|
||||
```javascript
|
||||
import GamesComponent from './views/ball/games.vue'
|
||||
|
||||
Vue.use(AdminFramework, {
|
||||
config,
|
||||
ViewUI,
|
||||
VueRouter,
|
||||
Vuex,
|
||||
createPersistedState,
|
||||
componentMap: {
|
||||
'ball/games': GamesComponent
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 方法二:使用 addComponentMap
|
||||
|
||||
```javascript
|
||||
Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState })
|
||||
|
||||
AdminFramework.addComponentMap({
|
||||
'ball/games': GamesComponent
|
||||
})
|
||||
```
|
||||
|
||||
## 📝 配置清单
|
||||
|
||||
根据你的权限菜单接口,需要配置的业务组件:
|
||||
|
||||
### 球局模块
|
||||
- [ ] `ball/games.vue` - 球局表
|
||||
- [ ] `ball/wch_users.vue` - 微信用户
|
||||
- [ ] `ball/venues.vue` - 场地表
|
||||
- [ ] `ball/game_participants.vue` - 球局参与者
|
||||
- [ ] `ball/game_comments.vue` - 球局评论
|
||||
|
||||
### 订单模块
|
||||
- [ ] `order/pay_orders.vue` - 支付订单
|
||||
- [ ] `order/wch_wallets.vue` - 用户钱包
|
||||
- [ ] `order/wallet_transactions.vue` - 交易记录
|
||||
- [ ] `order/transfer_details.vue` - 转账详情
|
||||
- [ ] `order/frozen_funds.vue` - 冻结资金
|
||||
|
||||
### 用户模块
|
||||
- [ ] `users/user_follows.vue` - 用户关注
|
||||
- [ ] `users/recommend_blocks.vue` - 推荐屏蔽
|
||||
- [ ] `users/user_tracking.vue` - 行为追踪
|
||||
|
||||
### 资源模块
|
||||
- [ ] `statistics/resources.vue` - 图库资源表
|
||||
- [ ] `ntrp/ntr_questions.vue` - 题库管理
|
||||
- [ ] `ntrp/ntr_records.vue` - 测试记录
|
||||
|
||||
### 其他
|
||||
- [ ] `message/msg_notifications.vue` - 消息管理
|
||||
- [ ] `system/wch_professions.vue` - 职业管理
|
||||
- [ ] `system/wch_cities.vue` - 城市管理
|
||||
- [ ] `business/hot_city_qr.vue` - 热门城市
|
||||
|
||||
## 🎯 已自动映射(无需配置)
|
||||
|
||||
- ✅ `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` - 系统标题设置
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [快速配置组件映射.md](./快速配置组件映射.md) - 快速指南
|
||||
- [权限菜单组件配置指南.md](./权限菜单组件配置指南.md) - 详细教程
|
||||
- [../README.md](../README.md) - 项目说明
|
||||
- [../../完整使用文档.md](../../完整使用文档.md) - 框架文档
|
||||
|
||||
---
|
||||
|
||||
**修复时间**: 2025-10-08
|
||||
**修复人员**: light
|
||||
|
||||
**现在配置完 componentMap,所有菜单页面都能正常显示了!** 🎉
|
||||
|
||||
Reference in New Issue
Block a user