2026-03-14 22:26:00 +08:00
|
|
|
"""
|
|
|
|
|
Web UI Blueprint
|
|
|
|
|
智队中枢 Web 管理界面
|
|
|
|
|
"""
|
|
|
|
|
from flask import Blueprint, render_template, request, jsonify
|
|
|
|
|
from flask_jwt_extended import jwt_required, get_jwt_identity
|
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
from app.models import db, User, Session, Agent, Gateway, Message
|
|
|
|
|
|
|
|
|
|
web_bp = Blueprint('web', __name__, url_prefix='/web')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def index():
|
|
|
|
|
"""首页/仪表盘"""
|
|
|
|
|
# 统计数据
|
|
|
|
|
stats = {
|
|
|
|
|
'online_agents': Agent.query.filter_by(status='online').count(),
|
|
|
|
|
'active_sessions': Session.query.filter_by(status='active').count(),
|
|
|
|
|
'today_messages': Message.query.filter(
|
|
|
|
|
Message.created_at >= datetime.utcnow() - timedelta(days=1)
|
|
|
|
|
).count(),
|
|
|
|
|
'online_gateways': Gateway.query.filter_by(status='online').count(),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 最近会话
|
|
|
|
|
recent_sessions = Session.query.order_by(
|
|
|
|
|
Session.last_active_at.desc()
|
|
|
|
|
).limit(5).all()
|
|
|
|
|
|
|
|
|
|
return render_template('index.html', stats=stats, recent_sessions=recent_sessions)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/config/channels')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def channels():
|
|
|
|
|
"""频道配置列表"""
|
|
|
|
|
from app.models.channel_config import ChannelConfig
|
|
|
|
|
configs = ChannelConfig.query.all()
|
|
|
|
|
return render_template('config/channels.html', configs=configs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/test')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def test():
|
|
|
|
|
"""连接测试页面"""
|
|
|
|
|
from app.models.channel_config import ChannelConfig
|
|
|
|
|
configs = ChannelConfig.query.filter_by(enabled=True).all()
|
|
|
|
|
return render_template('test/index.html', configs=configs)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/monitor/sessions')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def sessions():
|
|
|
|
|
"""会话监控"""
|
|
|
|
|
agents = Agent.query.all()
|
|
|
|
|
sessions = Session.query.order_by(Session.last_active_at.desc()).limit(50).all()
|
|
|
|
|
return render_template('monitor/sessions.html', sessions=sessions, agents=agents)
|
2026-03-15 07:12:38 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/monitor/sessions/<session_id>')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def session_detail(session_id):
|
|
|
|
|
"""会话详情页面"""
|
|
|
|
|
session = Session.query.get_or_404(session_id)
|
|
|
|
|
messages = Message.query.filter_by(session_id=session_id).order_by(
|
|
|
|
|
Message.created_at.asc()
|
|
|
|
|
).limit(200).all()
|
|
|
|
|
return render_template('monitor/session_detail.html', session=session, messages=messages)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@web_bp.route('/config/channels/<channel_id>/edit')
|
|
|
|
|
@jwt_required()
|
|
|
|
|
def channel_edit(channel_id):
|
|
|
|
|
"""编辑频道配置页面"""
|
|
|
|
|
from app.models.channel_config import ChannelConfig
|
|
|
|
|
config = ChannelConfig.query.get_or_404(channel_id)
|
|
|
|
|
return render_template('config/channel_edit.html', config=config)
|