index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { Card, Grid, Header, Segment } from 'semantic-ui-react';
  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, statusDispatch] = 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 timestamp2string(timestamp);
  44. };
  45. useEffect(() => {
  46. displayNotice().then();
  47. displayHomePageContent().then();
  48. }, []);
  49. return (
  50. <>
  51. {
  52. homePageContentLoaded && homePageContent === '' ? <>
  53. <Segment>
  54. <Header as='h3'>系统状况</Header>
  55. <Grid columns={2} stackable>
  56. <Grid.Column>
  57. <Card fluid>
  58. <Card.Content>
  59. <Card.Header>系统信息</Card.Header>
  60. <Card.Meta>系统信息总览</Card.Meta>
  61. <Card.Description>
  62. <p>名称:{statusState?.status?.system_name}</p>
  63. <p>版本:{statusState?.status?.version}</p>
  64. <p>
  65. 源码:
  66. <a
  67. href='https://github.com/songquanpeng/one-api'
  68. target='_blank'
  69. >
  70. https://github.com/songquanpeng/one-api
  71. </a>
  72. </p>
  73. <p>启动时间:{getStartTimeString()}</p>
  74. </Card.Description>
  75. </Card.Content>
  76. </Card>
  77. </Grid.Column>
  78. <Grid.Column>
  79. <Card fluid>
  80. <Card.Content>
  81. <Card.Header>系统配置</Card.Header>
  82. <Card.Meta>系统配置总览</Card.Meta>
  83. <Card.Description>
  84. <p>
  85. 邮箱验证:
  86. {statusState?.status?.email_verification === true
  87. ? '已启用'
  88. : '未启用'}
  89. </p>
  90. <p>
  91. GitHub 身份验证:
  92. {statusState?.status?.github_oauth === true
  93. ? '已启用'
  94. : '未启用'}
  95. </p>
  96. <p>
  97. 微信身份验证:
  98. {statusState?.status?.wechat_login === true
  99. ? '已启用'
  100. : '未启用'}
  101. </p>
  102. <p>
  103. Turnstile 用户校验:
  104. {statusState?.status?.turnstile_check === true
  105. ? '已启用'
  106. : '未启用'}
  107. </p>
  108. </Card.Description>
  109. </Card.Content>
  110. </Card>
  111. </Grid.Column>
  112. </Grid>
  113. </Segment>
  114. </> : <>
  115. {
  116. homePageContent.startsWith('https://') ? <iframe
  117. src={homePageContent}
  118. style={{ width: '100%', height: '100vh', border: 'none' }}
  119. /> : <div style={{ fontSize: 'larger' }} dangerouslySetInnerHTML={{ __html: homePageContent }}></div>
  120. }
  121. </>
  122. }
  123. </>
  124. );
  125. };
  126. export default Home;