提交消息列表功能
This commit is contained in:
@@ -152,6 +152,12 @@ class DashboardServer:
|
|||||||
def errors():
|
def errors():
|
||||||
return render_template('errors.html')
|
return render_template('errors.html')
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/messages')
|
||||||
|
@login_required
|
||||||
|
def message_list_page():
|
||||||
|
"""消息列表页面"""
|
||||||
|
return render_template('message_list.html')
|
||||||
# 在_create_app方法中添加新的路由
|
# 在_create_app方法中添加新的路由
|
||||||
@app.route('/robot_management')
|
@app.route('/robot_management')
|
||||||
@login_required
|
@login_required
|
||||||
@@ -480,7 +486,63 @@ class DashboardServer:
|
|||||||
self.logger.error(f"添加群组失败: {e}")
|
self.logger.error(f"添加群组失败: {e}")
|
||||||
return jsonify({"success": False, "error": str(e)}), 500
|
return jsonify({"success": False, "error": str(e)}), 500
|
||||||
|
|
||||||
return app
|
|
||||||
|
@app.route('/api/messages', methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
def get_messages():
|
||||||
|
"""获取消息列表API"""
|
||||||
|
try:
|
||||||
|
# 获取查询参数
|
||||||
|
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 = self.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'] = self.contact_manager.get_nickname(msg['group_id']) or msg['group_id']
|
||||||
|
|
||||||
|
# 获取发送者昵称
|
||||||
|
msg['sender_name'] = self.contact_manager.get_nickname(msg['sender']) or msg['sender']
|
||||||
|
|
||||||
|
return jsonify(result)
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"获取消息列表失败: {e}")
|
||||||
|
return jsonify({'error': str(e)}), 500
|
||||||
|
|
||||||
|
@app.route('/api/groups', methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
def get_groups():
|
||||||
|
"""获取群组列表API"""
|
||||||
|
try:
|
||||||
|
# 获取机器人管理的群组列表
|
||||||
|
groups = []
|
||||||
|
for group_id in self.contact_manager.get_contacts():
|
||||||
|
if '@chatroom' in group_id:
|
||||||
|
groups.append({
|
||||||
|
'group_id': group_id,
|
||||||
|
'group_name': self.contact_manager.get_nickname(group_id) or group_id
|
||||||
|
})
|
||||||
|
|
||||||
|
return jsonify({'groups': groups})
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"获取群组列表失败: {e}")
|
||||||
|
return jsonify({'error': str(e)}), 500
|
||||||
|
|
||||||
|
return app
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""运行服务器"""
|
"""运行服务器"""
|
||||||
@@ -504,4 +566,4 @@ class DashboardServer:
|
|||||||
if self._server:
|
if self._server:
|
||||||
self._server.shutdown()
|
self._server.shutdown()
|
||||||
|
|
||||||
self.logger.info("服务器已停止")
|
self.logger.info("服务器已停止")
|
||||||
|
|||||||
@@ -133,6 +133,11 @@
|
|||||||
<i class="el-icon-setting"></i>
|
<i class="el-icon-setting"></i>
|
||||||
<span slot="title">群机器人管理</span>
|
<span slot="title">群机器人管理</span>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
|
<!-- 在左侧菜单中添加消息列表选项 -->
|
||||||
|
<el-menu-item index="7">
|
||||||
|
<i class="el-icon-chat-line-square"></i>
|
||||||
|
<span slot="title">消息列表</span>
|
||||||
|
</el-menu-item>
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Dict, List, Optional
|
from typing import Dict, List, Optional
|
||||||
|
|
||||||
@@ -107,4 +108,75 @@ class MessageStorageDB(BaseDBOperator):
|
|||||||
GROUP BY DATE(timestamp)
|
GROUP BY DATE(timestamp)
|
||||||
ORDER BY date
|
ORDER BY date
|
||||||
"""
|
"""
|
||||||
return self.execute_query(sql, (group_id, days)) or []
|
return self.execute_query(sql, (group_id, days)) or []
|
||||||
|
|
||||||
|
def get_messages_by_filter(self, group_id=None, start_date=None, end_date=None,
|
||||||
|
search_text=None, page=1, page_size=20) -> Dict:
|
||||||
|
"""按条件筛选消息并支持分页和模糊搜索
|
||||||
|
|
||||||
|
Args:
|
||||||
|
group_id: 群组ID,可选
|
||||||
|
start_date: 开始日期,格式为YYYY-MM-DD,可选
|
||||||
|
end_date: 结束日期,格式为YYYY-MM-DD,可选
|
||||||
|
search_text: 搜索文本,可选,用于模糊搜索消息内容
|
||||||
|
page: 页码,从1开始
|
||||||
|
page_size: 每页记录数
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
包含消息列表和总记录数的字典
|
||||||
|
"""
|
||||||
|
# 构建基础SQL查询
|
||||||
|
sql_count = "SELECT COUNT(*) as total FROM messages WHERE 1=1 "
|
||||||
|
sql_data = """
|
||||||
|
SELECT id, group_id, timestamp, sender, content, message_type,
|
||||||
|
attachment_url, message_id, message_xml, message_thumb
|
||||||
|
FROM messages
|
||||||
|
WHERE 1=1
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 构建参数列表
|
||||||
|
params = []
|
||||||
|
|
||||||
|
# 添加筛选条件
|
||||||
|
if group_id:
|
||||||
|
sql_count += " AND group_id = %s "
|
||||||
|
sql_data += " AND group_id = %s "
|
||||||
|
params.append(group_id)
|
||||||
|
|
||||||
|
if start_date:
|
||||||
|
sql_count += " AND DATE(timestamp) >= %s "
|
||||||
|
sql_data += " AND DATE(timestamp) >= %s "
|
||||||
|
params.append(start_date)
|
||||||
|
|
||||||
|
if end_date:
|
||||||
|
sql_count += " AND DATE(timestamp) <= %s "
|
||||||
|
sql_data += " AND DATE(timestamp) <= %s "
|
||||||
|
params.append(end_date)
|
||||||
|
|
||||||
|
if search_text:
|
||||||
|
sql_count += " AND content LIKE %s "
|
||||||
|
sql_data += " AND content LIKE %s "
|
||||||
|
params.append(f"%{search_text}%")
|
||||||
|
|
||||||
|
# 添加排序和分页
|
||||||
|
sql_data += " ORDER BY timestamp DESC "
|
||||||
|
sql_data += " LIMIT %s OFFSET %s "
|
||||||
|
|
||||||
|
# 计算分页参数
|
||||||
|
offset = (page - 1) * page_size
|
||||||
|
data_params = params.copy()
|
||||||
|
data_params.extend([page_size, offset])
|
||||||
|
|
||||||
|
# 执行查询
|
||||||
|
count_result = self.execute_query(sql_count, params)
|
||||||
|
total = count_result[0]['total'] if count_result else 0
|
||||||
|
|
||||||
|
messages = self.execute_query(sql_data, data_params) or []
|
||||||
|
|
||||||
|
return {
|
||||||
|
'total': total,
|
||||||
|
'page': page,
|
||||||
|
'page_size': page_size,
|
||||||
|
'total_pages': (total + page_size - 1) // page_size,
|
||||||
|
'messages': messages
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user