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 }) => {
联系我们
- 敬请期待
+
+ 扫码添加,获取更多资讯
+
+
+ {/* 微信群二维码 */}
+
+
+
+
+
+ 微信交流群
+
+
+ {/* 小程序二维码 */}
+
+
+
+
+
+ 微信小程序
+
+
+