管理后台 server 使用蓝图模式,降低维护成本,降低修改功能时对其他模块的影响
This commit is contained in:
91
admin/dashboard/blueprints/messages.py
Normal file
91
admin/dashboard/blueprints/messages.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from flask import Blueprint, render_template, jsonify, request
|
||||
from .auth import login_required
|
||||
import logging
|
||||
import xml.etree.ElementTree as ET
|
||||
from datetime import datetime
|
||||
from utils.message_formatter import format_quote_message
|
||||
|
||||
# 创建消息管理蓝图
|
||||
messages_bp = Blueprint('messages', __name__, url_prefix='/messages')
|
||||
logger = logging.getLogger("MessagesBlueprint")
|
||||
|
||||
# 消息列表页面
|
||||
@messages_bp.route('/')
|
||||
@login_required
|
||||
def message_list_page():
|
||||
"""消息列表页面"""
|
||||
return render_template('message_list.html')
|
||||
|
||||
# API路由
|
||||
@messages_bp.route('/api', methods=['GET'])
|
||||
@login_required
|
||||
def get_messages():
|
||||
"""获取消息列表API"""
|
||||
try:
|
||||
server = messages_bp.server
|
||||
# 获取查询参数
|
||||
group_id = request.args.get('group_id')
|
||||
start_date = request.args.get('start_date', datetime.now().strftime('%Y-%m-%d'))
|
||||
end_date = request.args.get('end_date', datetime.now().strftime('%Y-%m-%d'))
|
||||
search_text = request.args.get('search_text')
|
||||
page = int(request.args.get('page', 1))
|
||||
page_size = int(request.args.get('page_size', 20))
|
||||
|
||||
# 调用数据库方法获取消息
|
||||
result = server.message_storage.get_messages_by_filter(
|
||||
group_id=group_id,
|
||||
start_date=start_date,
|
||||
end_date=end_date,
|
||||
search_text=search_text,
|
||||
page=page,
|
||||
page_size=page_size
|
||||
)
|
||||
|
||||
# 处理消息数据,添加群组名称和发送者昵称,并格式化引用消息
|
||||
for msg in result['messages']:
|
||||
# 获取群组名称
|
||||
msg['group_name'] = server.contact_manager.get_nickname(msg['group_id']) or msg['group_id']
|
||||
|
||||
# 获取发送者昵称
|
||||
msg['sender_name'] = server.contact_manager.get_nickname(msg['sender']) or msg['sender']
|
||||
|
||||
# 处理消息内容,格式化引用消息
|
||||
if msg['message_type'] == "49" and msg['content']: # 应用消息类型
|
||||
try:
|
||||
# 检查是否为引用消息
|
||||
if '<refermsg>' in msg['content']:
|
||||
# 使用格式化工具处理引用消息
|
||||
msg['content'] = format_quote_message(msg['content'])
|
||||
else:
|
||||
# 其他类型的应用消息,解析 XML 提取标题
|
||||
root = ET.fromstring(msg['content'])
|
||||
title_elem = root.find('.//title')
|
||||
if title_elem is not None:
|
||||
msg['content'] = title_elem.text
|
||||
except Exception as e:
|
||||
logger.error(f"解析消息类型49出错: {e}")
|
||||
|
||||
return jsonify(result)
|
||||
except Exception as e:
|
||||
logger.error(f"获取消息列表失败: {e}")
|
||||
return jsonify({'error': str(e)}), 500
|
||||
|
||||
@messages_bp.route('/api/groups', methods=['GET'])
|
||||
@login_required
|
||||
def get_groups():
|
||||
"""获取群组列表API"""
|
||||
try:
|
||||
server = messages_bp.server
|
||||
# 获取机器人管理的群组列表
|
||||
groups = []
|
||||
for group_id in server.contact_manager.get_contacts():
|
||||
if '@chatroom' in group_id:
|
||||
groups.append({
|
||||
'group_id': group_id,
|
||||
'group_name': server.contact_manager.get_nickname(group_id) or group_id
|
||||
})
|
||||
|
||||
return jsonify({'groups': groups})
|
||||
except Exception as e:
|
||||
logger.error(f"获取群组列表失败: {e}")
|
||||
return jsonify({'error': str(e)}), 500
|
||||
Reference in New Issue
Block a user