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