Initial commit of akmon project
This commit is contained in:
259
pages/sport/SUPACLINET_GUIDE.md
Normal file
259
pages/sport/SUPACLINET_GUIDE.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# 直接使用 AkSupa 链式调用指南
|
||||
|
||||
**优势:** 无需 API 包装层,直接使用 `supaClient` 链式调用,代码更简洁高效!
|
||||
|
||||
## 基本用法
|
||||
|
||||
### 1. 导入 supaClient
|
||||
```typescript
|
||||
import supaClient from '@/components/supadb/aksupainstance.uts'
|
||||
```
|
||||
|
||||
### 2. 基本 CRUD 操作
|
||||
|
||||
#### 查询数据
|
||||
```typescript
|
||||
// 获取所有项目
|
||||
const result = await supaClient
|
||||
.from('ak_training_projects')
|
||||
.select('*')
|
||||
.execute()
|
||||
|
||||
// 带条件查询
|
||||
const result = await supaClient
|
||||
.from('ak_assignments')
|
||||
.select('*, ak_training_projects(*)')
|
||||
.eq('student_id', studentId)
|
||||
.eq('status', 'pending')
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(20)
|
||||
.execute()
|
||||
|
||||
// 单条记录查询
|
||||
const result = await supaClient
|
||||
.from('ak_training_projects')
|
||||
.select('*')
|
||||
.eq('id', projectId)
|
||||
.single()
|
||||
.execute()
|
||||
```
|
||||
|
||||
#### 插入数据
|
||||
```typescript
|
||||
// 创建新记录
|
||||
const result = await supaClient
|
||||
.from('ak_training_records')
|
||||
.insert({
|
||||
title: '晨跑训练',
|
||||
duration: 30,
|
||||
calories: 200,
|
||||
student_id: 'user123',
|
||||
created_at: new Date().toISOString()
|
||||
})
|
||||
.single()
|
||||
.execute()
|
||||
```
|
||||
|
||||
#### 更新数据
|
||||
```typescript
|
||||
// 更新记录
|
||||
const result = await supaClient
|
||||
.from('ak_assignments')
|
||||
.update({
|
||||
status: 'completed',
|
||||
completed_at: new Date().toISOString(),
|
||||
score: 95
|
||||
})
|
||||
.eq('id', assignmentId)
|
||||
.single()
|
||||
.execute()
|
||||
```
|
||||
|
||||
#### 删除数据
|
||||
```typescript
|
||||
// 删除记录
|
||||
const result = await supaClient
|
||||
.from('ak_training_records')
|
||||
.delete()
|
||||
.eq('id', recordId)
|
||||
.execute()
|
||||
```
|
||||
|
||||
### 3. 高级查询
|
||||
|
||||
#### 复杂筛选
|
||||
```typescript
|
||||
// 多条件筛选
|
||||
const result = await supaClient
|
||||
.from('ak_training_projects')
|
||||
.select('*')
|
||||
.eq('category', '体能训练')
|
||||
.gte('difficulty', 3)
|
||||
.lte('difficulty', 5)
|
||||
.eq('is_active', true)
|
||||
.ilike('name', '%跑步%')
|
||||
.execute()
|
||||
```
|
||||
|
||||
#### 分页查询
|
||||
```typescript
|
||||
// 分页获取数据
|
||||
const result = await supaClient
|
||||
.from('ak_assignments')
|
||||
.select('*')
|
||||
.range(0, 19) // 获取前20条
|
||||
.order('created_at', { ascending: false })
|
||||
.execute()
|
||||
```
|
||||
|
||||
#### 聚合查询
|
||||
```typescript
|
||||
// 统计查询
|
||||
const result = await supaClient
|
||||
.from('ak_training_records')
|
||||
.select('*', { count: 'exact' })
|
||||
.eq('student_id', studentId)
|
||||
.execute()
|
||||
|
||||
// result.count 包含总数
|
||||
```
|
||||
|
||||
### 4. 实时订阅
|
||||
|
||||
```typescript
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
subscription: null
|
||||
}
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.setupRealtimeSubscription()
|
||||
},
|
||||
|
||||
onUnload() {
|
||||
if (this.subscription) {
|
||||
this.subscription.unsubscribe()
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
setupRealtimeSubscription() {
|
||||
this.subscription = supaClient
|
||||
.from('ak_assignments')
|
||||
.on('INSERT', (payload) => {
|
||||
console.log('新作业:', payload.new)
|
||||
// 更新本地数据
|
||||
this.assignments.push(payload.new)
|
||||
})
|
||||
.on('UPDATE', (payload) => {
|
||||
console.log('作业更新:', payload.new)
|
||||
// 更新本地数据
|
||||
this.updateLocalAssignment(payload.new)
|
||||
})
|
||||
.on('DELETE', (payload) => {
|
||||
console.log('作业删除:', payload.old)
|
||||
// 从本地数据中移除
|
||||
this.removeLocalAssignment(payload.old.id)
|
||||
})
|
||||
.subscribe()
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 文件上传
|
||||
|
||||
```typescript
|
||||
// 上传文件到 Supabase Storage
|
||||
const result = await supaClient
|
||||
.storage
|
||||
.from('training-files')
|
||||
.upload(`${Date.now()}_${fileName}`, filePath)
|
||||
.execute()
|
||||
|
||||
if (result.success) {
|
||||
const fileUrl = supaClient.storage
|
||||
.from('training-files')
|
||||
.getPublicUrl(result.data.path)
|
||||
|
||||
console.log('文件URL:', fileUrl)
|
||||
}
|
||||
```
|
||||
|
||||
### 6. 认证操作
|
||||
|
||||
```typescript
|
||||
// 登录
|
||||
const result = await supaClient.signInWithPassword(email, password)
|
||||
|
||||
// 登出
|
||||
await supaClient.signOut()
|
||||
|
||||
// 获取当前会话
|
||||
const session = supaClient.getSession()
|
||||
|
||||
// 获取当前用户
|
||||
if (session && session.user) {
|
||||
const userId = session.user.id
|
||||
const userEmail = session.user.email
|
||||
}
|
||||
```
|
||||
|
||||
## 错误处理
|
||||
|
||||
```typescript
|
||||
try {
|
||||
const result = await supaClient
|
||||
.from('ak_training_projects')
|
||||
.select('*')
|
||||
.execute()
|
||||
|
||||
if (result.success) {
|
||||
// 处理成功结果
|
||||
this.projects = result.data
|
||||
} else {
|
||||
// 处理错误
|
||||
uni.showToast({
|
||||
title: result.message || '操作失败',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('请求失败:', error)
|
||||
uni.showToast({
|
||||
title: '网络错误',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
## 数据安全访问
|
||||
|
||||
使用 `types.uts` 中的安全访问函数:
|
||||
|
||||
```typescript
|
||||
import { safeGet } from '../types.uts'
|
||||
|
||||
// 安全获取数据
|
||||
const projectId = safeGet(project, 'id', '') as string
|
||||
const projectName = safeGet(project, 'name', '未命名项目') as string
|
||||
const difficulty = safeGet(project, 'difficulty', 1) as number
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **统一错误处理** - 使用 try-catch 包装所有数据库操作
|
||||
2. **数据验证** - 在插入/更新前验证数据有效性
|
||||
3. **实时订阅管理** - 在页面卸载时记得取消订阅
|
||||
4. **安全访问** - 始终使用 `safeGet` 等安全函数访问数据
|
||||
5. **性能优化** - 合理使用 `limit()` 和分页查询
|
||||
|
||||
## 示例页面
|
||||
|
||||
参考 `pages/sport/student/simple-records.uvue` 查看完整的实现示例。
|
||||
|
||||
---
|
||||
|
||||
**总结:** 删除了 `api.uts` 包装层后,直接使用 `supaClient` 链式调用让代码更加简洁、直观和高效!
|
||||
Reference in New Issue
Block a user