diff --git a/.gitignore b/.gitignore index 20bcd52..5f3eb61 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ cache/ # nuitka build files nuitka-crash-report.xml + +# plugin files +plugins/ diff --git a/app/signal/test_webview.py b/app/signal/test_webview.py deleted file mode 100644 index cd0d02d..0000000 --- a/app/signal/test_webview.py +++ /dev/null @@ -1,90 +0,0 @@ -from PySide6.QtCore import QObject, Slot, Signal, QTimer -from PySide6.QtWebChannel import QWebChannel -import time - -class WebviewBridge(QObject): - """Webview桥接类,用于处理前端和Python后端之间的通信""" - - # 定义信号 - time_updated = Signal(str) - message_received = Signal(str) - - def __init__(self, parent=None): - super().__init__(parent) - self.frontend_ready = False - self.timer = QTimer() - self.timer.timeout.connect(self.send_time) - - @Slot() - def on_frontend_ready(self): - """当前端准备就绪时调用""" - print("Frontend is ready") - self.frontend_ready = True - # 启动定时器,每秒更新一次时间 - self.timer.start(1000) - - @Slot(str, result=str) - def hello(self, message): - """处理前端发送的消息""" - print('Message received from frontend:', message) - response = f'Hello from Python: {message}' - self.message_received.emit(response) - return response - - def send_time(self): - """定期向前端发送时间更新""" - if self.frontend_ready: - current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) - self.time_updated.emit(current_time) - return current_time - return None - - def set_frontend_ready(self, ready=True): - """设置前端准备状态""" - self.frontend_ready = ready - -class WebviewController(QObject): - """Webview控制器类,负责管理Webview的逻辑""" - - def __init__(self, web_engine_page, parent=None): - super().__init__(parent) - self.page = web_engine_page - self.bridge = WebviewBridge() - self.channel = QWebChannel() - self.channel.registerObject('py', self.bridge) - self.page.setWebChannel(self.channel) - - # 连接bridge的信号 - self.bridge.time_updated.connect(self.on_time_updated) - self.bridge.message_received.connect(self.on_message_received) - - def on_time_updated(self, time_str): - """当bridge发出time_updated信号时调用""" - print(f"Time updated: {time_str}") - # 调用前端的update_time函数 - js_code = f""" - try {{ - if (typeof update_time !== 'undefined' && typeof update_time === 'function') {{ - update_time('{time_str}'); - }} - }} catch (e) {{ - console.error('Error calling update_time:', e); - }} - """ - self.page.runJavaScript(js_code) - - def on_message_received(self, message): - """当bridge发出message_received信号时调用""" - print(f"Message received: {message}") - # 调用前端的消息处理函数 - js_code = f""" - try {{ - if (typeof app_sendMessage !== 'undefined' && typeof app_sendMessage === 'function') {{ - app_sendMessage('{message}'); - }} - }} catch (e) {{ - console.error('Error calling app_sendMessage:', e); - }} - """ - self.page.runJavaScript(js_code) - \ No newline at end of file diff --git a/app/view/web_view/entrance.py b/app/view/web_view/entrance.py new file mode 100644 index 0000000..8d1f8fe --- /dev/null +++ b/app/view/web_view/entrance.py @@ -0,0 +1,186 @@ +from PySide6.QtCore import QObject, Slot, QUrl +from PySide6.QtWebChannel import QWebChannel +from PySide6.QtWebEngineCore import QWebEngineSettings +import time +import os +import zipfile +from pathlib import Path +import json +import shutil +import base64 +import tempfile + +class WebviewBridge(QObject): + """Webview桥接类,用于处理前端和Python后端之间的通信""" + + def __init__(self, webview, parent=None): + super().__init__(parent) + self.webview = webview + + # 启用本地文件访问 + self.webview.settings().setAttribute(QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls, True) + self.webview.settings().setAttribute(QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls, True) + self.webview.settings().setAttribute(QWebEngineSettings.WebAttribute.AllowRunningInsecureContent, True) + self.webview.settings().setAttribute(QWebEngineSettings.WebAttribute.AllowGeolocationOnInsecureOrigins, True) + + # 设置Web安全策略 + self.webview.page().settings().setAttribute(QWebEngineSettings.WebAttribute.LocalContentCanAccessFileUrls, True) + self.webview.page().settings().setAttribute(QWebEngineSettings.WebAttribute.LocalContentCanAccessRemoteUrls, True) + self.webview.page().settings().setAttribute(QWebEngineSettings.WebAttribute.AllowRunningInsecureContent, True) + + # 创建插件目录 + self.plugins_dir = Path(os.getcwd()) / "plugins" + self.plugins_dir.mkdir(exist_ok=True) + + # 插件信息文件 + self.plugins_info_file = self.plugins_dir / "plugins.json" + if not self.plugins_info_file.exists(): + with open(self.plugins_info_file, 'w') as f: + json.dump([], f) + + @Slot(str, str, str, result=str) + def upload_plugin(self, name, description, file_content): + """处理插件上传请求""" + try: + # 将base64编码的文件内容解码并保存为临时文件 + file_data = base64.b64decode(file_content) + + # 创建临时文件来保存上传的ZIP文件 + with tempfile.NamedTemporaryFile(suffix='.zip', delete=False) as tmp_file: + tmp_file.write(file_data) + tmp_file_path = tmp_file.name + + # 解压插件 + success, error = self.extract_plugin(tmp_file_path, name) + if not success: + # 清理临时文件 + os.unlink(tmp_file_path) + return json.dumps({"success": False, "error": error}) + + plugin_info = { + "id": int(time.time()), # 使用时间戳作为简单ID + "name": name, + "description": description, + "version": "1.0.0", + "uploadDate": time.strftime('%Y-%m-%d', time.localtime()), + "path": str(self.plugins_dir / name) + } + + # 读取现有插件信息 + if self.plugins_info_file.exists(): + with open(self.plugins_info_file, 'r') as f: + plugins = json.load(f) + else: + plugins = [] + + # 添加新插件 + plugins.append(plugin_info) + + # 保存插件信息 + with open(self.plugins_info_file, 'w') as f: + json.dump(plugins, f) + + # 清理临时文件 + os.unlink(tmp_file_path) + + return json.dumps({"success": True}) + except Exception as e: + # 确保任何异常都返回有效的JSON + return json.dumps({"success": False, "error": str(e)}) + + # 解压插件 + def extract_plugin(self, plugin_file, plugin_name): + """解压插件""" + try: + with zipfile.ZipFile(plugin_file, 'r') as zf: + # 获取插件名称 + plugin_dir = self.plugins_dir / plugin_name + + # 如果插件目录已存在,删除 + if plugin_dir.exists(): + shutil.rmtree(plugin_dir) + + # 创建插件目录并解压 + plugin_dir.mkdir(exist_ok=True) + zf.extractall(plugin_dir) + + # 检测是否有 index.html 文件 + index_file = plugin_dir / "index.html" + if not index_file.exists(): + # 查找任何HTML文件作为入口 + html_files = list(plugin_dir.glob("*.html")) + if not html_files: + return False, "插件中未找到HTML文件" + index_file = html_files[0] + + return True, "" + except Exception as e: + return False, str(e) + + @Slot(result=str) + def list_plugins(self): + """获取插件列表""" + try: + if self.plugins_info_file.exists(): + with open(self.plugins_info_file, 'r') as f: + plugins = json.load(f) + return json.dumps({"success": True, "plugins": plugins}) + else: + return json.dumps({"success": True, "plugins": []}) + except Exception as e: + # 确保任何异常都返回有效的JSON + return json.dumps({"success": False, "error": str(e)}) + + @Slot(int, result=str) + def launch_plugin(self, plugin_id): + """启动插件""" + try: + if self.plugins_info_file.exists(): + with open(self.plugins_info_file, 'r') as f: + plugins = json.load(f) + + # 查找插件 + plugin = next((p for p in plugins if p["id"] == plugin_id), None) + if plugin: + # 构建插件URL + plugin_path = Path(plugin["path"]) + # 查找HTML文件作为入口 + html_files = list(plugin_path.glob("*.html")) + if html_files: + index_file = html_files[0] + url = QUrl.fromLocalFile(str(index_file.absolute())) + print(f"Launching plugin: {url.toString()}") + self.webview.load(url) + return json.dumps({"success": True, "url": url.toString()}) + else: + return json.dumps({"success": False, "error": "插件入口文件未找到"}) + else: + return json.dumps({"success": False, "error": "插件未找到"}) + else: + return json.dumps({"success": False, "error": "插件信息文件未找到"}) + except Exception as e: + # 确保任何异常都返回有效的JSON + return json.dumps({"success": False, "error": str(e)}) + + @Slot(str, result=str) + def save_settings(self, settings_json): + """保存设置""" + try: + settings = json.loads(settings_json) + # 在实际应用中,这里会保存设置到配置文件 + print(f"保存设置: {settings}") + return json.dumps({"success": True}) + except Exception as e: + # 确保任何异常都返回有效的JSON + return json.dumps({"success": False, "error": str(e)}) + +class WebviewController(QObject): + """Webview控制器类,负责管理Webview的逻辑""" + + def __init__(self, web_engine_page, web_webview, parent=None): + super().__init__(parent) + self.page = web_engine_page + self.bridge = WebviewBridge(web_webview) + self.channel = QWebChannel() + self.channel.registerObject('py', self.bridge) + self.page.setWebChannel(self.channel) diff --git a/app/view/web_view/web_view_interface.py b/app/view/web_view/web_view_interface.py index 5c9a5b9..0e4466e 100644 --- a/app/view/web_view/web_view_interface.py +++ b/app/view/web_view/web_view_interface.py @@ -1,12 +1,13 @@ # coding:utf-8 import sys import os +from pathlib import Path from PySide6.QtWidgets import QFrame, QVBoxLayout, QMenu, QApplication, QWidget, QPushButton, QHBoxLayout from qframelesswindow.webengine import FramelessWebEngineView from PySide6.QtCore import QPoint, Qt, QUrl from ...config import config -from ...signal.test_webview import WebviewController +from .entrance import WebviewController class DevToolsWindow(FramelessWebEngineView): @@ -32,14 +33,18 @@ class WebViewInterface(QFrame): self.dev_tools_view = None # 添加连接状态标志 self.is_local_connection = config.get("project", {}).get("is-production", True) + + # 插件目录 + self.plugins_dir = Path(os.getcwd()) / "plugins" + self.plugins_dir.mkdir(exist_ok=True) self.webView = FramelessWebEngineView(self) - self.html_path = os.getcwd().replace("\\", '/') + '/resources/webview/test_webview/dist/index.html' + self.html_path = os.getcwd().replace("\\", '/') + '/resources/webview/entrance/dist/index.html' self.remote_url = "http://localhost:8080/" # 创建WebviewController实例 self.page = self.webView.page() - self.controller = WebviewController(self.page) + self.controller = WebviewController(self.page, self.webView) # 加载初始页面 self.load_current_page() @@ -192,6 +197,8 @@ class WebViewInterface(QFrame): menu.addSeparator() + menu.addSeparator() + # 在鼠标位置显示菜单 menu.exec(self.webView.mapToGlobal(pos)) @@ -211,10 +218,100 @@ class WebViewInterface(QFrame): self.dev_tools_view.dev_tools_window.show() self.dev_tools_view.dev_tools_window.raise_() # 将窗口置于最前 + def generate_plugins_page(self): + """生成插件列表页面""" + plugins = [] + for item in self.plugins_dir.iterdir(): + if item.is_dir(): + index_files = list(item.glob("*.html")) + if index_files: + plugins.append({ + 'name': item.name, + 'path': f"file:///{item.absolute()}/{index_files[0].name}", + 'description': f"插件 {item.name}" + }) + + # 生成HTML页面 + html = """ + + + + + 插件管理 + + + +
+

插件管理

+

当前可用插件列表

+
+
+ """ + + if not plugins: + html += '

暂无插件,请上传插件。

' + else: + for plugin in plugins: + html += f""" +
+

{plugin['name']}

+

{plugin['description']}

+ 访问插件 +
+ """ + + html += """ +
+ + + """ + + return html + def closeEvent(self, event): """关闭时清理资源""" # 停止controller中的定时器 - self.controller.bridge.timer.stop() + # self.controller.bridge.timer.stop() if self.dev_tools_view: self.dev_tools_view.close() super().closeEvent(event) diff --git a/resources/webview/test_webview/.gitignore b/resources/webview/entrance/.gitignore similarity index 100% rename from resources/webview/test_webview/.gitignore rename to resources/webview/entrance/.gitignore diff --git a/resources/webview/test_webview/README.md b/resources/webview/entrance/README.md similarity index 95% rename from resources/webview/test_webview/README.md rename to resources/webview/entrance/README.md index fc8bf6b..90278d3 100644 --- a/resources/webview/test_webview/README.md +++ b/resources/webview/entrance/README.md @@ -1,4 +1,4 @@ -# test_webview +# entrance ## Project setup ``` diff --git a/resources/webview/test_webview/babel.config.js b/resources/webview/entrance/babel.config.js similarity index 100% rename from resources/webview/test_webview/babel.config.js rename to resources/webview/entrance/babel.config.js diff --git a/resources/webview/test_webview/jsconfig.json b/resources/webview/entrance/jsconfig.json similarity index 100% rename from resources/webview/test_webview/jsconfig.json rename to resources/webview/entrance/jsconfig.json diff --git a/resources/webview/test_webview/package-lock.json b/resources/webview/entrance/package-lock.json similarity index 98% rename from resources/webview/test_webview/package-lock.json rename to resources/webview/entrance/package-lock.json index c05ef61..9359f45 100644 --- a/resources/webview/test_webview/package-lock.json +++ b/resources/webview/entrance/package-lock.json @@ -1,11 +1,11 @@ { - "name": "test_webview", + "name": "entrance", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "test_webview", + "name": "entrance", "version": "0.1.0", "dependencies": { "core-js": "^3.8.3", @@ -37,20 +37,6 @@ "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20 || 21 || 22" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -67,9 +53,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, "license": "MIT", "engines": { @@ -77,22 +63,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -108,9 +94,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz", - "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", + "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", "dev": true, "license": "MIT", "dependencies": { @@ -403,14 +389,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -501,12 +487,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -811,9 +797,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "dev": true, "license": "MIT", "dependencies": { @@ -861,9 +847,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -872,7 +858,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1265,9 +1251,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1275,7 +1261,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1402,9 +1388,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1720,9 +1706,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, "license": "MIT", "engines": { @@ -1745,18 +1731,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", + "@babel/types": "^7.28.4", "debug": "^4.3.1" }, "engines": { @@ -1764,9 +1750,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1869,6 +1855,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -2198,9 +2195,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.3.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", "dev": true, "license": "MIT", "dependencies": { @@ -2783,53 +2780,53 @@ "license": "ISC" }, "node_modules/@vue/compiler-core": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.20.tgz", - "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.21.tgz", + "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", - "@vue/shared": "3.5.20", + "@vue/shared": "3.5.21", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", - "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz", + "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-core": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", - "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz", + "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", - "@vue/compiler-core": "3.5.20", - "@vue/compiler-dom": "3.5.20", - "@vue/compiler-ssr": "3.5.20", - "@vue/shared": "3.5.20", + "@vue/compiler-core": "3.5.21", + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21", "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", + "magic-string": "^0.30.18", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", - "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz", + "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-dom": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/component-compiler-utils": { @@ -2903,53 +2900,53 @@ "license": "ISC" }, "node_modules/@vue/reactivity": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.20.tgz", - "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.21.tgz", + "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.20" + "@vue/shared": "3.5.21" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.20.tgz", - "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.21.tgz", + "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/reactivity": "3.5.21", + "@vue/shared": "3.5.21" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", - "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz", + "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.20", - "@vue/runtime-core": "3.5.20", - "@vue/shared": "3.5.20", + "@vue/reactivity": "3.5.21", + "@vue/runtime-core": "3.5.21", + "@vue/shared": "3.5.21", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.20.tgz", - "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.21.tgz", + "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-ssr": "3.5.21", + "@vue/shared": "3.5.21" }, "peerDependencies": { - "vue": "3.5.20" + "vue": "3.5.21" } }, "node_modules/@vue/shared": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.20.tgz", - "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.21.tgz", + "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==", "license": "MIT" }, "node_modules/@vue/vue-loader-v15": { @@ -3934,9 +3931,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001737", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", - "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "version": "1.0.30001741", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", + "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", "dev": true, "funding": [ { @@ -5229,9 +5226,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.211", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", - "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==", + "version": "1.5.214", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz", + "integrity": "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==", "dev": true, "license": "ISC" }, @@ -8243,9 +8240,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.20.tgz", + "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", "dev": true, "license": "MIT" }, @@ -10788,14 +10785,14 @@ } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "version": "5.44.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -11259,16 +11256,16 @@ } }, "node_modules/vue": { - "version": "3.5.20", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.20.tgz", - "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", + "version": "3.5.21", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.21.tgz", + "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.20", - "@vue/compiler-sfc": "3.5.20", - "@vue/runtime-dom": "3.5.20", - "@vue/server-renderer": "3.5.20", - "@vue/shared": "3.5.20" + "@vue/compiler-dom": "3.5.21", + "@vue/compiler-sfc": "3.5.21", + "@vue/runtime-dom": "3.5.21", + "@vue/server-renderer": "3.5.21", + "@vue/shared": "3.5.21" }, "peerDependencies": { "typescript": "*" diff --git a/resources/webview/test_webview/package.json b/resources/webview/entrance/package.json similarity index 97% rename from resources/webview/test_webview/package.json rename to resources/webview/entrance/package.json index eeb6ee8..a484b20 100644 --- a/resources/webview/test_webview/package.json +++ b/resources/webview/entrance/package.json @@ -1,5 +1,5 @@ { - "name": "test_webview", + "name": "entrance", "version": "0.1.0", "private": true, "scripts": { diff --git a/resources/webview/test_webview/public/favicon.ico b/resources/webview/entrance/public/favicon.ico similarity index 100% rename from resources/webview/test_webview/public/favicon.ico rename to resources/webview/entrance/public/favicon.ico diff --git a/resources/webview/test_webview/public/index.html b/resources/webview/entrance/public/index.html similarity index 100% rename from resources/webview/test_webview/public/index.html rename to resources/webview/entrance/public/index.html diff --git a/resources/webview/entrance/src/App.vue b/resources/webview/entrance/src/App.vue new file mode 100644 index 0000000..aebb8ae --- /dev/null +++ b/resources/webview/entrance/src/App.vue @@ -0,0 +1,574 @@ + + + + + \ No newline at end of file diff --git a/resources/webview/test_webview/src/assets/logo.png b/resources/webview/entrance/src/assets/logo.png similarity index 100% rename from resources/webview/test_webview/src/assets/logo.png rename to resources/webview/entrance/src/assets/logo.png diff --git a/resources/webview/test_webview/src/components/HelloWorld.vue b/resources/webview/entrance/src/components/HelloWorld.vue similarity index 100% rename from resources/webview/test_webview/src/components/HelloWorld.vue rename to resources/webview/entrance/src/components/HelloWorld.vue diff --git a/resources/webview/test_webview/src/main.js b/resources/webview/entrance/src/main.js similarity index 100% rename from resources/webview/test_webview/src/main.js rename to resources/webview/entrance/src/main.js diff --git a/resources/webview/test_webview/vue.config.js b/resources/webview/entrance/vue.config.js similarity index 100% rename from resources/webview/test_webview/vue.config.js rename to resources/webview/entrance/vue.config.js diff --git a/resources/webview/test_webview/src/App.vue b/resources/webview/test_webview/src/App.vue deleted file mode 100644 index 1ac4bd9..0000000 --- a/resources/webview/test_webview/src/App.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - - - \ No newline at end of file diff --git a/resources/webview/test_webview/src/components/CustomAlert.vue b/resources/webview/test_webview/src/components/CustomAlert.vue deleted file mode 100644 index e1c2cbf..0000000 --- a/resources/webview/test_webview/src/components/CustomAlert.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - \ No newline at end of file