Initial commit: 商品售卖网站
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
API_BASE = "http://localhost:8080/api"
|
||||
|
||||
ADMIN_TOKEN = None
|
||||
|
||||
def login():
|
||||
global ADMIN_TOKEN
|
||||
response = requests.post(f"{API_BASE}/auth/login", json={
|
||||
"email": "admin@viaeon.com",
|
||||
"password": "admin123"
|
||||
})
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
ADMIN_TOKEN = data.get("token")
|
||||
print(f"登录成功")
|
||||
return True
|
||||
else:
|
||||
print(f"登录失败: {response.text}")
|
||||
return False
|
||||
|
||||
def get_headers():
|
||||
return {
|
||||
"Authorization": f"Bearer {ADMIN_TOKEN}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def create_category(name):
|
||||
response = requests.post(f"{API_BASE}/admin/categories",
|
||||
headers=get_headers(),
|
||||
json={"name": name}
|
||||
)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return data.get("id")
|
||||
else:
|
||||
existing = requests.get(f"{API_BASE}/categories")
|
||||
if existing.status_code == 200:
|
||||
cats = existing.json()
|
||||
if isinstance(cats, list):
|
||||
for cat in cats:
|
||||
if isinstance(cat, dict) and cat.get("name") == name:
|
||||
return cat.get("id")
|
||||
elif isinstance(cat, str) and cat == name:
|
||||
return None
|
||||
return None
|
||||
|
||||
def download_image(url, filepath):
|
||||
try:
|
||||
response = requests.get(url, timeout=30)
|
||||
if response.status_code == 200:
|
||||
with open(filepath, 'wb') as f:
|
||||
f.write(response.content)
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"下载图片失败: {e}")
|
||||
return False
|
||||
|
||||
def upload_image(filepath):
|
||||
try:
|
||||
with open(filepath, 'rb') as f:
|
||||
response = requests.post(f"{API_BASE}/upload",
|
||||
headers={"Authorization": f"Bearer {ADMIN_TOKEN}"},
|
||||
files={"file": f}
|
||||
)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return data.get("url")
|
||||
except Exception as e:
|
||||
print(f"上传图片失败: {e}")
|
||||
return None
|
||||
|
||||
def create_product(product, category_id, image_url):
|
||||
price_cny = product.get("price_jpy", 0) * 0.048
|
||||
price_cny = round(price_cny, 2)
|
||||
|
||||
data = {
|
||||
"name": product.get("name_cn", product.get("name_jp", "未知商品")),
|
||||
"description": f"{product.get('name_jp', '')}\n{product.get('description', '')}".strip(),
|
||||
"price": price_cny,
|
||||
"stock": 100,
|
||||
"images": image_url,
|
||||
"category_ids": [category_id] if category_id else [],
|
||||
"is_active": True
|
||||
}
|
||||
|
||||
response = requests.post(f"{API_BASE}/admin/products",
|
||||
headers=get_headers(),
|
||||
json=data
|
||||
)
|
||||
|
||||
if response.status_code in [200, 201]:
|
||||
return response.json()
|
||||
else:
|
||||
result = response.json()
|
||||
if result.get("data") and result["data"].get("id"):
|
||||
return result["data"]
|
||||
print(f"创建商品失败: {response.text}")
|
||||
return None
|
||||
|
||||
def main():
|
||||
print("开始导入商品数据...")
|
||||
|
||||
if not login():
|
||||
print("请先创建管理员账户")
|
||||
return
|
||||
|
||||
with open('ribenyan_products.json', 'r', encoding='utf-8') as f:
|
||||
products = json.load(f)
|
||||
|
||||
print(f"读取到 {len(products)} 个商品")
|
||||
|
||||
categories = {}
|
||||
for product in products:
|
||||
cat_name = product.get("category")
|
||||
if cat_name not in categories:
|
||||
cat_id = create_category(cat_name)
|
||||
if cat_id:
|
||||
categories[cat_name] = cat_id
|
||||
print(f"创建分类: {cat_name} (ID: {cat_id})")
|
||||
|
||||
os.makedirs("temp_images", exist_ok=True)
|
||||
|
||||
success_count = 0
|
||||
for i, product in enumerate(products):
|
||||
print(f"\n处理商品 {i+1}/{len(products)}: {product.get('name_cn', 'N/A')}")
|
||||
|
||||
image_url = ""
|
||||
if product.get("image_url"):
|
||||
temp_path = f"temp_images/{product.get('external_id', i)}.webp"
|
||||
if download_image(product["image_url"], temp_path):
|
||||
uploaded_url = upload_image(temp_path)
|
||||
if uploaded_url:
|
||||
image_url = uploaded_url
|
||||
print(f" 图片上传成功: {uploaded_url}")
|
||||
|
||||
cat_name = product.get("category")
|
||||
cat_id = categories.get(cat_name)
|
||||
|
||||
result = create_product(product, cat_id, image_url)
|
||||
if result:
|
||||
success_count += 1
|
||||
print(f" 商品创建成功")
|
||||
else:
|
||||
print(f" 商品创建失败")
|
||||
|
||||
import shutil
|
||||
shutil.rmtree("temp_images", ignore_errors=True)
|
||||
|
||||
print(f"\n导入完成: 成功 {success_count}/{len(products)} 个商品")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user