# Supabase 数据迁移指南 ## 概述 本指南将帮助您将当前使用模拟数据的 uni-app 项目迁移到使用 Supabase 数据库。您的项目已经配置了连接到 Ubuntu 服务器上的 Supabase(IP: 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. 测试连接和数据加载 完成后,您的应用将具备完整的后端数据支持,为后续添加用户管理、购物车、订单等功能打下基础。