feat: 自动提交 - 周二 2025/09/23 14:03:10.47
This commit is contained in:
@@ -37,8 +37,7 @@ class TSPAgentAssistantCore(TSPAssistant):
|
|||||||
|
|
||||||
# 初始化智能Agent
|
# 初始化智能Agent
|
||||||
self.intelligent_agent = IntelligentAgent(
|
self.intelligent_agent = IntelligentAgent(
|
||||||
llm_manager=self.llm_manager,
|
llm_client=self.llm_manager
|
||||||
agent_core=self.agent_core
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# 初始化动作执行器
|
# 初始化动作执行器
|
||||||
|
|||||||
@@ -243,17 +243,13 @@ class QueryOptimizer:
|
|||||||
start_time_query = end_time - timedelta(days=days-1)
|
start_time_query = end_time - timedelta(days=days-1)
|
||||||
|
|
||||||
# 批量查询所有需要的数据
|
# 批量查询所有需要的数据
|
||||||
workorders = session.query(WorkOrder).filter(
|
# 修改:查询所有工单,不限制时间范围
|
||||||
WorkOrder.created_at >= start_time_query
|
workorders = session.query(WorkOrder).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
alerts = session.query(Alert).filter(
|
# 修改:查询所有预警和对话,不限制时间范围
|
||||||
Alert.created_at >= start_time_query
|
alerts = session.query(Alert).all()
|
||||||
).all()
|
|
||||||
|
|
||||||
conversations = session.query(Conversation).filter(
|
conversations = session.query(Conversation).all()
|
||||||
Conversation.timestamp >= start_time_query
|
|
||||||
).all()
|
|
||||||
|
|
||||||
# 处理数据
|
# 处理数据
|
||||||
analytics = self._process_analytics_data(workorders, alerts, conversations, days)
|
analytics = self._process_analytics_data(workorders, alerts, conversations, days)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import logging
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
|
|
||||||
from flask import Flask, render_template, request, jsonify, send_from_directory
|
from flask import Flask, render_template, request, jsonify, send_from_directory, make_response
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
|
|
||||||
# 添加项目根目录到Python路径
|
# 添加项目根目录到Python路径
|
||||||
@@ -72,9 +72,12 @@ app.register_blueprint(core_bp)
|
|||||||
|
|
||||||
# 页面路由
|
# 页面路由
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
|
@app.route('/dashboard')
|
||||||
def index():
|
def index():
|
||||||
"""主页 - 综合管理平台"""
|
"""主页 - 综合管理平台"""
|
||||||
return render_template('dashboard.html')
|
response = make_response(render_template('dashboard.html'))
|
||||||
|
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
|
||||||
|
return response
|
||||||
|
|
||||||
@app.route('/alerts')
|
@app.route('/alerts')
|
||||||
def alerts():
|
def alerts():
|
||||||
@@ -214,9 +217,16 @@ def get_agent_status():
|
|||||||
"""获取Agent状态"""
|
"""获取Agent状态"""
|
||||||
try:
|
try:
|
||||||
status = service_manager.get_agent_assistant().get_agent_status()
|
status = service_manager.get_agent_assistant().get_agent_status()
|
||||||
return jsonify(status)
|
return jsonify({"success": True, **status})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
# 返回默认状态,避免500错误
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"status": "inactive",
|
||||||
|
"active_goals": 0,
|
||||||
|
"available_tools": 0,
|
||||||
|
"error": "Agent服务暂时不可用"
|
||||||
|
})
|
||||||
|
|
||||||
@app.route('/api/agent/action-history')
|
@app.route('/api/agent/action-history')
|
||||||
def get_agent_action_history():
|
def get_agent_action_history():
|
||||||
@@ -366,7 +376,13 @@ def get_agent_tools_stats():
|
|||||||
"performance": performance
|
"performance": performance
|
||||||
})
|
})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
# 返回默认工具列表,避免500错误
|
||||||
|
return jsonify({
|
||||||
|
"success": False,
|
||||||
|
"tools": [],
|
||||||
|
"performance": {},
|
||||||
|
"error": "工具统计暂时不可用"
|
||||||
|
})
|
||||||
|
|
||||||
@app.route('/api/agent/tools/execute', methods=['POST'])
|
@app.route('/api/agent/tools/execute', methods=['POST'])
|
||||||
def execute_agent_tool():
|
def execute_agent_tool():
|
||||||
|
|||||||
@@ -8,18 +8,11 @@ import os
|
|||||||
import tempfile
|
import tempfile
|
||||||
import uuid
|
import uuid
|
||||||
from flask import Blueprint, request, jsonify
|
from flask import Blueprint, request, jsonify
|
||||||
from src.main import TSPAssistant
|
from src.web.service_manager import service_manager
|
||||||
from src.agent_assistant import TSPAgentAssistant
|
from src.web.error_handlers import handle_api_errors, create_error_response, create_success_response
|
||||||
|
|
||||||
knowledge_bp = Blueprint('knowledge', __name__, url_prefix='/api/knowledge')
|
knowledge_bp = Blueprint('knowledge', __name__, url_prefix='/api/knowledge')
|
||||||
|
|
||||||
def get_assistant():
|
|
||||||
"""获取TSP助手实例(懒加载)"""
|
|
||||||
global _assistant
|
|
||||||
if '_assistant' not in globals():
|
|
||||||
_assistant = TSPAssistant()
|
|
||||||
return _assistant
|
|
||||||
|
|
||||||
def get_agent_assistant():
|
def get_agent_assistant():
|
||||||
"""获取Agent助手实例(懒加载)"""
|
"""获取Agent助手实例(懒加载)"""
|
||||||
global _agent_assistant
|
global _agent_assistant
|
||||||
@@ -107,7 +100,7 @@ def search_knowledge():
|
|||||||
return jsonify([])
|
return jsonify([])
|
||||||
|
|
||||||
# 直接调用知识库管理器的搜索方法
|
# 直接调用知识库管理器的搜索方法
|
||||||
assistant = get_assistant()
|
assistant = service_manager.get_assistant()
|
||||||
results = assistant.knowledge_manager.search_knowledge(query, top_k=5)
|
results = assistant.knowledge_manager.search_knowledge(query, top_k=5)
|
||||||
logger.info(f"搜索结果数量: {len(results)}")
|
logger.info(f"搜索结果数量: {len(results)}")
|
||||||
return jsonify(results)
|
return jsonify(results)
|
||||||
@@ -122,7 +115,7 @@ def add_knowledge():
|
|||||||
"""添加知识库条目"""
|
"""添加知识库条目"""
|
||||||
try:
|
try:
|
||||||
data = request.get_json()
|
data = request.get_json()
|
||||||
success = get_assistant().knowledge_manager.add_knowledge_entry(
|
success = service_manager.get_assistant().knowledge_manager.add_knowledge_entry(
|
||||||
question=data['question'],
|
question=data['question'],
|
||||||
answer=data['answer'],
|
answer=data['answer'],
|
||||||
category=data['category'],
|
category=data['category'],
|
||||||
@@ -136,7 +129,7 @@ def add_knowledge():
|
|||||||
def get_knowledge_stats():
|
def get_knowledge_stats():
|
||||||
"""获取知识库统计"""
|
"""获取知识库统计"""
|
||||||
try:
|
try:
|
||||||
stats = get_assistant().knowledge_manager.get_knowledge_stats()
|
stats = service_manager.get_assistant().knowledge_manager.get_knowledge_stats()
|
||||||
return jsonify(stats)
|
return jsonify(stats)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
return jsonify({"error": str(e)}), 500
|
||||||
@@ -190,7 +183,7 @@ def upload_knowledge_file():
|
|||||||
def delete_knowledge(knowledge_id):
|
def delete_knowledge(knowledge_id):
|
||||||
"""删除知识库条目"""
|
"""删除知识库条目"""
|
||||||
try:
|
try:
|
||||||
success = get_assistant().knowledge_manager.delete_knowledge_entry(knowledge_id)
|
success = service_manager.get_assistant().knowledge_manager.delete_knowledge_entry(knowledge_id)
|
||||||
return jsonify({"success": success, "message": "删除成功" if success else "删除失败"})
|
return jsonify({"success": success, "message": "删除成功" if success else "删除失败"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
return jsonify({"error": str(e)}), 500
|
||||||
@@ -201,7 +194,7 @@ def verify_knowledge(knowledge_id):
|
|||||||
try:
|
try:
|
||||||
data = request.get_json() or {}
|
data = request.get_json() or {}
|
||||||
verified_by = data.get('verified_by', 'admin')
|
verified_by = data.get('verified_by', 'admin')
|
||||||
success = get_assistant().knowledge_manager.verify_knowledge_entry(knowledge_id, verified_by)
|
success = service_manager.get_assistant().knowledge_manager.verify_knowledge_entry(knowledge_id, verified_by)
|
||||||
return jsonify({"success": success, "message": "验证成功" if success else "验证失败"})
|
return jsonify({"success": success, "message": "验证成功" if success else "验证失败"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
return jsonify({"error": str(e)}), 500
|
||||||
@@ -210,7 +203,7 @@ def verify_knowledge(knowledge_id):
|
|||||||
def unverify_knowledge(knowledge_id):
|
def unverify_knowledge(knowledge_id):
|
||||||
"""取消验证知识库条目"""
|
"""取消验证知识库条目"""
|
||||||
try:
|
try:
|
||||||
success = get_assistant().knowledge_manager.unverify_knowledge_entry(knowledge_id)
|
success = service_manager.get_assistant().knowledge_manager.unverify_knowledge_entry(knowledge_id)
|
||||||
return jsonify({"success": success, "message": "取消验证成功" if success else "取消验证失败"})
|
return jsonify({"success": success, "message": "取消验证成功" if success else "取消验证失败"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ from src.main import TSPAssistant
|
|||||||
from src.core.database import db_manager
|
from src.core.database import db_manager
|
||||||
from src.core.models import WorkOrder, Conversation, WorkOrderSuggestion, KnowledgeEntry
|
from src.core.models import WorkOrder, Conversation, WorkOrderSuggestion, KnowledgeEntry
|
||||||
from src.core.query_optimizer import query_optimizer
|
from src.core.query_optimizer import query_optimizer
|
||||||
|
from src.web.service_manager import service_manager
|
||||||
|
|
||||||
workorders_bp = Blueprint('workorders', __name__, url_prefix='/api/workorders')
|
workorders_bp = Blueprint('workorders', __name__, url_prefix='/api/workorders')
|
||||||
|
|
||||||
@@ -321,7 +322,7 @@ def generate_workorder_ai_suggestion(workorder_id):
|
|||||||
rec.ai_suggestion = suggestion
|
rec.ai_suggestion = suggestion
|
||||||
rec.updated_at = datetime.now()
|
rec.updated_at = datetime.now()
|
||||||
session.commit()
|
session.commit()
|
||||||
return jsonify({"success": True, "ai_suggestion": suggestion})
|
return jsonify({"success": True, "suggestion": suggestion})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": str(e)}), 500
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ const translations = {
|
|||||||
'sidebar-knowledge': '知识库',
|
'sidebar-knowledge': '知识库',
|
||||||
'sidebar-analytics': '数据分析',
|
'sidebar-analytics': '数据分析',
|
||||||
'sidebar-feishu-sync': '飞书同步',
|
'sidebar-feishu-sync': '飞书同步',
|
||||||
|
'sidebar-conversation-history': '对话历史',
|
||||||
|
'sidebar-token-monitor': 'Token监控',
|
||||||
|
'sidebar-ai-monitor': 'AI监控',
|
||||||
|
'sidebar-system-optimizer': '系统优化',
|
||||||
'sidebar-system': '系统设置',
|
'sidebar-system': '系统设置',
|
||||||
|
|
||||||
// 预警管理页面
|
// 预警管理页面
|
||||||
@@ -60,6 +64,10 @@ const translations = {
|
|||||||
'sidebar-knowledge': 'Knowledge Base',
|
'sidebar-knowledge': 'Knowledge Base',
|
||||||
'sidebar-analytics': 'Analytics',
|
'sidebar-analytics': 'Analytics',
|
||||||
'sidebar-feishu-sync': 'Feishu Sync',
|
'sidebar-feishu-sync': 'Feishu Sync',
|
||||||
|
'sidebar-conversation-history': 'Conversation History',
|
||||||
|
'sidebar-token-monitor': 'Token Monitor',
|
||||||
|
'sidebar-ai-monitor': 'AI Monitor',
|
||||||
|
'sidebar-system-optimizer': 'System Optimizer',
|
||||||
'sidebar-system': 'System Settings',
|
'sidebar-system': 'System Settings',
|
||||||
|
|
||||||
// Alert Management page
|
// Alert Management page
|
||||||
@@ -109,8 +117,20 @@ function updatePageLanguage(lang) {
|
|||||||
elements.forEach(element => {
|
elements.forEach(element => {
|
||||||
const key = element.getAttribute('data-i18n');
|
const key = element.getAttribute('data-i18n');
|
||||||
if (t[key]) {
|
if (t[key]) {
|
||||||
|
// 检查元素是否包含图标(i标签)
|
||||||
|
const icon = element.querySelector('i');
|
||||||
|
if (icon) {
|
||||||
|
// 如果包含图标,只更新文本部分
|
||||||
|
const textNodes = Array.from(element.childNodes).filter(node =>
|
||||||
|
node.nodeType === Node.TEXT_NODE || (node.nodeType === Node.ELEMENT_NODE && node.tagName !== 'I')
|
||||||
|
);
|
||||||
|
// 保留图标,更新其他文本内容
|
||||||
|
element.innerHTML = icon.outerHTML + ' ' + t[key];
|
||||||
|
} else {
|
||||||
|
// 如果没有图标,直接更新文本内容
|
||||||
element.textContent = t[key];
|
element.textContent = t[key];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 更新导航栏标题(特殊处理,因为包含图标)
|
// 更新导航栏标题(特殊处理,因为包含图标)
|
||||||
@@ -129,11 +149,17 @@ function updatePageLanguage(lang) {
|
|||||||
if (currentTab) {
|
if (currentTab) {
|
||||||
const tabKey = currentTab.getAttribute('data-i18n');
|
const tabKey = currentTab.getAttribute('data-i18n');
|
||||||
if (tabKey && t[tabKey]) {
|
if (tabKey && t[tabKey]) {
|
||||||
|
// 检查当前标签是否包含图标
|
||||||
|
const icon = currentTab.querySelector('i');
|
||||||
|
if (icon) {
|
||||||
|
currentTabTitle.innerHTML = icon.outerHTML + ' ' + t[tabKey];
|
||||||
|
} else {
|
||||||
currentTabTitle.textContent = t[tabKey];
|
currentTabTitle.textContent = t[tabKey];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class TSPDashboard {
|
class TSPDashboard {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -194,7 +220,7 @@ class TSPDashboard {
|
|||||||
|
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
if (textarea) {
|
if (textarea) {
|
||||||
textarea.value = data.ai_suggestion || '';
|
textarea.value = data.suggestion || '';
|
||||||
textarea.classList.remove('ai-loading');
|
textarea.classList.remove('ai-loading');
|
||||||
textarea.classList.add('success-animation');
|
textarea.classList.add('success-animation');
|
||||||
|
|
||||||
@@ -703,15 +729,15 @@ class TSPDashboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
startAutoRefresh() {
|
startAutoRefresh() {
|
||||||
// 每15秒刷新健康状态(减少 /api/health 日志)
|
// 每30秒刷新健康状态(减少重复请求)
|
||||||
this.refreshIntervals.health = setInterval(() => {
|
this.refreshIntervals.health = setInterval(() => {
|
||||||
this.loadHealth();
|
this.loadHealth();
|
||||||
}, 15000);
|
}, 30000);
|
||||||
|
|
||||||
// 每10秒刷新当前标签页数据
|
// 每30秒刷新当前标签页数据(减少重复请求)
|
||||||
this.refreshIntervals.currentTab = setInterval(() => {
|
this.refreshIntervals.currentTab = setInterval(() => {
|
||||||
this.refreshCurrentTab();
|
this.refreshCurrentTab();
|
||||||
}, 10000);
|
}, 30000);
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshCurrentTab() {
|
refreshCurrentTab() {
|
||||||
@@ -815,8 +841,8 @@ class TSPDashboard {
|
|||||||
|
|
||||||
// 更新统计卡片
|
// 更新统计卡片
|
||||||
document.getElementById('total-sessions').textContent = sessions.sessions?.length || 0;
|
document.getElementById('total-sessions').textContent = sessions.sessions?.length || 0;
|
||||||
document.getElementById('total-alerts').textContent = alerts.length || 0;
|
document.getElementById('total-alerts').textContent = alerts.alerts?.length || 0;
|
||||||
document.getElementById('total-workorders').textContent = workorders.filter(w => w.status === 'open').length || 0;
|
document.getElementById('total-workorders').textContent = workorders.workorders?.filter(w => w.status === 'open').length || 0;
|
||||||
document.getElementById('knowledge-count').textContent = knowledge.total_entries || 0;
|
document.getElementById('knowledge-count').textContent = knowledge.total_entries || 0;
|
||||||
|
|
||||||
// 更新知识库详细统计
|
// 更新知识库详细统计
|
||||||
@@ -833,6 +859,9 @@ class TSPDashboard {
|
|||||||
// 更新系统健康状态
|
// 更新系统健康状态
|
||||||
await this.updateSystemHealth();
|
await this.updateSystemHealth();
|
||||||
|
|
||||||
|
// 加载分析数据并更新统计卡片
|
||||||
|
await this.loadAnalytics();
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('加载仪表板数据失败:', error);
|
console.error('加载仪表板数据失败:', error);
|
||||||
}
|
}
|
||||||
@@ -3782,11 +3811,13 @@ class TSPDashboard {
|
|||||||
// 更新工单统计
|
// 更新工单统计
|
||||||
const total = data.workorders?.total || 0;
|
const total = data.workorders?.total || 0;
|
||||||
const open = data.workorders?.open || 0;
|
const open = data.workorders?.open || 0;
|
||||||
|
const inProgress = data.workorders?.in_progress || 0;
|
||||||
const resolved = data.workorders?.resolved || 0;
|
const resolved = data.workorders?.resolved || 0;
|
||||||
const avgSatisfaction = data.satisfaction?.average || 0;
|
const avgSatisfaction = data.satisfaction?.average || 0;
|
||||||
|
|
||||||
document.getElementById('totalWorkorders').textContent = total;
|
document.getElementById('totalWorkorders').textContent = total;
|
||||||
document.getElementById('openWorkorders').textContent = open;
|
document.getElementById('openWorkorders').textContent = open;
|
||||||
|
document.getElementById('workorders-progress').textContent = inProgress;
|
||||||
document.getElementById('resolvedWorkorders').textContent = resolved;
|
document.getElementById('resolvedWorkorders').textContent = resolved;
|
||||||
document.getElementById('avgSatisfaction').textContent = avgSatisfaction.toFixed(1);
|
document.getElementById('avgSatisfaction').textContent = avgSatisfaction.toFixed(1);
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,15 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||||
|
<meta http-equiv="Pragma" content="no-cache">
|
||||||
|
<meta http-equiv="Expires" content="0">
|
||||||
<title>TSP智能助手 - 综合管理平台</title>
|
<title>TSP智能助手 - 综合管理平台</title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||||
<link href="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.css" rel="stylesheet">
|
||||||
<link href="{{ url_for('static', filename='css/design-system.css') }}" rel="stylesheet">
|
<link href="{{ url_for('static', filename='css/design-system.css') }}?v=1.0.0" rel="stylesheet">
|
||||||
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet">
|
<link href="{{ url_for('static', filename='css/style.css') }}?v=1.0.0" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
.sidebar {
|
.sidebar {
|
||||||
@@ -384,56 +387,56 @@
|
|||||||
控制面板
|
控制面板
|
||||||
</h5>
|
</h5>
|
||||||
<nav class="nav flex-column">
|
<nav class="nav flex-column">
|
||||||
<a class="nav-link active" href="#dashboard" data-tab="dashboard">
|
<a class="nav-link active" href="#dashboard" data-tab="dashboard" data-i18n="sidebar-dashboard">
|
||||||
<i class="fas fa-home"></i>
|
<i class="fas fa-home"></i>
|
||||||
仪表板
|
仪表板
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#chat" data-tab="chat">
|
<a class="nav-link" href="#chat" data-tab="chat" data-i18n="sidebar-conversations">
|
||||||
<i class="fas fa-comments"></i>
|
<i class="fas fa-comments"></i>
|
||||||
智能对话
|
智能对话
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#agent" data-tab="agent">
|
<a class="nav-link" href="#agent" data-tab="agent" data-i18n="sidebar-agent">
|
||||||
<i class="fas fa-brain"></i>
|
<i class="fas fa-brain"></i>
|
||||||
Agent管理
|
Agent管理
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#alerts" data-tab="alerts" data-i18n="sidebar-alerts">
|
<a class="nav-link" href="#alerts" data-tab="alerts" data-i18n="sidebar-alerts">
|
||||||
<i class="fas fa-bell"></i>
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
预警管理
|
预警管理
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#knowledge" data-tab="knowledge">
|
<a class="nav-link" href="#knowledge" data-tab="knowledge" data-i18n="sidebar-knowledge">
|
||||||
<i class="fas fa-database"></i>
|
<i class="fas fa-database"></i>
|
||||||
知识库
|
知识库
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#workorders" data-tab="workorders">
|
<a class="nav-link" href="#workorders" data-tab="workorders" data-i18n="sidebar-workorders">
|
||||||
<i class="fas fa-tasks"></i>
|
<i class="fas fa-tasks"></i>
|
||||||
工单管理
|
工单管理
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#feishu-sync" data-tab="feishu-sync">
|
<a class="nav-link" href="#feishu-sync" data-tab="feishu-sync" data-i18n="sidebar-feishu-sync">
|
||||||
<i class="fas fa-sync"></i>
|
<i class="fas fa-sync"></i>
|
||||||
飞书同步
|
飞书同步
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#conversation-history" data-tab="conversation-history">
|
<a class="nav-link" href="#conversation-history" data-tab="conversation-history" data-i18n="sidebar-conversation-history">
|
||||||
<i class="fas fa-history"></i>
|
<i class="fas fa-history"></i>
|
||||||
对话历史
|
对话历史
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#token-monitor" data-tab="token-monitor">
|
<a class="nav-link" href="#token-monitor" data-tab="token-monitor" data-i18n="sidebar-token-monitor">
|
||||||
<i class="fas fa-coins"></i>
|
<i class="fas fa-coins"></i>
|
||||||
Token监控
|
Token监控
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#ai-monitor" data-tab="ai-monitor">
|
<a class="nav-link" href="#ai-monitor" data-tab="ai-monitor" data-i18n="sidebar-ai-monitor">
|
||||||
<i class="fas fa-brain"></i>
|
<i class="fas fa-brain"></i>
|
||||||
AI监控
|
AI监控
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#system-optimizer" data-tab="system-optimizer">
|
<a class="nav-link" href="#system-optimizer" data-tab="system-optimizer" data-i18n="sidebar-system-optimizer">
|
||||||
<i class="fas fa-tools"></i>
|
<i class="fas fa-tools"></i>
|
||||||
系统优化
|
系统优化
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#analytics" data-tab="analytics">
|
<a class="nav-link" href="#analytics" data-tab="analytics" data-i18n="sidebar-analytics">
|
||||||
<i class="fas fa-chart-line"></i>
|
<i class="fas fa-chart-line"></i>
|
||||||
数据分析
|
数据分析
|
||||||
</a>
|
</a>
|
||||||
<a class="nav-link" href="#settings" data-tab="settings" data-i18n="sidebar-system">
|
<a class="nav-link" href="#settings" data-tab="settings" data-i18n="sidebar-system">
|
||||||
<i class="fas fa-cog"></i>
|
<i class="fas fa-sliders-h"></i>
|
||||||
系统设置
|
系统设置
|
||||||
</a>
|
</a>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -2469,6 +2472,6 @@
|
|||||||
<!-- 脚本 -->
|
<!-- 脚本 -->
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script>
|
||||||
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/dashboard.js') }}?v=1.0.7"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Reference in New Issue
Block a user