# Pro 套餐判定逻辑 ## 概述 系统使用统一的价格判定逻辑来确定套餐是否为 Pro 级别,而不是依赖硬编码的套餐 ID。这提供了更大的灵活性,允许动态创建不同价格的套餐。 ## 判定规则 ### Pro 套餐判定 ```typescript function isPlanPro(plan): boolean { return plan.price > 19 } ``` **规则**: 任何价格超过 $19 的套餐都被视为 Pro 级别 ### 套餐层级 ```typescript function getPlanTier(plan): 'free' | 'pro' | 'enterprise' { if (!plan || plan.price === 0) return 'free' if (plan.price > 50) return 'enterprise' // 为未来预留 if (plan.price > 19) return 'pro' return 'free' } ``` **层级划分**: - **Free**: $0 - **Basic**: $0.01 - $19.00 (仍被视为免费层级) - **Pro**: $19.01 - $50.00 - **Enterprise**: $50.01+ (为未来扩展预留) ## 实际应用示例 | 套餐名称 | 价格 | isPro() | getPlanTier() | 说明 | |---------|------|---------|---------------|------| | Free | $0 | false | free | 免费套餐 | | Basic | $9.99 | false | free | 低价套餐,仍为免费层级 | | Pro | $19.99 | true | pro | 标准 Pro 套餐 | | Premium | $29.99 | true | pro | 高级 Pro 套餐 | | Enterprise | $99.99 | true | enterprise | 企业级套餐 | ## 使用方式 ### 在组件中使用 ```typescript import { isPlanPro, getPlanTier, getPlanTheme } from '@/lib/subscription-utils' // 判断是否为 Pro const isPro = isPlanPro(plan) // 获取套餐层级 const tier = getPlanTier(plan) // 获取对应的主题样式 const theme = getPlanTheme(plan) ``` ### 在服务端使用 ```typescript import { SubscriptionService } from '@/lib/subscription-service' // 判断用户是否为 Pro const isUserPro = await SubscriptionService.isUserPro(userId) // 判断套餐是否为 Pro const isPro = SubscriptionService.isPlanPro(plan) ``` ## 优势 1. **灵活性**: 可以创建任意价格的套餐,系统自动判定层级 2. **一致性**: 所有 Pro 判定都使用统一的逻辑 3. **可扩展性**: 易于添加新的套餐层级(如 Enterprise) 4. **维护性**: 修改判定规则只需要更新一个地方 ## 样式主题 系统会根据套餐层级自动应用对应的主题样式: - **Free**: 灰色主题,Star 图标 - **Pro**: 橙色/琥珀色主题,Crown 图标 - **Enterprise**: 紫色主题,Building 图标 ## 注意事项 1. 价格判定基于美元金额 2. 判定逻辑支持部分套餐数据(只需要 `price` 字段) 3. 所有显示逻辑都应该使用这些工具函数,而不是硬编码套餐 ID 4. 修改价格阈值时需要考虑现有套餐的影响 ## 迁移指南 如果需要修改 Pro 套餐的价格阈值: 1. 更新 `src/lib/subscription-utils.ts` 中的判定逻辑 2. 运行测试确保所有现有套餐仍然正确分类 3. 更新文档中的示例 ```typescript // 例如,将 Pro 阈值改为 $25 export function isPlanPro(plan: PlanLike): boolean { if (!plan) return false return plan.price > 25 // 从 19 改为 25 } ```