help.html 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  6. <title></title>
  7. <link rel="stylesheet" href="/css/activity.css">
  8. <style>
  9. .activity-content {
  10. min-height: 100vh;
  11. }
  12. .activity-content img {
  13. max-width: 100%;
  14. height: auto;
  15. }
  16. .activity-content a {
  17. color: #f5a623;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="container activity">
  23. <div id="activityContent" class="activity-content">
  24. </div>
  25. <div class="loading-overlay" id="loadingOverlay" style="display: none;">
  26. <div class="loading-content">
  27. <div class="loading-spinner"></div>
  28. <span class="loading-text" data-i18n="loadingText">加载中...</span>
  29. </div>
  30. </div>
  31. <div class="error-overlay" id="errorOverlay" style="display: none;">
  32. <div class="error-content">
  33. <div class="error-icon">!</div>
  34. <span class="error-text" data-i18n="errorText">加载失败,请稍后重试</span>
  35. <button class="error-retry" id="retryBtn" data-i18n="retryBtn">重试</button>
  36. </div>
  37. </div>
  38. </div>
  39. <script src="/js/common.js"></script>
  40. <script>
  41. (function () {
  42. const loadingOverlay = document.getElementById('loadingOverlay');
  43. const errorOverlay = document.getElementById('errorOverlay');
  44. const retryBtn = document.getElementById('retryBtn');
  45. const activityContent = document.getElementById('activityContent');
  46. let token = '';
  47. function getQueryParam(name) {
  48. const urlParams = new URLSearchParams(window.location.search);
  49. return urlParams.get(name);
  50. }
  51. function showLoading() {
  52. loadingOverlay.style.display = 'flex';
  53. errorOverlay.style.display = 'none';
  54. }
  55. function hideLoading() {
  56. loadingOverlay.style.display = 'none';
  57. }
  58. function showError() {
  59. loadingOverlay.style.display = 'none';
  60. errorOverlay.style.display = 'flex';
  61. }
  62. async function fetchHelpDoc() {
  63. showLoading();
  64. const helpDocId = getQueryParam('id');
  65. if (!helpDocId) {
  66. activityContent.innerHTML = '<p style="color: #888; text-align: center; padding: 20px;">' + BEXI18n.t('detailCommon', 'missingHelpId') + '</p>';
  67. hideLoading();
  68. return;
  69. }
  70. try {
  71. const headers = {
  72. 'Content-Type': 'application/json',
  73. 'Accept': 'application/json',
  74. 'X-Requested-With': 'XMLHttpRequest',
  75. 'localeName': getCurrentLang(),
  76. 'Authorization': `${token}`,
  77. ...globalHeaders
  78. };
  79. const API_URL = `/api/v1/config/helpDoc/${encodeURIComponent(helpDocId)}`;
  80. const response = await fetch(API_URL, {
  81. method: 'GET',
  82. headers: headers,
  83. credentials: 'include',
  84. timeout: 10000
  85. });
  86. if (!response.ok) {
  87. throw new Error(`请求失败! status: ${response.status}`);
  88. }
  89. const result = await response.json();
  90. const data = result.data || {};
  91. if (data.content) {
  92. const decodedHTML = decodeHTMLEntities(data.content);
  93. activityContent.innerHTML = decodedHTML;
  94. } else {
  95. activityContent.innerHTML = '<p style="color: #888; text-align: center; padding: 20px;">' + BEXI18n.t('detailCommon', 'emptyHelp') + '</p>';
  96. }
  97. hideLoading();
  98. } catch (error) {
  99. console.error('Data fetch error:', error);
  100. showError();
  101. }
  102. }
  103. BEXI18n.applyTranslations('detailCommon');
  104. retryBtn.addEventListener('click', fetchHelpDoc);
  105. document.addEventListener('DOMContentLoaded', async function () {
  106. try {
  107. token = await window.BEXBridge.getToken();
  108. } catch (error) {
  109. }
  110. fetchHelpDoc();
  111. });
  112. })();
  113. function decodeHTMLEntities(text) {
  114. const textarea = document.createElement('textarea');
  115. textarea.innerHTML = text;
  116. return textarea.value;
  117. }
  118. </script>
  119. </body>
  120. </html>