Skip to content

前端直接 Supabase 访问

本页面记录了前端代码中直接使用 Supabase SDK(不通过后端 API)的所有场景。 这是项目架构设计中允许的访问模式,但需要了解其影响和边界。

架构说明

前端的 Service 层允许直接访问 Supabase SDK,这是架构设计中认可的模式。数据通过 Supabase 的 RLS(Row Level Security)策略保护,确保用户只能访问自己有权限的数据。

层级规则:

  • Services 层:允许直接使用 Supabase SDK(.from().rpc().auth.channel().storage
  • Composables 层:允许使用 Supabase Realtime(.channel()),用于实时订阅
  • Stores 层:应通过 Services 层间接访问,但存在少量直接调用
  • Views 层:应通过 Services/Stores 间接访问,越层调用需要注意

Services 层

billingService.ts

计费相关的数据直接通过 Supabase 查询,订阅管理操作则走后端 API。

方法操作表/RPC说明
getSubscriptionfrom().select()subscriptions读取团队订阅信息
getCreditBalancefrom().select()credit_balances读取积分余额
updateAutoTopupfrom().update()credit_balances更新自动充值配置
listTransactionsfrom().select()credit_transactions查询积分流水
getUsageHeatmaprpc()get_usage_heatmap获取用量热力图
listPricingRulesfrom().select()billing_rules查询定价规则
createBillingRulefrom().insert()billing_rules创建定价规则
updateBillingRulefrom().update()billing_rules更新定价规则
deleteBillingRulefrom().update()billing_rules软删除定价规则
listProviderCostsfrom().select()model_provider_costs查询供应商成本
upsertProviderCostsfrom().upsert()model_provider_costs批量更新供应商成本
deleteProviderCostsfrom().delete()model_provider_costs删除供应商成本
cancelRenewalfetch()后端 API取消续订(走后端)
resumeRenewalfetch()后端 API恢复续订(走后端)
changePlanfetch()后端 API变更套餐(走后端)

permissionService.ts

权限查询和审计日志直接操作 Supabase。

方法操作表/RPC说明
getSitePermissionsfrom().select()grants查询当前用户站点权限
hasSitePermissionfrom().select()grants检查是否有指定权限
logAuditfrom().insert()audit_logs记录审计日志
listAuditLogsfrom().select()audit_logs_with_names查询审计日志列表(视图)

apiKeyService.ts

API Key 列表和更新直接操作 Supabase,创建走后端 API。

方法操作表/RPC说明
listByTeamfrom().select()api_keys获取团队 API Key 列表
createfetch()后端 API创建 API Key(走后端,密钥安全)
updatefrom().update()api_keys更新 API Key 设置
deleterpc()delete_api_key软删除 API Key(数据库 RPC)

siteSettingsService.ts

站点配置完全通过 Supabase 直接操作。

方法操作表/RPC说明
getfrom().select()site_settings获取单个配置项
getManyfrom().select()site_settings批量获取配置项
getAllfrom().select()site_settings获取所有配置项
setfrom().upsert()site_settings设置配置项(upsert)
setManyfrom().upsert()site_settings批量设置配置项
deletefrom().delete()site_settings删除配置项

realtimeService.ts

Supabase Realtime 订阅封装,所有实时数据同步通过此服务。

方法操作订阅表说明
subscribeToTablechannel().on()任意表通用单表订阅
subscribeToMultipleTableschannel().on()多表通用多表共享 channel 订阅
subscribeToBillingTables多表订阅credit_balances, credit_transactions, subscriptions计费数据实时同步
subscribeToAiModelTables多表订阅billing_rules, model_provider_costsAI 模型数据变更
subscribeToDocument单表订阅documents文档变更监听
subscribeToPaymentOrder单表订阅payment_orders支付订单状态监听
subscribeToRunschannel().on()runs执行记录变更(按 deployment)
subscribeToProjectRunschannel().on()runs执行记录变更(按 project)
subscribeToRompMessages多表订阅romp_messagesROMP 消息实时推送
subscribeToTypingIndicatorBroadcastROMP 输入状态指示器
subscribeToProjectData多表订阅projects, documents, deployments, project_schedules项目级数据同步
subscribeToTeamData多表订阅projects, deployments, team_members团队级数据同步
createCollaborationChannelPresence + BroadcastYjs 协同编辑通道

Composables 层

useAssetsRealtime.ts

资产状态实时订阅。

操作订阅表说明
channel().on()assets_items监听资产 UPDATE 事件,更新 Store 状态
channel().on()assets_sessions监听会话 UPDATE 事件,检测控制权转移

useStorageRealtime.ts

存储文件实时订阅。

操作订阅表说明
channel().on()files监听文件 INSERT/UPDATE/DELETE,刷新文件列表

Stores 层

romp.ts

ROMP 聊天 Store 中直接调用 Supabase Auth 获取 Session Token,用于 WebSocket 连接鉴权。

操作API说明
supabase.auth.getSession()Auth获取 access_token 用于 WS 连接

Views 层(越层调用)

警告

以下为 Views 层直接调用 Supabase SDK 的场景,属于越层调用,理想情况应迁移到 Services 层。

DashboardMainBody.vue

操作API说明
supabase.storage.from().getPublicUrl()Storage获取横幅图片公开 URL

BannersConfigTab.vue(Admin)

操作API说明
supabase.storage.from().getPublicUrl()Storage获取横幅图片公开 URL
supabase.storage.from().upload()Storage上传横幅封面图片
supabase.storage.from().remove()Storage删除旧封面图片

注意事项

  1. RLS 保护:所有直接 Supabase 访问都受 RLS 策略保护。前端使用 anon key + JWT 认证,不会泄露 service_role key。

  2. 数据一致性:对于需要跨表事务或复杂业务逻辑的操作(如创建 API Key、订阅变更),统一走后端 API 处理。

  3. Realtime 订阅:Supabase Realtime 的 postgres_changes 事件受 RLS 策略约束,用户只能收到自己有权访问的行变更。

  4. Storage 访问getPublicUrl() 仅生成 URL 不做鉴权检查,实际访问权限由 Storage 的 Bucket Policy 控制。upload()remove() 需要有效 JWT。

  5. 越层调用治理:Views 层的直接 Supabase 调用(DashboardMainBody、BannersConfigTab)应逐步迁移到 Services 层,以保持架构分层清晰。

AI Workflow Editor