index.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { Card, Col, Row } from '@douyinfe/semi-ui';
  3. import { API, showError, showNotice, timestamp2string } from '../../helpers';
  4. import { StatusContext } from '../../context/Status';
  5. import { marked } from 'marked';
  6. const Home = () => {
  7. const [statusState] = useContext(StatusContext);
  8. const [homePageContentLoaded, setHomePageContentLoaded] = useState(false);
  9. const [homePageContent, setHomePageContent] = useState('');
  10. const displayNotice = async () => {
  11. const res = await API.get('/api/notice');
  12. const { success, message, data } = res.data;
  13. if (success) {
  14. let oldNotice = localStorage.getItem('notice');
  15. if (data !== oldNotice && data !== '') {
  16. const htmlNotice = marked(data);
  17. showNotice(htmlNotice, true);
  18. localStorage.setItem('notice', data);
  19. }
  20. } else {
  21. showError(message);
  22. }
  23. };
  24. const displayHomePageContent = async () => {
  25. setHomePageContent(localStorage.getItem('home_page_content') || '');
  26. const res = await API.get('/api/home_page_content');
  27. const { success, message, data } = res.data;
  28. if (success) {
  29. let content = data;
  30. if (!data.startsWith('https://')) {
  31. content = marked.parse(data);
  32. }
  33. setHomePageContent(content);
  34. localStorage.setItem('home_page_content', content);
  35. } else {
  36. showError(message);
  37. setHomePageContent('加载首页内容失败...');
  38. }
  39. setHomePageContentLoaded(true);
  40. };
  41. const getStartTimeString = () => {
  42. const timestamp = statusState?.status?.start_time;
  43. return statusState.status ? timestamp2string(timestamp) : '';
  44. };
  45. useEffect(() => {
  46. displayNotice().then();
  47. displayHomePageContent().then();
  48. }, []);
  49. return (
  50. <>
  51. {homePageContentLoaded && homePageContent === '' ? (
  52. <>
  53. <Card
  54. bordered={false}
  55. headerLine={false}
  56. title='系统状况'
  57. bodyStyle={{ padding: '10px 20px' }}
  58. >
  59. <Row gutter={16}>
  60. <Col span={12}>
  61. <Card
  62. title='系统信息'
  63. headerExtraContent={
  64. <span
  65. style={{
  66. fontSize: '12px',
  67. color: 'var(--semi-color-text-1)',
  68. }}
  69. >
  70. 系统信息总览
  71. </span>
  72. }
  73. >
  74. <p>名称:{statusState?.status?.system_name}</p>
  75. <p>
  76. 版本:
  77. {statusState?.status?.version
  78. ? statusState?.status?.version
  79. : 'unknown'}
  80. </p>
  81. <p>
  82. 源码:
  83. <a
  84. href='https://github.com/songquanpeng/one-api'
  85. target='_blank'
  86. rel='noreferrer'
  87. >
  88. https://github.com/songquanpeng/one-api
  89. </a>
  90. </p>
  91. <p>启动时间:{getStartTimeString()}</p>
  92. </Card>
  93. </Col>
  94. <Col span={12}>
  95. <Card
  96. title='系统配置'
  97. headerExtraContent={
  98. <span
  99. style={{
  100. fontSize: '12px',
  101. color: 'var(--semi-color-text-1)',
  102. }}
  103. >
  104. 系统配置总览
  105. </span>
  106. }
  107. >
  108. <p>
  109. 邮箱验证:
  110. {statusState?.status?.email_verification === true
  111. ? '已启用'
  112. : '未启用'}
  113. </p>
  114. <p>
  115. GitHub 身份验证:
  116. {statusState?.status?.github_oauth === true
  117. ? '已启用'
  118. : '未启用'}
  119. </p>
  120. <p>
  121. 微信身份验证:
  122. {statusState?.status?.wechat_login === true
  123. ? '已启用'
  124. : '未启用'}
  125. </p>
  126. <p>
  127. Turnstile 用户校验:
  128. {statusState?.status?.turnstile_check === true
  129. ? '已启用'
  130. : '未启用'}
  131. </p>
  132. <p>
  133. Telegram 身份验证:
  134. {statusState?.status?.telegram_oauth === true
  135. ? '已启用'
  136. : '未启用'}
  137. </p>
  138. </Card>
  139. </Col>
  140. </Row>
  141. </Card>
  142. </>
  143. ) : (
  144. <>
  145. {homePageContent.startsWith('https://') ? (
  146. <iframe
  147. src={homePageContent}
  148. style={{ width: '100%', height: '100vh', border: 'none' }}
  149. />
  150. ) : (
  151. <div
  152. style={{ fontSize: 'larger' }}
  153. dangerouslySetInnerHTML={{ __html: homePageContent }}
  154. ></div>
  155. )}
  156. </>
  157. )}
  158. </>
  159. );
  160. };
  161. export default Home;