diff --git a/ruoyi-admin/src/main/resources/templates/customer/service/index.html b/ruoyi-admin/src/main/resources/templates/customer/service/index.html
index f0d10d16..fad2669e 100644
--- a/ruoyi-admin/src/main/resources/templates/customer/service/index.html
+++ b/ruoyi-admin/src/main/resources/templates/customer/service/index.html
@@ -562,6 +562,19 @@
loadManualRequests();
// 添加闪烁动画效果
triggerManualRequestBlink();
+
+ // 触发父页面的菜单闪烁功能
+ try {
+ if (parent && parent.startMenuBlink && typeof parent.startMenuBlink === 'function') {
+ parent.startMenuBlink('客服系统', 5000);
+ console.log('[DEBUG] 已触发父页面客服系统菜单闪烁');
+ } else {
+ console.log('[DEBUG] 父页面菜单闪烁功能不可用');
+ }
+ } catch (e) {
+ console.error('[ERROR] 调用父页面菜单闪烁功能失败:', e);
+ }
+
// 显示通知
console.log('[DEBUG] 显示转人工请求通知...');
if (typeof $.modal !== 'undefined') {
diff --git a/ruoyi-admin/src/main/resources/templates/index.html b/ruoyi-admin/src/main/resources/templates/index.html
index ae3309a9..96d0d78a 100644
--- a/ruoyi-admin/src/main/resources/templates/index.html
+++ b/ruoyi-admin/src/main/resources/templates/index.html
@@ -15,6 +15,37 @@
+
@@ -272,6 +303,117 @@
var ctx = [[@{/}]];
var lockscreen = [[${session.lockscreen}]];
if(lockscreen){window.top.location=ctx+"lockscreen";}
+
+ // 菜单闪烁控制变量
+ var blinkTimer = null;
+ var blinkingMenus = new Set();
+
+ /**
+ * 开始菜单闪烁
+ * @param {string} menuText - 菜单文本内容
+ * @param {number} duration - 闪烁持续时间(毫秒),默认5000ms
+ */
+ function startMenuBlink(menuText, duration) {
+ duration = duration || 5000;
+
+ // 查找包含指定文本的菜单项
+ var menuItems = $('.nav-second-level a, .nav-third-level a, .nav li > a').filter(function() {
+ return $(this).text().trim() === menuText;
+ });
+
+ if (menuItems.length > 0) {
+ menuItems.each(function() {
+ var $menu = $(this);
+ $menu.addClass('menu-blink');
+ blinkingMenus.add($menu[0]);
+
+ // 添加点击事件监听,点击后停止闪烁
+ $menu.off('click.blink').on('click.blink', function() {
+ stopMenuBlink(menuText);
+ });
+ });
+
+ // 设置自动停止闪烁的定时器
+ setTimeout(function() {
+ stopMenuBlink(menuText);
+ }, duration);
+
+ console.log('菜单 "' + menuText + '" 开始闪烁,持续 ' + duration + 'ms');
+ } else {
+ console.warn('未找到菜单: ' + menuText);
+ }
+ }
+
+ /**
+ * 停止菜单闪烁
+ * @param {string} menuText - 菜单文本内容
+ */
+ function stopMenuBlink(menuText) {
+ var menuItems = $('.nav-second-level a, .nav-third-level a, .nav li > a').filter(function() {
+ return $(this).text().trim() === menuText;
+ });
+
+ menuItems.each(function() {
+ var $menu = $(this);
+ $menu.removeClass('menu-blink').addClass('menu-blink-stop');
+ blinkingMenus.delete($menu[0]);
+
+ // 移除点击事件监听
+ $menu.off('click.blink');
+
+ // 延迟移除停止样式类
+ setTimeout(function() {
+ $menu.removeClass('menu-blink-stop');
+ }, 300);
+ });
+
+ console.log('菜单 "' + menuText + '" 停止闪烁');
+ }
+
+ /**
+ * 停止所有菜单闪烁
+ */
+ function stopAllMenuBlink() {
+ $('.menu-blink').each(function() {
+ var $menu = $(this);
+ var menuText = $menu.text().trim();
+ stopMenuBlink(menuText);
+ });
+ }
+
+ /**
+ * WebSocket消息监听(示例)
+ * 当收到APP消息时触发菜单闪烁
+ */
+ function initWebSocketForMenuBlink() {
+ // 这里是WebSocket连接的示例代码
+ // 实际使用时需要根据项目的WebSocket实现进行调整
+ /*
+ var ws = new WebSocket('ws://localhost:8080/websocket');
+
+ ws.onmessage = function(event) {
+ try {
+ var message = JSON.parse(event.data);
+ // 如果是APP消息通知
+ if (message.type === 'app_message' || message.type === 'new_message') {
+ // 触发消息管理菜单闪烁
+ startMenuBlink('消息管理', 5000);
+ }
+ } catch (e) {
+ console.error('解析WebSocket消息失败:', e);
+ }
+ };
+
+ ws.onerror = function(error) {
+ console.error('WebSocket连接错误:', error);
+ };
+ */
+ }
+
+ // 全局暴露函数,方便外部调用
+ window.startMenuBlink = startMenuBlink;
+ window.stopMenuBlink = stopMenuBlink;
+ window.stopAllMenuBlink = stopAllMenuBlink;
// 皮肤缓存
var skin = storage.get("skin");
// history(表示去掉地址的#)否则地址以"#"形式展示