feat(menu): 优化菜单服务性能并新增医生排班功能

- 添加菜单缓存注解以提升查询性能
- 实现菜单完整路径计算优化,解决 N+1 查询问题
- 新增 selectAllMenus 方法供路径计算使用
- 添加今日医生排班查询功能
- 重构前端图标显示逻辑,使用 SVG 图标替代 Element 图标
- 添加前端菜单数据本地缓存机制
- 更新菜单管理界面的表单组件绑定方式
- 新增预约管理、门诊管理和药房管理路由配置
This commit is contained in:
2026-02-02 08:46:33 +08:00
parent 669d669422
commit 5534a71c7d
20 changed files with 1156 additions and 228 deletions

View File

@@ -124,9 +124,9 @@
<el-col :span="24">
<el-form-item label="菜单类型" prop="menuType">
<el-radio-group v-model="form.menuType">
<el-radio label="M">目录</el-radio>
<el-radio label="C">菜单</el-radio>
<el-radio label="F">按钮</el-radio>
<el-radio value="M">目录</el-radio>
<el-radio value="C">菜单</el-radio>
<el-radio value="F">按钮</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@@ -174,8 +174,8 @@
</span>
</template>
<el-radio-group v-model="form.isFrame">
<el-radio label="0"></el-radio>
<el-radio label="1"></el-radio>
<el-radio value="0"></el-radio>
<el-radio value="1"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@@ -247,8 +247,8 @@
</span>
</template>
<el-radio-group v-model="form.isCache">
<el-radio label="0">缓存</el-radio>
<el-radio label="1">不缓存</el-radio>
<el-radio value="0">缓存</el-radio>
<el-radio value="1">不缓存</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
@@ -266,7 +266,7 @@
<el-radio
v-for="dict in sys_show_hide"
:key="dict.value"
:label="dict.value"
:value="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
@@ -285,7 +285,7 @@
<el-radio
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
:value="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
@@ -303,7 +303,7 @@
</template>
<script setup name="Menu">
import {addMenu, delMenu, getMenu, listMenu, updateMenu} from "@/api/system/menu";
import {addMenu, delMenu, getMenu, listMenu, updateMenu, treeselect} from "@/api/system/menu";
import SvgIcon from "@/components/SvgIcon";
import IconSelect from "@/components/IconSelect";
@@ -351,10 +351,28 @@ async function getList() {
/** 查询菜单下拉树结构 */
function getTreeselect() {
menuOptions.value = [];
listMenu().then(response => {
const menu = { menuId: 0, menuName: "主类目", children: [] };
menu.children = proxy.handleTree(response.data, "menuId");
menuOptions.value.push(menu);
// 使用专门的treeselect API它返回预构建的树形结构
treeselect().then(response => {
// TreeSelect对象使用id、label、children字段但el-tree-select组件期望menuId、menuName、children字段
// 需要将TreeSelect对象转换为el-tree-select组件期望的格式
const convertTreeSelectToMenuFormat = (treeSelectList) => {
return treeSelectList.map(item => ({
menuId: item.id,
menuName: item.label,
value: item.id,
label: item.label,
children: item.children ? convertTreeSelectToMenuFormat(item.children) : []
}));
};
const rootNode = {
menuId: 0,
menuName: "主类目",
value: 0,
label: "主类目",
children: convertTreeSelectToMenuFormat(response.data)
};
menuOptions.value.push(rootNode);
});
}
/** 取消按钮 */
@@ -426,7 +444,7 @@ async function handleUpdate(row) {
const response = await getMenu(row.menuId);
form.value = response.data;
// 使用后端返回的完整路径
form.value.fullPath = row.fullPath || row.path;
form.value.fullPath = response.data.fullPath || response.data.path;
open.value = true;
title.value = "修改菜单";
} catch (error) {