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系统的各种使用场景,您可以根据实际需求进行调整和扩展。
|