# 技术开发文档 ## 1. 架构设计 项目采用 MVVM 架构,View 层为 `.uvue` 文件,Model/Service 层主要由 `utils/supabaseService.uts` 承担,负责与 Supabase 进行数据交互。 ## 2. 核心模块实现 ### 2.1 首页 (index.uvue) - **UI 组件**: 使用 `.category-tabs-pills` 实现胶囊式选项卡切换。解决在移动端 flex 布局默认方向问题,显式设置 `flex-direction: row`。 - **动态布局**: 监听 `statusBarHeight`,动态调整内容区域的 `marginTop`,防止被自定义导航栏遮挡。 - **数据加载**: - `loadCategories()` 与 `loadBrands()` 获取数据后调用 `.sort(() => Math.random() - 0.5)` 实现随机排序。 - 品牌点击事件 `switchBrand` 使用 `uni.navigateTo` 跳转至搜索页,携带参数 `type=brand`。 ### 2.2 搜索页 (search.uvue) - **自动搜索逻辑**: 在 `onLoad` 或 `initPage` 中检查页面参数 `options`。 - 若 `options.type === 'brand'`,则直接调用 `performSearch()`,并设置 `showResults = true`,跳过手动输入步骤。 - **数据源**: `supabaseService.searchProducts` 支持按销量、价格排序。 ### 2.3 订单导航拦截 (orders.uvue) - **问题**: 登录后跳转至订单页,点击返回键可能回到登录页。 - **方案**: 实现 `onBackPress` 生命周期钩子。 ```typescript onBackPress((options) => { if (options.from === 'navigateBack') { // 检查路由栈,若需拦截则跳转至 Profile uni.switchTab({ url: '/pages/mall/consumer/profile' }) return true } return false }) ``` ### 2.4 钱包与提现 (wallet.uvue / withdraw.uvue) - **数据交互**: - `getWalletBalance()`: 获取 `ak_wallet` 表余额。 - `withdraw()`: 调用 Supabase RPC `withdraw_balance` (需在数据库定义该函数) 或直接操作余额表(视后端实现而定,建议使用 RPC 保证事务原子性)。 ## 3. 数据库交互 (Supabase) 主要涉及的表结构: - `ml_products`: 商品主表 - `ml_brands`: 品牌表 - `ml_categories`: 分类表 - `ak_wallet`: 用户钱包表 - `ml_orders`: 订单表 ### 3.1 数据脚本 请参考 `doc_mall/consumer/sql/` 目录下的 SQL 脚本进行数据初始化: - `05_insert_brand_products.sql`: 自动为每个品牌生成 12 个测试商品。 ## 4. UI 适配指南 - **状态栏适配**: 所有自定义导航栏页面均需获取 `uni.getSystemInfoSync().statusBarHeight` 并设置顶部内边距。 - **响应式**: 使用媒体查询 (`@media`) 适配手机、平板及桌面端网格列数 (2列 -> 6列)。