# 定价页面改进说明 ## 概述 定价页面现在实现了智能的套餐过滤和按钮显示逻辑,确保只显示有效的可订阅套餐,并提供清晰的用户体验。 ## 主要改进 ### 1. 智能套餐过滤 定价页面现在只显示以下套餐: 1. **免费套餐** - 总是显示 2. **用户当前套餐** - 总是显示(即使没有 stripePriceId) 3. **有效的付费套餐** - 必须有 `stripePriceId` 才显示 #### 过滤逻辑 ```typescript const filteredPlans = plans.filter((plan: SubscriptionPlan) => { // 免费套餐总是显示 if (isPlanFree(plan)) return true // 用户当前套餐总是显示 if (userData && isCurrentPlan(plan.id)) return true // 其他套餐必须有 stripePriceId 才能显示(可订阅) return plan.stripePriceId && plan.stripePriceId.trim() !== '' }) ``` ### 2. 智能按钮显示 按钮显示遵循以下逻辑: #### 免费套餐 - **当前套餐**: 显示 "当前方案" 按钮(禁用) - **非当前套餐**: 不显示任何按钮 #### 付费套餐 - **当前套餐**: 显示 "当前方案" 按钮(禁用) - **可订阅套餐**: 显示 "立即订阅" 按钮 - **无价格ID套餐**: 不显示按钮(理论上不会出现,因为已过滤) #### 按钮逻辑代码 ```typescript {(() => { // 免费套餐逻辑 if (isFree) { if (isCurrent) { return } return null // 免费套餐且非当前套餐,不显示按钮 } // 付费套餐逻辑 if (isCurrent) { return } // 可订阅的付费套餐 if (plan.stripePriceId && plan.stripePriceId.trim() !== '') { return ( {t('subscribeNow')} ) } return null })()} ``` ### 3. 多语言支持 添加了新的翻译键: #### 英文 (en.json) ```json { "pricing": { "subscribeNow": "Subscribe Now", "currentPlan": "Current Plan" } } ``` #### 中文 (zh.json) ```json { "pricing": { "subscribeNow": "立即订阅", "currentPlan": "当前方案" } } ``` ## 用户体验场景 ### 1. 匿名用户 - 看到:免费套餐(无按钮)+ 有价格ID的付费套餐(立即订阅按钮) - 不看到:没有价格ID的付费套餐 ### 2. 免费用户 - 看到:免费套餐(当前方案按钮)+ 有价格ID的付费套餐(立即订阅按钮) - 不看到:没有价格ID的付费套餐 ### 3. Pro 用户 - 看到:免费套餐(无按钮)+ 当前Pro套餐(当前方案按钮)+ 其他有价格ID的套餐(立即订阅按钮) - 不看到:没有价格ID的付费套餐 ## 技术实现 ### 1. 动态数据获取 ```typescript useEffect(() => { fetchPlans() }, [userData]) // 依赖 userData,确保用户数据加载后再过滤套餐 ``` ### 2. 套餐判定工具 使用统一的工具函数: - `isPlanFree(plan)` - 判断是否为免费套餐 - `isPlanPro(plan)` - 判断是否为Pro套餐 - `isCurrentPlan(planId)` - 判断是否为用户当前套餐 ### 3. 类型安全 ```typescript const filteredPlans = (data.plans || []).filter((plan: SubscriptionPlan) => { // 过滤逻辑 }) ``` ## 配置要求 ### 1. 套餐配置 确保付费套餐有有效的 `stripePriceId`: ```sql -- 检查套餐配置 SELECT id, name, "displayName", price, "stripePriceId", "isActive" FROM subscription_plans WHERE "isActive" = true; -- 设置价格ID UPDATE subscription_plans SET "stripePriceId" = 'price_your_stripe_price_id' WHERE name = 'pro'; ``` ### 2. 验证工具 使用测试脚本验证配置: ```bash npx tsx scripts/test-pricing-page-filtering.ts ``` ## 优势 1. **用户友好**: 只显示用户可以实际订阅的套餐 2. **防止错误**: 避免显示无法订阅的套餐 3. **清晰导航**: 明确的按钮状态和操作 4. **灵活配置**: 支持动态套餐管理 5. **多语言**: 完整的国际化支持 ## 故障排除 ### 问题:套餐不显示 **原因**: 付费套餐没有设置 `stripePriceId` **解决**: 在数据库中设置正确的 Stripe 价格 ID ### 问题:按钮不显示 **原因**: 套餐被过滤掉或逻辑判断问题 **解决**: 检查套餐配置和用户状态 ### 问题:翻译缺失 **原因**: 缺少 `subscribeNow` 翻译键 **解决**: 在对应语言文件中添加翻译 ## 测试建议 1. 测试不同用户状态下的页面显示 2. 验证按钮功能和状态 3. 检查多语言显示 4. 确认套餐过滤逻辑 5. 测试订阅流程