1 回复
我理解你想做一个付费课程的激活码发放活动。这个需求很常见,核心就是生成、管理和验证激活码。下面给你一个完整的实现方案:
import secrets
import string
import sqlite3
from datetime import datetime, timedelta
from typing import Optional, List, Tuple
class ActivationCodeSystem:
def __init__(self, db_path: str = "activation_codes.db"):
"""初始化激活码系统"""
self.conn = sqlite3.connect(db_path)
self._init_database()
def _init_database(self):
"""创建数据库表"""
cursor = self.conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS activation_codes (
code TEXT PRIMARY KEY,
course_id TEXT NOT NULL,
is_used BOOLEAN DEFAULT 0,
used_by TEXT,
used_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP,
max_uses INTEGER DEFAULT 1
)
''')
self.conn.commit()
def generate_codes(self, course_id: str, count: int = 100,
length: int = 12, expires_days: int = 30) -> List[str]:
"""批量生成激活码"""
codes = []
for _ in range(count):
# 生成随机激活码:字母+数字
code = ''.join(secrets.choice(string.ascii_uppercase + string.digits)
for _ in range(length))
expires_at = datetime.now() + timedelta(days=expires_days)
cursor = self.conn.cursor()
cursor.execute('''
INSERT INTO activation_codes (code, course_id, expires_at)
VALUES (?, ?, ?)
''', (code, course_id, expires_at))
codes.append(code)
self.conn.commit()
return codes
def validate_code(self, code: str, user_id: str) -> Tuple[bool, str]:
"""验证激活码是否有效"""
cursor = self.conn.cursor()
cursor.execute('''
SELECT course_id, is_used, expires_at, max_uses
FROM activation_codes
WHERE code = ?
''', (code,))
result = cursor.fetchone()
if not result:
return False, "激活码不存在"
course_id, is_used, expires_at, max_uses = result
if is_used:
return False, "激活码已被使用"
if expires_at and datetime.now() > datetime.fromisoformat(expires_at):
return False, "激活码已过期"
# 标记为已使用
cursor.execute('''
UPDATE activation_codes
SET is_used = 1, used_by = ?, used_at = CURRENT_TIMESTAMP
WHERE code = ?
''', (user_id, code))
self.conn.commit()
return True, course_id
def get_available_codes(self, course_id: str) -> List[str]:
"""获取某个课程未使用的激活码"""
cursor = self.conn.cursor()
cursor.execute('''
SELECT code FROM activation_codes
WHERE course_id = ? AND is_used = 0
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
''', (course_id,))
return [row[0] for row in cursor.fetchall()]
def close(self):
"""关闭数据库连接"""
self.conn.close()
# 使用示例
def main():
# 初始化系统
system = ActivationCodeSystem()
# 为"AI入门课程"生成100个激活码,有效期30天
codes = system.generate_codes(
course_id="ai_basics_101",
count=100,
expires_days=30
)
print(f"已生成 {len(codes)} 个激活码")
print(f"示例激活码: {codes[0]}")
# 模拟用户激活
user_id = "user_123"
test_code = codes[0]
is_valid, result = system.validate_code(test_code, user_id)
if is_valid:
print(f"激活成功!课程ID: {result}")
else:
print(f"激活失败: {result}")
# 获取剩余可用激活码
available = system.get_available_codes("ai_basics_101")
print(f"剩余可用激活码: {len(available)} 个")
system.close()
if __name__ == "__main__":
main()
这个方案的核心要点:
- 激活码生成:使用
secrets模块生成安全的随机码,避免被猜测 - 数据库存储:SQLite轻量级,包含激活码、课程ID、使用状态、有效期等关键信息
- 验证逻辑:检查激活码是否存在、是否已使用、是否过期
- 使用追踪:记录谁在什么时候使用了哪个激活码
实际部署时你需要考虑:
- 添加防刷机制(比如IP限制、频率限制)
- 集成到你的用户系统
- 添加后台管理界面来查看激活码使用情况
- 考虑并发情况下的数据库锁问题
一句话建议:用这个基础框架,再根据你的具体业务需求扩展功能。






