Files
medical-mall/doc_mall/SUPABASE_DATA_MIGRATION_GUIDE.md

248 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Supabase 数据迁移指南
## 概述
本指南将帮助您将当前使用模拟数据的 uni-app 项目迁移到使用 Supabase 数据库。您的项目已经配置了连接到 Ubuntu 服务器上的 SupabaseIP: 192.168.1.61),现在需要创建数据库表并插入测试数据,然后修改前端代码以使用真实数据。
## 第一步:在 Supabase 中创建数据库表
### 方法一:通过 Supabase Dashboard 执行 SQL
1. **打开 Supabase Dashboard**
- 访问http://192.168.1.61:3000
- 使用 Dashboard 用户名和密码登录(位于 `supabase_pro/.env` 中的 `DASHBOARD_USERNAME``DASHBOARD_PASSWORD`
2. **进入 SQL Editor**
- 在左侧菜单中点击 "SQL Editor"
- 点击 "New query" 创建新查询
3. **执行建表脚本**
- 复制 `sql/001_create_tables.sql` 文件中的全部内容
- 粘贴到 SQL Editor 中
- 点击 "Run" 执行
4. **执行插入数据脚本**
- 复制 `sql/002_insert_test_data.sql` 文件中的全部内容
- 粘贴到 SQL Editor 中
- 点击 "Run" 执行
### 方法二:通过命令行执行(如果 Supabase 运行在 Ubuntu 服务器上)
```bash
# 登录到 Ubuntu 服务器
ssh hfkj@192.168.1.61
# 进入 Supabase 项目目录(假设 Supabase 安装在默认位置)
cd ~/supabase
# 使用 psql 连接到数据库执行 SQL 脚本
# 注意:需要知道数据库密码(位于 supabase_pro/.env 中的 POSTGRES_PASSWORD
PGPASSWORD=yxyHINygZMLSq9jLddrZQBB-CoyGHSF5DwlwWmbrYXc psql -h localhost -U postgres -d postgres -f /path/to/001_create_tables.sql
PGPASSWORD=yxyHINygZMLSq9jLddrZQBB-CoyGHSF5DwlwWmbrYXc psql -h localhost -U postgres -d postgres -f /path/to/002_insert_test_data.sql
```
## 第二步:验证数据表创建成功
### 在 Supabase Dashboard 中验证
1. **查看 Tables**
- 在左侧菜单中点击 "Table Editor"
- 应该能看到 `categories``products`
2. **查看数据**
- 点击 `categories` 表,应该能看到 10 条分类数据
- 点击 `products` 表,应该能看到 18 条商品数据
### 通过 API 验证
1. **测试分类 API**
```
GET http://192.168.1.61:8000/rest/v1/categories
Headers:
apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNzY4ODMwNjI0LCJleHAiOjE5MjY1MTA2MjR9.mDVl-kIOdRK9v6VTxo0TDF8r7X7xk3PZXazaavHyVvg
```
2. **测试商品 API**
```
GET http://192.168.1.61:8000/rest/v1/products?category_id=eq.cold
Headers:
apikey: [同上]
```
## 第三步:修改前端代码使用真实数据
### 1. 已创建的服务文件
我已经创建了 `utils/supabaseService.uts` 文件,提供了以下功能:
- `getCategories()` - 获取所有分类
- `getProductsByCategory()` - 获取指定分类的商品
- `searchProducts()` - 搜索商品
- `getProductById()` - 获取单个商品详情
- `getHotProducts()` - 获取热销商品
- `getRecommendedProducts()` - 获取推荐商品
### 2. 修改分类页面 (`pages/mall/consumer/category.uvue`)
需要将硬编码的模拟数据替换为从 Supabase 获取的数据:
```typescript
// 在 script 部分添加导入
import supabaseService from '@/utils/supabaseService.uts'
import type { Category, Product } from '@/utils/supabaseService.uts'
// 替换 medicineCategories 的初始化
// 删除原有的 medicineCategories 数组定义
// 修改 onMounted 或创建新的生命周期函数
onMounted(async () => {
await loadCategories()
await loadProducts()
})
// 添加加载分类的方法
const loadCategories = async () => {
const categories = await supabaseService.getCategories()
if (categories.length > 0) {
primaryCategories.value = categories
// 设置默认选中第一个分类
if (!activePrimary.value && categories[0]) {
activePrimary.value = categories[0].id
}
}
}
// 修改 selectPrimaryCategory 方法
const selectPrimaryCategory = async (categoryId: string) => {
activePrimary.value = categoryId
// 更新当前分类信息
const category = primaryCategories.value.find(cat => cat.id === categoryId)
if (category) {
currentCategoryName.value = category.name
currentCategoryDesc.value = category.description
}
// 加载对应商品
const response = await supabaseService.getProductsByCategory(categoryId)
productList.value = response.data
hasMore.value = response.hasmore
}
```
### 3. 修改主页 (`pages/mall/consumer/index.uvue`)
如果主页显示商品,也需要修改为从 Supabase 获取:
```typescript
import supabaseService from '@/utils/supabaseService.uts'
// 获取热销商品
const loadHotProducts = async () => {
hotProducts.value = await supabaseService.getHotProducts(6)
}
// 获取推荐商品
const loadRecommendedProducts = async () => {
recommendedProducts.value = await supabaseService.getRecommendedProducts(6)
}
```
## 第四步:测试连接和数据
### 1. 测试 Supabase 连接
创建一个测试页面或使用现有的页面测试连接:
```typescript
// 测试代码示例
const testConnection = async () => {
try {
const categories = await supabaseService.getCategories()
console.log('连接成功,获取到分类数:', categories.length)
uni.showToast({
title: `连接成功,获取到 ${categories.length} 个分类`,
icon: 'success'
})
} catch (error) {
console.error('连接失败:', error)
uni.showToast({
title: '连接失败,请检查配置',
icon: 'error'
})
}
}
```
### 2. 测试数据加载
在分类页面测试:
1. 打开分类页面
2. 检查分类列表是否显示
3. 点击不同分类,检查商品列表是否更新
4. 检查商品图片、价格等信息是否正确显示
### 3. 测试搜索功能
如果项目有搜索页面,测试搜索功能:
1. 输入关键字搜索
2. 检查返回的商品是否相关
## 第五步:处理图片 URL
### 当前情况
- 数据库中的 `image` 字段目前为空或使用本地路径
- 实际项目中,图片应该存储在 Supabase Storage 或 CDN
### 临时解决方案
在显示图片时,如果数据库中没有图片 URL使用默认图片
```typescript
const getProductImage = (product: Product) => {
if (product.image && product.image.startsWith('http')) {
return product.image
}
return '/static/images/default-product.png'
}
```
### 长期解决方案
1. 将图片上传到 Supabase Storage
2. 更新数据库中的 `image` 字段为完整 URL
## 常见问题解决
### 1. 连接超时或失败
- 检查 Ubuntu 服务器上的 Supabase 是否正常运行
- 检查防火墙设置,确保 8000 和 3000 端口可访问
- 检查 `ak/config.uts` 中的 IP 地址是否正确
### 2. 401 未授权错误
- 检查 `SUPA_KEY` 是否正确(与 `supabase_pro/.env` 中的 `ANON_KEY` 一致)
- 检查 Supabase 是否已启用匿名访问
### 3. 表不存在错误
- 确认已执行 SQL 脚本创建表
- 检查表名是否拼写正确(区分大小写)
### 4. 数据不显示
- 检查浏览器控制台是否有错误
- 检查网络请求是否成功
- 确认数据库中有数据
## 下一步优化建议
1. **添加加载状态**:在数据加载时显示加载动画
2. **错误处理**:添加更完善的错误处理和重试机制
3. **数据缓存**:使用本地存储缓存常用数据,减少网络请求
4. **分页加载**:实现滚动加载更多商品
5. **图片优化**:使用图片懒加载和压缩
## 总结
通过以上步骤,您的项目将从使用模拟数据过渡到使用 Supabase 数据库数据。主要工作包括:
1. 在 Supabase 中创建表和插入测试数据
2. 修改前端代码使用新的服务层
3. 测试连接和数据加载
完成后,您的应用将具备完整的后端数据支持,为后续添加用户管理、购物车、订单等功能打下基础。