From d643ae156a434f8782a64394b31b7b499045bffa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com>
Date: Thu, 27 Aug 2026 05:09:40 -0400
Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E7=94=A8=E6=88=B7=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=E8=8F=9C=E5=8D=95=E6=9D=83=E9=99=90=E7=9B=AE=E5=BD=95?=
=?UTF-8?q?=EF=BC=9A=E5=8A=A0=E8=BD=BD=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E9=87=8D=E8=AF=95=E4=B8=8E=E5=A4=B1=E8=B4=A5=E6=8F=90=E7=A4=BA?=
=?UTF-8?q?/=E9=87=8D=E6=96=B0=E5=8A=A0=E8=BD=BD=EF=BC=8C=E5=88=9B?=
=?UTF-8?q?=E5=BB=BA=E7=BC=96=E8=BE=91=E5=A4=B1=E8=B4=A5=E6=97=B6=E8=87=AA?=
=?UTF-8?q?=E5=8A=A8=E6=81=A2=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/static/admin.js | 71 +++++++++++++++++++++++++++++++----
backend/web_source/admin.html | 2 +-
2 files changed, 65 insertions(+), 8 deletions(-)
diff --git a/backend/static/admin.js b/backend/static/admin.js
index 55498f9e..33e9396e 100644
--- a/backend/static/admin.js
+++ b/backend/static/admin.js
@@ -388,7 +388,44 @@
}
var allColumnsList = [];
var columnPermissionCatalogReady = false;
+ var columnPermissionCatalogState = 'idle'; // idle | loading | ready | failed
+ var columnPermissionCatalogError = '';
var columnCardsContainerMap = { createColumnPermissionWrap: 'createColumnCards', editColumnPermissionWrap: 'editColumnCards' };
+ function fetchCatalogWithRetry(url, attempts) {
+ return fetch(url).then(function (r) {
+ if (!r.ok) throw new Error('请求失败(' + r.status + ')');
+ return r.json();
+ }).catch(function (error) {
+ if (attempts <= 1) throw error;
+ return new Promise(function (resolve) { setTimeout(resolve, 700); })
+ .then(function () { return fetchCatalogWithRetry(url, attempts - 1); });
+ });
+ }
+ function renderPermissionCatalogStatus() {
+ var wrap = document.getElementById('createColumnPermissionWrap');
+ if (!wrap) return;
+ if (columnPermissionCatalogState === 'loading') {
+ wrap.textContent = '菜单权限加载中…';
+ } else if (columnPermissionCatalogState === 'failed') {
+ wrap.innerHTML = '';
+ var tip = document.createElement('div');
+ tip.style.color = '#e5484d';
+ tip.style.fontSize = '13px';
+ tip.style.padding = '8px 0';
+ tip.textContent = '菜单权限加载失败' +
+ (columnPermissionCatalogError ? '(' + columnPermissionCatalogError + ')' : '') +
+ ':';
+ var retryBtn = document.createElement('button');
+ retryBtn.type = 'button';
+ retryBtn.className = 'col-perm-retry';
+ retryBtn.textContent = '重新加载';
+ retryBtn.style.marginLeft = '6px';
+ retryBtn.style.padding = '2px 10px';
+ retryBtn.onclick = loadColumnsForPermission;
+ tip.appendChild(retryBtn);
+ wrap.appendChild(tip);
+ }
+ }
// Hierarchical permission editor: only direct IDs are submitted; descendants are visual inheritance.
function columnParentId(item) {
var value = item && item.parent_id != null ? item.parent_id : item && item.parentId;
@@ -424,12 +461,16 @@
return columnTreeFullyCovered(columnId(child), directIds);
});
}
+ var columnPermissionCatalogPending = null;
function loadColumnsForPermission() {
+ if (columnPermissionCatalogPending) return columnPermissionCatalogPending;
columnPermissionCatalogReady = false;
+ columnPermissionCatalogState = 'loading';
+ columnPermissionCatalogError = '';
+ renderPermissionCatalogStatus();
var ownedKeys = {}, ownedRoutes = {};
var ownPermissionRequest = (currentUserRole === 'admin' && currentUserId)
- ? fetch('/api/admin/user/' + currentUserId + '/column-permissions')
- .then(function (r) { return r.json(); })
+ ? fetchCatalogWithRetry('/api/admin/user/' + currentUserId + '/column-permissions', 3)
.then(function (res) {
if (!res.success) throw new Error(res.error || '当前用户权限加载失败');
(res.items || []).forEach(function (item) {
@@ -438,10 +479,9 @@
});
})
: Promise.resolve();
- ownPermissionRequest.then(function () { return fetch('/api/admin/columns'); })
- .then(function (r) { return r.json(); })
+ var catalogChain = ownPermissionRequest.then(function () { return fetchCatalogWithRetry('/api/admin/columns', 3); })
.then(function (res) {
- if (!res.success) return;
+ if (!res.success) throw new Error(res.error || '菜单列表加载失败');
var availableColumns = (res.items || []).filter(function (item) {
if (item.column_key === 'admin_image_video_task_data' ||
item.column_key === 'admin_shop_data_crawl_task_data') return false;
@@ -477,17 +517,25 @@
});
}
columnPermissionCatalogReady = true;
+ columnPermissionCatalogState = 'ready';
renderColumnPermissionWrap('createColumnPermissionWrap');
renderColumnPermissionWrap('editColumnPermissionWrap');
populateColumnParentSelects();
- }).catch(function () {
+ }).catch(function (error) {
columnPermissionCatalogReady = false;
+ columnPermissionCatalogState = 'failed';
+ columnPermissionCatalogError = (error && error.message) ? error.message : '';
allColumnsList = [];
var editPermissionWrap = document.getElementById('editColumnPermissionWrap');
if (editPermissionWrap) editPermissionWrap._permissionsReady = false;
renderColumnPermissionWrap('createColumnPermissionWrap');
renderColumnPermissionWrap('editColumnPermissionWrap');
+ renderPermissionCatalogStatus();
+ }).finally(function () {
+ columnPermissionCatalogPending = null;
});
+ columnPermissionCatalogPending = catalogChain;
+ return catalogChain;
}
function renderColumnCards(wrapId) {
var wrap = document.getElementById(wrapId);
@@ -748,6 +796,9 @@
editPermissionWrap._directIds = {};
editPermissionWrap._permissionsReady = false;
renderColumnPermissionWrap('editColumnPermissionWrap');
+ if (!columnPermissionCatalogReady && (columnPermissionCatalogState === 'failed' || columnPermissionCatalogState === 'idle')) {
+ loadColumnsForPermission();
+ }
fetch('/api/admin/user/' + (u.id) + '/columns')
.then(function (r) { return r.json(); })
.then(function (res) {
@@ -800,7 +851,13 @@
return;
}
if (!columnPermissionCatalogReady) {
- msgEl.textContent = '菜单权限尚未加载,请稍后重试';
+ if (columnPermissionCatalogState === 'failed' || columnPermissionCatalogState === 'idle') {
+ loadColumnsForPermission();
+ msgEl.textContent = '菜单权限加载失败,已重新加载,请稍后重试';
+ msgEl.classList.add('err');
+ return;
+ }
+ msgEl.textContent = '菜单权限尚未加载(加载中),请稍后重试';
msgEl.classList.add('err');
return;
}
diff --git a/backend/web_source/admin.html b/backend/web_source/admin.html
index f2ef9acf..1d8005fa 100644
--- a/backend/web_source/admin.html
+++ b/backend/web_source/admin.html
@@ -3209,7 +3209,7 @@
-
+