File size: 5,446 Bytes
494c9e4 12617a9 494c9e4 12617a9 494c9e4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | """Demo 文件管理 API"""
from backend.data_utils import save_demo_payload
from backend.demo_folder import (
list_demo_items,
move_demo_file,
rename_demo_file,
delete_demo_file,
move_folder,
)
from backend.api.utils import (
get_demo_directory,
handle_api_error,
handle_api_success,
require_admin,
validate_admin_token,
)
from backend.access_log import log_check_admin
def list_demos(path: str = ""):
"""
扫描demo目录下的文件夹和文件,返回列表
支持指定路径参数,返回指定路径下的内容
文件名(去掉.json后缀)作为demo名称
支持中文文件名和路径
从data/demo目录读取(更专业的数据目录结构)
Args:
path: 可选,指定要列出的路径,默认为根目录(空字符串)
"""
demo_dir = get_demo_directory(create=False)
try:
result = list_demo_items(demo_dir, path)
# if not result.get("items"):
# print(f"⚠️ 路径 '{path}' 下没有内容: {demo_dir}")
# else:
# items_count = len(result["items"])
# folders_count = sum(1 for item in result["items"] if item["type"] == "folder")
# files_count = sum(1 for item in result["items"] if item["type"] == "file")
# print(f"✓ 路径 '{path}': {folders_count} 个文件夹, {files_count} 个文件 (共 {items_count} 项)")
return result
except Exception as e:
error_result = handle_api_error("Failed to scan demo directory", e)
return {"path": path, "items": []}
@require_admin
def save_demo(save_request):
"""
保存demo文件到data/demo目录
请求格式: { name: string, data: AnalyzeResponse, path?: string, overwrite?: boolean }
path: 可选,保存路径,默认为根目录("/")
overwrite: 可选,是否覆盖已存在的文件,默认为False
"""
name = save_request.get('name')
data = save_request.get('data')
path = save_request.get('path', '/') # 默认为根目录
overwrite = save_request.get('overwrite', False) # 默认为False
if not name or not data:
return {
'success': False,
'message': 'Missing required parameters: name or data'
}
try:
demo_dir = get_demo_directory(create=True)
result = save_demo_payload(demo_dir, name, data, path, overwrite)
if result.get('success'):
print(f"✓ Demo已保存: {demo_dir / result['file']}")
else:
print(f"❌ Save failed: {result.get('message')}")
return result
except Exception as e:
return handle_api_error('Save failed', e)
@require_admin
def delete_demo(delete_request):
"""
将demo文件移动到deleted文件夹(软删除)
请求格式: { file: string } # 文件名(包含.json后缀)
"""
file = delete_request.get('file')
if not file:
return {
'success': False,
'message': 'Missing required parameter: file'
}
try:
demo_dir = get_demo_directory(create=False)
result = delete_demo_file(demo_dir, file)
return handle_api_success(result)
except Exception as e:
return handle_api_error('Delete failed', e)
@require_admin
def move_demo(move_request):
"""
移动demo文件或文件夹
请求格式: { file: string, target_path: string } 或 { path: string, target_path: string }
"""
file = move_request.get('file')
path = move_request.get('path')
target_path = move_request.get('target_path', '')
if not target_path and target_path != '':
return {
'success': False,
'message': 'Missing required parameter: target_path'
}
if not file and not path:
return {
'success': False,
'message': 'Missing required parameter: file or path'
}
try:
demo_dir = get_demo_directory(create=False)
if file:
# 移动文件
result = move_demo_file(demo_dir, file, target_path)
else:
# 移动文件夹
result = move_folder(demo_dir, path, target_path)
return handle_api_success(result)
except Exception as e:
return handle_api_error('Move failed', e)
@require_admin
def rename_demo(rename_request):
"""
重命名demo文件
请求格式: { file: string, new_name: string }
"""
file = rename_request.get('file')
new_name = rename_request.get('new_name')
if not file or not new_name:
return {
'success': False,
'message': 'Missing required parameter: file or new_name'
}
try:
demo_dir = get_demo_directory(create=False)
result = rename_demo_file(demo_dir, file, new_name)
return handle_api_success(result)
except Exception as e:
return handle_api_error('Rename failed', e)
def check_admin(check_request):
from flask import request
request_token = check_request.get('token') or request.headers.get('X-Admin-Token')
is_valid, error_message = validate_admin_token(request_token)
log_check_admin(is_valid, token=request_token)
if is_valid:
return {"success": True}
else:
return {
'success': False,
'message': error_message
}
|