From 7c7e83eda8993137663e7f34477756dd1de0beb3 Mon Sep 17 00:00:00 2001 From: zqc <835569504@qq.com> Date: Wed, 11 Mar 2026 12:07:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9C=8D=E5=8A=A1=E5=99=A8we?= =?UTF-8?q?b=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web_page_2/http_server.py | 98 ++++++++++ web_page_2/index.html | 388 ++++++++++++++++++++++++++++++++++++++ web_page_2/sfx_alert.mp3 | Bin 0 -> 5648 bytes 3 files changed, 486 insertions(+) create mode 100644 web_page_2/http_server.py create mode 100644 web_page_2/index.html create mode 100644 web_page_2/sfx_alert.mp3 diff --git a/web_page_2/http_server.py b/web_page_2/http_server.py new file mode 100644 index 0000000..162da07 --- /dev/null +++ b/web_page_2/http_server.py @@ -0,0 +1,98 @@ +from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler +import os +import urllib.parse +import socket + +class APIHandler(SimpleHTTPRequestHandler): + # 设置超时,避免长时间占用连接 + timeout = 30 + + def log_message(self, format, *args): + # 自定义日志格式 + print(f"[{self.log_date_time_string()}] {self.address_string()} - {format % args}") + + def do_GET(self): + try: + # 解析路径和查询参数 + parsed_path = urllib.parse.urlparse(self.path) + path = parsed_path.path + query = parsed_path.query + + # 检查是否是API接口 + api_param = None + if path.startswith('/api/'): + api_param = path[5:] # 提取 /api/ 后面的数字 + + # 生成带参数的index.html URL + if api_param: + # 使用HTML文件并附加api参数 + self.serve_file('index.html', query=f'api={api_param}') + elif path == '/' or path == '/index.html': + # 默认访问使用 api=1 + self.serve_file('index.html', query='api=1') + else: + self.send_error(404, 'Not Found') + except Exception as e: + print(f"Error handling request: {e}") + self.send_error(500, 'Internal Server Error') + + def serve_file(self, filename, query=None): + try: + file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename) + if os.path.exists(file_path): + self.send_response(200) + self.send_header('Content-type', 'text/html; charset=utf-8') + self.end_headers() + + with open(file_path, 'rb') as f: + content = f.read() + + # 如果有查询参数,修改HTML中的URL参数解析部分 + if query: + try: + content = content.decode('utf-8') + # 修改URL参数行,替换默认值为实际参数 + content = content.replace( + "const apiParam = urlParams.get('api') || '1';", + f"const apiParam = '{query.split('=')[1]}';" + ) + content = content.encode('utf-8') + except Exception as e: + print(f"Error modifying HTML content: {e}") + + self.wfile.write(content) + else: + self.send_error(404, f'{filename} not found') + except Exception as e: + print(f"Error serving file: {e}") + raise + +def check_port_available(port): + """检查端口是否可用""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.bind(('', port)) + return True + except socket.error: + return False + +def run(): + port = 8086 + if not check_port_available(port): + print(f"错误: 端口 {port} 已被占用") + return + + server_address = ('', port) + httpd = ThreadingHTTPServer(server_address, APIHandler) + print(f'Server running on http://localhost:{port}') + print(f'支持的接口: /, /api/1, /api/2, /api/3, /api/4, /api/5, /api/6, /api/7, /api/11-16') + print('按 Ctrl+C 停止服务器') + + try: + httpd.serve_forever() + except KeyboardInterrupt: + print('\n服务器已停止') + httpd.server_close() + +if __name__ == '__main__': + run() diff --git a/web_page_2/index.html b/web_page_2/index.html new file mode 100644 index 0000000..fdc3224 --- /dev/null +++ b/web_page_2/index.html @@ -0,0 +1,388 @@ + + + + + AI督察系统 + + + +
+
+ +
+ +
连接中...
+
+
正在连接 WebSocket...
+
+
+
+
+ + + + diff --git a/web_page_2/sfx_alert.mp3 b/web_page_2/sfx_alert.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6881edfb80607a25c572e6dc87cfb2f3f11d201d GIT binary patch literal 5648 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 T&BFeM0MP&IxBsT_KcV$M5axXO literal 0 HcmV?d00001