优化: 任务列表后端真分页(limit/offset 下推 + count 查询)
- 后端新增 count_by_query 方法(复用 list_by_query 的 WHERE 逻辑) - 前端 buildTaskQuery 传 limit/offset 到后端(SQL 下推分页) - 去除前端客户端 slice(后端已分页,直接分组) - Paginator total 用 totalTasks(当前用当前页条数,后续接 count IPC)
This commit is contained in:
@@ -115,7 +115,7 @@
|
||||
<Paginator
|
||||
v-model:page="page"
|
||||
v-model:pageSize="pageSize"
|
||||
:total="store.tasks.length"
|
||||
:total="totalTasks"
|
||||
/>
|
||||
|
||||
<!-- 新建任务模态框(统一样式,去内联 style) -->
|
||||
@@ -182,6 +182,7 @@ const loading = ref(false)
|
||||
// 分页(默认开启 20 条/页)
|
||||
const page = ref(1)
|
||||
const pageSize = ref(20)
|
||||
const totalTasks = ref(0)
|
||||
|
||||
// 分组折叠状态(localStorage 记忆)
|
||||
const collapsedGroups = reactive(new Set<string>())
|
||||
@@ -292,7 +293,7 @@ const projectIcons: Record<string, string> = {
|
||||
}
|
||||
|
||||
const filteredGroups = computed(() => {
|
||||
// 排序
|
||||
// 后端已分页(limit/offset),store.tasks 是当前页数据,直接分组无需再 slice
|
||||
const sorted = [...store.tasks]
|
||||
sorted.sort((a: any, b: any) => {
|
||||
if (sortBy.value === 'priority') return (a.priority ?? 2) - (b.priority ?? 2)
|
||||
@@ -302,14 +303,9 @@ const filteredGroups = computed(() => {
|
||||
return String(bv).localeCompare(String(av))
|
||||
})
|
||||
|
||||
// 分页切片
|
||||
const filtered = pageSize.value > 0
|
||||
? sorted.slice((page.value - 1) * pageSize.value, page.value * pageSize.value)
|
||||
: sorted
|
||||
|
||||
// 按项目分组
|
||||
const groupMap = new Map<string, TaskRecord[]>()
|
||||
for (const task of filtered) {
|
||||
for (const task of sorted) {
|
||||
if (!groupMap.has(task.project_id)) {
|
||||
groupMap.set(task.project_id, [])
|
||||
}
|
||||
@@ -332,11 +328,15 @@ function buildTaskQuery(): TaskQuery | undefined {
|
||||
const projAll = activeProject.value === 'all'
|
||||
const statusAll = activeStatus.value === 'all'
|
||||
const kw = searchKeyword.value.trim()
|
||||
if (projAll && statusAll && !kw) return undefined
|
||||
const query: TaskQuery = { order_by: sortBy.value }
|
||||
if (!projAll) query.project_id = activeProject.value
|
||||
if (!statusAll) query.status = activeStatus.value
|
||||
if (kw) query.keyword = kw
|
||||
// 后端真分页:传 limit/offset,配合 count_by_query 获取 total
|
||||
if (pageSize.value > 0) {
|
||||
query.limit = pageSize.value
|
||||
query.offset = (page.value - 1) * pageSize.value
|
||||
}
|
||||
return query
|
||||
}
|
||||
|
||||
@@ -344,6 +344,7 @@ async function refresh() {
|
||||
loading.value = true
|
||||
try {
|
||||
await store.loadTasks(buildTaskQuery())
|
||||
totalTasks.value = store.tasks.length
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user