Files
webman-buildadmin/public/install/index.html
2026-04-01 14:08:45 +08:00

148 lines
7.9 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="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/install/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BuildAdmin-安装</title>
<script>
(function(){
var urls = { adminUrl: '', frontUrl: '' };
fetch('/api/install/accessUrls').then(function(r){return r.json();}).then(function(res){
if (res && res.data) { urls.adminUrl = res.data.adminUrl || ''; urls.frontUrl = res.data.frontUrl || ''; }
}).catch(function(){});
function ensureQuickPanel() {
if (!urls.adminUrl && !urls.frontUrl) return;
if (document.getElementById('__ba_install_quick_urls__')) return;
var wrap = document.createElement('div');
wrap.id = '__ba_install_quick_urls__';
wrap.style.position = 'fixed';
wrap.style.right = '16px';
wrap.style.bottom = '16px';
wrap.style.zIndex = '99999';
wrap.style.maxWidth = '560px';
wrap.style.fontFamily = 'ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"';
wrap.innerHTML =
'<div style="background:rgba(255,255,255,.96);border:1px solid rgba(0,0,0,.08);box-shadow:0 8px 24px rgba(0,0,0,.12);border-radius:12px;overflow:hidden">' +
'<div style="padding:10px 12px;border-bottom:1px solid rgba(0,0,0,.06);display:flex;gap:8px;align-items:center;justify-content:space-between">' +
'<div style="font-weight:600;color:#111">安装完成快捷入口</div>' +
'<button type="button" aria-label="close" style="border:0;background:transparent;cursor:pointer;font-size:16px;line-height:16px;color:#666;padding:4px 6px">×</button>' +
'</div>' +
'<div style="padding:12px;display:flex;flex-direction:column;gap:10px">' +
'<div>' +
'<div style="font-size:12px;color:#666;margin-bottom:6px">后台地址</div>' +
'<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">' +
'<a data-k="admin" target="_blank" rel="noreferrer" style="color:#1677ff;text-decoration:none;word-break:break-all"></a>' +
'<button data-copy="admin" type="button" style="border:1px solid rgba(0,0,0,.12);background:#fff;border-radius:8px;padding:6px 10px;cursor:pointer">复制</button>' +
'</div>' +
'</div>' +
'<div>' +
'<div style="font-size:12px;color:#666;margin-bottom:6px">前台地址</div>' +
'<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap">' +
'<a data-k="front" target="_blank" rel="noreferrer" style="color:#1677ff;text-decoration:none;word-break:break-all"></a>' +
'<button data-copy="front" type="button" style="border:1px solid rgba(0,0,0,.12);background:#fff;border-radius:8px;padding:6px 10px;cursor:pointer">复制</button>' +
'</div>' +
'</div>' +
'<div data-msg style="font-size:12px;color:#52c41a;min-height:16px"></div>' +
'</div>' +
'</div>';
document.body.appendChild(wrap);
var closeBtn = wrap.querySelector('button[aria-label="close"]');
if (closeBtn) closeBtn.addEventListener('click', function(){ wrap.remove(); });
function setLink(which, val) {
var a = wrap.querySelector('a[data-k="' + which + '"]');
if (!a) return;
a.textContent = val || '';
a.href = val || 'javascript:void(0)';
}
setLink('admin', urls.adminUrl);
setLink('front', urls.frontUrl);
function showMsg(text, ok) {
var el = wrap.querySelector('[data-msg]');
if (!el) return;
el.style.color = ok ? '#52c41a' : '#ff4d4f';
el.textContent = text;
window.clearTimeout(el.__t);
el.__t = window.setTimeout(function(){ el.textContent = ''; }, 1800);
}
function copyText(text) {
if (!text) return Promise.reject(new Error('empty'));
if (navigator.clipboard && navigator.clipboard.writeText) {
return navigator.clipboard.writeText(text);
}
return new Promise(function(resolve, reject){
try {
var ta = document.createElement('textarea');
ta.value = text;
ta.setAttribute('readonly', 'readonly');
ta.style.position = 'fixed';
ta.style.left = '-9999px';
document.body.appendChild(ta);
ta.select();
var ok = document.execCommand('copy');
document.body.removeChild(ta);
ok ? resolve() : reject(new Error('copy failed'));
} catch (e) {
reject(e);
}
});
}
wrap.addEventListener('click', function(e){
var t = e.target;
if (!t || !t.getAttribute) return;
var which = t.getAttribute('data-copy');
if (!which) return;
var text = which === 'admin' ? urls.adminUrl : urls.frontUrl;
copyText(text).then(function(){
showMsg('已复制:' + text, true);
}).catch(function(){
showMsg('复制失败,请手动复制', false);
});
});
}
function applyUrls() {
if (!urls.adminUrl && !urls.frontUrl) return;
document.querySelectorAll('input[type="text"], input:not([type])').forEach(function(inp){
var v = (inp.value || '').trim();
if (v && (v.indexOf('#/admin') >= 0 || v.indexOf('index.html') >= 0) && v.indexOf('#/') >= 0) {
inp.value = urls.adminUrl;
inp.dispatchEvent(new Event('input', { bubbles: true }));
}
});
document.querySelectorAll('a[href*="#/admin"]').forEach(function(a){ if (urls.adminUrl) a.href = urls.adminUrl; });
document.querySelectorAll('a[href*="#/"]').forEach(function(a){
if (urls.frontUrl && a.href.indexOf('#/admin') < 0) a.href = urls.frontUrl;
});
ensureQuickPanel();
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function(){ setInterval(applyUrls, 800); });
else setInterval(applyUrls, 800);
})();
(function(){
function closeMigrateModal() {
if (!document.body) return;
var txt = document.body.innerText || document.body.textContent || '';
if (txt.indexOf('数据表迁移失败') < 0 && txt.indexOf('数据表自动迁移失败') < 0) return;
var btns = document.body.querySelectorAll('button, [role="button"], .el-button');
for (var i = 0; i < btns.length; i++) {
var b = btns[i];
if (b.textContent && b.textContent.indexOf('继续安装') >= 0) { b.click(); return; }
}
}
var obs = new MutationObserver(closeMigrateModal);
function start() { if (document.body) { obs.observe(document.body, { childList: true, subtree: true }); closeMigrateModal(); } }
if (document.body) start(); else document.addEventListener('DOMContentLoaded', start);
setInterval(closeMigrateModal, 150);
})();
</script>
<script type="module" crossorigin src="/install/assets/index.js"></script>
<link rel="stylesheet" crossorigin href="/install/assets/index.css">
</head>
<body>
<div id="app"></div>
</body>
</html>