diff --git a/IMPROVEMENTS.md b/IMPROVEMENTS.md index 3c498ad..4de53bc 100644 --- a/IMPROVEMENTS.md +++ b/IMPROVEMENTS.md @@ -837,6 +837,143 @@ pages/ --- +## 方案二:邀请码开通会员 + +### 方案描述 +用户输入邀请码即可开通会员,无需支付。适合不想接入微信支付但需要会员管理的场景。 + +### 数据库设计 +```sql +-- 邀请码表 +CREATE TABLE invitation_codes ( + id SERIAL PRIMARY KEY, + code VARCHAR(32) UNIQUE NOT NULL, -- 邀请码 + package_type VARCHAR(20) NOT NULL, -- 套餐类型:monthly/yearly/permanent + used_by INTEGER REFERENCES users(id), -- 使用者 + used_at TIMESTAMPTZ, -- 使用时间 + created_at TIMESTAMPTZ DEFAULT NOW(), + expires_at TIMESTAMPTZ, -- 邀请码过期时间(可选) + is_used BOOLEAN DEFAULT FALSE +); + +CREATE INDEX idx_invitation_codes_code ON invitation_codes(code); +``` + +### 接口设计 + +#### 1. 使用邀请码 +```json +POST /api/redeem-invitation-code +Request: +{ + "code": "ASD2024VIP001" +} + +Response: +{ + "success": true, + "data": { + "package_type": "yearly", + "expires_at": "2027-04-17T00:00:00Z" + } +} + +Error: +{ + "success": false, + "errcode": 400, + "errmsg": "邀请码无效或已使用" +} +``` + +#### 2. 生成邀请码(管理员) +```json +POST /api/admin/invitation-codes +Request: +{ + "package_type": "yearly", + "count": 10, + "expires_in_days": 365 +} + +Response: +{ + "success": true, + "data": { + "codes": [ + {"code": "ASD2024VIP001", "expires_at": "2027-04-17T00:00:00Z"}, + {"code": "ASD2024VIP002", "expires_at": "2027-04-17T00:00:00Z"} + ] + } +} +``` + +### 后端实现要点 +```rust +// 1. 使用邀请码 +async fn redeem_invitation_code(pool: &PgPool, user_id: i32, code: &str) -> Result { + // 查询邀请码 + // 检查是否已使用 + // 检查是否过期 + // 标记为已使用 + // 更新用户付费状态 +} + +// 2. 生成邀请码 +async fn generate_invitation_codes(pool: &PgPool, package_type: &str, count: i32, expires_days: i32) -> Result> { + // 生成随机码 + // 批量插入数据库 +} +``` + +### 前端实现要点 +```typescript +// 页面:pkg-extra/upgrade/upgrade +// 添加"使用邀请码"入口 + +async onRedeemCode() { + const code = this.data.invitationCode.trim(); + if (!code) { + wx.showToast({ title: '请输入邀请码', icon: 'none' }); + return; + } + + const res = await request({ + url: `${baseUrl}/api/redeem-invitation-code`, + method: 'POST', + data: { code } + }); + + if (res.success) { + wx.showModal({ + title: '开通成功', + content: `恭喜!您已开通${res.data.package_type}会员`, + showCancel: false + }); + // 刷新用户状态 + this.fetchUserProfile(); + } +} +``` + +### 邀请码生成规则建议 +``` +格式:ASD + 年份 + 类型 + 随机6位 +示例: +- ASD2024Y01A2B3C (年度会员) +- ASD2024M01X2Y3Z (月度会员) +- ASD2024P01Q2W3E (永久会员) +``` + +### 实施优先级 + +| 阶段 | 内容 | 复杂度 | +|------|------|--------| +| P2 | 后端:邀请码表 + 使用/生成接口 | 中 | +| P2 | 前端:邀请码输入入口 | 低 | + +--- + ## 十一、检查清单 ### 代码提交前检查