diff --git a/common/init.go b/common/init.go index 81c351b..a59c04c 100644 --- a/common/init.go +++ b/common/init.go @@ -19,7 +19,7 @@ var ( func printHelp() { fmt.Println(fmt.Sprintf("Message Pusher %s - Your all in one message push system.", Version)) fmt.Println("Copyright (C) 2023 JustSong. All rights reserved.") - fmt.Println("GitHub: https://github.com/songquanpeng/message-pusher") + fmt.Println("GitHub: https://github.com/xyzmos/message-pusher") fmt.Println("Usage: message-pusher [options]") fmt.Println("Options:") flag.CommandLine.VisitAll(func(f *flag.Flag) { diff --git a/common/public/message.html b/common/public/message.html index 7a121f9..373638f 100644 --- a/common/public/message.html +++ b/common/public/message.html @@ -7,26 +7,25 @@ {{.title}} - -
- -
- -
- -
-

{{.title}}

-
- 发布于:{{.time}} -
-
- {{.description | unescape}} -
-
+ + +
+
+
+
+
+

{{.title}}

+
+ 发布于:{{.time}} +
+
+ {{.description | unescape}} +
{{.content | unescape}} -
-
+ +
+ - + \ No newline at end of file diff --git a/common/public/static/app.css b/common/public/static/app.css index ace220f..784dff9 100644 --- a/common/public/static/app.css +++ b/common/public/static/app.css @@ -1,223 +1,326 @@ -/* Liquid Glass Global Styles */ - -/* 液态玻璃变量 */ +/* Neumorphism Global Styles */ :root { - --liquid-glass-bg: rgba(255, 255, 255, 0.15); - --liquid-glass-bg-hover: rgba(255, 255, 255, 0.25); - --liquid-glass-border: rgba(255, 255, 255, 0.3); - --liquid-glass-ring: rgba(255, 255, 255, 0.2); - --liquid-glass-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15); - --liquid-glass-blur: 40px; /* backdrop-blur-2xl/3xl */ - --liquid-glass-saturate: 1.5; - - --text-primary: #ffffff; - --text-secondary: rgba(255, 255, 255, 0.8); - --link-color: #60a5fa; /* blue-400 */ - --link-hover-color: #93c5fd; /* blue-300 */ + --neu-bg: #e0e5ec; + --neu-bg-light: #f0f0f3; + --neu-shadow-dark: #b8bcc2; + --neu-shadow-light: #ffffff; + --neu-accent: #6d5dfc; + --neu-text: #333333; + --neu-text-muted: #6b7280; } -/* 基础液态玻璃类 */ -.liquid-glass { - background: var(--liquid-glass-bg); - backdrop-filter: blur(var(--liquid-glass-blur)) saturate(var(--liquid-glass-saturate)); - -webkit-backdrop-filter: blur(var(--liquid-glass-blur)) saturate(var(--liquid-glass-saturate)); - border: 1px solid var(--liquid-glass-border); +/* Utility Classes */ +.neu-raised { + background: var(--neu-bg); + border-radius: 12px; box-shadow: - var(--liquid-glass-shadow), - inset 0 1px 1px rgba(255, 255, 255, 0.25); - border-radius: 1.5rem; /* rounded-2xl */ - transition: all 0.3s ease-out; + 8px 8px 16px var(--neu-shadow-dark), + -8px -8px 16px var(--neu-shadow-light); } -.liquid-glass:hover { - background: var(--liquid-glass-bg-hover); +.neu-raised-sm { + box-shadow: + 4px 4px 8px var(--neu-shadow-dark), + -4px -4px 8px var(--neu-shadow-light); } -/* 液态玻璃容器 - 渐变背景 (Blue-Purple) */ -.liquid-glass-container { - background: linear-gradient(135deg, #2563eb 0%, #9333ea 50%, #ec4899 100%); - min-height: 100vh; - width: 100%; - position: relative; - overflow-x: hidden; +.neu-pressed { + background: var(--neu-bg); + border-radius: 12px; + box-shadow: + inset 8px 8px 16px var(--neu-shadow-dark), + inset -8px -8px 16px var(--neu-shadow-light); } -/* 边缘高光效果 */ -.liquid-glass-highlight { - background-image: linear-gradient( - to bottom, - rgba(255, 255, 255, 0.15), - transparent 50% - ); - pointer-events: none; - position: absolute; - inset: 0; - border-radius: inherit; +.neu-pressed-sm { + box-shadow: + inset 4px 4px 8px var(--neu-shadow-dark), + inset -4px -4px 8px var(--neu-shadow-light); } -/* 胶囊标签样式 */ -.liquid-glass-pill { - display: inline-flex; - align-items: center; - gap: 0.375rem; - padding: 0.375rem 1rem; - background: rgba(255, 255, 255, 0.2); - backdrop-filter: blur(16px) saturate(1.5); - -webkit-backdrop-filter: blur(16px) saturate(1.5); - border: 1px solid rgba(255, 255, 255, 0.3); - border-radius: 9999px; - font-size: 0.875rem; - font-weight: 500; - color: white; - box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.3); +.neu-hover:hover { + box-shadow: + 4px 4px 8px var(--neu-shadow-dark), + -4px -4px 8px var(--neu-shadow-light); } -/* General Resets & Typography adapted for Liquid Glass */ +.neu-active:active { + box-shadow: + inset 4px 4px 8px var(--neu-shadow-dark), + inset -4px -4px 8px var(--neu-shadow-light); +} + +.neu-circle { + border-radius: 50%; +} + +/* Base Styles */ body { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif; + font-family: Verdana, Candara, Arial, Helvetica, Microsoft YaHei, sans-serif; line-height: 1.6; margin: 0; - color: var(--text-primary); + background-color: var(--neu-bg); + color: var(--neu-text); +} + +nav { + margin-bottom: 16px; } a { text-decoration: none; - color: var(--link-color); - transition: color 0.2s; + color: var(--neu-accent); + transition: all 0.3s ease; } a:hover { - color: var(--link-hover-color); text-decoration: none !important; + color: var(--neu-accent); + text-shadow: 0 0 5px rgba(109, 93, 252, 0.3); } -/* Layout */ .wrapper { max-width: 960px; margin: 0 auto; - padding: 2rem 1rem; } -/* Article Styles */ -article { - font-size: 16px; - line-height: 1.6; - word-wrap: break-word; - color: var(--text-primary); - padding: 2rem; +#page-container { position: relative; + min-height: 97vh; +} + +#content-wrap { + padding-bottom: 4rem; +} + +#footer { + height: 4rem; +} + +/* Article Container - Main Card */ +.article-container { + margin: 40px auto; + max-width: 960px; + padding: 40px; + overflow-wrap: break-word; + word-break: break-word; + line-height: 1.6; + + background: var(--neu-bg); + border-radius: 24px; + box-shadow: + 12px 12px 24px var(--neu-shadow-dark), + -12px -12px 24px var(--neu-shadow-light); +} + +@media screen and (max-width: 768px) { + .article-container { + margin: 16px; + padding: 20px; + box-shadow: + 6px 6px 12px var(--neu-shadow-dark), + -6px -6px 12px var(--neu-shadow-light); + } +} + +/* Typography */ +article { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; + color: var(--neu-text); } article h1, article h2, article h3, article h4, article h5, article h6 { - color: var(--text-primary); - margin-top: 1.5em; - margin-bottom: 0.5em; + margin-top: 24px; + margin-bottom: 16px; font-weight: 600; + line-height: 1.5; + color: var(--neu-text); } -article h1 { font-size: 2.25em; line-height: 1.2; } -article h2 { font-size: 1.75em; padding-bottom: 0.3em; border-bottom: 1px solid rgba(255,255,255,0.2); } -article h3 { font-size: 1.5em; } +article h1 { font-size: 2em; } +article h2 { font-size: 1.5em; padding-bottom: 0.3em; } +article h3 { font-size: 1.25em; } +article h4 { font-size: 1.25em; } +article h5 { font-size: 1.1em; } +article h6 { font-size: 1em; font-weight: bold; } .info { - font-size: 0.9rem; - color: var(--text-secondary); - margin-bottom: 1.5rem; - display: flex; - align-items: center; + font-size: 14px; + line-height: 28px; + text-align: left; + color: var(--neu-text-muted); + margin-bottom: 24px; +} + +/* Blockquote - Pressed Effect */ +article blockquote { + margin: 16px 0; + padding: 16px 24px; + border-left: none; + border-radius: 12px; + background: var(--neu-bg); + box-shadow: + inset 4px 4px 8px var(--neu-shadow-dark), + inset -4px -4px 8px var(--neu-shadow-light); + color: var(--neu-text-muted); +} + +/* Code Blocks - Pressed Effect */ +article pre { + max-width: 100%; + display: block; + overflow: auto; + padding: 16px; + margin-top: 12px; + margin-bottom: 12px; + border-radius: 12px; + background: var(--neu-bg); + box-shadow: + inset 4px 4px 8px var(--neu-shadow-dark), + inset -4px -4px 8px var(--neu-shadow-light); } -/* Code Blocks */ code { - font-family: "JetBrains Mono", "Cascadia Code", Consolas, monospace; - font-size: 0.9em; + font-family: "JetBrains Mono", "Cascadia Code", Consolas, Microsoft YaHei, monospace; } article code { - background: rgba(0, 0, 0, 0.2); - color: #e2e8f0; - padding: 0.2em 0.4em; - border-radius: 0.375rem; + color: var(--neu-accent); + background-color: transparent; + padding: .065em .4em; + border-radius: 6px; } -article pre { - background: rgba(0, 0, 0, 0.25); - padding: 1rem; - border-radius: 0.75rem; - overflow-x: auto; - margin: 1rem 0; - border: 1px solid rgba(255, 255, 255, 0.1); +/* Inline Code Style */ +p code, li code { + background-color: var(--neu-bg); + box-shadow: + inset 2px 2px 4px var(--neu-shadow-dark), + inset -2px -2px 4px var(--neu-shadow-light); + padding: 2px 6px; + border-radius: 6px; } -article pre code { - background: transparent; - padding: 0; - color: inherit; - font-size: 0.9em; +/* Lists */ +article ul, article ol { + padding-left: 2em; } -/* Blockquotes */ -article blockquote { - margin: 1rem 0; - padding: 0.5rem 1rem; - border-left: 4px solid rgba(255, 255, 255, 0.4); - background: rgba(255, 255, 255, 0.05); - border-radius: 0 0.5rem 0.5rem 0; - color: var(--text-secondary); +article li + li { + margin-top: 0.25em; } /* Tables */ article table { - width: 100%; - border-collapse: collapse; - margin: 1rem 0; -} - -article table th, article table td { - border: 1px solid rgba(255, 255, 255, 0.2); - padding: 0.75rem; + margin: auto; + border-collapse: separate; + border-spacing: 0; + vertical-align: middle; + text-align: left; + min-width: 66%; + border-radius: 12px; + overflow: hidden; + background: var(--neu-bg); + box-shadow: + 8px 8px 16px var(--neu-shadow-dark), + -8px -8px 16px var(--neu-shadow-light); + margin-bottom: 24px; } +article table td, article table th { - background: rgba(255, 255, 255, 0.1); - font-weight: 600; + padding: 12px 16px; + border-bottom: 1px solid rgba(184, 188, 194, 0.3); +} + +article table tr:last-child td { + border-bottom: none; } /* Images */ img { max-width: 100%; - height: auto; - border-radius: 0.75rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + max-height: 100%; + border-radius: 12px; + margin: 16px 0; + box-shadow: + 8px 8px 16px var(--neu-shadow-dark), + -8px -8px 16px var(--neu-shadow-light); } -/* Helpers */ -.shadow { - box-shadow: var(--liquid-glass-shadow); +/* Tags (e.g. timestamp) */ +.tag.is-light { + background: var(--neu-bg); + color: var(--neu-text-muted); + padding: 4px 12px; + border-radius: 20px; + box-shadow: + 4px 4px 8px var(--neu-shadow-dark), + -4px -4px 8px var(--neu-shadow-light); + font-size: 0.85em; + font-weight: 500; } -/* Specific elements from original CSS that might be needed */ -.columns { - display: flex; - justify-content: center; -} -.column { - width: 100%; - max-width: 960px; -} - -/* Scrollbar customization for webkit */ +/* Scrollbar */ ::-webkit-scrollbar { - width: 8px; - height: 8px; + width: 12px; + height: 12px; } ::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.1); + background: var(--neu-bg); } ::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.3); - border-radius: 4px; + background: var(--neu-shadow-dark); + border-radius: 6px; + border: 3px solid var(--neu-bg); } -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.5); + +/* Helper classes */ +.shadow { + box-shadow: + 8px 8px 16px var(--neu-shadow-dark), + -8px -8px 16px var(--neu-shadow-light); +} + +.nav-shadow { + box-shadow: + 0 4px 8px var(--neu-shadow-dark); +} + +/* Pagination */ +.paginator div { + border: none; + cursor: pointer; + display: inline-block; + min-width: 40px; + text-align: center; + font-weight: bold; + padding: 10px 20px; + margin: 0 8px; + + background: var(--neu-bg); + border-radius: 12px; + color: var(--neu-text); + box-shadow: + 4px 4px 8px var(--neu-shadow-dark), + -4px -4px 8px var(--neu-shadow-light); + transition: all 0.2s ease; +} + +.paginator div:hover { + transform: translateY(-2px); + box-shadow: + 6px 6px 12px var(--neu-shadow-dark), + -6px -6px 12px var(--neu-shadow-light); + color: var(--neu-accent); +} + +.paginator div:active { + transform: translateY(0); + box-shadow: + inset 4px 4px 8px var(--neu-shadow-dark), + inset -4px -4px 8px var(--neu-shadow-light); } diff --git a/web/public/index.html b/web/public/index.html index 2ec6a7a..2f4d76a 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -4,7 +4,7 @@ - + { {Footer === '' ? (
- 消息推送服务 {process.env.REACT_APP_VERSION}{' '} - - 由{' '} - - JustSong - {' '} - 构建,源代码遵循{' '} - - MIT 协议 -
) : (
{ const openGitHubRelease = () => { window.location = - 'https://github.com/songquanpeng/message-pusher/releases/latest'; + 'https://github.com/xyzmos/message-pusher/releases/latest'; }; const checkUpdate = async () => { const res = await API.get( - 'https://api.github.com/repos/songquanpeng/message-pusher/releases/latest' + 'https://api.github.com/repos/xyzmos/message-pusher/releases/latest' ); const { tag_name, body } = res.data; if (tag_name === process.env.REACT_APP_VERSION) { diff --git a/web/src/index.css b/web/src/index.css index 28b1ce5..344e1be 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1,31 +1,281 @@ +/* Neumorphism Global Styles */ + +:root { + --neu-bg: #e0e5ec; + --neu-bg-light: #f0f0f3; + --neu-shadow-dark: #b8bcc2; + --neu-shadow-light: #ffffff; + --neu-accent: #6d5dfc; + --neu-text: #333333; + --neu-text-muted: #6b7280; + --neu-radius: 12px; +} + body { - margin: 0; - padding-top: 55px; - overflow-y: scroll; - font-family: Lato, 'Helvetica Neue', Arial, Helvetica, "Microsoft YaHei", sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - scrollbar-width: none; + margin: 0; + padding-top: 55px; + overflow-y: scroll; + font-family: Lato, 'Helvetica Neue', Arial, Helvetica, "Microsoft YaHei", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: var(--neu-bg); + color: var(--neu-text); + scrollbar-width: none; } body::-webkit-scrollbar { - display: none; + display: none; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; } .main-content { - padding: 4px; + padding: 4px; } .small-icon .icon { - font-size: 1em !important; + font-size: 1em !important; +} + +.quote { + margin-left: 0; + padding: 0 1em; + border-left: 0.25em solid #ddd; +} + +a { + color: var(--neu-accent); + text-decoration: none; +} + +a:hover { + color: #5a4ad1; /* Slightly darker accent */ +} + +/* Utility Classes */ +.neu-raised { + background: var(--neu-bg); + border-radius: var(--neu-radius); + box-shadow: 8px 8px 16px var(--neu-shadow-dark), -8px -8px 16px var(--neu-shadow-light); + border: none !important; +} + +.neu-raised-sm { + background: var(--neu-bg); + border-radius: var(--neu-radius); + box-shadow: 4px 4px 8px var(--neu-shadow-dark), -4px -4px 8px var(--neu-shadow-light); + border: none !important; +} + +.neu-pressed { + background: var(--neu-bg); + border-radius: var(--neu-radius); + box-shadow: inset 8px 8px 16px var(--neu-shadow-dark), inset -8px -8px 16px var(--neu-shadow-light); + border: none !important; +} + +.neu-pressed-sm { + background: var(--neu-bg); + border-radius: var(--neu-radius); + box-shadow: inset 4px 4px 8px var(--neu-shadow-dark), inset -4px -4px 8px var(--neu-shadow-light); + border: none !important; +} + +.neu-circle { + border-radius: 50% !important; +} + +/* Semantic UI Overrides */ + +/* Segments, Cards, Messages */ +.ui.segment, +.ui.card, +.ui.cards > .card, +.ui.message { + background: var(--neu-bg) !important; + border: none !important; + box-shadow: 8px 8px 16px var(--neu-shadow-dark), -8px -8px 16px var(--neu-shadow-light) !important; + border-radius: var(--neu-radius) !important; + color: var(--neu-text) !important; +} + +.ui.card > .content > .header, +.ui.cards > .card > .content > .header, +.ui.header { + color: var(--neu-text) !important; +} + +.ui.card > .content > .meta, +.ui.cards > .card > .content > .meta { + color: var(--neu-text-muted) !important; +} + +/* Remove internal borders in segments/cards if desired, or keep them soft */ +.ui.segment:after, .ui.segment:before { + display: none; +} + +/* Buttons */ +.ui.button { + background: var(--neu-bg) !important; + color: var(--neu-text) !important; + border: none !important; + box-shadow: 5px 5px 10px var(--neu-shadow-dark), -5px -5px 10px var(--neu-shadow-light) !important; + border-radius: 10px !important; + transition: all 0.2s ease !important; + font-weight: 600 !important; +} + +.ui.button:hover { + background: var(--neu-bg) !important; + box-shadow: 3px 3px 6px var(--neu-shadow-dark), -3px -3px 6px var(--neu-shadow-light) !important; + transform: translateY(-1px); +} + +.ui.button:active, +.ui.button.active { + background: var(--neu-bg) !important; + box-shadow: inset 4px 4px 8px var(--neu-shadow-dark), inset -4px -4px 8px var(--neu-shadow-light) !important; + transform: translateY(1px); +} + +/* Circular Buttons */ +.ui.circular.button { + border-radius: 50% !important; +} + +/* Primary/Positive/Negative buttons - use accent color text or slight tint */ +.ui.primary.button, .ui.blue.button { + color: var(--neu-accent) !important; +} +.ui.positive.button, .ui.green.button { + color: #21ba45 !important; +} +.ui.negative.button, .ui.red.button { + color: #db2828 !important; +} + +/* Inputs */ +.ui.form input:not([type]), +.ui.form input[type=date], +.ui.form input[type=datetime-local], +.ui.form input[type=email], +.ui.form input[type=file], +.ui.form input[type=number], +.ui.form input[type=password], +.ui.form input[type=search], +.ui.form input[type=tel], +.ui.form input[type=text], +.ui.form input[type=time], +.ui.form input[type=url], +.ui.input > input, +.ui.form textarea { + background: var(--neu-bg) !important; + border: none !important; + box-shadow: inset 5px 5px 10px var(--neu-shadow-dark), inset -5px -5px 10px var(--neu-shadow-light) !important; + border-radius: var(--neu-radius) !important; + color: var(--neu-text) !important; + padding: 1em !important; +} + +.ui.form input:focus, .ui.input > input:focus, .ui.form textarea:focus { + color: var(--neu-accent) !important; +} + +/* Menu / Header */ +.ui.menu { + background: var(--neu-bg) !important; + border: none !important; + box-shadow: none !important; +} + +.ui.menu.fixed { + box-shadow: 0px 4px 10px var(--neu-shadow-dark) !important; +} + +.ui.menu .item { + color: var(--neu-text) !important; +} + +.ui.menu .item:before { + background: transparent !important; +} + +.ui.menu .active.item { + background: transparent !important; + color: var(--neu-accent) !important; + font-weight: bold !important; + box-shadow: inset 3px 3px 6px var(--neu-shadow-dark), inset -3px -3px 6px var(--neu-shadow-light) !important; + border-radius: 8px !important; +} + +/* Dropdown */ +.ui.dropdown .menu { + background: var(--neu-bg) !important; + border: none !important; + box-shadow: 8px 8px 16px var(--neu-shadow-dark), -8px -8px 16px var(--neu-shadow-light) !important; + border-radius: var(--neu-radius) !important; +} + +.ui.dropdown .menu > .item { + color: var(--neu-text) !important; + border-top: none !important; +} + +.ui.dropdown .menu > .item:hover { + background: transparent !important; + box-shadow: inset 3px 3px 6px var(--neu-shadow-dark), inset -3px -3px 6px var(--neu-shadow-light) !important; + border-radius: 8px !important; +} + +/* Labels */ +.ui.label { + background: var(--neu-bg) !important; + box-shadow: 3px 3px 6px var(--neu-shadow-dark), -3px -3px 6px var(--neu-shadow-light) !important; + border: none !important; + color: var(--neu-text) !important; + border-radius: 6px !important; +} + +/* Tables */ +.ui.table { + background: var(--neu-bg) !important; + border: none !important; + box-shadow: 8px 8px 16px var(--neu-shadow-dark), -8px -8px 16px var(--neu-shadow-light) !important; + border-radius: var(--neu-radius) !important; +} +.ui.table thead th { + background: var(--neu-bg) !important; + border-bottom: 1px solid rgba(0,0,0,0.05) !important; + color: var(--neu-text) !important; +} +.ui.table tbody td { + border-top: 1px solid rgba(0,0,0,0.05) !important; +} + +/* Modal */ +.ui.modal { + background: var(--neu-bg) !important; + border-radius: var(--neu-radius) !important; + box-shadow: 10px 10px 20px var(--neu-shadow-dark), -10px -10px 20px var(--neu-shadow-light) !important; +} +.ui.modal > .header, .ui.modal > .content, .ui.modal > .actions { + background: var(--neu-bg) !important; + border: none !important; + color: var(--neu-text) !important; +} + +/* Divider */ +.ui.divider { + border-top: 1px solid rgba(0,0,0,0.05) !important; + border-bottom: 1px solid rgba(255,255,255,0.8) !important; } .custom-footer { font-size: 1.1em; + color: var(--neu-text-muted); } @media only screen and (max-width: 600px) { @@ -33,9 +283,3 @@ code { display: none !important; } } - -.quote { - margin-left: 0; - padding: 0 1em; - border-left: 0.25em solid #ddd; -} \ No newline at end of file diff --git a/web/src/pages/About/index.js b/web/src/pages/About/index.js index 3288ea9..dfbc7be 100644 --- a/web/src/pages/About/index.js +++ b/web/src/pages/About/index.js @@ -34,8 +34,8 @@ const About = () => {
关于

可在设置页面设置关于内容,支持 HTML & Markdown

项目仓库地址: - - https://github.com/songquanpeng/message-pusher + + https://github.com/xyzmos/message-pusher ) : ( diff --git a/web/src/pages/Home/index.js b/web/src/pages/Home/index.js index 119bf68..b760e9b 100644 --- a/web/src/pages/Home/index.js +++ b/web/src/pages/Home/index.js @@ -54,10 +54,10 @@ const Home = () => {

源码: - https://github.com/songquanpeng/message-pusher + > + https://github.com/xyzmos/message-pusher

启动时间:{getStartTimeString()}