# 权限菜单组件配置指南 ## 🎯 核心问题 **问题**:后端权限菜单接口返回的组件路径需要映射到实际组件,否则会显示 404。 **解决**:在 `Vue.use()` 时传入 `componentMap` 参数,一次性注册所有业务组件。 ## 📝 配置步骤 ### 第一步:查看权限菜单接口返回的组件路径 后端接口返回的菜单数据示例: ```json { "code": 0, "data": [ { "component": "home/index.vue" }, { "component": "system/sys_user.vue" }, { "component": "ball/games.vue" }, { "component": "order/pay_orders.vue" }, { "component": "ball/wch_users.vue" } ] } ``` ### 第二步:创建对应的业务组件 在项目中创建对应的组件文件: ``` src/views/ ├── ball/ │ ├── games.vue │ └── wch_users.vue └── order/ └── pay_orders.vue ``` ### 第三步:在 main.js 中配置组件映射 ```javascript import Vue from 'vue' import AdminFramework from '../../src/index.js' import config from './config' // ✅ 导入所有业务组件(根据权限菜单接口的 component 字段) import GamesComponent from './views/ball/games.vue' import PayOrdersComponent from './views/order/pay_orders.vue' import WchUsersComponent from './views/ball/wch_users.vue' // 使用框架 Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, // ✅ 一次性注册所有组件映射 componentMap: { 'ball/games': GamesComponent, 'order/pay_orders': PayOrdersComponent, 'ball/wch_users': WchUsersComponent // 添加更多业务组件... } }) // 创建 Vue 实例 new Vue({ el: '#app', router: AdminFramework.router, store: AdminFramework.store, render: h => h(App), mounted() { // 设置权限菜单(会自动加载映射的组件) this.$store.dispatch('user/setAuthorityMenus', { Main: AdminFramework.Main, ParentView: AdminFramework.ParentView, Page404: AdminFramework.Page404 }) } }) ``` ## 🔧 两种配置方式 ### 方式一:在 Vue.use 时配置(推荐) ```javascript Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, componentMap: { 'ball/games': GamesComponent, 'order/pay_orders': PayOrdersComponent } }) ``` **优点**: - ✅ 集中配置,清晰明了 - ✅ 在框架初始化时就完成映射 - ✅ 代码简洁 ### 方式二:使用 addComponentMap 方法 ```javascript Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState }) // 之后添加映射 AdminFramework.addComponentMap({ 'ball/games': GamesComponent, 'order/pay_orders': PayOrdersComponent }) ``` **适用场景**: - 需要动态添加组件映射 - 分模块配置 ## 📋 完整示例 ### 根据你的权限菜单接口配置 查看你的接口返回数据,列出所有 `component` 字段: ```javascript // 权限菜单返回的组件列表: // - home/index.vue // - system/sys_user.vue // - system/sys_role.vue // - system_high/sys_menu.vue // - system/sys_log.vue // - system/sys_param_setup.vue // - ball/games.vue ← 业务组件,需要自己创建 // - ball/wch_users.vue ← 业务组件,需要自己创建 // - ball/venues.vue ← 业务组件,需要自己创建 // - order/pay_orders.vue ← 业务组件,需要自己创建 // - order/wch_wallets.vue ← 业务组件,需要自己创建 // - users/user_follows.vue ← 业务组件,需要自己创建 ``` ### 完整的 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 GamesComponent from './views/ball/games.vue' import WchUsersComponent from './views/ball/wch_users.vue' import VenuesComponent from './views/ball/venues.vue' import GameParticipantsComponent from './views/ball/game_participants.vue' import GameCommentsComponent from './views/ball/game_comments.vue' // 订单模块 import PayOrdersComponent from './views/order/pay_orders.vue' import WchWalletsComponent from './views/order/wch_wallets.vue' import WalletTransactionsComponent from './views/order/wallet_transactions.vue' import TransferDetailsComponent from './views/order/transfer_details.vue' import FrozenFundsComponent from './views/order/frozen_funds.vue' // 用户模块 import UserFollowsComponent from './views/users/user_follows.vue' import RecommendBlocksComponent from './views/users/recommend_blocks.vue' import UserTrackingComponent from './views/users/user_tracking.vue' // 资源模块 import ResourcesComponent from './views/statistics/resources.vue' import NtrQuestionsComponent from './views/ntrp/ntr_questions.vue' import NtrRecordsComponent from './views/ntrp/ntr_records.vue' // 消息模块 import MsgNotificationsComponent from './views/message/msg_notifications.vue' // 使用框架 Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, // ✅ 组件映射表 componentMap: { // 球局模块 'ball/games': GamesComponent, 'ball/wch_users': WchUsersComponent, 'ball/venues': VenuesComponent, 'ball/game_participants': GameParticipantsComponent, 'ball/game_comments': GameCommentsComponent, // 订单模块 'order/pay_orders': PayOrdersComponent, 'order/wch_wallets': WchWalletsComponent, 'order/wallet_transactions': WalletTransactionsComponent, 'order/transfer_details': TransferDetailsComponent, 'order/frozen_funds': FrozenFundsComponent, // 用户模块 'users/user_follows': UserFollowsComponent, 'users/recommend_blocks': RecommendBlocksComponent, 'users/user_tracking': UserTrackingComponent, // 资源模块 'statistics/resources': ResourcesComponent, 'ntrp/ntr_questions': NtrQuestionsComponent, 'ntrp/ntr_records': NtrRecordsComponent, // 消息模块 'message/msg_notifications': MsgNotificationsComponent } }) // 创建 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 }) // 获取系统标题 this.$store.dispatch('app/getSysTitle', { defaultTitle: 'Demo 管理系统', defaultLogo: '' }) } }) // 响应式适配 window.addEventListener('load', AdminFramework.uiTool.setRem) window.addEventListener('resize', AdminFramework.uiTool.setRem) ``` ## 🎯 关键要点 ### 1. 路径命名规则 **后端返回**: ```json { "component": "ball/games.vue" } ``` **项目文件**: ``` src/views/ball/games.vue ``` **配置映射**(不需要 .vue 后缀): ```javascript componentMap: { 'ball/games': GamesComponent // ✅ 不需要写 .vue } ``` **框架会自动处理**: - `ball/games` ✅ - `ball/games.vue` ✅ ### 2. 框架内置组件 以下组件**无需配置**,框架已自动映射: - `home/index.vue` → HomePage - `system/sys_user.vue` → SysUser - `system/sys_role.vue` → SysRole - `system/sys_log.vue` → SysLog - `system/sys_param_setup.vue` → SysParamSetup - `system_high/sys_menu.vue` → SysMenu - `system_high/sys_control.vue` → SysControl - `system_high/sys_title.vue` → SysTitle ### 3. 业务组件 需要在项目中: 1. **创建组件文件** 2. **在 main.js 中导入** 3. **在 componentMap 中配置** ## ⚠️ 组件未找到的提示 如果后端返回的组件路径没有在映射表中,会显示: ``` ┌────────────────────────────────────┐ │ ⚠️ 警告 │ │ 页面组件未加载: ball/games.vue │ │ 请在项目中创建此组件或在组件映射表中注册 │ └────────────────────────────────────┘ ``` **控制台也会输出**: ``` ⚠️ 组件未找到: ball/games.vue,使用占位组件 ``` ## 💡 快速配置技巧 ### 技巧1:批量导入组件 ```javascript // 按模块组织导入 // 球局模块 import GamesComponent from './views/ball/games.vue' import WchUsersComponent from './views/ball/wch_users.vue' // 订单模块 import PayOrdersComponent from './views/order/pay_orders.vue' import WchWalletsComponent from './views/order/wch_wallets.vue' ``` ### 技巧2:使用对象展开 ```javascript // 定义模块组件映射 const ballComponents = { 'ball/games': GamesComponent, 'ball/wch_users': WchUsersComponent } const orderComponents = { 'order/pay_orders': PayOrdersComponent, 'order/wch_wallets': WchWalletsComponent } // 合并配置 Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, componentMap: { ...ballComponents, ...orderComponents } }) ``` ### 技巧3:注释待开发的组件 ```javascript componentMap: { 'ball/games': GamesComponent, // ✅ 已开发 // 'ball/venues': VenuesComponent, // ⏳ 待开发 // 'order/pay_orders': PayOrdersComponent // ⏳ 待开发 } ``` ## 📊 配置流程图 ``` 后端接口返回菜单 ↓ 查看所有 component 字段 ↓ 在项目中创建对应的 .vue 文件 ↓ 在 main.js 中导入组件 ↓ 在 componentMap 中配置映射 ↓ 框架自动生成路由 ↓ 页面正常显示 ✅ ``` ## 🚀 实战示例 ### 示例:添加"球局管理"页面 #### 1. 后端返回的菜单 ```json { "id": 123, "name": "球局表", "path": "games", "component": "ball/games.vue", "type": "页面" } ``` #### 2. 创建组件文件 ```vue ``` #### 3. 在 main.js 中配置 ```javascript // 导入 import GamesComponent from './views/ball/games.vue' // 配置映射 Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, componentMap: { 'ball/games': GamesComponent // ✅ 添加映射 } }) ``` #### 4. 完成! 登录后,权限菜单中的"球局表"会自动加载 `GamesComponent` 组件。 ## 📚 框架自动处理 ### 已自动映射的系统组件 | 后端路径 | 组件 | 说明 | |---------|------|------| | `home/index.vue` | HomePage | 主页 | | `system/sys_user.vue` | SysUser | 用户管理 | | `system/sys_role.vue` | SysRole | 角色管理 | | `system/sys_log.vue` | SysLog | 日志管理 | | `system/sys_param_setup.vue` | SysParamSetup | 参数设置 | | `system_high/sys_menu.vue` | SysMenu | 菜单管理 | | `system_high/sys_control.vue` | SysControl | 控制器管理 | | `system_high/sys_title.vue` | SysTitle | 系统标题设置 | ### 需要手动配置的业务组件 根据你的权限菜单接口,需要配置: - ✅ `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` - 热门城市 ## 🎯 推荐配置模板 ```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' // ==================== 导入业务组件 ==================== // TODO: 根据权限菜单接口返回的 component 字段,导入对应组件 // 使用框架 Vue.use(AdminFramework, { config, ViewUI, VueRouter, Vuex, createPersistedState, componentMap: { // TODO: 在这里添加业务组件映射 // 格式:'后端返回的路径(不含.vue)': 导入的组件 } }) // 创建 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 }) this.$store.dispatch('app/getSysTitle', { defaultTitle: config.title, defaultLogo: '' }) } }) window.addEventListener('load', AdminFramework.uiTool.setRem) window.addEventListener('resize', AdminFramework.uiTool.setRem) ``` ## 📝 总结 ### ✅ 优化后的优势 1. **代码简洁** - 不需要重复写 `.vue` 后缀的映射 - 框架自动生成 2. **集中配置** - 在 `Vue.use()` 时一次性配置所有映射 - 清晰明了 3. **灵活扩展** - 可以随时使用 `addComponentMap()` 添加新映射 - 支持分模块配置 ### 🔗 相关文档 - [../README.md](../README.md) - 项目说明 - [../CHANGELOG.md](../CHANGELOG.md) - 更新日志 - [../../完整使用文档.md](../../完整使用文档.md) - 框架文档 --- **配置完成后,重启项目即可看到所有权限菜单中的页面!** 🎉