后台管理接口修复 后端BUG修复
This commit is contained in:
@@ -1856,16 +1856,82 @@
|
||||
minimumPriceMappings: minimumPriceMappings
|
||||
};
|
||||
}
|
||||
function buildSkipPriceAsinQuery(page) {
|
||||
var query = 'page=' + (page || 1) + '&page_size=' + skipPriceAsinPageSize;
|
||||
function buildSkipPriceAsinFilterQuery() {
|
||||
var query = '';
|
||||
var groupId = (document.getElementById('skipPriceAsinFilterGroupId').value || '').trim();
|
||||
var shopName = (document.getElementById('skipPriceAsinFilterShopName').value || '').trim();
|
||||
var asin = (document.getElementById('skipPriceAsinFilterAsin').value || '').trim();
|
||||
if (groupId) query += '&group_id=' + encodeURIComponent(groupId);
|
||||
if (shopName) query += '&shop_name=' + encodeURIComponent(shopName);
|
||||
if (asin) query += '&asin=' + encodeURIComponent(asin);
|
||||
if (groupId) query += (query ? '&' : '') + 'group_id=' + encodeURIComponent(groupId);
|
||||
if (shopName) query += (query ? '&' : '') + 'shop_name=' + encodeURIComponent(shopName);
|
||||
if (asin) query += (query ? '&' : '') + 'asin=' + encodeURIComponent(asin);
|
||||
return query;
|
||||
}
|
||||
function buildSkipPriceAsinOperatorQuery() {
|
||||
var query = '';
|
||||
if (currentUserId) query += 'operator_id=' + encodeURIComponent(currentUserId);
|
||||
if (currentUserRole === 'super_admin') query += (query ? '&' : '') + 'super_admin=true';
|
||||
return query;
|
||||
}
|
||||
function buildSkipPriceAsinQuery(page) {
|
||||
var query = 'page=' + (page || 1) + '&page_size=' + skipPriceAsinPageSize;
|
||||
var filterQuery = buildSkipPriceAsinFilterQuery();
|
||||
if (filterQuery) query += '&' + filterQuery;
|
||||
var operatorQuery = buildSkipPriceAsinOperatorQuery();
|
||||
if (operatorQuery) query += '&' + operatorQuery;
|
||||
return query;
|
||||
}
|
||||
function extractDownloadFilename(disposition, fallbackName) {
|
||||
var fallback = fallbackName || 'download.xlsx';
|
||||
if (!disposition) return fallback;
|
||||
var utf8Match = disposition.match(/filename\*=UTF-8''([^;]+)/i);
|
||||
if (utf8Match && utf8Match[1]) {
|
||||
try {
|
||||
return decodeURIComponent(utf8Match[1]);
|
||||
} catch (e) { }
|
||||
}
|
||||
var plainMatch = disposition.match(/filename=\"?([^\";]+)\"?/i);
|
||||
if (plainMatch && plainMatch[1]) return plainMatch[1];
|
||||
return fallback;
|
||||
}
|
||||
function triggerBrowserDownload(blob, filename) {
|
||||
var url = URL.createObjectURL(blob);
|
||||
var a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = filename || 'download.xlsx';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
setTimeout(function () { URL.revokeObjectURL(url); }, 1000);
|
||||
}
|
||||
function exportSkipPriceAsin() {
|
||||
var query = buildSkipPriceAsinFilterQuery();
|
||||
var operatorQuery = buildSkipPriceAsinOperatorQuery();
|
||||
if (operatorQuery) query += (query ? '&' : '') + operatorQuery;
|
||||
var url = '/api/admin/skip-price-asins/export' + (query ? ('?' + query) : '');
|
||||
fetch(url)
|
||||
.then(function (response) {
|
||||
var contentType = response.headers.get('content-type') || '';
|
||||
if (!response.ok || contentType.indexOf('application/json') >= 0) {
|
||||
return response.json().then(function (res) {
|
||||
throw new Error((res && (res.error || res.msg)) || '导出失败');
|
||||
}).catch(function (err) {
|
||||
throw err instanceof Error ? err : new Error('导出失败');
|
||||
});
|
||||
}
|
||||
return response.blob().then(function (blob) {
|
||||
return {
|
||||
blob: blob,
|
||||
filename: extractDownloadFilename(response.headers.get('content-disposition'), 'skip-price-asin.xlsx')
|
||||
};
|
||||
});
|
||||
})
|
||||
.then(function (payload) {
|
||||
triggerBrowserDownload(payload.blob, payload.filename);
|
||||
})
|
||||
.catch(function (err) {
|
||||
alert((err && err.message) || '导出失败');
|
||||
});
|
||||
}
|
||||
function renderSkipPriceAsinCell(item, country) {
|
||||
var asinValue = item[country.field] || '';
|
||||
var minimumPriceValue = formatSkipPriceMinimumPrice(item[country.minimumPriceField]);
|
||||
@@ -1917,7 +1983,8 @@
|
||||
var shopName = (btn.dataset.shopName || '').replace(/"/g, '"');
|
||||
var countryCode = btn.dataset.country || '';
|
||||
if (!confirm('确定删除店铺“' + shopName + '”在 ' + countryCode + ' 的 ASIN 吗?')) return;
|
||||
fetch('/api/admin/skip-price-asin/' + btn.dataset.skipPriceAsinDelete + '/country/' + countryCode, {
|
||||
var operatorQuery = buildSkipPriceAsinOperatorQuery();
|
||||
fetch('/api/admin/skip-price-asin/' + btn.dataset.skipPriceAsinDelete + '/country/' + countryCode + (operatorQuery ? ('?' + operatorQuery) : ''), {
|
||||
method: 'DELETE'
|
||||
})
|
||||
.then(function (r) { return r.json(); })
|
||||
@@ -2184,6 +2251,8 @@
|
||||
var formData = new FormData();
|
||||
formData.append('file', file);
|
||||
formData.append('group_id', groupId);
|
||||
if (currentUserId) formData.append('operator_id', currentUserId);
|
||||
if (currentUserRole === 'super_admin') formData.append('super_admin', 'true');
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', deleteMode ? '/api/admin/skip-price-asins/delete-import' : '/api/admin/skip-price-asins/import', true);
|
||||
xhr.upload.onprogress = function (event) {
|
||||
@@ -2267,7 +2336,8 @@
|
||||
return;
|
||||
}
|
||||
}
|
||||
fetch('/api/admin/skip-price-asin/' + itemId + '/country/' + countryCode, {
|
||||
var operatorQuery = buildSkipPriceAsinOperatorQuery();
|
||||
fetch('/api/admin/skip-price-asin/' + itemId + '/country/' + countryCode + (operatorQuery ? ('?' + operatorQuery) : ''), {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
@@ -2294,6 +2364,9 @@
|
||||
document.getElementById('btnSearchSkipPriceAsin').onclick = function () {
|
||||
loadSkipPriceAsin(1);
|
||||
};
|
||||
document.getElementById('btnExportSkipPriceAsin').onclick = function () {
|
||||
exportSkipPriceAsin();
|
||||
};
|
||||
document.getElementById('skipPriceAsinFilterShopName').addEventListener('keydown', function (e) {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
@@ -2334,7 +2407,8 @@
|
||||
fallbackAsin = asinMappings[countryCode] || '';
|
||||
return !!fallbackAsin;
|
||||
});
|
||||
fetch('/api/admin/skip-price-asin', {
|
||||
var operatorQuery = buildSkipPriceAsinOperatorQuery();
|
||||
fetch('/api/admin/skip-price-asin' + (operatorQuery ? ('?' + operatorQuery) : ''), {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
@@ -3429,8 +3503,10 @@
|
||||
}
|
||||
|
||||
// 初始化
|
||||
var adminCurrentUserPromise = null;
|
||||
function loadAdminCurrentUser() {
|
||||
fetch('/api/admin/current-user')
|
||||
if (adminCurrentUserPromise) return adminCurrentUserPromise;
|
||||
adminCurrentUserPromise = fetch('/api/admin/current-user')
|
||||
.then(function (r) {
|
||||
if (r.status === 404) {
|
||||
return fetch('/api/auth/check')
|
||||
@@ -3474,7 +3550,7 @@
|
||||
updateShopManageGroupButtonsAccess();
|
||||
})
|
||||
.catch(function () {
|
||||
fetch('/api/auth/check')
|
||||
return fetch('/api/auth/check')
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
document.getElementById('adminCurrentUsername').textContent = res && res.logged_in ? '当前用户' : '未登录';
|
||||
@@ -3486,7 +3562,13 @@
|
||||
document.getElementById('adminCurrentUserRole').style.display = 'none';
|
||||
updateShopManageGroupButtonsAccess();
|
||||
});
|
||||
})
|
||||
.finally(function () {
|
||||
if (!currentUserId && currentUserRole !== 'super_admin') {
|
||||
adminCurrentUserPromise = null;
|
||||
}
|
||||
});
|
||||
return adminCurrentUserPromise;
|
||||
}
|
||||
|
||||
document.getElementById('btnAdminLogout').onclick = function () {
|
||||
@@ -3514,10 +3596,11 @@
|
||||
});
|
||||
};
|
||||
|
||||
loadAdminCurrentUser();
|
||||
loadUserOptions();
|
||||
loadColumnsForPermission();
|
||||
loadShopManageGroups();
|
||||
loadAdminMenus();
|
||||
loadAdminCurrentUser().finally(function () {
|
||||
loadUserOptions();
|
||||
loadColumnsForPermission();
|
||||
loadShopManageGroups();
|
||||
loadAdminMenus();
|
||||
});
|
||||
}) ();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user