Files
ctbjrj/会员服务器/app/www/lib-cloud.html
T
dqb-dev 65755bf520 会员服务器:上传肥牛应用源码 v1.5.1(fnnas.huiyuan 完整 fpk 工程结构)
含 app/server/server.cjs 服务端、app/www 网页(admin/auth/项目云/库备份/settings)、
app/ui 图标、cmd 安装脚本、config、wizard、manifest、图标与对接文档。
按仓库规则排除构建产物 *.fpk 与 .mimosa 缓存。
2026-10-02 00:03:20 +08:00

115 lines
4.6 KiB
HTML
Executable File

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>库备份管理</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="wrap">
<header>
<h2>库备份管理</h2>
<span class="badge" id="h-ver"></span>
<nav class="nav">
<a href="/admin.html">会员管理</a>
<a href="/xiangmu-cloud.html">项目云管理</a>
<a class="cur" href="/lib-cloud.html">库备份管理</a>
<a href="/settings.html">设置</a>
</nav>
</header>
<p class="sub">方案库/用户库/柜体库/铜排铝排库/企业信息等库备份(按手机号),可下载或删除。</p>
<div class="card card--table">
<div class="bar">
手机号:
<select id="c手机号sel" onchange="同步手机号()" style="width:170px"><option value="">-- 选择会员 --</option></select>
或输入: <input id="c手机号" style="width:130px" placeholder="手动输入">
<button class="primary" onclick="云查询()">查看云上库备份</button>
<span id="tip"></span>
</div>
<table id="云tbl">
<thead>
<tr><th>库名</th><th>原始路径</th><th>备份时间</th><th>大小</th><th>操作</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<script src="/auth.js"></script>
<script>
function 提示(s, ok) {
var t = document.getElementById('tip');
t.textContent = s; t.style.color = ok ? '#2a7' : '#c33';
}
function 加载会员下拉() {
fetch('/api/list').then(r => r.json()).then(function (j) {
var sel = document.getElementById('c手机号sel');
(j['会员'] || []).forEach(function (m) {
var p = m['手机号'] || '';
if (!p) return;
var op = document.createElement('option');
op.value = p;
op.textContent = p + (m['会员类型'] ? ' (' + m['会员类型'] + ')' : '');
sel.appendChild(op);
});
}).catch(function () {});
}
function 同步手机号() {
var v = document.getElementById('c手机号sel').value;
if (v) document.getElementById('c手机号').value = v;
}
function 格式大小(b) {
if (b >= 1048576) return (b / 1048576).toFixed(1) + 'M';
if (b >= 1024) return (b / 1024).toFixed(1) + 'K';
return b + 'B';
}
function 云查询() {
var p = document.getElementById('c手机号').value.trim();
if (!p) { 提示('请选择或输入手机号', false); return; }
fetch('/api/proj/list?手机号=' + encodeURIComponent(p)).then(r => r.json()).then(function (j) {
var tb = document.getElementById('云tbl').getElementsByTagName('tbody')[0];
tb.innerHTML = '';
if (!j.ok) { 提示(j.msg || '查询失败', false); return; }
// 只显示 LIB_ 开头的库条目(项目在 xiangmu-cloud.html)
var list = (j['项目'] || []).filter(function (pr) { return (pr.编号 || '').indexOf('LIB_') === 0; });
if (!list.length) { 提示('该手机号云上暂无库备份', true); return; }
提示('共 ' + list.length + ' 个库备份', true);
list.forEach(function (pr) {
var 名称 = pr.名称 || '', 显示名 = 名称, 路径 = '';
var 竖 = 名称.indexOf('|');
if (竖 >= 0) { 显示名 = 名称.slice(0, 竖); 路径 = 名称.slice(竖 + 1); }
var tr = tb.insertRow();
tr.insertCell().textContent = 显示名;
tr.insertCell().textContent = 路径;
tr.insertCell().textContent = pr.时间 || '';
tr.insertCell().textContent = 格式大小(pr.大小 || 0);
var op = tr.insertCell(); op.className = 'op';
var del = document.createElement('button');
del.textContent = '删除'; del.className = 'del';
del.onclick = function () {
if (!confirm('确定删除云端库备份 ' + 显示名 + ' ?')) return;
fetch('/api/proj/delete', { method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify({ 手机号: p, 编号: pr.编号 }) })
.then(r => r.json()).then(function (d) { 提示(d.ok ? '已删除' : '删除失败:'+(d.msg||''), d.ok); 云查询(); });
};
op.appendChild(del);
var dl = document.createElement('button');
dl.textContent = '下载';
dl.onclick = function () {
location.href = '/api/proj/download?手机号=' + encodeURIComponent(p) + '&编号=' + encodeURIComponent(pr.编号);
};
op.appendChild(dl);
});
}).catch(function (e) { 提示('请求失败: ' + e, false); });
}
fetch('/api/version').then(r => r.json()).then(function (j) {
var b = document.getElementById('h-ver');
if (b && j.version) b.textContent = 'v' + j.version;
}).catch(function () {});
加载会员下拉();
</script>
</body>
</html>