ShopTRAINING/test/test_cors.html
2025-07-02 11:05:23 +08:00

284 lines
11 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CORS跨域测试页面</title>
<style>
body {
font-family: 'Microsoft YaHei', sans-serif;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.test-section {
margin: 20px 0;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
background: #fafafa;
}
.btn {
background: #007bff;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
margin: 5px;
}
.btn:hover {
background: #0056b3;
}
.btn.success {
background: #28a745;
}
.btn.error {
background: #dc3545;
}
.log {
background: #000;
color: #0f0;
padding: 15px;
border-radius: 5px;
font-family: 'Consolas', monospace;
height: 300px;
overflow-y: auto;
margin: 10px 0;
}
.status {
display: inline-block;
padding: 5px 10px;
border-radius: 3px;
margin: 5px;
font-weight: bold;
}
.status.success { background: #d4edda; color: #155724; }
.status.error { background: #f8d7da; color: #721c24; }
.status.warning { background: #fff3cd; color: #856404; }
</style>
</head>
<body>
<div class="container">
<h1>🧪 CORS跨域请求测试</h1>
<p>测试药店销售预测系统API的跨域访问功能</p>
<div class="test-section">
<h3>📡 基础连接测试</h3>
<button class="btn" onclick="testBasicConnection()">测试基础连接</button>
<button class="btn" onclick="testCORSHeaders()">测试CORS头</button>
<button class="btn" onclick="testPreflightRequest()">测试预检请求</button>
<div id="connectionStatus"></div>
</div>
<div class="test-section">
<h3>🔗 API端点测试</h3>
<button class="btn" onclick="testAPIEndpoints()">测试所有端点</button>
<button class="btn" onclick="testTrainingAPI()">测试训练API</button>
<button class="btn" onclick="testWebSocket()">测试WebSocket</button>
<div id="apiStatus"></div>
</div>
<div class="test-section">
<h3>📝 实时日志</h3>
<button class="btn" onclick="clearLog()">清空日志</button>
<div class="log" id="logOutput"></div>
</div>
</div>
<script>
const API_BASE = 'http://127.0.0.1:5000';
const logOutput = document.getElementById('logOutput');
function log(message, type = 'info') {
const timestamp = new Date().toLocaleTimeString();
const color = type === 'error' ? '#ff6b6b' : type === 'success' ? '#51cf66' : '#74c0fc';
logOutput.innerHTML += `<div style="color: ${color};">[${timestamp}] ${message}</div>`;
logOutput.scrollTop = logOutput.scrollHeight;
}
function clearLog() {
logOutput.innerHTML = '';
}
function updateStatus(elementId, message, type) {
const element = document.getElementById(elementId);
element.innerHTML = `<span class="status ${type}">${message}</span>`;
}
async function testBasicConnection() {
log('🔍 开始基础连接测试...');
try {
const response = await fetch(`${API_BASE}/api/health`, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
if (response.ok) {
const data = await response.json();
log('✅ 基础连接成功', 'success');
log(`📊 响应数据: ${JSON.stringify(data)}`);
updateStatus('connectionStatus', '连接正常', 'success');
} else {
log(`❌ 连接失败: HTTP ${response.status}`, 'error');
updateStatus('connectionStatus', `连接失败 (${response.status})`, 'error');
}
} catch (error) {
log(`❌ 连接错误: ${error.message}`, 'error');
updateStatus('connectionStatus', '连接失败', 'error');
}
}
async function testCORSHeaders() {
log('🌐 开始CORS头测试...');
try {
const response = await fetch(`${API_BASE}/api/health`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Origin': window.location.origin
}
});
const corsHeaders = {
'Access-Control-Allow-Origin': response.headers.get('Access-Control-Allow-Origin'),
'Access-Control-Allow-Methods': response.headers.get('Access-Control-Allow-Methods'),
'Access-Control-Allow-Headers': response.headers.get('Access-Control-Allow-Headers')
};
log('📋 CORS响应头:');
Object.entries(corsHeaders).forEach(([key, value]) => {
log(` ${key}: ${value || '未设置'}`);
});
if (corsHeaders['Access-Control-Allow-Origin']) {
log('✅ CORS头配置正常', 'success');
} else {
log('⚠️ CORS头可能缺失', 'error');
}
} catch (error) {
log(`❌ CORS测试失败: ${error.message}`, 'error');
}
}
async function testPreflightRequest() {
log('🚁 开始预检请求测试...');
try {
const response = await fetch(`${API_BASE}/api/training`, {
method: 'OPTIONS',
headers: {
'Origin': window.location.origin,
'Access-Control-Request-Method': 'POST',
'Access-Control-Request-Headers': 'Content-Type'
}
});
if (response.ok) {
log('✅ OPTIONS预检请求成功', 'success');
log(`📊 状态码: ${response.status}`);
} else {
log(`❌ OPTIONS预检失败: ${response.status}`, 'error');
}
} catch (error) {
log(`❌ 预检请求错误: ${error.message}`, 'error');
}
}
async function testAPIEndpoints() {
log('🔗 开始API端点测试...');
const endpoints = [
{ path: '/api/health', method: 'GET' },
{ path: '/api/training', method: 'GET' },
{ path: '/api/stores', method: 'GET' },
{ path: '/api/products', method: 'GET' }
];
let successCount = 0;
for (const endpoint of endpoints) {
try {
const response = await fetch(`${API_BASE}${endpoint.path}`, {
method: endpoint.method,
headers: {
'Content-Type': 'application/json'
}
});
if (response.ok) {
log(`${endpoint.method} ${endpoint.path}: 成功`, 'success');
successCount++;
} else {
log(`${endpoint.method} ${endpoint.path}: HTTP ${response.status}`, 'error');
}
} catch (error) {
log(`${endpoint.method} ${endpoint.path}: ${error.message}`, 'error');
}
}
updateStatus('apiStatus', `${successCount}/${endpoints.length} 端点正常`,
successCount === endpoints.length ? 'success' : 'warning');
}
async function testTrainingAPI() {
log('🚀 开始训练API测试...');
const trainingData = {
product_id: 'P001',
model_type: 'transformer',
epochs: 1,
training_mode: 'product'
};
try {
const response = await fetch(`${API_BASE}/api/start_training`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(trainingData)
});
if (response.ok) {
const result = await response.json();
log('✅ 训练API调用成功', 'success');
log(`📋 任务ID: ${result.task_id || 'N/A'}`);
} else {
const errorText = await response.text();
log(`❌ 训练API失败: HTTP ${response.status}`, 'error');
log(`📄 错误详情: ${errorText}`);
}
} catch (error) {
log(`❌ 训练API错误: ${error.message}`, 'error');
}
}
function testWebSocket() {
log('🔌 开始WebSocket测试...');
try {
// 注意浏览器环境中需要socket.io客户端库
log('⚠️ WebSocket测试需要socket.io客户端库', 'error');
log('💡 请在浏览器控制台中手动测试WebSocket连接');
log(`🔗 WebSocket地址: ws://127.0.0.1:5000/socket.io`);
} catch (error) {
log(`❌ WebSocket测试失败: ${error.message}`, 'error');
}
}
// 页面加载时自动运行基础测试
window.onload = function() {
log('🎉 CORS测试页面已加载');
log(`🎯 测试目标: ${API_BASE}`);
log('💡 点击按钮开始测试各项功能');
};
</script>
</body>
</html>