570 lines
16 KiB
Markdown
570 lines
16 KiB
Markdown
# 使用示例
|
||
|
||
本文档提供了KaMiXiTong软件授权管理系统的详细使用示例。
|
||
|
||
## 目录
|
||
|
||
1. [后台管理系统使用](#后台管理系统使用)
|
||
2. [Python验证器集成](#python验证器集成)
|
||
3. [API接口调用示例](#api接口调用示例)
|
||
4. [常见场景解决方案](#常见场景解决方案)
|
||
|
||
## 后台管理系统使用
|
||
|
||
### 1. 登录系统
|
||
|
||
首次访问系统时,使用默认管理员账号:
|
||
- 用户名: `admin`
|
||
- 密码: `admin123`
|
||
|
||
```python
|
||
# 启动系统
|
||
python run.py
|
||
|
||
# 访问地址
|
||
http://localhost:5000
|
||
```
|
||
|
||
### 2. 创建产品
|
||
|
||
```python
|
||
# 示例: 创建一个名为"记事本Pro"的产品
|
||
import requests
|
||
|
||
# 登录获取token (简化示例)
|
||
login_data = {
|
||
"username": "admin",
|
||
"password": "admin123"
|
||
}
|
||
|
||
# 创建产品
|
||
product_data = {
|
||
"product_name": "记事本Pro",
|
||
"description": "高级文本编辑器,支持多种格式和插件"
|
||
}
|
||
|
||
response = requests.post(
|
||
"http://localhost:5000/api/v1/products",
|
||
json=product_data,
|
||
headers={"Authorization": "Bearer your_token"}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
product_id = result["data"]["product_id"]
|
||
print(f"产品创建成功,ID: {product_id}")
|
||
```
|
||
|
||
### 3. 批量生成卡密
|
||
|
||
```python
|
||
# 生成100个为期1年的正式卡密
|
||
import requests
|
||
|
||
license_data = {
|
||
"product_id": "PROD_ABC12345", # 从上一步获得
|
||
"count": 100,
|
||
"type": 1, # 1=正式, 0=试用
|
||
"valid_days": 365,
|
||
"prefix": "NOTEPAD_", # 可选前缀
|
||
"length": 32
|
||
}
|
||
|
||
response = requests.post(
|
||
"http://localhost:5000/api/v1/licenses",
|
||
json=license_data,
|
||
headers={"Authorization": "Bearer your_token"}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
licenses = result["data"]["licenses"]
|
||
print(f"成功生成 {len(licenses)} 个卡密")
|
||
|
||
# 保存到文件
|
||
with open("licenses.txt", "w") as f:
|
||
for license_info in licenses:
|
||
f.write(f"{license_info['license_key']}\n")
|
||
```
|
||
|
||
### 4. 发布软件版本
|
||
|
||
```python
|
||
# 发布新版本
|
||
version_data = {
|
||
"product_id": "PROD_ABC12345",
|
||
"version_num": "2.1.0",
|
||
"update_log": "新增功能:\n1. 支持Markdown语法\n2. 改进性能\n3. 修复已知问题",
|
||
"download_url": "https://example.com/downloads/notepad-pro-2.1.0.exe",
|
||
"force_update": 0, # 0=不强制, 1=强制更新
|
||
"min_license_version": "1.0.0" # 最低兼容版本
|
||
}
|
||
|
||
response = requests.post(
|
||
"http://localhost:5000/api/v1/versions",
|
||
json=version_data,
|
||
headers={"Authorization": "Bearer your_token"}
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
print(f"版本创建成功: {result['data']['version_num']}")
|
||
|
||
# 发布版本
|
||
version_id = result["data"]["version_id"]
|
||
response = requests.post(
|
||
f"http://localhost:5000/api/v1/versions/{version_id}/publish",
|
||
headers={"Authorization": "Bearer your_token"}
|
||
)
|
||
```
|
||
|
||
## Python验证器集成
|
||
|
||
### 1. 基础集成示例
|
||
|
||
```python
|
||
# main.py - 您的主程序
|
||
from auth_validator import AuthValidator
|
||
import sys
|
||
|
||
def check_license():
|
||
"""检查授权"""
|
||
validator = AuthValidator(
|
||
software_id="PROD_ABC12345", # 您的软件ID
|
||
api_url="http://your-domain.com/api/v1",
|
||
gui_mode=True # 显示图形界面输入框
|
||
)
|
||
|
||
return validator.validate()
|
||
|
||
def main():
|
||
"""主程序"""
|
||
print("正在验证授权...")
|
||
|
||
if not check_license():
|
||
print("授权验证失败,程序退出")
|
||
sys.exit(1)
|
||
|
||
print("授权验证通过,启动程序...")
|
||
|
||
# 您的程序逻辑
|
||
print("欢迎使用记事本Pro!")
|
||
# ... 您的程序代码 ...
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
```
|
||
|
||
### 2. 高级集成示例
|
||
|
||
```python
|
||
# advanced_app.py - 高级集成示例
|
||
from auth_validator import AuthValidator
|
||
import logging
|
||
import sys
|
||
import json
|
||
|
||
class AdvancedValidator:
|
||
"""高级验证器"""
|
||
|
||
def __init__(self, config_file="config.json"):
|
||
self.config = self.load_config(config_file)
|
||
self.validator = AuthValidator(
|
||
software_id=self.config["software_id"],
|
||
api_url=self.config["api_url"],
|
||
secret_key=self.config.get("secret_key"),
|
||
cache_days=self.config.get("cache_days", 7),
|
||
gui_mode=self.config.get("gui_mode", True)
|
||
)
|
||
|
||
self.setup_logging()
|
||
|
||
def load_config(self, config_file):
|
||
"""加载配置文件"""
|
||
try:
|
||
with open(config_file, 'r', encoding='utf-8') as f:
|
||
return json.load(f)
|
||
except FileNotFoundError:
|
||
# 创建默认配置
|
||
default_config = {
|
||
"software_id": "YOUR_SOFTWARE_ID",
|
||
"api_url": "http://localhost:5000/api/v1",
|
||
"gui_mode": True,
|
||
"cache_days": 7
|
||
}
|
||
with open(config_file, 'w', encoding='utf-8') as f:
|
||
json.dump(default_config, f, indent=2, ensure_ascii=False)
|
||
return default_config
|
||
|
||
def setup_logging(self):
|
||
"""设置日志"""
|
||
logging.basicConfig(
|
||
level=logging.INFO,
|
||
format='%(asctime)s - %(levelname)s - %(message)s',
|
||
handlers=[
|
||
logging.FileHandler('app.log', encoding='utf-8'),
|
||
logging.StreamHandler()
|
||
]
|
||
)
|
||
|
||
def verify_license(self):
|
||
"""验证授权"""
|
||
try:
|
||
logging.info("开始授权验证")
|
||
|
||
if not self.validator.validate():
|
||
logging.error("授权验证失败")
|
||
return False
|
||
|
||
# 获取授权详情
|
||
software_info = self.validator.get_software_info()
|
||
if software_info:
|
||
logging.info(f"软件信息: {software_info}")
|
||
|
||
logging.info("授权验证成功")
|
||
return True
|
||
|
||
except Exception as e:
|
||
logging.error(f"授权验证异常: {e}")
|
||
return False
|
||
|
||
def check_updates(self):
|
||
"""检查更新"""
|
||
try:
|
||
software_info = self.validator.get_software_info()
|
||
if software_info and software_info.get('need_update'):
|
||
new_version = software_info.get('new_version')
|
||
download_url = software_info.get('download_url')
|
||
|
||
print(f"\n发现新版本: {new_version}")
|
||
print(f"下载地址: {download_url}")
|
||
|
||
if software_info.get('force_update'):
|
||
print("此版本为强制更新,请升级后重新启动程序")
|
||
return False
|
||
|
||
# 询问用户是否立即更新
|
||
choice = input("是否立即下载更新? (y/n): ").lower()
|
||
if choice == 'y':
|
||
import webbrowser
|
||
webbrowser.open(download_url)
|
||
return False
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
logging.warning(f"检查更新失败: {e}")
|
||
return True
|
||
|
||
def main():
|
||
"""主程序"""
|
||
# 初始化验证器
|
||
verifier = AdvancedValidator()
|
||
|
||
# 验证授权
|
||
if not verifier.verify_license():
|
||
input("按任意键退出...")
|
||
sys.exit(1)
|
||
|
||
# 检查更新
|
||
if not verifier.check_updates():
|
||
input("按任意键退出...")
|
||
sys.exit(1)
|
||
|
||
# 启动主程序
|
||
print("=" * 50)
|
||
print(" 记事本Pro v2.1.0")
|
||
print("=" * 50)
|
||
print("1. 新建文件")
|
||
print("2. 打开文件")
|
||
print("3. 关于")
|
||
print("4. 退出")
|
||
|
||
while True:
|
||
choice = input("\n请选择操作 (1-4): ")
|
||
|
||
if choice == '1':
|
||
print("新建文件功能...")
|
||
elif choice == '2':
|
||
print("打开文件功能...")
|
||
elif choice == '3':
|
||
print("记事本Pro - 高级文本编辑器")
|
||
print(f"授权状态: 已激活")
|
||
print(f"版本: 2.1.0")
|
||
elif choice == '4':
|
||
print("感谢使用,再见!")
|
||
break
|
||
else:
|
||
print("无效选择,请重试")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
```
|
||
|
||
## API接口调用示例
|
||
|
||
### 1. 卡密验证
|
||
|
||
```python
|
||
import requests
|
||
import time
|
||
import hashlib
|
||
|
||
def generate_signature(data, secret_key):
|
||
"""生成验证签名"""
|
||
combined = f"{data['software_id']}{data['license_key']}{data['machine_code']}{data['timestamp']}"
|
||
return hashlib.sha256(combined + secret_key).hexdigest()
|
||
|
||
def verify_license_api(license_key, machine_code, software_id):
|
||
"""通过API验证卡密"""
|
||
secret_key = "your-secret-key"
|
||
api_url = "http://localhost:5000/api/v1/auth/verify"
|
||
|
||
# 准备请求数据
|
||
data = {
|
||
"software_id": software_id,
|
||
"license_key": license_key,
|
||
"machine_code": machine_code,
|
||
"timestamp": int(time.time())
|
||
}
|
||
|
||
# 生成签名
|
||
data["signature"] = generate_signature(data, secret_key)
|
||
|
||
# 发送请求
|
||
response = requests.post(api_url, json=data)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result["success"]:
|
||
auth_info = result["data"]
|
||
print(f"验证成功! 类型: {auth_info['type_name']}")
|
||
print(f"有效期至: {auth_info['expire_time'] or '永久'}")
|
||
return True
|
||
|
||
print(f"验证失败: {result.get('message', '未知错误')}")
|
||
return False
|
||
|
||
# 使用示例
|
||
license_key = "NOTEPAD_ABC1234567890DEF"
|
||
machine_code = "A1B2C3D4E5F678901234567890ABCDEF"
|
||
software_id = "PROD_ABC12345"
|
||
|
||
verify_license_api(license_key, machine_code, software_id)
|
||
```
|
||
|
||
### 2. 批量操作示例
|
||
|
||
```python
|
||
# 批量查询卡密状态
|
||
def batch_check_licenses(license_keys, software_id):
|
||
"""批量查询卡密状态"""
|
||
api_url = "http://localhost:5000/api/v1/licenses"
|
||
|
||
results = []
|
||
|
||
for license_key in license_keys:
|
||
params = {
|
||
"keyword": license_key,
|
||
"product_id": software_id
|
||
}
|
||
|
||
response = requests.get(api_url, params=params)
|
||
|
||
if response.status_code == 200:
|
||
result = response.json()
|
||
if result["success"] and result["data"]["licenses"]:
|
||
license_info = result["data"]["licenses"][0]
|
||
results.append({
|
||
"license_key": license_key,
|
||
"status": license_info["status_name"],
|
||
"activate_time": license_info["activate_time"],
|
||
"expire_time": license_info["expire_time"]
|
||
})
|
||
else:
|
||
results.append({
|
||
"license_key": license_key,
|
||
"status": "不存在",
|
||
"activate_time": None,
|
||
"expire_time": None
|
||
})
|
||
|
||
return results
|
||
|
||
# 使用示例
|
||
license_keys = [
|
||
"NOTEPAD_ABC1234567890DEF",
|
||
"NOTEPAD_XYZ9876543210ABC",
|
||
"NOTEPAD_DEF5678901234GHI"
|
||
]
|
||
|
||
results = batch_check_licenses(license_keys, "PROD_ABC12345")
|
||
for result in results:
|
||
print(f"{result['license_key']}: {result['status']}")
|
||
```
|
||
|
||
## 常见场景解决方案
|
||
|
||
### 1. 试用授权场景
|
||
|
||
```python
|
||
# trial_manager.py - 试用管理
|
||
from auth_validator import AuthValidator
|
||
import time
|
||
|
||
class TrialManager:
|
||
"""试用授权管理"""
|
||
|
||
def __init__(self, software_id):
|
||
self.software_id = software_id
|
||
self.validator = AuthValidator(software_id=software_id)
|
||
|
||
def request_trial(self):
|
||
"""申请试用授权"""
|
||
print("正在申请试用授权...")
|
||
|
||
# 这里可以调用API生成试用卡密
|
||
# 或者让用户联系管理员
|
||
|
||
trial_code = input("请输入试用卡密: ").strip()
|
||
|
||
if self.validator._validate_license_format(trial_code):
|
||
return trial_code
|
||
return None
|
||
|
||
def start_trial(self):
|
||
"""开始试用"""
|
||
trial_code = self.request_trial()
|
||
if not trial_code:
|
||
return False
|
||
|
||
# 尝试验证试用卡密
|
||
success, message, auth_info = self.validator._online_verify(trial_code)
|
||
|
||
if success and auth_info and auth_info.get('type') == 0:
|
||
days_left = auth_info.get('remaining_days', 0)
|
||
print(f"试用激活成功!剩余 {days_left} 天")
|
||
return True
|
||
else:
|
||
print(f"试用激活失败: {message}")
|
||
return False
|
||
```
|
||
|
||
### 2. 离线授权场景
|
||
|
||
```python
|
||
# offline_manager.py - 离线授权管理
|
||
from auth_validator import AuthValidator, AuthCache
|
||
import json
|
||
import os
|
||
|
||
class OfflineManager:
|
||
"""离线授权管理"""
|
||
|
||
def __init__(self, software_id):
|
||
self.software_id = software_id
|
||
self.cache = AuthCache()
|
||
self.license_file = "offline_license.json"
|
||
|
||
def generate_offline_license(self, license_key, machine_code, expire_days):
|
||
"""生成离线授权文件"""
|
||
offline_data = {
|
||
"software_id": self.software_id,
|
||
"license_key": license_key,
|
||
"machine_code": machine_code,
|
||
"issue_time": time.time(),
|
||
"expire_days": expire_days,
|
||
"signature": "offline_signature" # 实际应用中需要数字签名
|
||
}
|
||
|
||
with open(self.license_file, 'w') as f:
|
||
json.dump(offline_data, f, indent=2)
|
||
|
||
print(f"离线授权文件已生成: {self.license_file}")
|
||
|
||
def verify_offline_license(self):
|
||
"""验证离线授权"""
|
||
if not os.path.exists(self.license_file):
|
||
return False, "未找到离线授权文件"
|
||
|
||
try:
|
||
with open(self.license_file, 'r') as f:
|
||
offline_data = json.load(f)
|
||
|
||
# 检查软件ID
|
||
if offline_data["software_id"] != self.software_id:
|
||
return False, "授权文件不匹配当前软件"
|
||
|
||
# 检查机器码
|
||
current_machine_code = MachineCodeGenerator.generate()
|
||
if offline_data["machine_code"] != current_machine_code:
|
||
return False, "授权文件不匹配当前设备"
|
||
|
||
# 检查过期时间
|
||
issue_time = offline_data["issue_time"]
|
||
expire_days = offline_data["expire_days"]
|
||
|
||
if time.time() - issue_time > expire_days * 24 * 3600:
|
||
return False, "离线授权已过期"
|
||
|
||
return True, "离线授权验证成功"
|
||
|
||
except Exception as e:
|
||
return False, f"授权文件损坏: {e}"
|
||
```
|
||
|
||
### 3. 多产品授权场景
|
||
|
||
```python
|
||
# multi_product_manager.py - 多产品授权管理
|
||
from auth_validator import AuthValidator
|
||
|
||
class MultiProductManager:
|
||
"""多产品授权管理"""
|
||
|
||
def __init__(self):
|
||
self.products = {}
|
||
self.validators = {}
|
||
|
||
def add_product(self, product_id, product_name, api_url):
|
||
"""添加产品"""
|
||
self.products[product_id] = product_name
|
||
self.validators[product_id] = AuthValidator(
|
||
software_id=product_id,
|
||
api_url=api_url
|
||
)
|
||
|
||
def verify_all_products(self):
|
||
"""验证所有产品授权"""
|
||
results = {}
|
||
|
||
for product_id, validator in self.validators.items():
|
||
success = validator.validate()
|
||
results[product_id] = {
|
||
"name": self.products[product_id],
|
||
"success": success
|
||
}
|
||
|
||
return results
|
||
|
||
def get_product_status(self, product_id):
|
||
"""获取产品授权状态"""
|
||
if product_id not in self.validators:
|
||
return None
|
||
|
||
auth_info = self.validators[product_id].cache.get_auth_info(product_id)
|
||
return auth_info
|
||
|
||
# 使用示例
|
||
manager = MultiProductManager()
|
||
manager.add_product("PROD_NOTEPAD", "记事本Pro", "http://api.example.com/v1")
|
||
manager.add_product("PROD_CALC", "计算器Pro", "http://api.example.com/v1")
|
||
|
||
# 验证所有产品
|
||
results = manager.verify_all_products()
|
||
for product_id, result in results.items():
|
||
status = "✅ 已授权" if result["success"] else "❌ 未授权"
|
||
print(f"{result['name']}: {status}")
|
||
```
|
||
|
||
这些示例涵盖了KaMiXiTong系统的各种使用场景,您可以根据实际需求进行调整和扩展。 |