oauth_nest_demo/GENERATE_LICENSE_GUIDE.md

419 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 生成卡密操作指南
## 概述
现在系统已经实现了完整的管理员权限验证。管理员可以通过 API 生成卡密,普通用户无法访问生成接口。
## 管理员权限规则
系统会自动识别以下用户为管理员:
1. 用户名为 `admin`
2. 邮箱包含 `admin`(如 `admin@example.com`
3. 用户名以 `admin_` 开头(如 `admin_user`
## 方法一:注册管理员账号(推荐)
### 步骤 1: 注册管理员账号
```bash
curl -X POST http://localhost:3030/user/register \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "your_secure_password",
"email": "admin@example.com"
}'
```
**响应示例:**
```json
{
"message": "User registered successfully",
"user": {
"id": 1,
"username": "admin",
"email": "admin@example.com",
"isActive": true,
"provider": "local"
},
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
```
**保存 `access_token`,后续生成卡密时需要使用!**
### 步骤 2: 使用管理员账号生成卡密
#### 生成单个月卡
```bash
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "monthly",
"validDays": 30,
"count": 1,
"remarks": "测试月卡"
}'
```
#### 批量生成卡密
```bash
# 生成 10 个月卡
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "monthly",
"validDays": 30,
"count": 10,
"remarks": "批量生成月卡"
}'
```
#### 生成不同类型的卡密
```bash
# 试用卡 (7天)
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "trial",
"validDays": 7,
"count": 5,
"remarks": "试用卡"
}'
# 年卡 (365天)
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "yearly",
"validDays": 365,
"count": 2,
"remarks": "年度授权"
}'
# 终身卡
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "lifetime",
"validDays": 36500,
"count": 1,
"remarks": "VIP终身授权"
}'
```
**响应示例:**
```json
[
{
"id": 1,
"code": "ABCD-1234-EFGH-5678",
"type": "monthly",
"status": "unused",
"validDays": 30,
"remarks": "测试月卡",
"createdAt": "2025-12-13T10:00:00.000Z"
}
]
```
### 步骤 3: 将卡密分发给用户
将生成的 `code` 发送给用户,用户可以使用以下方式激活:
```bash
curl -X POST http://localhost:3030/license/activate \
-H "Authorization: Bearer USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "ABCD-1234-EFGH-5678"
}'
```
## 方法二:使用 Swagger UI
### 步骤 1: 访问 Swagger
打开浏览器访问http://localhost:3030/api
### 步骤 2: 注册管理员账号
1. 找到 `POST /user/register` 接口
2. 点击 "Try it out"
3. 输入管理员信息:
```json
{
"username": "admin",
"password": "admin123",
"email": "admin@example.com"
}
```
4. 点击 "Execute"
5. 复制响应中的 `access_token`
### 步骤 3: 授权 Swagger
1. 点击页面右上角的 "Authorize" 按钮
2. 在弹出框中输入:`Bearer YOUR_ACCESS_TOKEN`
3. 点击 "Authorize"
4. 点击 "Close"
### 步骤 4: 生成卡密
1. 找到 `POST /license/generate` 接口
2. 点击 "Try it out"
3. 输入生成参数:
```json
{
"type": "monthly",
"validDays": 30,
"count": 1,
"remarks": "测试卡密"
}
```
4. 点击 "Execute"
5. 在响应中复制生成的卡密码
### 步骤 5: 查看已生成的卡密
1. 找到 `GET /license` 接口
2. 点击 "Try it out"
3. 可选:筛选条件
- status: unused (查看未使用的)
- type: monthly (查看月卡)
4. 点击 "Execute"
5. 查看所有卡密列表
## 方法三:直接插入数据库(临时方案)
如果还没有管理员账号,可以直接在数据库中插入卡密:
```sql
-- 插入测试卡密
INSERT INTO `license` (
`code`,
`type`,
`status`,
`validDays`,
`remarks`,
`createdAt`,
`updatedAt`
) VALUES
('ABCD-1234-EFGH-5678', 'monthly', 'unused', 30, '测试月卡', NOW(), NOW()),
('WXYZ-9876-IJKL-5432', 'yearly', 'unused', 365, '测试年卡', NOW(), NOW()),
('TEST-0000-FREE-TRIAL', 'trial', 'unused', 7, '试用卡', NOW(), NOW());
```
**注意:** 卡密格式必须是 `XXXX-XXXX-XXXX-XXXX`19个字符包含3个连字符
## 管理员其他操作
### 查看卡密统计
```bash
curl -X GET http://localhost:3030/license/statistics \
-H "Authorization: Bearer ADMIN_TOKEN"
```
**响应示例:**
```json
{
"total": 100,
"unused": 50,
"active": 30,
"expired": 15,
"revoked": 5
}
```
### 查询所有卡密
```bash
# 查询所有卡密
curl -X GET http://localhost:3030/license \
-H "Authorization: Bearer ADMIN_TOKEN"
# 查询未使用的卡密
curl -X GET "http://localhost:3030/license?status=unused" \
-H "Authorization: Bearer ADMIN_TOKEN"
# 查询已激活的月卡
curl -X GET "http://localhost:3030/license?status=active&type=monthly" \
-H "Authorization: Bearer ADMIN_TOKEN"
```
### 查询单个卡密详情
```bash
curl -X GET http://localhost:3030/license/1 \
-H "Authorization: Bearer ADMIN_TOKEN"
```
### 撤销卡密
```bash
curl -X POST http://localhost:3030/license/1/revoke \
-H "Authorization: Bearer ADMIN_TOKEN"
```
### 删除卡密
```bash
curl -X DELETE http://localhost:3030/license/1 \
-H "Authorization: Bearer ADMIN_TOKEN"
```
## 常见问题
### Q: 非管理员用户能生成卡密吗?
A: 不能。系统会返回 403 错误:
```json
{
"statusCode": 403,
"message": "需要管理员权限",
"error": "Forbidden"
}
```
### Q: 如何修改管理员权限规则?
A: 编辑 [src/common/services/admin.service.ts](src/common/services/admin.service.ts:23-30),修改 `isAdmin` 方法中的判断逻辑。
### Q: 可以有多个管理员吗?
A: 可以。所有满足管理员规则的用户都拥有管理员权限。
### Q: 生成的卡密可以重复使用吗?
A: 不可以。每个卡密只能激活一次,激活后状态变为 `active`
### Q: 如何批量生成大量卡密?
A: 使用 `count` 参数,建议每次不超过 100 个:
```json
{
"type": "monthly",
"count": 100
}
```
## 完整示例流程
### 场景销售100个月卡
```bash
# 1. 使用管理员账号登录
curl -X POST http://localhost:3030/user/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "admin123"
}'
# 获取 access_token
# 2. 批量生成 100 个月卡
curl -X POST http://localhost:3030/license/generate \
-H "Authorization: Bearer ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "monthly",
"validDays": 30,
"count": 100,
"remarks": "2025年1月批次"
}'
# 3. 查询已生成的卡密
curl -X GET "http://localhost:3030/license?status=unused&type=monthly" \
-H "Authorization: Bearer ADMIN_TOKEN"
# 4. 导出卡密可以通过数据库查询或API获取
# SQL 查询未使用的卡密
# SELECT code FROM license WHERE status = 'unused' AND type = 'monthly'
# 5. 将卡密分发给客户
# 6. 监控卡密使用情况
curl -X GET http://localhost:3030/license/statistics \
-H "Authorization: Bearer ADMIN_TOKEN"
```
## 数据库直接查询卡密
### 查询所有未使用的卡密
```sql
SELECT
id, code, type, validDays, remarks, createdAt
FROM license
WHERE status = 'unused'
ORDER BY createdAt DESC;
```
### 导出卡密列表(用于分发)
```sql
SELECT
code as '卡密码',
CASE type
WHEN 'trial' THEN '试用版'
WHEN 'monthly' THEN '月卡'
WHEN 'yearly' THEN '年卡'
WHEN 'lifetime' THEN '终身版'
END as '类型',
validDays as '有效天数',
remarks as '备注'
FROM license
WHERE status = 'unused'
ORDER BY type, createdAt DESC;
```
### 统计卡密使用情况
```sql
SELECT
type as '类型',
COUNT(*) as '总数',
SUM(CASE WHEN status = 'unused' THEN 1 ELSE 0 END) as '未使用',
SUM(CASE WHEN status = 'active' THEN 1 ELSE 0 END) as '已激活',
SUM(CASE WHEN status = 'expired' THEN 1 ELSE 0 END) as '已过期',
SUM(CASE WHEN status = 'revoked' THEN 1 ELSE 0 END) as '已撤销'
FROM license
GROUP BY type;
```
## 安全建议
1. **保护管理员账号**
- 使用强密码
- 定期更换密码
- 不要分享管理员凭证
2. **卡密分发**
- 通过安全渠道发送(邮件、加密通讯)
- 记录卡密分发情况
- 及时撤销未使用的卡密
3. **监控使用**
- 定期查看统计信息
- 检查异常激活
- 审计管理员操作日志
## 下一步
完成卡密生成后,可以:
1. 将卡密分发给用户
2. 用户使用 `POST /license/activate` 激活
3. 激活后用户可以使用任务功能
4. 管理员可以通过统计接口监控使用情况
## 相关文档
- [LICENSE_SYSTEM.md](LICENSE_SYSTEM.md) - 卡密系统详细说明
- [QUICKSTART.md](QUICKSTART.md) - 快速开始指南
- [Swagger API](http://localhost:3030/api) - 在线 API 文档