Python中如何实现人工智能学习网站的付费课程发码活动






Python中如何实现人工智能学习网站的付费课程发码活动


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()

这个方案的核心要点:

  1. 激活码生成:使用secrets模块生成安全的随机码,避免被猜测
  2. 数据库存储:SQLite轻量级,包含激活码、课程ID、使用状态、有效期等关键信息
  3. 验证逻辑:检查激活码是否存在、是否已使用、是否过期
  4. 使用追踪:记录谁在什么时候使用了哪个激活码

实际部署时你需要考虑

  • 添加防刷机制(比如IP限制、频率限制)
  • 集成到你的用户系统
  • 添加后台管理界面来查看激活码使用情况
  • 考虑并发情况下的数据库锁问题

一句话建议:用这个基础框架,再根据你的具体业务需求扩展功能。

回到顶部