diff --git a/app.py b/app.py index 491b188a..ea20cb70 100755 --- a/app.py +++ b/app.py @@ -11682,19 +11682,51 @@ def initialize_event_polling(): print(f'[轮询] 只会推送 ID > {max(current_redis_max, db_max_id)} 的新事件') print(f'[轮询] ========== 初始化完成 ==========\n') - # 创建后台调度器 - scheduler = BackgroundScheduler() - # 每 30 秒执行一次轮询 - scheduler.add_job( - func=poll_new_events, - trigger='interval', - seconds=30, - id='poll_new_events', - name='检查新事件并推送', - replace_existing=True - ) - scheduler.start() - print(f'[轮询] 调度器已启动 (PID: {os.getpid()}),每 30 秒检查一次新事件') + # 检测是否在 eventlet 环境下运行 + is_eventlet = False + try: + import eventlet + # 检查 eventlet 是否已经 monkey patch + if hasattr(eventlet, 'patcher') and eventlet.patcher.is_monkey_patched('socket'): + is_eventlet = True + except ImportError: + pass + + if is_eventlet: + # Eventlet 环境:使用 eventlet 的协程定时器 + print(f'[轮询] 检测到 Eventlet 环境,使用 eventlet 协程调度器') + + def eventlet_polling_loop(): + """Eventlet 兼容的轮询循环""" + import eventlet + while True: + try: + eventlet.sleep(30) # 等待 30 秒 + poll_new_events() + except Exception as e: + print(f'[轮询 ERROR] Eventlet 轮询循环出错: {e}') + import traceback + traceback.print_exc() + eventlet.sleep(30) # 出错后等待 30 秒再继续 + + # 启动 eventlet 协程 + eventlet.spawn(eventlet_polling_loop) + print(f'[轮询] Eventlet 协程调度器已启动 (PID: {os.getpid()}),每 30 秒检查一次新事件') + else: + # 非 Eventlet 环境:使用 APScheduler + print(f'[轮询] 使用 APScheduler BackgroundScheduler') + scheduler = BackgroundScheduler() + # 每 30 秒执行一次轮询 + scheduler.add_job( + func=poll_new_events, + trigger='interval', + seconds=30, + id='poll_new_events', + name='检查新事件并推送', + replace_existing=True + ) + scheduler.start() + print(f'[轮询] APScheduler 调度器已启动 (PID: {os.getpid()}),每 30 秒检查一次新事件') _polling_initialized = True diff --git a/gunicorn_eventlet_config.py b/gunicorn_eventlet_config.py index 24598a09..3c07fe43 100644 --- a/gunicorn_eventlet_config.py +++ b/gunicorn_eventlet_config.py @@ -135,6 +135,14 @@ def post_worker_init(worker): """Worker 初始化完成后调用""" print(f"✅ Eventlet Worker {worker.pid} 已初始化 (10,000 并发连接就绪)") + # 触发事件轮询初始化(使用 Redis 锁确保只有一个 Worker 启动调度器) + try: + from app import _auto_init_polling + print(f"[轮询] Worker {worker.pid} 尝试初始化事件轮询...") + _auto_init_polling() + except Exception as e: + print(f"[轮询] Worker {worker.pid} 初始化事件轮询失败: {e}") + def worker_abort(worker): """Worker 收到 SIGABRT 信号时调用(超时)""" diff --git a/public/images/services/service-1.png b/public/images/services/service-1.png deleted file mode 100644 index 1cfa2e56..00000000 Binary files a/public/images/services/service-1.png and /dev/null differ diff --git a/public/images/services/service-2.png b/public/images/services/service-2.png deleted file mode 100644 index d8d060be..00000000 Binary files a/public/images/services/service-2.png and /dev/null differ diff --git a/public/images/services/service-3.png b/public/images/services/service-3.png deleted file mode 100644 index dbecc5d0..00000000 Binary files a/public/images/services/service-3.png and /dev/null differ diff --git a/public/images/services/wechat_app2.jpg b/public/images/services/wechat_app2.jpg new file mode 100644 index 00000000..bfa5c7d7 Binary files /dev/null and b/public/images/services/wechat_app2.jpg differ diff --git a/public/images/services/wechat_group.png b/public/images/services/wechat_group.png new file mode 100644 index 00000000..28884e3d Binary files /dev/null and b/public/images/services/wechat_group.png differ diff --git a/src/components/Navbars/components/MobileDrawer/MobileDrawer.js b/src/components/Navbars/components/MobileDrawer/MobileDrawer.js index d9f7a3e8..e4807287 100644 --- a/src/components/Navbars/components/MobileDrawer/MobileDrawer.js +++ b/src/components/Navbars/components/MobileDrawer/MobileDrawer.js @@ -18,6 +18,7 @@ import { Link, Divider, Avatar, + Image, useColorModeValue } from '@chakra-ui/react'; import { useNavigate, useLocation } from 'react-router-dom'; @@ -282,7 +283,55 @@ const MobileDrawer = memo(({ {/* 联系我们 */} 联系我们 - 敬请期待 + + 扫码添加,获取更多资讯 + + + {/* 微信群二维码 */} + + + 微信群 + + + 微信交流群 + + + {/* 小程序二维码 */} + + + 小程序 + + + 微信小程序 + + + {/* 移动端登录/登出按钮 */} diff --git a/src/components/Navbars/components/Navigation/DesktopNav.js b/src/components/Navbars/components/Navigation/DesktopNav.js index e6f86205..85c14c33 100644 --- a/src/components/Navbars/components/Navigation/DesktopNav.js +++ b/src/components/Navbars/components/Navigation/DesktopNav.js @@ -4,6 +4,7 @@ import React, { memo, useCallback } from 'react'; import { HStack, + VStack, Menu, MenuButton, MenuList, @@ -12,6 +13,8 @@ import { Text, Flex, Badge, + Image, + Box, useColorModeValue } from '@chakra-ui/react'; import { ChevronDownIcon } from '@chakra-ui/icons'; @@ -279,12 +282,64 @@ const DesktopNav = memo(({ isAuthenticated, user }) => { 联系我们 - 敬请期待 + + 扫码添加,获取更多资讯 + + + {/* 微信群二维码 */} + + + 微信群 + + + 微信交流群 + + + {/* 小程序二维码 */} + + + 小程序 + + + 微信小程序 + + +