11<script lang="ts" setup>
2+ import { WebMcpServer , z } from ' @opentiny/next-sdk'
23import type { RoleAddData } from ' ./add-role.vue'
34import type { Permission } from ' @/api/permission'
45import type { ITreeNodeData } from ' @/router/guard/menu'
@@ -10,7 +11,7 @@ import {
1011 TinyModal ,
1112 Pager as TinyPager ,
1213} from ' @opentiny/vue'
13- import { computed , inject , ref } from ' vue'
14+ import { computed , inject , ref , onMounted } from ' vue'
1415import { useI18n } from ' vue-i18n'
1516import { useRouter } from ' vue-router'
1617import { getAllMenu } from ' @/api/menu'
@@ -25,6 +26,8 @@ import constant from '@/router/constant'
2526import { toRoutes } from ' @/router/guard/menu'
2627import { useTabStore } from ' @/store'
2728import { useMenuStore } from ' @/store/modules/router'
29+ import { sleep } from ' @/utils/base-utils'
30+ import { getIdByLabel } from ' @/utils/tree'
2831import addRole from ' ./add-role.vue'
2932import menuDrawer from ' ./menu-drawer.vue'
3033import roleTable from ' ./role-table.vue'
@@ -71,6 +74,7 @@ const pagerConfigLg = {
7174 attrs: { currentPage: 1 , pageSize: 10 , pageSizes: [10 , 20 , 50 , 100 ], total: 10 , layout: ' sizes, total, prev, pager, next, jumper' },
7275}
7376const roleTableRef = ref ()
77+ const menuDrawerRef = ref ()
7478const allFilter = {
7579 inputFilter: {
7680 inputFilter: true ,
@@ -203,6 +207,41 @@ function onRoleUpdateSuccess() {
203207function onRoleDelete() {
204208 roleTableRef .value .reload ()
205209}
210+
211+ onMounted (async () => {
212+ const server = new WebMcpServer ({
213+ name: ' bind-menu-mcp-server' ,
214+ version: ' 1.0.0' ,
215+ })
216+ const serverTransport = inject <any >(' serverTransport' )
217+
218+ server .registerTool (
219+ ' bind-menu-for-role' ,
220+ {
221+ title: ' 绑定菜单' ,
222+ description: ' 给某个角色绑定菜单' ,
223+ inputSchema: {
224+ role: z .string ().describe (' 需要绑定菜单的角色名称' ),
225+ menu: z .string ().describe (' 需要绑定的菜单名称' ),
226+ },
227+ },
228+ async ({ role , menu }) => {
229+ const rowData = tableData .value .find (item => item .name === role )
230+ roleTableRef .value .openMenuModal (rowData .menus , rowData .id , rowData )
231+ await sleep (1000 )
232+
233+ // 先从菜单名称获取菜单 ID,再勾选菜单
234+ const menuId = getIdByLabel (i18MenuDatas .value , menu )
235+ menuDrawerRef .value .treeRef .setChecked (menuId , true , false )
236+ await sleep (1000 )
237+
238+ menuDrawerRef .value .onConfirm ()
239+ return { content: [{ type: ' text' , text: ` 收到: ${role } ` }] }
240+ },
241+ )
242+
243+ await server .connect (serverTransport )
244+ })
206245 </script >
207246
208247<template >
@@ -232,6 +271,7 @@ function onRoleDelete() {
232271 </div >
233272 <menu-drawer
234273 v-if =" open"
274+ ref =" menuDrawerRef"
235275 v-loading =" loading"
236276 :visible =" open"
237277 :menus =" i18MenuDatas"
0 commit comments