""" Web UI Blueprint 智队中枢 Web 管理界面 """ from flask import Blueprint, render_template, request, jsonify, redirect, url_for 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('/login') def login(): """登录页面""" return render_template('auth/login.html') @web_bp.route('/') def index(): """首页/仪表盘""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if token: user_id = decode_token(token).get('sub') 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() else: stats = {'online_agents': 0, 'active_sessions': 0, 'today_messages': 0, 'online_gateways': 0} recent_sessions = [] except: stats = {'online_agents': 0, 'active_sessions': 0, 'today_messages': 0, 'online_gateways': 0} recent_sessions = [] return render_template('index.html', stats=stats, recent_sessions=recent_sessions) @web_bp.route('/config/channels') def channels(): """频道配置列表""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if token: from app.models.channel_config import ChannelConfig configs = ChannelConfig.query.all() else: configs = [] except: configs = [] return render_template('config/channels.html', configs=configs) @web_bp.route('/test') def test(): """连接测试页面""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if token: from app.models.channel_config import ChannelConfig configs = ChannelConfig.query.filter_by(enabled=True).all() else: configs = [] except: configs = [] return render_template('test/index.html', configs=configs) @web_bp.route('/monitor/sessions') def sessions(): """会话监控""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if token: agents = Agent.query.all() sessions = Session.query.order_by(Session.last_active_at.desc()).limit(50).all() else: agents = [] sessions = [] except: agents = [] sessions = [] return render_template('monitor/sessions.html', sessions=sessions, agents=agents) @web_bp.route('/monitor/sessions/') def session_detail(session_id): """会话详情页面""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if not token: return render_template('errors/401.html'), 401 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() except: return render_template('errors/401.html'), 401 return render_template('monitor/session_detail.html', session=session, messages=messages) @web_bp.route('/config/channels//edit') def channel_edit(channel_id): """编辑频道配置页面""" try: from flask_jwt_extended import decode_token from flask import request token = request.cookies.get('access_token') or request.headers.get('Authorization', '').replace('Bearer ', '') if not token: return render_template('errors/401.html'), 401 from app.models.channel_config import ChannelConfig config = ChannelConfig.query.get_or_404(channel_id) except: return render_template('errors/401.html'), 401 return render_template('config/channel_edit.html', config=config)