Add landing page, referral system, usage quotas, search API management, and yearly pricing

- Separate workspace landing from login for better UX
- Referral system rewards both parties with Pro days
- Quota enforcement prevents abuse without breaking endpoints
- 7-day free trial with auto-downgrade on expiry
- Admin-managed search provider config (SearXNG, Bing)
- 15% discount on annual subscriptions
- MCP search server wrapping opencode search
- Fix discovery module field name mismatch causing 422
This commit is contained in:
TradeMate Dev
2026-05-26 11:40:13 +08:00
parent 52dba37f22
commit bed5c7abef
39 changed files with 1988 additions and 152 deletions
+30 -1
View File
@@ -209,13 +209,29 @@
<text class="ob-result-hint">你可以去"营销素材""产品库"查看更多</text>
</view>
<view class="ob-upgrade" v-if="onboardingStep === 4">
<text class="ob-upgrade-title">🚀 升级 Pro解锁全部功能</text>
<view class="ob-compare-row"><text>翻译字符/</text><text class="free">5,000</text><text class="pro">50,000</text></view>
<view class="ob-compare-row"><text>客户管理</text><text class="free">最多5个</text><text class="pro">最多100个</text></view>
<view class="ob-compare-row"><text>产品管理</text><text class="free">最多1个</text><text class="pro">最多20个</text></view>
<view class="ob-compare-row"><text>跟进提醒</text><text class="free"></text><text class="pro"></text></view>
<view class="ob-compare-row"><text>挖掘新客</text><text class="free"></text><text class="pro"></text></view>
<text class="ob-upgrade-price"> ¥99/</text>
</view>
<view class="ob-actions">
<button class="ob-btn ob-btn-primary" @click="onboardingNext" v-if="onboardingStep === 1">
开始生成
</button>
<button class="ob-btn ob-btn-primary" @click="finishOnboarding" v-if="onboardingStep === 3">
<button class="ob-btn ob-btn-primary" @click="onboardingStep = 4" v-if="onboardingStep === 3">
开始使用
</button>
<button class="ob-btn ob-btn-primary" @click="goUpgrade" v-if="onboardingStep === 4">
升级 Pro
</button>
<button class="ob-btn ob-btn-secondary" @click="finishOnboarding" v-if="onboardingStep === 4">
暂时不用
</button>
</view>
<text class="ob-skip" @click="finishOnboarding" v-if="onboardingStep === 1">跳过以后再说</text>
@@ -403,6 +419,11 @@ const finishOnboarding = () => {
loadData()
}
const goUpgrade = () => {
finishOnboarding()
uni.navigateTo({ url: PAGES.UPGRADE })
}
const loadData = async () => {
try {
const [userRes, silentRes, overviewRes] = await Promise.all([
@@ -1111,8 +1132,16 @@ const playTryResult = () => {
.ob-actions { margin-top: 32rpx; }
.ob-btn { width: 100%; height: 88rpx; border-radius: 12rpx; font-size: 30rpx; border: none; display: flex; align-items: center; justify-content: center; }
.ob-btn-primary { background: #1890ff; color: #fff; }
.ob-btn-secondary { background: #f5f5f5; color: #666; margin-top: 12rpx; }
.ob-skip { display: block; text-align: center; margin-top: 24rpx; font-size: 24rpx; color: #999; }
.ob-upgrade { margin: 20rpx 0; }
.ob-upgrade-title { font-size: 30rpx; font-weight: 600; color: #333; display: block; text-align: center; margin-bottom: 24rpx; }
.ob-compare-row { display: flex; justify-content: space-between; padding: 16rpx 0; border-bottom: 1px solid #f0f0f0; font-size: 26rpx; }
.ob-compare-row .free { color: #999; width: 80rpx; text-align: center; }
.ob-compare-row .pro { color: #1890ff; font-weight: 500; width: 80rpx; text-align: center; }
.ob-upgrade-price { display: block; text-align: center; margin-top: 20rpx; font-size: 28rpx; color: #ff4d4f; font-weight: 600; }
.modal-overlay {
position: fixed; top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.5);