docs: 新增邀请码开通会员方案

- IMPROVEMENTS.md 添加方案二:邀请码开通会员
  - 数据库设计(invitation_codes 表)
  - 接口设计(使用邀请码、生成邀请码)
  - 后端/前端实现要点
  - 邀请码生成规则建议
This commit is contained in:
2026-04-17 21:34:03 +08:00
parent a495d091e5
commit 75cdb1d222

View File

@@ -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<PackageType> {
// 查询邀请码
// 检查是否已使用
// 检查是否过期
// 标记为已使用
// 更新用户付费状态
}
// 2. 生成邀请码
async fn generate_invitation_codes(pool: &PgPool, package_type: &str, count: i32, expires_days: i32) -> Result<Vec<String>> {
// 生成随机码
// 批量插入数据库
}
```
### 前端实现要点
```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 | 前端:邀请码输入入口 | 低 |
---
## 十一、检查清单 ## 十一、检查清单
### 代码提交前检查 ### 代码提交前检查