library-picturebook-activity/lesingle-aicreate-backend-demo/test-iframe.html

114 lines
4.7 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>iframe嵌入测试</title>
<style>
body { margin: 0; font-family: sans-serif; }
.bar { background: #7C3AED; color: white; padding: 10px 20px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.bar button { background: white; color: #7C3AED; border: none; padding: 6px 14px; border-radius: 6px; cursor: pointer; font-weight: 600; font-size: 13px; }
.bar button:hover { background: #f0f0f0; }
.bar .label { font-size: 12px; opacity: 0.8; }
#status { font-size: 12px; margin-left: auto; }
iframe { width: 100%; height: calc(100vh - 46px); border: none; }
#log { position: fixed; bottom: 0; right: 0; width: 450px; max-height: 220px; overflow-y: auto; background: rgba(0,0,0,0.9); color: #0f0; font-size: 11px; padding: 8px; font-family: monospace; z-index: 999; border-radius: 8px 0 0 0; }
</style></head>
<body>
<div class="bar">
<span class="label">企业iframe测试:</span>
<button onclick="loadPage('')">新建创作</button>
<button onclick="loadPage('/edit-info/2041081353944043520')">编目(status=3)</button>
<button onclick="loadPage('/dubbing/2040041094040915968')">配音(status=4)</button>
<button onclick="expireToken()">模拟token过期</button>
<span id="status">等待加载...</span>
</div>
<iframe id="leai" allow="camera;microphone"></iframe>
<div id="log"></div>
<script>
const H5 = 'http://localhost:3001';
const API = 'http://localhost:8080';
const ORG_ID = 'LESINGLE888888888';
const APP_SECRET = 'leai_test_secret_2026_abc123xyz';
const PHONE = '18911223344';
let currentToken = '';
function log(msg) {
const t = new Date().toLocaleTimeString();
document.getElementById('log').innerHTML = '<div>[' + t + '] ' + msg + '</div>' + document.getElementById('log').innerHTML;
}
// 换取token模拟企业后端
async function getToken() {
const res = await fetch(API + '/api/v1/auth/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ orgId: ORG_ID, appSecret: APP_SECRET, phone: PHONE })
});
const data = await res.json();
currentToken = data.data.sessionToken;
log('Token获取: ' + currentToken.substring(0, 20) + '...');
return currentToken;
}
// 加载iframe页面
async function loadPage(path) {
const token = await getToken();
const url = H5 + path + '?token=' + token + '&orgId=' + ORG_ID + '&phone=' + PHONE + '&embed=1';
document.getElementById('leai').src = url;
document.getElementById('status').textContent = '加载: ' + (path || '新建创作');
log('iframe.src = ' + path + '?token=...');
}
// 模拟token过期删除Redis中的token
async function expireToken() {
if (!currentToken) { log('还没有token'); return; }
try {
// 直接调一个需要认证的接口用一个假token触发过期
// 实际是通过Redis DEL但这里我们通过修改store中的token来模拟
document.getElementById('leai').contentWindow.postMessage({
source: 'test', type: 'SIMULATE_EXPIRE'
}, '*');
log('已发送模拟过期指令需手动redis-cli DEL session:token:' + currentToken + '');
document.getElementById('status').textContent = '已模拟过期';
} catch(e) { log('模拟过期失败: ' + e); }
}
// 监听H5的postMessage
window.addEventListener('message', function(event) {
var msg = event.data;
if (!msg || msg.source !== 'leai-creation') return;
log('<b>收到: ' + msg.type + '</b> ' + JSON.stringify(msg.payload || {}));
switch (msg.type) {
case 'READY':
document.getElementById('status').textContent = 'H5已就绪';
break;
case 'TOKEN_EXPIRED':
document.getElementById('status').textContent = '刷新Token...';
log('★ Token过期! 正在刷新...');
getToken().then(function(newToken) {
document.getElementById('leai').contentWindow.postMessage({
source: 'leai-creation', version: 1, type: 'TOKEN_REFRESHED',
payload: { messageId: msg.payload.messageId, token: newToken, orgId: ORG_ID, phone: PHONE }
}, '*');
document.getElementById('status').textContent = 'Token已刷新';
log('★ Token刷新成功已回传');
}).catch(function(e) { log('Token刷新失败: ' + e); });
break;
case 'WORK_CREATED':
document.getElementById('status').textContent = '创作中: ' + msg.payload.workId;
break;
case 'WORK_COMPLETED':
document.getElementById('status').textContent = '完成: ' + msg.payload.workId;
log('★★★ 创作完成! workId=' + msg.payload.workId);
break;
case 'CREATION_ERROR':
document.getElementById('status').textContent = '失败';
log('创作失败: ' + msg.payload.message);
break;
}
});
// 初始加载新建创作
loadPage('');
</script>
</body></html>