feat(doctor): add system diagnostics feature

This commit is contained in:
Will Miao
2026-04-11 16:02:13 +08:00
parent 25fa175aa2
commit 1817142a7b
28 changed files with 2231 additions and 6 deletions

View File

@@ -84,6 +84,13 @@
</div>
<div class="controls-right">
<div class="control-group doctor-control-group">
<button id="doctorTriggerBtn" class="doctor-trigger" title="{{ t('doctor.buttonTitle', default='Run diagnostics and common fixes') }}">
<i class="fas fa-stethoscope"></i>
<span>{{ t('doctor.title', default='Doctor') }}</span>
<span id="doctorStatusBadge" class="doctor-status-badge hidden" aria-hidden="true"></span>
</button>
</div>
<div class="keyboard-nav-hint tooltip">
<i class="fas fa-keyboard"></i>
<span class="tooltiptext">
@@ -117,4 +124,4 @@
<!-- Breadcrumbs will be populated by JavaScript -->
</nav>
</div>
</div>
</div>

View File

@@ -3,6 +3,7 @@
{% include 'components/modals/confirm_modals.html' %}
{% include 'components/modals/settings_modal.html' %}
{% include 'components/modals/doctor_modal.html' %}
{% include 'components/modals/support_modal.html' %}
{% include 'components/modals/update_modal.html' %}
{% include 'components/modals/help_modal.html' %}
@@ -11,4 +12,4 @@
{% include 'components/modals/download_modal.html' %}
{% include 'components/modals/move_modal.html' %}
{% include 'components/modals/bulk_add_tags_modal.html' %}
{% include 'components/modals/bulk_base_model_modal.html' %}
{% include 'components/modals/bulk_base_model_modal.html' %}

View File

@@ -0,0 +1,40 @@
<div id="doctorModal" class="modal">
<div class="modal-content doctor-modal">
<button class="close" onclick="modalManager.closeModal('doctorModal')">&times;</button>
<div class="doctor-shell">
<div class="doctor-hero">
<div class="doctor-hero-copy">
<span class="doctor-kicker">{{ t('doctor.kicker', default='System diagnostics') }}</span>
<h2>{{ t('doctor.title', default='Doctor') }}</h2>
<p id="doctorSummaryText">{{ t('doctor.summary.idle', default='Run a health check for settings, cache integrity, and UI consistency.') }}</p>
</div>
<div id="doctorSummaryBadge" class="doctor-summary-badge doctor-status-ok">
<i class="fas fa-heartbeat"></i>
<span>{{ t('doctor.status.ok', default='Healthy') }}</span>
</div>
</div>
<div id="doctorLoadingState" class="doctor-loading-state">
<i class="fas fa-spinner fa-spin"></i>
<span>{{ t('doctor.loading', default='Checking environment...') }}</span>
</div>
<div id="doctorIssuesList" class="doctor-issues-list"></div>
<div class="doctor-footer">
<div class="doctor-footer-note">{{ t('doctor.footer', default='Export a diagnostics bundle if the issues remain after repair.') }}</div>
<div class="doctor-footer-actions">
<button id="doctorRefreshBtn" class="secondary-btn">
<i class="fas fa-sync-alt"></i>
<span>{{ t('doctor.actions.runAgain', default='Run Again') }}</span>
</button>
<button id="doctorExportBtn" class="primary-btn">
<i class="fas fa-file-export"></i>
<span>{{ t('doctor.actions.exportBundle', default='Export Bundle') }}</span>
</button>
</div>
</div>
</div>
</div>
</div>