diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
deleted file mode 100644
index a76aaa37e..000000000
--- a/node_modules/.package-lock.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "MaxKB",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "node_modules/recorder-core": {
- "version": "1.3.25011100",
- "resolved": "https://registry.npmmirror.com/recorder-core/-/recorder-core-1.3.25011100.tgz",
- "integrity": "sha512-trXsCH0zurhoizT4Z22C0OsM0SDOW+2OvtgRxeLQFwxoFeqFjDjYZsbZEZUiKMJLhBvamI4K7Ic+qZ2LBo74TA==",
- "license": "MIT"
- },
- "node_modules/vue3-menus": {
- "version": "1.1.2",
- "resolved": "https://registry.npmmirror.com/vue3-menus/-/vue3-menus-1.1.2.tgz",
- "integrity": "sha512-MoX87TH25fbKmmE8PwC+c2kJOSGJheP4pBR2we0RkOrfUDQg7sK+akAZSmQU8o+7dF+xVF2NfKPhoVHOhlX9wQ==",
- "license": "MIT"
- }
- }
-}
diff --git a/node_modules/recorder-core/README.md b/node_modules/recorder-core/README.md
deleted file mode 100644
index bc201a5ec..000000000
--- a/node_modules/recorder-core/README.md
+++ /dev/null
@@ -1,240 +0,0 @@
-# Recorder:recorder-core 用于html5录音
-
-GitHub: [https://github.com/xiangyuecn/Recorder](https://github.com/xiangyuecn/Recorder)
-
-Gitee: [https://gitee.com/xiangyuecn/Recorder](https://gitee.com/xiangyuecn/Recorder)
-
-文档和详细使用方法请参考上面两个Recorder仓库。npm recorder这个名字已被使用,因此在Recorder基础上增加后缀-core,就命名为recorder-core,和Recorder核心文件同名。
-
-
-# 如何使用
-
-## 使用npm安装
-```
-npm install recorder-core
-```
-
-## 引入Recorder库
-可以使用`import`、`require`、`html script`等你适合的方式来引入js文件,下面的以import为主要参考,其他引入方式根据文件路径自行调整一下就可以了。
-``` javascript
-//必须引入的Recorder核心(文件路径是 /src/recorder-core.js 下同),使用import、require都行;recorder-core会自动往window(浏览器环境)或Object(非浏览器环境)下挂载名称为Recorder对象,全局可调用Recorder
-import Recorder from 'recorder-core' //注意如果未引用Recorder变量,可能编译时会被优化删除(如vue3 tree-shaking),请改成 import 'recorder-core',或随便调用一下 Recorder.a=1 保证强引用
-//import './你clone的目录/src/recorder-core.js' //clone源码可以按这个方式引入,下同
-//require('./你clone的目录/src/recorder-core.js') //clone源码可以按这个方式引入,下同
-//
-```
-
-```css
-.div {
- display: inline-block;
- background-color: aqua;
- margin: 0 20px;
- line-height: 200px;
- padding: 0 20px;
- height: 200px;
-}
-```
-
-### 指令方式使用
-
-```html
-
- 指令方式打开菜单
-
-
-```
-
-### 方法方式使用
-
-```html
-
- 事件方式打开菜单
-
-
-```
-
-### 组件方式使用
-
-```html
-
- 组件方式打开菜单
-
- {{activeIndex}}
- 插槽:{{ menu.label }}
-
-
-
-```
-
-## 参数说明
-
-### 单个菜单项参数`MenusItemOptions`
-
-| 属性 | 描述 | 类型 | 是否必填 | 默认值 |
-| :------: | :----------------------------------------------------------: | :--------------------: | :------: | :---------: |
-| label | 菜单项名称 | `string` | `true` | — |
-| style | 每一项菜单的自定义样式 | `object` | `false` | `{}` |
-| icon | 图标参数,内部支持html字符串图标,传入组件时需要实现icon插槽 | `string` \| `其他类型` | `false` | `undefined` |
-| disabled | 是否禁用菜单项 | `boolean` | `false` | `undefined` |
-| divided | 是否显示分割线 | `boolean` | `false` | `undefined` |
-| tip | 没项菜单后面的小提示 | `string` | `false` | `''` |
-| hidden | 是否隐藏该项 | `boolean` | `false` | `undefined` |
-| children | 子菜单列表信息 | `MenusItemOptions[]` | `false` | `undefined` |
-| enter | 菜单项移入事件,返回`null`或`false`不展开子菜单 | `Function()` | `false` | `undefined` |
-| click | 菜单项点击事件,返回`null`或`false`不关闭菜单 | `Function()` | `false` | `undefined` |
-
-### 指令与方法使用参数
-
-| 属性 | 描述 | 类型 | 是否必填 | 默认值 |
-| :-------: | :---------------------------------------------: | :-------------------: | :------: | :---------: |
-| menus | 菜单列表信息 | `MenusItemOptions[]` | `true` | [] |
-| menusClass | 菜单外层 `div` 的 `class` 名 | `string` | `false` | `null` |
-| itemClass | 菜单每一项的`class`名 | `string` | `false` | `null` |
-| minWidth | 菜单容器最小宽度 | `number` \| `string` | `false` | `none` |
-| maxWidth | 菜单容器最打宽度 | `number` \| `string` | `false` | `none` |
-| zIndex | 菜单层级 | `number` \| `string` | `false` | `3` |
-| direction | 菜单打开方向 | `left` \| `right` | `false` | `right` |
-
-### 组件使用参数
-
-| 属性 | 描述 | 类型 | 是否必填 | 默认值 | 插槽传入值 |
-| :-------: | :---------------------------------------------: | :-------------------: | :------------------: | :---------: | :-----------------------------------------------: |
-| menus | 菜单列表信息 | `MenusItemOptions[]` | `true` | [] | |
-| event | 鼠标事件信息(指令使用时不传) | `Event` | 与`position`必填一项 | {} | |
-| menusClass | 菜单外层 `div` 的 `class` 名 | `string` | `false` | `null` | |
-| itemClass | 菜单每一项的`class`名 | `string` | `false` | `null` | |
-| minWidth | 菜单容器最小宽度 | `number` \| `string` | `false` | `none` | |
-| maxWidth | 菜单容器最打宽度 | `number` \| `string` | `false` | `none` | |
-| zIndex | 菜单层级 | `number` \| `string` | `false` | `3` | |
-| direction | 菜单打开方向 | `left` \| `right` | `false` | `right` | |
-| open | 控制菜单组件显示 | `boolean` | `true` | `false` | |
-| args | 附加参数 | `unknown` | `false` | `undefined` | |
-| default | 默认插槽 | `Slot` | `false` | - | `activeIndex`: 当前选中索引, `menu`: 当前菜单项 `MenusItemOptions`, `index`: 当前菜单索引 |
-| icon | 图标插槽 | `Slot` | `false` | - | `activeIndex`: 当前选中索引, `menu`: 当前菜单项 `MenusItemOptions`, `index`: 当前菜单索引 |
-| label | 菜单标题插槽 | `Slot` | `false` | - | `activeIndex`: 当前选中索引, `menu`: 当前菜单项 `MenusItemOptions`, `index`: 当前菜单索引 |
-| suffix | 菜单后缀插槽 | `Slot` | `false` | - | `activeIndex`: 当前选中索引, `menu`: 当前菜单项 `MenusItemOptions`, `index`: 当前菜单索引 |
-
-### 指令使用配置
-
-> 配置参数与方法使用相同
-
-| 指令使用方式 | 描述 | 参数类型 | 参数是否必填 | 默认值 |
-| :-----------: | :------------------------: | :-----------: | :----------: | :----: |
-| v-menus | 绑定元素右击打开菜单 | `MenuOptions` | `true` | - |
-| v-menus:all | 绑定元素左右击均可打开菜单 | `MenuOptions` | `true` | - |
-| v-menus:left | 绑定元素左击打开 | `MenuOptions` | `true` | - |
-| v-menus:right | 绑定元素右击打开 | `MenuOptions` | `true` | - |
diff --git a/node_modules/vue3-menus/index.d.ts b/node_modules/vue3-menus/index.d.ts
deleted file mode 100644
index b96caf248..000000000
--- a/node_modules/vue3-menus/index.d.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-type menusItemType = {
- label: string;
- style?: {
- [key: string]: string | number
- }
- icon?: string | unknown;
- disabled?: boolean;
- divided?: boolean;
- enter?: (menu: menusItemType, args: unknown) => unknown;
- click?: (menu: menusItemType, args: unknown) => unknown;
- children?: Array;
- tip?: string;
- hidden?: boolean;
-}
-
-type menusType = {
- menus: Array;
- menusClass?: string;
- itemClass?: string;
- minWidth?: number | string;
- maxWidth?: number | string;
- zIndex?: number | string;
- direction?: "left" | "right";
-}
-
-type componentMenusType = menusType & {
- event: MouseEvent;
- open: boolean;
- args?: unknown
-}
-
-declare module 'vue3-menus' {
- export const Vue3Menus: import('vue').DefineComponent;
-
- export const menusEvent: (event: MouseEvent, menus: menusType | Array, args: unknown) => void;
-
- export const directive: import('vue').Directive>;
-
- const install: (app: import('vue').App, options: {
- name: string
- }) => unknown;
- export default install;
-}
-
-export {
- menusType,
- menusItemType
-}
diff --git a/node_modules/vue3-menus/package.json b/node_modules/vue3-menus/package.json
deleted file mode 100644
index 03938dc24..000000000
--- a/node_modules/vue3-menus/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "name": "vue3-menus",
- "version": "1.1.2",
- "author": "xufangyi",
- "private": false,
- "description": "Vue3.0 左右键菜单",
- "keywords": [
- "vue",
- "vue3",
- "vue3-menus",
- "contextmenu",
- "vue-contextmenu",
- "vue3-contextmenu"
- ],
- "main": "dist/vue3-menus.js",
- "module": "dist/vue3-menus.es.js",
- "types": "./index.d.ts",
- "files": [
- "package.json",
- "README.md",
- ".gitignore",
- "LICENSE",
- "dist/vue3-menus.es.js",
- "dist/vue3-menus.es.min.js",
- "dist/vue3-menus.js",
- "dist/vue3-menus.min.js",
- "src",
- "index.d.ts"
- ],
- "license": "MIT",
- "repository": {
- "type": "git",
- "url": "https://github.com/xfy520/vue3-menus.git"
- },
- "scripts": {
- "build": "rollup -c",
- "dev": "vite"
- },
- "dependencies": {},
- "devDependencies": {
- "@babel/core": "^7.15.5",
- "@vitejs/plugin-vue": "^1.10.1",
- "@vitejs/plugin-vue-jsx": "^1.3.0",
- "@vue/compiler-sfc": "3.0.0",
- "rollup": "^2.57.0",
- "rollup-plugin-babel": "^4.4.0",
- "rollup-plugin-clear": "^2.0.7",
- "rollup-plugin-commonjs": "^10.1.0",
- "rollup-plugin-json": "^4.0.0",
- "rollup-plugin-node-resolve": "^5.2.0",
- "rollup-plugin-postcss": "3.1.8",
- "rollup-plugin-terser": "^7.0.2",
- "rollup-plugin-uglify": "^6.0.4",
- "rollup-plugin-vue": "^6.0.0",
- "vite": "^2.7.0-beta.11",
- "vue": "3.0.0"
- }
-}
diff --git a/node_modules/vue3-menus/src/App.vue b/node_modules/vue3-menus/src/App.vue
deleted file mode 100644
index da6f6015a..000000000
--- a/node_modules/vue3-menus/src/App.vue
+++ /dev/null
@@ -1,353 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/node_modules/vue3-menus/src/main.ts b/node_modules/vue3-menus/src/main.ts
deleted file mode 100644
index 6f9b1a61f..000000000
--- a/node_modules/vue3-menus/src/main.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { createApp } from 'vue';
-import App from './App.vue';
-import Vue3Menus from '../package/index'
-
-const app = createApp(App)
-app.use(Vue3Menus)
-app.mount('#app')
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index dfde5a34a..000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "MaxKB",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "dependencies": {
- "recorder-core": "^1.3.25011100",
- "vue3-menus": "^1.1.2"
- }
- },
- "node_modules/recorder-core": {
- "version": "1.3.25011100",
- "resolved": "https://registry.npmmirror.com/recorder-core/-/recorder-core-1.3.25011100.tgz",
- "integrity": "sha512-trXsCH0zurhoizT4Z22C0OsM0SDOW+2OvtgRxeLQFwxoFeqFjDjYZsbZEZUiKMJLhBvamI4K7Ic+qZ2LBo74TA==",
- "license": "MIT"
- },
- "node_modules/vue3-menus": {
- "version": "1.1.2",
- "resolved": "https://registry.npmmirror.com/vue3-menus/-/vue3-menus-1.1.2.tgz",
- "integrity": "sha512-MoX87TH25fbKmmE8PwC+c2kJOSGJheP4pBR2we0RkOrfUDQg7sK+akAZSmQU8o+7dF+xVF2NfKPhoVHOhlX9wQ==",
- "license": "MIT"
- }
- }
-}
diff --git a/package.json b/package.json
deleted file mode 100644
index b50449e76..000000000
--- a/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "dependencies": {
- "recorder-core": "^1.3.25011100",
- "vue3-menus": "^1.1.2"
- }
-}
diff --git a/ui/package.json b/ui/package.json
index 03dfd75e8..53d76c8a0 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -40,7 +40,9 @@
"vue-codemirror": "^6.1.1",
"vue-draggable-plus": "^0.6.0",
"vue-i18n": "^11.1.3",
- "vue-router": "^4.5.0"
+ "vue-router": "^4.5.0",
+ "recorder-core": "^1.3.25011100",
+ "vue3-menus": "^1.1.2"
},
"devDependencies": {
"@tsconfig/node22": "^22.0.1",