Files
his/openhis-ui-vue3/src/router/index.js
zhaoyun a4370b00db Fix Bug #539: 住院护士站功能模块缺失 — 菜单类型从目录(M)改为菜单(C)并添加静态路由
根因分析:
- sys_menu 中"住院护士站"(menu_id=295) 的 menu_type 为 M(目录类型),
  没有 component,点击后仅在侧边栏展开子菜单,不会导航到功能页面
- "住院医生工作站"(menu_id=288) 为 C 类型(菜单),点击直接打开功能页面

修复方案(两处修改):
1. 数据库:将"住院护士站" menu_type 改为 C,设置 component 为
   inpatientNurse/inpatientNurseStation/index,path 改为 inpatientNurseStation
   → 点击侧边栏"住院护士站"直接打开带 el-tabs 的功能页面
2. 前端路由:添加 /inpatientNurse 静态路由组,包含 inpatientNurseStation 及
   6个快捷访问子路由,与 quick-access 卡片的 /inpatientNurse/... 路径匹配

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 12:24:19 +08:00

475 lines
16 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {createWebHistory, createRouter} from 'vue-router'
/* Layout */
import Layout from '@/layout'
/**
* Note: 路由配置项
*
* hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401login等页面或者如一些编辑页面/edit/1
* alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时自动会变成嵌套的模式--如组件页面
* // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
* // 若你想不管路由下面的 children 声明的个数都显示你的根路由
* // 你可以设置 alwaysShow: true这样它就会忽略之前定义的规则一直显示根路由
* redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
* name:'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
* query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数
* roles: ['admin', 'common'] // 访问路由的角色权限
* permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
* meta : {
noCache: true // 如果设置为true则不会被 <keep-alive> 缓存(默认 false)
title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
icon: 'svg-name' // 设置该路由的图标对应路径src/assets/icons/svg
breadcrumb: false // 如果设置为false则不会在breadcrumb面包屑中显示
activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
}
*/
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect/index.vue')
}
]
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
},
{
path: '',
component: Layout,
redirect: '/index',
children: [
{
path: '/index',
component: () => import('@/views/index'),
name: 'Index',
meta: {title: '首页', icon: 'dashboard', affix: true}
}
]
},
{
path: '/user',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: {title: '个人中心', icon: 'user'}
}
]
},
// 住院护士站 — 快捷访问路由(与 sys_menu 中 menu_id=295 的动态路由并存,路径不同不冲突)
{
path: '/inpatientNurse',
component: Layout,
hidden: true,
redirect: '/inpatientNurse/inpatientNurseStation',
children: [
{
path: 'inpatientNurseStation',
component: () => import('@/views/inpatientNurse/inpatientNurseStation/index.vue'),
name: 'InpatientNurseStation',
meta: {title: '住院护士站'}
},
{
path: 'medicalOrderExecution',
component: () => import('@/views/inpatientNurse/medicalOrderExecution/index.vue'),
name: 'MedicalOrderExecution',
meta: {title: '医嘱执行'}
},
{
path: 'medicalOrderProofread',
component: () => import('@/views/inpatientNurse/medicalOrderProofread/index.vue'),
name: 'MedicalOrderProofread',
meta: {title: '医嘱校对'}
},
{
path: 'medicineCollect',
component: () => import('@/views/inpatientNurse/medicineCollect/index.vue'),
name: 'MedicineCollect',
meta: {title: '领药管理'}
},
{
path: 'tprsheet',
component: () => import('@/views/inpatientNurse/tprsheet/index.vue'),
name: 'TprSheet',
meta: {title: '体温单'}
},
{
path: 'nursingRecord',
component: () => import('@/views/inpatientNurse/nursingRecord/index.vue'),
name: 'NursingRecord',
meta: {title: '护理记录'}
}
]
},
// 添加套餐管理相关路由到公共路由,确保始终可用
{
path: '/maintainSystem/Inspection/PackageManagement',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/maintainSystem/Inspection/PackageManagement.vue'),
name: 'DirectPackageManagement',
meta: {title: '套餐管理'}
}
]
}
]
// 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [
{
path: '/system/tenant-user',
component: Layout,
hidden: true,
permissions: ['*:*:*'],
children: [
{
path: 'set/:tenantId(\\d+)',
component: () => import('@/views/system/tenant/setUser'),
name: 'SetUser',
meta: {title: '所属用户', activeMenu: '/system/tenant'}
}
]
},
{
path: '/system/tenant-contract',
component: Layout,
hidden: true,
permissions: ['*:*:*'],
children: [
{
path: 'set/:tenantId(\\d+)',
component: () => import('@/views/system/tenant/setContract'),
name: 'SetContract',
meta: {title: '合同管理', activeMenu: '/system/tenant'}
}
]
},
{
path: '/system/user-auth',
component: Layout,
hidden: true,
permissions: ['system:user:edit'],
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
name: 'AuthRole',
meta: {title: '分配角色', activeMenu: '/system/user'}
}
]
},
{
path: '/system/role-auth',
component: Layout,
hidden: true,
permissions: ['system:role:edit'],
children: [
{
path: 'user/:roleId(\\d+)',
component: () => import('@/views/system/role/authUser'),
name: 'AuthUser',
meta: {title: '分配用户', activeMenu: '/system/role'}
}
]
},
{
path: '/monitor',
component: Layout,
redirect: '/monitor/operlog',
name: 'Monitor',
meta: {title: '系统监控', icon: 'monitor'},
children: [
{
path: 'operlog',
component: () => import('@/views/monitor/operlog/index.vue'),
name: 'Operlog',
meta: {title: '操作日志', icon: 'operlog', permissions: ['monitor:operlog:list']}
},
{
path: 'logininfor',
component: () => import('@/views/monitor/logininfor/index.vue'),
name: 'Logininfor',
meta: {title: '登录日志', icon: 'logininfor', permissions: ['monitor:logininfor:list']}
},
{
path: 'job',
component: () => import('@/views/monitor/job/index.vue'),
name: 'Job',
meta: {title: '定时任务', icon: 'job', permissions: ['monitor:job:list']}
}
]
},
{
path: '/tool',
component: Layout,
redirect: '/tool/gen',
name: 'Tool',
meta: {title: '系统工具', icon: 'tool'},
children: [
{
path: 'gen',
component: () => import('@/views/tool/gen/index.vue'),
name: 'Gen',
meta: {title: '代码生成', icon: 'gen', permissions: ['tool:gen:list']}
}
]
},
{
path: '/monitor/job-log',
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: {title: '调度日志', activeMenu: '/monitor/job'}
}
]
},
{
path: '/tool/gen-edit',
component: Layout,
hidden: true,
permissions: ['tool:gen:edit'],
children: [
{
path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit',
meta: {title: '修改生成配置', activeMenu: '/tool/gen'}
}
]
},
{
path: '/help-center',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/helpcenter/index.vue'),
name: 'HelpCenter',
meta: {
title: '帮助中心',
link: '/help-center/vuepress-theme-vdoing-doc/docs/.vuepress/dist/pages/520e67/index.html'
},
},
],
},
{
path: '/doctorstation',
component: Layout,
redirect: '/doctorstation/index',
name: 'DoctorStation',
meta: {title: '医生工作站', icon: 'operation'},
children: [
{
path: 'pending-emr',
component: () => import('@/views/doctorstation/pendingEmr.vue'),
name: 'PendingEmr',
meta: {title: '待写病历', icon: 'document', permissions: ['doctorstation:pending-emr:view']}
}
]
},
{
path: '/features',
component: Layout,
name: 'Features',
meta: {title: '全部功能', icon: 'menu'},
children: [
{
path: '',
component: () => import('@/views/features/index.vue'),
name: 'FeaturesIndex',
meta: {title: '功能列表', icon: 'menu'}
},
{
path: 'config',
component: () => import('@/views/features/config.vue'),
name: 'FeaturesConfig',
meta: {title: '功能配置', icon: 'setting'}
}
]
},
{
path: '/todo',
component: Layout,
name: 'Todo',
meta: {title: '待办事项', icon: 'todo'},
children: [
{
path: '',
component: () => import('@/views/todo/index.vue'),
name: 'TodoIndex',
meta: {title: '待办列表', icon: 'todo'}
}
]
},
{
path: '/appoinmentmanage',
component: Layout,
name: 'AppoinmentManage',
meta: {title: '预约管理', icon: 'appointment'},
children: [
{
path: 'deptManage',
component: () => import('@/views/appoinmentmanage/deptManage/index.vue'),
name: 'DeptManage',
meta: {title: '科室排班管理', icon: 'calendar'}
}
]
},
{
path: '/clinicmanagement',
component: Layout,
name: 'ClinicManagement',
meta: {title: '门诊管理', icon: 'operation'},
children: [
{
path: 'dayEnd',
component: () => import('@/views/clinicmanagement/dayEnd/index.vue'),
name: 'DayEnd',
meta: {title: '门诊日结', icon: 'document'}
}
]
},
{
path: '/consultationmanagement',
component: Layout,
name: 'ConsultationManagement',
meta: {title: '会诊管理', icon: 'operation'},
children: [
{
path: 'consultationapplication',
component: () => import('@/views/consultationmanagement/consultationapplication/index.vue'),
name: 'ConsultationApplication',
meta: {title: '门诊会诊申请管理', icon: 'document'}
},
{
path: 'consultationconfirmation',
component: () => import('@/views/consultationmanagement/consultationconfirmation/index.vue'),
name: 'ConsultationConfirmation',
meta: {title: '门诊会诊申请确认', icon: 'document'}
}
]
},
{
path: '/medicationmanagement',
component: Layout,
name: 'MedicationManagement',
meta: {title: '药房管理', icon: 'medication'},
children: [
{
path: 'dayEndSettlement',
component: () => import('@/views/medicationmanagement/dayEndSettlement/index.vue'),
name: 'DayEndSettlement',
meta: {title: '日结结算单管理', icon: 'document'}
}
]
},
{
path: '/inspection',
component: Layout,
redirect: '/inspection/report',
name: 'Inspection',
meta: {title: '检查管理', icon: 'inspection'},
children: [
{
path: 'report',
component: () => import('@/views/inspection/report/index.vue'),
name: 'Report',
meta: {title: '检查报告', icon: 'document'}
},
{
path: 'sampleType',
component: () => import('@/views/inspection/sampleType/index.vue'),
name: 'SampleType',
meta: {title: '样本类型', icon: 'sample'}
},
{
path: 'observation',
component: () => import('@/views/inspection/observation/index.vue'),
name: 'Observation',
meta: {title: '观测记录', icon: 'observation'}
},
{
path: 'lisconfig',
component: () => import('@/views/inspection/lisconfig/index.vue'),
name: 'LisConfig',
meta: {title: 'LIS 配置', icon: 'setting'}
},
{
path: 'instrument',
component: () => import('@/views/inspection/instrument/index.vue'),
name: 'Instrument',
meta: {title: '仪器管理', icon: 'instrument'}
},
{
path: 'groupRec',
component: () => import('@/views/inspection/groupRec/index.vue'),
name: 'GroupRec',
meta: {title: '组合记录', icon: 'group'}
},
{
path: 'sampleCollection',
component: () => import('@/views/inspection/sampleCollection/index.vue'),
name: 'SampleCollection',
meta: {title: '样本采集', icon: 'collection'}
}
]
}
];
// 合并常量路由和动态路由,确保所有路由都能被访问
const allRoutes = [...constantRoutes, ...dynamicRoutes];
// 添加404路由到所有路由的最后
allRoutes.push({
path: "/:pathMatch(.*)*",
component: () => import('@/views/error/404'),
hidden: true
});
const router = createRouter({
history: createWebHistory(),
routes: allRoutes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return {top: 0}
}
},
});
export default router;