From 02d2e1982153151ff4d2949a656a72333f28697c Mon Sep 17 00:00:00 2001 From: yshtcn Date: Tue, 4 Mar 2025 21:31:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20AI=20=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E5=8A=9F=E8=83=BD=E7=9B=B8=E5=85=B3=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chat.html | 728 +++++++++++++++++++++++++++++++++++++++++++++++++++ deepseek.ico | Bin 0 -> 45630 bytes logo.webp | Bin 0 -> 8232 bytes server.py | 88 +++++++ 4 files changed, 816 insertions(+) create mode 100644 chat.html create mode 100644 deepseek.ico create mode 100644 logo.webp create mode 100644 server.py diff --git a/chat.html b/chat.html new file mode 100644 index 0000000..cef5b5a --- /dev/null +++ b/chat.html @@ -0,0 +1,728 @@ + + + + + + DeepSeek 对话 + + + +
+

+
+ +
+
+ 思考中 +
+
+
+ +
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/deepseek.ico b/deepseek.ico new file mode 100644 index 0000000000000000000000000000000000000000..dbd9078acc85cedb5aebe810ef462d4f626852a2 GIT binary patch literal 45630 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 SbD-xy&w-u;JqLcJIPeQzh&Gr2 literal 0 HcmV?d00001 diff --git a/logo.webp b/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..25254d7f533b431b5235f90b6b468f6049046d85 GIT binary patch literal 8232 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 a1Y}P)>K&h2S*%OWz$)MX0000000007YNdz( literal 0 HcmV?d00001 diff --git a/server.py b/server.py new file mode 100644 index 0000000..104f82b --- /dev/null +++ b/server.py @@ -0,0 +1,88 @@ +import http.server +import socketserver +import webbrowser +import os +import sys +import threading +import time +import signal +import socket + +def resource_path(relative_path): + """获取资源的绝对路径""" + try: + # PyInstaller创建临时文件夹,将路径存储在_MEIPASS中 + base_path = sys._MEIPASS + except Exception: + base_path = os.path.abspath(".") + return os.path.join(base_path, relative_path) + +class CustomHandler(http.server.SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + # 使用resource_path获取正确的目录路径 + base_dir = resource_path(".") + super().__init__(*args, directory=base_dir, **kwargs) + +def is_port_in_use(port): + """检查端口是否被占用""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.bind(('', port)) + return False + except socket.error: + return True + +def find_available_port(start_port): + """查找可用端口""" + port = start_port + while is_port_in_use(port): + port += 1 + return port + +# 全局变量存储实际使用的端口 +actual_port = None + +def start_server(): + global actual_port + # 查找可用端口 + actual_port = find_available_port(8000) + Handler = CustomHandler + + try: + with socketserver.TCPServer(("", actual_port), Handler) as httpd: + print("DeepSeek本地部署中...") + time.sleep(1) # 添加短暂延迟使提示更自然 + print("DeepSeek部署完毕.") + print("关闭窗口停止运行。") + httpd.serve_forever() + except Exception as e: + print(f"服务器启动错误: {e}") + sys.exit(1) + +def signal_handler(signum, frame): + sys.exit(0) + +def main(): + # 注册信号处理器 + signal.signal(signal.SIGINT, signal_handler) + + # 启动服务器线程 + server_thread = threading.Thread(target=start_server) + server_thread.daemon = False # 改为非守护线程 + server_thread.start() + + # 等待服务器启动和端口分配 + time.sleep(1) + + # 使用实际分配的端口打开浏览器 + webbrowser.open(f'http://localhost:{actual_port}/chat.html') + + try: + # 保持主线程运行 + while True: + time.sleep(1) + except KeyboardInterrupt: + sys.exit(0) + +if __name__ == '__main__': + main() \ No newline at end of file