新增数字人版本管理
This commit is contained in:
@@ -3519,35 +3519,98 @@
|
||||
});
|
||||
};
|
||||
|
||||
function loadVersions() {
|
||||
fetch('/api/admin/versions')
|
||||
function loadVersions(page) {
|
||||
page = page || 1;
|
||||
fetch('/api/admin/digital-human-versions?page=' + page + '&pageSize=20')
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
var tbody = document.getElementById('versionListBody');
|
||||
if (!res.success) {
|
||||
tbody.innerHTML = '<tr><td colspan="4" class="empty-tip">加载失败: ' + (res.error || '') + '</td></tr>';
|
||||
tbody.innerHTML = '<tr><td colspan="8" class="empty-tip">加载失败: ' + (res.message || res.error || '') + '</td></tr>';
|
||||
return;
|
||||
}
|
||||
var items = res.items || [];
|
||||
// 兼容两种返回格式:直接数组 或 分页对象
|
||||
var data = res.data;
|
||||
var items = [];
|
||||
var pages = 1;
|
||||
var current = 1;
|
||||
if (Array.isArray(data)) {
|
||||
items = data;
|
||||
} else if (data && Array.isArray(data.records)) {
|
||||
items = data.records;
|
||||
pages = data.pages || 1;
|
||||
current = data.current || 1;
|
||||
} else if (data && Array.isArray(data.items)) {
|
||||
items = data.items;
|
||||
}
|
||||
if (items.length === 0) {
|
||||
tbody.innerHTML = '<tr><td colspan="4" class="empty-tip">暂无版本记录</td></tr>';
|
||||
tbody.innerHTML = '<tr><td colspan="8" class="empty-tip">暂无版本记录</td></tr>';
|
||||
} else {
|
||||
tbody.innerHTML = items.map(function (v) {
|
||||
var url = (v.file_url || '').replace(/"/g, '"');
|
||||
return '<tr><td>' + (v.version || '') + '</td><td><a href="' + url + '" target="_blank" rel="noopener">' + url + '</a></td><td>' + (v.created_at || '') + '</td><td><a href="' + url + '" download class="btn btn-sm">下载</a></td></tr>';
|
||||
var statusText = v.status === 'DRAFT' ? '草稿' : (v.status === 'RELEASED' ? '已发布' : '已废弃');
|
||||
var statusColor = v.status === 'DRAFT' ? '#999' : (v.status === 'RELEASED' ? '#52c41a' : '#ff4d4f');
|
||||
var isLatestBadge = v.isLatest ? '<span style="color:#ff4d4f;font-weight:600;">★</span>' : '';
|
||||
var fileSize = v.fileSize ? (v.fileSize / 1024 / 1024).toFixed(2) + ' MB' : '-';
|
||||
var md5Short = (v.md5 || 'unknown').substring(0, 12) + '...';
|
||||
var changelog = (v.changelog || '-').substring(0, 50);
|
||||
if ((v.changelog || '').length > 50) changelog += '...';
|
||||
var releasedAt = v.releasedAt || '-';
|
||||
var downloadUrl = v.downloadUrl || '';
|
||||
|
||||
var actions = '';
|
||||
if (v.status === 'DRAFT') {
|
||||
actions += '<button class="btn btn-sm" onclick="releaseVersion(\'' + v.version + '\')">发布</button> ';
|
||||
}
|
||||
if (v.status === 'RELEASED' && !v.isLatest) {
|
||||
actions += '<button class="btn btn-sm" onclick="setLatestVersion(\'' + v.version + '\')">设为最新</button> ';
|
||||
}
|
||||
if (downloadUrl) {
|
||||
actions += '<a href="' + downloadUrl + '" class="btn btn-sm" download>下载</a> ';
|
||||
}
|
||||
if (!v.isLatest) {
|
||||
actions += '<button class="btn btn-sm btn-danger" onclick="deleteVersion(\'' + v.version + '\')">删除</button>';
|
||||
}
|
||||
|
||||
return '<tr>' +
|
||||
'<td>' + (v.version || '') + '</td>' +
|
||||
'<td style="color:' + statusColor + ';">' + statusText + '</td>' +
|
||||
'<td>' + isLatestBadge + '</td>' +
|
||||
'<td>' + fileSize + '</td>' +
|
||||
'<td title="' + (v.md5 || '') + '">' + md5Short + '</td>' +
|
||||
'<td>' + changelog + '</td>' +
|
||||
'<td>' + releasedAt + '</td>' +
|
||||
'<td>' + actions + '</td>' +
|
||||
'</tr>';
|
||||
}).join('');
|
||||
}
|
||||
|
||||
// 分页
|
||||
var pagination = document.getElementById('versionPagination');
|
||||
if (pages > 1) {
|
||||
var html = '';
|
||||
for (var i = 1; i <= pages; i++) {
|
||||
var active = i === current ? ' active' : '';
|
||||
html += '<span class="page-item' + active + '" onclick="loadVersions(' + i + ')">' + i + '</span>';
|
||||
}
|
||||
pagination.innerHTML = html;
|
||||
} else {
|
||||
pagination.innerHTML = '';
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
document.getElementById('versionListBody').innerHTML = '<tr><td colspan="4" class="empty-tip">请求失败</td></tr>';
|
||||
.catch(function (err) {
|
||||
document.getElementById('versionListBody').innerHTML = '<tr><td colspan="8" class="empty-tip">请求失败: ' + (err.message || '') + '</td></tr>';
|
||||
});
|
||||
}
|
||||
|
||||
document.getElementById('btnUploadVersion').onclick = function () {
|
||||
var version = (document.getElementById('versionNumber').value || '').trim();
|
||||
var minClientVersion = (document.getElementById('versionMinClientVersion').value || '').trim();
|
||||
var changelog = (document.getElementById('versionChangelog').value || '').trim();
|
||||
var fileInput = document.getElementById('versionZip');
|
||||
var msgEl = document.getElementById('msgVersion');
|
||||
msgEl.textContent = '';
|
||||
msgEl.className = 'msg';
|
||||
|
||||
if (!version) {
|
||||
msgEl.textContent = '请填写版本号';
|
||||
msgEl.classList.add('err');
|
||||
@@ -3564,34 +3627,99 @@
|
||||
msgEl.classList.add('err');
|
||||
return;
|
||||
}
|
||||
|
||||
var formData = new FormData();
|
||||
formData.append('version', version);
|
||||
formData.append('file', file);
|
||||
msgEl.textContent = '上传中...';
|
||||
formData.append('version', version);
|
||||
if (minClientVersion) formData.append('minClientVersion', minClientVersion);
|
||||
if (changelog) formData.append('changelog', changelog);
|
||||
|
||||
msgEl.textContent = '上传中,请稍候...';
|
||||
msgEl.classList.remove('err', 'ok');
|
||||
fetch('/api/admin/version', {
|
||||
|
||||
fetch('/api/admin/digital-human-versions/upload', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.success) {
|
||||
msgEl.textContent = '发布成功。版本:' + res.version + ',链接:' + (res.file_url || '');
|
||||
if (res.success && res.data) {
|
||||
msgEl.textContent = '上传成功!版本:' + res.data.version + '(状态:草稿,请在列表中点击"发布"按钮)';
|
||||
msgEl.classList.add('ok');
|
||||
document.getElementById('versionNumber').value = '';
|
||||
document.getElementById('versionMinClientVersion').value = '';
|
||||
document.getElementById('versionChangelog').value = '';
|
||||
fileInput.value = '';
|
||||
loadVersions();
|
||||
} else {
|
||||
msgEl.textContent = res.error || '上传失败';
|
||||
msgEl.textContent = res.message || res.error || '上传失败';
|
||||
msgEl.classList.add('err');
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
msgEl.textContent = '请求失败';
|
||||
.catch(function (err) {
|
||||
msgEl.textContent = '请求失败: ' + (err.message || '');
|
||||
msgEl.classList.add('err');
|
||||
});
|
||||
};
|
||||
|
||||
window.releaseVersion = function(version) {
|
||||
if (!confirm('确认发布版本 ' + version + ' 吗?')) return;
|
||||
fetch('/api/admin/digital-human-versions/' + version + '/release', {
|
||||
method: 'POST'
|
||||
})
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.success) {
|
||||
alert('发布成功!');
|
||||
loadVersions();
|
||||
} else {
|
||||
alert('发布失败:' + (res.message || res.error || ''));
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
alert('请求失败:' + (err.message || ''));
|
||||
});
|
||||
};
|
||||
|
||||
window.setLatestVersion = function(version) {
|
||||
if (!confirm('确认将版本 ' + version + ' 设为最新吗?客户端将自动检测并更新到此版本。')) return;
|
||||
fetch('/api/admin/digital-human-versions/' + version + '/set-latest', {
|
||||
method: 'POST'
|
||||
})
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.success) {
|
||||
alert('设置成功!版本 ' + version + ' 已标记为最新。');
|
||||
loadVersions();
|
||||
} else {
|
||||
alert('设置失败:' + (res.message || res.error || ''));
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
alert('请求失败:' + (err.message || ''));
|
||||
});
|
||||
};
|
||||
|
||||
window.deleteVersion = function(version) {
|
||||
if (!confirm('确认删除版本 ' + version + ' 吗?此操作将删除 OSS 文件,不可恢复!')) return;
|
||||
fetch('/api/admin/digital-human-versions/' + version, {
|
||||
method: 'DELETE'
|
||||
})
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.success) {
|
||||
alert('删除成功!');
|
||||
loadVersions();
|
||||
} else {
|
||||
alert('删除失败:' + (res.message || res.error || ''));
|
||||
}
|
||||
})
|
||||
.catch(function (err) {
|
||||
alert('请求失败:' + (err.message || ''));
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
// ========== 栏目权限配置 ==========
|
||||
function loadColumns() {
|
||||
fetch('/api/admin/columns')
|
||||
|
||||
Reference in New Issue
Block a user