docs: 新增邀请码开通会员方案
- IMPROVEMENTS.md 添加方案二:邀请码开通会员 - 数据库设计(invitation_codes 表) - 接口设计(使用邀请码、生成邀请码) - 后端/前端实现要点 - 邀请码生成规则建议
This commit is contained in:
137
IMPROVEMENTS.md
137
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<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 | 前端:邀请码输入入口 | 低 |
|
||||
|
||||
---
|
||||
|
||||
## 十一、检查清单
|
||||
|
||||
### 代码提交前检查
|
||||
|
||||
Reference in New Issue
Block a user