6.2 KiB
6.2 KiB
学生 Records 页面链式调用转换完成
转换概述
已成功将 h:\blews\akmon\pages\sport\student\records.uvue 从使用 supadb 组件转换为直接使用 supaClient 链式调用,与教师 records 页面保持一致的技术模式。
主要变更
1. 移除 supadb 组件依赖
转换前:使用 supadb 组件
<template>
<view class="records-history-container">
<!-- Training Records Data -->
<supadb collection="ak_training_records" :filter="recordsFilter" :order-by="recordsOrderBy"
@process-data="handleRecordsData" @error="handleError">
</supadb>
<!-- ... -->
</view>
</template>
转换后:纯链式调用
<template>
<view class="records-history-container">
<!-- Header -->
<view class="header">
<!-- 直接使用响应式数据和方法 -->
</view>
<!-- ... -->
</view>
</template>
2. 重构数据加载方法
转换前:依赖组件事件
// Computed filters for supadb component
const recordsFilter = computed(() => {
const filter: any = {
student_id: getCurrentStudentId()
}
// ... filter logic
return filter
})
// Handle component data
const handleRecordsData = (data: UTSJSONObject) => {
recordsLoading.value = false
allRecords.value = data["data"]
// ...
}
转换后:直接链式调用
const loadRecords = async () => {
try {
recordsLoading.value = true
error.value = null
// Build query with chain calls
let query = supaClient
.from('ak_training_records')
.select('*, ak_training_projects(*)')
.eq('student_id', getCurrentStudentId())
// Apply date filters
if (startDate.value && endDate.value) {
query = query
.gte('created_at', startDate.value + 'T00:00:00Z')
.lte('created_at', endDate.value + 'T23:59:59Z')
}
// Apply project filters
if (selectedProjects.value.length > 0) {
query = query.in('project_id', selectedProjects.value)
}
// Execute query
const result = await query
.order('created_at', { ascending: false })
.limit(pageSize.value * currentPage.value)
.execute()
if (result.success) {
allRecords.value = result.data as UTSJSONObject[]
updateFilteredRecords()
updateStatistics()
groupRecordsByDate()
} else {
error.value = '加载失败,请重试'
}
} catch (err) {
console.error('加载记录失败:', err)
error.value = '加载失败,请重试'
} finally {
recordsLoading.value = false
}
}
3. 优化筛选和分页逻辑
转换前:依赖组件内部筛选
const applyFilters = () => {
selectedProjects.value = projectFilters.value
.filter(filter => filter.selected)
.map(filter => safeGetString(filter, 'id', ''))
showFilters.value = false
updateFilteredRecords() // 仅更新本地数据
groupRecordsByDate()
}
转换后:重新查询数据库
const applyFilters = () => {
selectedProjects.value = projectFilters.value
.filter(filter => filter.selected)
.map(filter => safeGetString(filter, 'id', ''))
showFilters.value = false
currentPage.value = 1 // Reset pagination
loadRecords() // Reload data with new filters
}
4. 移除不必要的方法
移除了以下不再需要的方法:
handleRecordsData()- 组件数据处理方法handleError()- 组件错误处理方法recordsFiltercomputed - 筛选器计算属性recordsOrderBycomputed - 排序计算属性
性能和功能改进
1. 更精确的数据查询
- 筛选逻辑直接在数据库层面执行,减少不必要的数据传输
- 支持复合筛选条件(日期范围 + 项目类型)
- 优化了分页加载逻辑
2. 更好的错误处理
- 统一的错误处理机制
- 更清晰的错误状态管理
- 支持重试功能
3. 改进的用户体验
- 筛选应用后立即重新查询数据
- 重置筛选器时重新加载数据
- 更流畅的加载状态展示
技术细节
链式调用结构
// 基础查询
const query = supaClient
.from('ak_training_records')
.select('*, ak_training_projects(*)')
.eq('student_id', getCurrentStudentId())
// 条件筛选
if (dateRange) {
query = query
.gte('created_at', startDate)
.lte('created_at', endDate)
}
if (projectFilters) {
query = query.in('project_id', selectedProjects)
}
// 排序和分页
const result = await query
.order('created_at', { ascending: false })
.limit(pageSize)
.execute()
会话管理
const getCurrentStudentId = (): string => {
try {
const session = supaClient.getSession()
if (session && session.user) {
return safeGet(session.user, 'id', '') as string
}
return uni.getStorageSync('current_student_id') || 'demo_student_id'
} catch (error) {
console.error('获取学生ID失败:', error)
return 'demo_student_id'
}
}
文件状态
已完成转换的文件
- ✅
h:\blews\akmon\pages\sport\student\records.uvue- 转换完成
转换模式一致性
现在学生 records 页面与以下页面使用相同的技术模式:
h:\blews\akmon\pages\sport\teacher\records.uvueh:\blews\akmon\pages\sport\student\progress.uvueh:\blews\akmon\pages\sport\student\assignments.uvueh:\blews\akmon\pages\sport\student\training-record.uvue
结论
✅ 链式调用转换完成
学生 records 页面现已成功从 supadb 组件模式转换为直接的 supaClient 链式调用模式,实现了:
- 统一的技术栈 - 与其他已转换页面保持一致
- 更好的性能 - 数据库层面的筛选和分页
- 更清晰的代码结构 - 直接的异步调用,无需组件事件处理
- 更强的可维护性 - 更直观的数据流和错误处理
AI监测系统的学生模块现在完全采用现代化的链式调用模式,为后续功能开发和维护提供了坚实的技术基础。
转换完成日期: 2025年6月12日
技术栈: Vue 3 + Composition API + Supabase 链式调用
页面状态: ✅ 完成