fix: 分页正确显示当前筛选的总数
- API返回 total 字段(筛选后的实际总数) - 新增 count_items 函数计算筛选条件下的总数 - 分页使用API返回的total而不是全局统计 - 解决筛选后分页显示不正确的问题
This commit is contained in:
@@ -25,7 +25,16 @@ def list_items():
|
|||||||
limit=int(request.args.get('limit', 50)),
|
limit=int(request.args.get('limit', 50)),
|
||||||
offset=int(request.args.get('offset', 0))
|
offset=int(request.args.get('offset', 0))
|
||||||
)
|
)
|
||||||
return jsonify({'success': True, 'data': items})
|
|
||||||
|
# 获取符合条件的总数(用于分页)
|
||||||
|
total = db.count_items(
|
||||||
|
type=request.args.get('type'),
|
||||||
|
status=request.args.get('status'),
|
||||||
|
tag=request.args.get('tag'),
|
||||||
|
keyword=request.args.get('keyword')
|
||||||
|
)
|
||||||
|
|
||||||
|
return jsonify({'success': True, 'data': items, 'total': total})
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/items', methods=['POST'])
|
@app.route('/api/items', methods=['POST'])
|
||||||
@@ -1248,7 +1257,7 @@ async function loadItems(page = 1) {
|
|||||||
|
|
||||||
if (data.success) {
|
if (data.success) {
|
||||||
renderItems(data.data);
|
renderItems(data.data);
|
||||||
renderPagination(data.data.length, page);
|
renderPagination(data.total, page); // 使用API返回的total
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1293,9 +1302,8 @@ function renderItems(items) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 渲染分页
|
// 渲染分页
|
||||||
function renderPagination(itemCount, page) {
|
function renderPagination(total, page) {
|
||||||
const container = document.getElementById('pagination');
|
const container = document.getElementById('pagination');
|
||||||
const total = parseInt(document.getElementById('statTotal').textContent);
|
|
||||||
const totalPages = Math.ceil(total / pageSize);
|
const totalPages = Math.ceil(total / pageSize);
|
||||||
|
|
||||||
if (totalPages <= 1) {
|
if (totalPages <= 1) {
|
||||||
|
|||||||
@@ -204,6 +204,41 @@ class Database:
|
|||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
|
def count_items(self, type: str = None, status: str = None, tag: str = None,
|
||||||
|
keyword: str = None) -> int:
|
||||||
|
"""计算符合条件的条目总数"""
|
||||||
|
with self.get_conn() as conn:
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
query = "SELECT COUNT(DISTINCT i.id) as count FROM items i"
|
||||||
|
params = []
|
||||||
|
conditions = []
|
||||||
|
|
||||||
|
# 标签过滤需要JOIN
|
||||||
|
if tag:
|
||||||
|
query += " JOIN item_tags it ON i.id = it.item_id JOIN tags t ON it.tag_id = t.id"
|
||||||
|
conditions.append("t.name = ?")
|
||||||
|
params.append(tag)
|
||||||
|
|
||||||
|
if type:
|
||||||
|
conditions.append("i.type = ?")
|
||||||
|
params.append(type)
|
||||||
|
|
||||||
|
if status:
|
||||||
|
conditions.append("i.status = ?")
|
||||||
|
params.append(status)
|
||||||
|
|
||||||
|
if keyword:
|
||||||
|
conditions.append("(i.title LIKE ? OR i.content LIKE ? OR i.note LIKE ?)")
|
||||||
|
keyword_pattern = f"%{keyword}%"
|
||||||
|
params.extend([keyword_pattern, keyword_pattern, keyword_pattern])
|
||||||
|
|
||||||
|
if conditions:
|
||||||
|
query += " WHERE " + " AND ".join(conditions)
|
||||||
|
|
||||||
|
cursor.execute(query, params)
|
||||||
|
return cursor.fetchone()['count']
|
||||||
|
|
||||||
def update_item(self, item_id: int, **kwargs) -> bool:
|
def update_item(self, item_id: int, **kwargs) -> bool:
|
||||||
"""更新条目"""
|
"""更新条目"""
|
||||||
allowed_fields = ['type', 'title', 'content', 'url', 'source', 'status', 'priority', 'due_date', 'note']
|
allowed_fields = ['type', 'title', 'content', 'url', 'source', 'status', 'priority', 'due_date', 'note']
|
||||||
|
|||||||
Reference in New Issue
Block a user