Merge branch 'master' of https://git.eactive.synology.me:8090/eapim/djbank/eapim-admin.git
eapim-admin CI / build (push) Has been cancelled
eapim-admin CI / build (push) Has been cancelled
This commit is contained in:
@@ -189,7 +189,7 @@
|
||||
<td>
|
||||
<input type="text" id="keywordList" style="width:100%" placeholder="쉼표(,)로 구분하여 입력">
|
||||
<div class="help-text" style="color:#666; font-size:12px; margin-top:5px;">
|
||||
예시: #인증, #대출, #예금
|
||||
예시: 인증, 대출, 예금
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -327,14 +327,61 @@
|
||||
}, 'json').fail(ajaxFail);
|
||||
}
|
||||
|
||||
// ── 캐시 Reload ──
|
||||
var reloadModal;
|
||||
var reloadBtnHtml;
|
||||
|
||||
function reloadPortalCache() {
|
||||
var $btn = $('#btnReloadCache');
|
||||
if ($btn.prop('disabled')) return;
|
||||
if (reloadBtnHtml === undefined) reloadBtnHtml = $btn.html();
|
||||
$btn.prop('disabled', true)
|
||||
.html('<span class="spinner-border spinner-border-sm"></span> 리로드 중...');
|
||||
|
||||
$.post(url, { cmd: 'TRANSACTION_RELOAD' }, function (result) {
|
||||
if (result && result.success) {
|
||||
alert('포탈 메뉴 캐시 리로드 완료 (항목 ' + result.itemCount + '건, ' + result.reloadedAt + ')');
|
||||
} else {
|
||||
alert('캐시 리로드 실패: ' + (result ? result.message : '알 수 없는 오류'));
|
||||
}
|
||||
}, 'json').fail(ajaxFail);
|
||||
showReloadResult(result);
|
||||
}, 'json').fail(ajaxFail).always(function () {
|
||||
$btn.prop('disabled', false).html(reloadBtnHtml);
|
||||
});
|
||||
}
|
||||
|
||||
function showReloadResult(result) {
|
||||
if (!result) {
|
||||
alert('캐시 리로드 실패: 알 수 없는 오류');
|
||||
return;
|
||||
}
|
||||
|
||||
var servers = result.servers || [];
|
||||
var $summary = $('#reloadSummary');
|
||||
$summary.removeClass('alert-success alert-danger alert-warning')
|
||||
.addClass(result.success ? 'alert-success'
|
||||
: (result.successCount > 0 ? 'alert-warning' : 'alert-danger'))
|
||||
.text(result.message || '');
|
||||
|
||||
var rows = '';
|
||||
servers.forEach(function (s) {
|
||||
var badge = s.success
|
||||
? '<span class="badge text-bg-success">성공</span>'
|
||||
: '<span class="badge text-bg-danger">실패</span>';
|
||||
var detail = s.success
|
||||
? ('항목 ' + (s.itemCount == null ? '-' : s.itemCount) + '건'
|
||||
+ (s.reloadedAt ? ' / ' + escapeHtml(String(s.reloadedAt)) : ''))
|
||||
: escapeHtml(String(s.message || '-'));
|
||||
rows += '<tr>'
|
||||
+ '<td class="text-center">' + badge + '</td>'
|
||||
+ '<td style="word-break:break-all;">' + escapeHtml(String(s.url || '')) + '</td>'
|
||||
+ '<td>' + detail + '</td>'
|
||||
+ '<td class="text-end">' + (s.elapsedMs == null ? '-' : s.elapsedMs + 'ms') + '</td>'
|
||||
+ '</tr>';
|
||||
});
|
||||
if (rows === '') {
|
||||
rows = '<tr><td colspan="4" class="text-center text-muted">'
|
||||
+ '호출 대상 서버가 없습니다. 아래 설정 안내를 확인하세요.</td></tr>';
|
||||
}
|
||||
$('#reloadResultBody').html(rows);
|
||||
|
||||
if (!reloadModal) reloadModal = new bootstrap.Modal(document.getElementById('reloadResultModal'));
|
||||
reloadModal.show();
|
||||
}
|
||||
|
||||
function ajaxFail(xhr) {
|
||||
@@ -453,7 +500,7 @@
|
||||
<button type="button" class="btn btn-sm btn-outline-danger" level="W" onclick="initializeMenus()">
|
||||
<i class="bi bi-arrow-counterclockwise"></i> 메뉴 초기화</button>
|
||||
<span class="spacer"></span>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" level="W" onclick="reloadPortalCache()">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary" id="btnReloadCache" level="W" onclick="reloadPortalCache()">
|
||||
<i class="bi bi-arrow-repeat"></i> 캐시 Reload</button>
|
||||
<button type="button" class="btn btn-sm btn-success" level="W" onclick="savePlacements()">
|
||||
<i class="bi bi-save"></i> 저장</button>
|
||||
@@ -463,6 +510,12 @@
|
||||
드래그로 위치를 조절한 뒤 <strong>저장</strong> 버튼으로 일괄 반영합니다.
|
||||
기본 항목([기본] 배지)은 [-] 시 <strong>미배치</strong>로만 이동하고, 커스텀 항목은 미배치 시 <strong>삭제</strong>됩니다.
|
||||
저장 후 <strong>캐시 Reload</strong> 를 실행해야 포탈에 즉시 반영됩니다(미실행 시 TTL 경과 후 반영).
|
||||
<br>
|
||||
캐시 Reload 대상 서버는 포탈 프로퍼티 <code>Portal / portal.internal.menu-reload-url</code> 로 설정합니다.
|
||||
포탈이 <strong>다중 서버(이중화)</strong> 로 기동된 경우 모든 서버의 리로드 URL 을
|
||||
<strong>콤마(,) 또는 줄바꿈</strong> 으로 나열해야 전체 서버에 반영됩니다
|
||||
(예: <code>http://10.0.0.11:39130/internal/menu/reload, http://10.0.0.12:39130/internal/menu/reload</code>).
|
||||
서버별 요청 타임아웃은 <strong>3초</strong> 이며, 실행 결과는 서버별로 표시됩니다.
|
||||
</div>
|
||||
|
||||
<div class="menu-board">
|
||||
@@ -544,6 +597,39 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 캐시 Reload 결과 -->
|
||||
<div class="modal fade" id="reloadResultModal" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">포탈 메뉴 캐시 Reload 결과</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="닫기"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert py-2 px-3" id="reloadSummary" style="font-size:13px;"></div>
|
||||
<table class="table table-sm table-bordered align-middle" style="font-size:12px;">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th style="width:70px;" class="text-center">결과</th>
|
||||
<th>서버 URL</th>
|
||||
<th style="width:38%;">상세</th>
|
||||
<th style="width:80px;" class="text-end">소요</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="reloadResultBody"></tbody>
|
||||
</table>
|
||||
<div class="text-muted" style="font-size:12px;">
|
||||
대상 서버는 포탈 프로퍼티 <code>Portal / portal.internal.menu-reload-url</code> 에
|
||||
콤마(,) 또는 줄바꿈으로 나열합니다. 서버별 타임아웃 3초, 전 서버 병렬 호출입니다.
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- end content_middle -->
|
||||
</div><!-- end right_box -->
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user