first commit

This commit is contained in:
toom1996
2025-06-19 14:25:18 +08:00
commit 022e7a68c3
68 changed files with 10858 additions and 0 deletions

19
README.md Normal file
View File

@ -0,0 +1,19 @@
@author: toom<tangmu@butnoice.com>
@date: 2025/06/04 16:57
---
# 项目说明
知识回声官网
```text
/
├── public/
│ └── favicon.svg
├── src/
│ ├── layouts/
│ │ └── Layout.astro
│ └── pages/
│ └── index.astro // 首页
└── package.json
```

20
astro.config.mjs Normal file
View File

@ -0,0 +1,20 @@
// @ts-check
import { defineConfig } from 'astro/config';
import tailwindcss from '@tailwindcss/vite'
import node from '@astrojs/node';
// https://astro.build/config
export default defineConfig({
output: 'server',
adapter: node({
mode: 'standalone',
}),
build: {
format: 'file',
},
vite: {
plugins: [tailwindcss()],
},
server: {
host: '0.0.0.0',
},
});

5707
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "app",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/node": "^9.2.2",
"@tailwindcss/vite": "^4.1.8",
"astro": "^5.8.1",
"tailwindcss": "^4.1.8"
}
}

BIN
public/app-showcase.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 KiB

BIN
public/avatar_1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
public/avatar_2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
public/avatar_3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
public/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
public/enterprise1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

BIN
public/enterprise2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

BIN
public/enterprise3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

BIN
public/honor-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
public/huawei-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

62
public/logo.svg Normal file
View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="120px" height="120px" viewBox="0 0 120 120" enable-background="new 0 0 120 120" xml:space="preserve"> <image id="image0" width="120" height="120" x="0" y="0"
xlink:href="data:image/png;base64,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" />
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
public/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

BIN
public/logoAll.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 KiB

BIN
public/oneplus-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/oppo-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
public/page_1.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
public/page_2.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
public/page_3.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

BIN
public/page_4.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

BIN
public/trophy1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
public/trophy2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

BIN
public/vivo-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

BIN
public/xiaomi-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

1
src/assets/astro.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="115" height="48"><path fill="#17191E" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="url(#a)" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="#17191E" d="M.02 30.31s4.02-1.95 8.05-1.95l3.04-9.4c.11-.45.44-.76.82-.76.37 0 .7.31.82.76l3.04 9.4c4.77 0 8.05 1.95 8.05 1.95L17 11.71c-.2-.56-.53-.91-.98-.91H7.83c-.44 0-.76.35-.97.9L.02 30.31Zm42.37-5.97c0 1.64-2.05 2.62-4.88 2.62-1.85 0-2.5-.45-2.5-1.41 0-1 .8-1.49 2.65-1.49 1.67 0 3.09.03 4.73.23v.05Zm.03-2.04a21.37 21.37 0 0 0-4.37-.36c-5.32 0-7.82 1.25-7.82 4.18 0 3.04 1.71 4.2 5.68 4.2 3.35 0 5.63-.84 6.46-2.92h.14c-.03.5-.05 1-.05 1.4 0 1.07.18 1.16 1.06 1.16h4.15a16.9 16.9 0 0 1-.36-4c0-1.67.06-2.93.06-4.62 0-3.45-2.07-5.64-8.56-5.64-2.8 0-5.9.48-8.26 1.19.22.93.54 2.83.7 4.06 2.04-.96 4.95-1.37 7.2-1.37 3.11 0 3.97.71 3.97 2.15v.57Zm11.37 3c-.56.07-1.33.07-2.12.07-.83 0-1.6-.03-2.12-.1l-.02.58c0 2.85 1.87 4.52 8.45 4.52 6.2 0 8.2-1.64 8.2-4.55 0-2.74-1.33-4.09-7.2-4.39-4.58-.2-4.99-.7-4.99-1.28 0-.66.59-1 3.65-1 3.18 0 4.03.43 4.03 1.35v.2a46.13 46.13 0 0 1 4.24.03l.02-.55c0-3.36-2.8-4.46-8.2-4.46-6.08 0-8.13 1.49-8.13 4.39 0 2.6 1.64 4.23 7.48 4.48 4.3.14 4.77.62 4.77 1.28 0 .7-.7 1.03-3.71 1.03-3.47 0-4.35-.48-4.35-1.47v-.13Zm19.82-12.05a17.5 17.5 0 0 1-6.24 3.48c.03.84.03 2.4.03 3.24l1.5.02c-.02 1.63-.04 3.6-.04 4.9 0 3.04 1.6 5.32 6.58 5.32 2.1 0 3.5-.23 5.23-.6a43.77 43.77 0 0 1-.46-4.13c-1.03.34-2.34.53-3.78.53-2 0-2.82-.55-2.82-2.13 0-1.37 0-2.65.03-3.84 2.57.02 5.13.07 6.64.11-.02-1.18.03-2.9.1-4.04-2.2.04-4.65.07-6.68.07l.07-2.93h-.16Zm13.46 6.04a767.33 767.33 0 0 1 .07-3.18H82.6c.07 1.96.07 3.98.07 6.92 0 2.95-.03 4.99-.07 6.93h5.18c-.09-1.37-.11-3.68-.11-5.65 0-3.1 1.26-4 4.12-4 1.33 0 2.28.16 3.1.46.03-1.16.26-3.43.4-4.43-.86-.25-1.81-.41-2.96-.41-2.46-.03-4.26.98-5.1 3.38l-.17-.02Zm22.55 3.65c0 2.5-1.8 3.66-4.64 3.66-2.81 0-4.61-1.1-4.61-3.66s1.82-3.52 4.61-3.52c2.82 0 4.64 1.03 4.64 3.52Zm4.71-.11c0-4.96-3.87-7.18-9.35-7.18-5.5 0-9.23 2.22-9.23 7.18 0 4.94 3.49 7.59 9.21 7.59 5.77 0 9.37-2.65 9.37-7.6Z"/><defs><linearGradient id="a" x1="6.33" x2="19.43" y1="40.8" y2="34.6" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none"><path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/><path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/><defs><linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient><linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse"><stop stop-color="#3245FF"/><stop offset="1" stop-color="#BC52EE"/></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none">
<path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/>
<path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/>
<defs>
<linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse">
<stop stop-color="#1ce783"/>
<stop offset="1" stop-color="#1ce783" stop-opacity="0.2"/>
</linearGradient>
<linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse">
<stop stop-color="#1ce783"/>
<stop offset="1" stop-color="#1ce783" stop-opacity="0.2"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
src/assets/page_1.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

BIN
src/assets/page_2.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
src/assets/page_3.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
src/assets/page_4.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

BIN
src/assets/trophy1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
src/assets/trophy2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

View File

@ -0,0 +1,28 @@
---
const {data} = Astro.props;
---
<div class="breadcrumb">
<a title="首页" href="/">首页</a>
{
data.map((item: { title: string; link: string }) => {
return (
<span class="separator">/</span>
<a href={item.link}>{item.title}</a>
)
})
}
</div>
<style>
.breadcrumb {
margin-left: 1rem;
margin-bottom: 1rem;
font-size: 0.9rem;
}
.breadcrumb a {
color: #000000;
text-decoration: none;
transition: color 0.3s ease;
}
</style>

245
src/components/Footer.astro Normal file
View File

@ -0,0 +1,245 @@
---
import { APP_NAME, APP_COMPANY } from '../config/app.ts'
---
<footer class="site-footer">
<div class="footer-content">
<div class="footer-logo">
<a href="/" title={APP_NAME}>{ APP_NAME }</a>
</div>
<div class="footer-links">
<div class="footer-column">
<h4>浏览</h4>
<ul>
<li><a href="/news" title="新闻专栏">新闻专栏</a></li>
</ul>
</div>
<div class="footer-column">
<h4>帮助</h4>
<ul>
<li><a href="/product" title="产品介绍">产品介绍</a></li>
<li><a href="/faq" title="常见问题">常见问题</a></li>
</ul>
</div>
<div class="footer-column">
<h4>关于我们</h4>
<ul>
<!-- <li><a href="/about" title="关于我们">关于我们</a></li> -->
<li><a href="/contact" title="联系我们">联系我们</a></li>
</ul>
</div>
</div>
</div>
<div class="footer-bottom">
<div class="copyright">
© {new Date().getFullYear()} { APP_COMPANY }. 保留所有权利。
</div>
<div class="icpoo">
<a target="_blank" rel="noopener" href="https://beian.miit.gov.cn/" title="ICP备案信息">新ICP备2023000253号</a>
<span class="margin-oc">新B2-20230068号</span>
<a target="_blank" rel="noopener" class="beiancil" href="https://www.beian.gov.cn/portal/registerSystemInfo?recordcode=65400402000209" title="公安备案信息">
<span>新公网安备 65400402000209号</span>
</a>
</div>
</div>
</footer>
<style>
.site-footer {
background-color: var(--hulu-black);
padding: 3rem 2rem 2rem;
margin-top: 4rem;
color: var(--hulu-light-gray);
}
.footer-content {
display: flex;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
padding-bottom: 2rem;
gap: 4rem;
}
.footer-logo {
flex-shrink: 0;
}
.footer-logo a {
color: var(--hulu-green);
font-size: 1.5rem;
font-weight: 700;
text-decoration: none;
transition: color 0.3s ease;
}
.footer-logo a:hover {
color: var(--hulu-green-light);
}
.footer-links {
display: flex;
gap: 4rem;
flex-wrap: wrap;
}
.footer-column {
min-width: 160px;
}
.footer-column h4 {
margin: 0 0 1.25rem;
color: black;
font-size: 1.1rem;
font-weight: 600;
}
.footer-column ul {
list-style: none;
padding: 0;
margin: 0;
}
.footer-column li {
margin-bottom: 0.75rem;
}
.footer-column a {
color: var(--hulu-light-gray);
text-decoration: none;
transition: color 0.2s ease;
font-size: 0.95rem;
}
.footer-column a:hover {
color: var(--hulu-green);
}
.footer-bottom {
max-width: 1200px;
margin: 0 auto;
padding-top: 2rem;
border-top: 1px solid rgba(255, 255, 255, 0.1);
text-align: center;
}
.copyright {
color: var(--hulu-light-gray);
font-size: 0.875rem;
margin-bottom: 1rem;
}
.icpoo {
color: var(--hulu-light-gray);
font-size: 0.875rem;
display: flex;
justify-content: center;
gap: 1.5rem;
flex-wrap: wrap;
}
.icpoo a {
color: var(--hulu-light-gray);
text-decoration: none;
transition: color 0.2s ease;
}
.icpoo a:hover {
color: var(--hulu-green);
}
.margin-oc {
margin: 0 0.5rem;
}
@media (max-width: 1024px) {
.footer-content {
gap: 3rem;
}
.footer-links {
gap: 3rem;
}
}
@media (max-width: 768px) {
.site-footer {
padding: 2rem 1.5rem 1.5rem;
}
.footer-content {
flex-direction: column;
gap: 2rem;
}
.footer-links {
gap: 2rem;
}
.footer-column {
min-width: 140px;
}
.icpoo {
gap: 1rem;
}
}
@media (max-width: 480px) {
.site-footer {
padding: 1.5rem 1rem 1rem;
margin-top: 2rem;
}
.footer-content {
gap: 1.5rem;
}
.footer-logo {
text-align: center;
}
.footer-links {
display: none; /* 在移动端隐藏导航链接 */
}
.footer-bottom {
padding-top: 1rem;
}
.copyright {
margin-bottom: 0.5rem;
font-size: 0.8rem;
}
.icpoo {
flex-direction: column;
gap: 0.5rem;
font-size: 0.8rem;
}
.margin-oc {
display: none;
}
/* 移动端显示简化的底部导航 */
.mobile-nav {
display: flex;
justify-content: center;
gap: 1rem;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.mobile-nav a {
color: var(--hulu-light-gray);
text-decoration: none;
font-size: 0.9rem;
}
.mobile-nav a:hover {
color: var(--hulu-green);
}
}
</style>

View File

@ -0,0 +1,210 @@
---
import astroLogo from '../assets/astro.svg';
import background from '../assets/background.svg';
---
<div id="container">
<img id="background" src={background.src} alt="" fetchpriority="high" />
<main>
<section id="hero">
<a href="https://astro.build"
><img src={astroLogo.src} width="115" height="48" alt="Astro Homepage" /></a
>
<h1>
To get started, open the <code><pre>src/pages</pre></code> directory in your project.
</h1>
<section id="links">
<a class="button" href="https://docs.astro.build">Read our docs</a>
<a href="https://astro.build/chat"
>Join our Discord <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36"
><path
fill="currentColor"
d="M107.7 8.07A105.15 105.15 0 0 0 81.47 0a72.06 72.06 0 0 0-3.36 6.83 97.68 97.68 0 0 0-29.11 0A72.37 72.37 0 0 0 45.64 0a105.89 105.89 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.73 105.73 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.42 68.42 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.68 68.68 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.25 105.25 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15ZM42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69Zm42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69Z"
></path></svg
>
</a>
</section>
</section>
</main>
<a href="https://astro.build/blog/astro-5/" id="news" class="box">
<svg width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"
><path
d="M24.667 12c1.333 1.414 2 3.192 2 5.334 0 4.62-4.934 5.7-7.334 12C18.444 28.567 18 27.456 18 26c0-4.642 6.667-7.053 6.667-14Zm-5.334-5.333c1.6 1.65 2.4 3.43 2.4 5.333 0 6.602-8.06 7.59-6.4 17.334C13.111 27.787 12 25.564 12 22.666c0-4.434 7.333-8 7.333-16Zm-6-5.333C15.111 3.555 16 5.556 16 7.333c0 8.333-11.333 10.962-5.333 22-3.488-.774-6-4-6-8 0-8.667 8.666-10 8.666-20Z"
fill="#111827"></path></svg
>
<h2>What's New in Astro 5.0?</h2>
<p>
From content layers to server islands, click to learn more about the new features and
improvements in Astro 5.0
</p>
</a>
</div>
<style>
#background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
filter: blur(100px);
}
#container {
font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif;
height: 100%;
}
main {
height: 100%;
display: flex;
justify-content: center;
}
#hero {
display: flex;
align-items: start;
flex-direction: column;
justify-content: center;
padding: 16px;
}
h1 {
font-size: 22px;
margin-top: 0.25em;
}
#links {
display: flex;
gap: 16px;
}
#links a {
display: flex;
align-items: center;
padding: 10px 12px;
color: #111827;
text-decoration: none;
transition: color 0.2s;
}
#links a:hover {
color: rgb(78, 80, 86);
}
#links a svg {
height: 1em;
margin-left: 8px;
}
#links a.button {
color: white;
background: linear-gradient(83.21deg, #3245ff 0%, #bc52ee 100%);
box-shadow:
inset 0 0 0 1px rgba(255, 255, 255, 0.12),
inset 0 -2px 0 rgba(0, 0, 0, 0.24);
border-radius: 10px;
}
#links a.button:hover {
color: rgb(230, 230, 230);
box-shadow: none;
}
pre {
font-family:
ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono',
monospace;
font-weight: normal;
background: linear-gradient(14deg, #d83333 0%, #f041ff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin: 0;
}
h2 {
margin: 0 0 1em;
font-weight: normal;
color: #111827;
font-size: 20px;
}
p {
color: #4b5563;
font-size: 16px;
line-height: 24px;
letter-spacing: -0.006em;
margin: 0;
}
code {
display: inline-block;
background:
linear-gradient(66.77deg, #f3cddd 0%, #f5cee7 100%) padding-box,
linear-gradient(155deg, #d83333 0%, #f041ff 18%, #f5cee7 45%) border-box;
border-radius: 8px;
border: 1px solid transparent;
padding: 6px 8px;
}
.box {
padding: 16px;
background: rgba(255, 255, 255, 1);
border-radius: 16px;
border: 1px solid white;
}
#news {
position: absolute;
bottom: 16px;
right: 16px;
max-width: 300px;
text-decoration: none;
transition: background 0.2s;
backdrop-filter: blur(50px);
}
#news:hover {
background: rgba(255, 255, 255, 0.55);
}
@media screen and (max-height: 368px) {
#news {
display: none;
}
}
@media screen and (max-width: 768px) {
#container {
display: flex;
flex-direction: column;
}
#hero {
display: block;
padding-top: 10%;
}
#links {
flex-wrap: wrap;
}
#links a.button {
padding: 14px 18px;
}
#news {
right: 16px;
left: 16px;
bottom: 2.5rem;
max-width: 100%;
}
h1 {
line-height: 1.5;
}
}
</style>

9
src/config/app.ts Normal file
View File

@ -0,0 +1,9 @@
// 网站全局配置
export const APP_NAME = "知识回声";
export const APP_COMPANY = '新疆阅快阅好信息技术有限公司';
export const BASE_URL = "https://www.zhishihuisheng.com";
export const DESCRIPTION = '知识回声是一款超实用学习应用,涵盖海量读物,热门有声书籍,让知识触手可及。';
export const CONTACT_PHONE = "400-136-3116";
// 其他配置项可以在这里添加
export const SITE_VERSION = "1.0.0";

356
src/layouts/Layout.astro Normal file
View File

@ -0,0 +1,356 @@
---
import Footer from '../components/Footer.astro'
import { APP_NAME } from '../config/app';
import '../styles/global.css'
import '../styles/theme.css'
const {description, title, keywords} = Astro.props;
---
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/logo.png" />
<title>{title}</title>
<meta name="description" content={description} />
<meta name="keywords" content={keywords} />
<!-- <link href="https://fonts.googleapis.com/css2?family=Graphik:wght@400;500;600;700&display=swap" rel="stylesheet"> -->
</head>
<body>
<header>
<div class="logo-container">
<a href="/"><img src="/logo.png" alt={APP_NAME} class="logo-image" /></a>
<div class="logo-text"><a href="/">{APP_NAME}</a></div>
</div>
<button class="mobile-menu-btn" aria-label="打开菜单">
<span></span>
<span></span>
<span></span>
</button>
<nav class="desktop-nav">
<ul>
<li><a title="首页" href="/">首页</a></li>
<!-- <li><a title="新闻专栏" href="/product">产品介绍</a></li> -->
<li><a title="新闻专栏" href="/news">新闻专栏</a></li>
<li><a title="常见问题" href="/faq">常见问题</a></li>
<li><a title="联系我们" href="/contact">联系我们</a></li>
</ul>
</nav>
<nav class="mobile-nav">
<ul>
<li><a title="首页" href="/">首页</a></li>
<!-- <li><a title="新闻专栏" href="/product">产品介绍</a></li> -->
<li><a title="新闻专栏" href="/news">新闻专栏</a></li>
<li><a title="常见问题" href="/faq">常见问题</a></li>
<li><a title="联系我们" href="/contact">联系我们</a></li>
</ul>
</nav>
</header>
<main>
<slot />
</main>
<Footer />
</body>
</html>
<div class="background-animation"></div>
<style>
:root {
--primary-color: #4F46E5;
--primary-light: #818CF8;
--primary-dark: #3730A3;
--accent-color: #10B981;
--accent-light: #34D399;
--accent-dark: #059669;
--background-light: #FFFFFF;
--background-off-white: #F8FAFC;
--background-gray: #F1F5F9;
--text-primary: #000000;
--text-secondary: #64748B;
--gradient-start: #FFFFFF;
--gradient-end: #F8FAFC;
}
html,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
font-family: 'Graphik', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
background: linear-gradient(135deg, var(--gradient-start), var(--gradient-end));
background-attachment: fixed;
background-size: cover;
color: var(--text-primary);
position: relative;
overflow-x: hidden;
}
.background-animation {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -2;
overflow: hidden;
}
.background-animation::before {
content: "";
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background:
radial-gradient(circle at 20% 30%, rgba(79, 70, 229, 0.03), transparent 50%),
radial-gradient(circle at 80% 70%, rgba(16, 185, 129, 0.03), transparent 50%),
radial-gradient(circle at 50% 50%, rgba(129, 140, 248, 0.03), transparent 50%);
animation: rotate 60s linear infinite;
z-index: -1;
}
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(10px);
position: sticky;
top: 0;
z-index: 100;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}
.logo-container {
display: flex;
align-items: center;
gap: 0.75rem;
z-index: 101;
}
.logo-image {
width: 40px;
height: 40px;
object-fit: contain;
transition: transform 0.3s ease;
}
.logo-container:hover .logo-image {
transform: scale(1.1);
}
.logo-text {
font-size: 1.5rem;
font-weight: 700;
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.mobile-menu-btn {
display: none;
flex-direction: column;
justify-content: space-between;
width: 30px;
height: 21px;
background: transparent;
border: none;
cursor: pointer;
padding: 0;
z-index: 101;
}
.mobile-menu-btn span {
width: 100%;
height: 3px;
background-color: var(--text-primary);
border-radius: 3px;
transition: all 0.3s ease;
}
.desktop-nav {
display: flex;
}
.mobile-nav {
display: none;
}
nav ul {
display: flex;
list-style: none;
gap: 2.5rem;
margin: 0;
padding: 0;
}
nav a {
color: black;
text-decoration: none;
font-weight: 500;
transition: all 0.3s ease;
position: relative;
padding: 0.5rem 0;
}
nav a::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
/* background: linear-gradient(90deg, var(--primary-color), var(--accent-color)); */
background: black;
transition: width 0.3s ease;
}
nav a:hover {
color: var(--text-primary);
}
nav a:hover::after {
width: 100%;
}
button {
padding: 0.75rem 1.5rem;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
}
main {
flex: 1;
padding: 2rem;
max-width: 1200px;
margin: 0 auto;
width: 100%;
box-sizing: border-box;
/* background: var(--background-light); */
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (max-width: 768px) {
header {
padding: 1rem;
}
.mobile-menu-btn {
display: flex;
}
.desktop-nav {
display: none;
}
.mobile-nav {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
padding: 6rem 2rem 2rem;
box-sizing: border-box;
z-index: 100;
}
.mobile-nav.active {
display: block;
}
.mobile-nav ul {
flex-direction: column;
gap: 1.5rem;
align-items: center;
}
.mobile-nav a {
font-size: 1.2rem;
color: var(--text-primary);
}
.mobile-menu-btn.active span:nth-child(1) {
transform: translateY(9px) rotate(45deg);
}
.mobile-menu-btn.active span:nth-child(2) {
opacity: 0;
}
.mobile-menu-btn.active span:nth-child(3) {
transform: translateY(-9px) rotate(-45deg);
}
}
@media (max-width: 480px) {
.logo-text {
font-size: 1.2rem;
}
.logo-image {
width: 32px;
height: 32px;
}
.mobile-nav {
padding: 5rem 1.5rem 1.5rem;
}
.mobile-nav a {
font-size: 1.1rem;
}
}
</style>
<script>
// 移动端菜单交互
const menuBtn = document.querySelector('.mobile-menu-btn');
const mobileNav = document.querySelector('.mobile-nav');
const body = document.body;
menuBtn?.addEventListener('click', () => {
menuBtn.classList.toggle('active');
mobileNav?.classList.toggle('active');
body.style.overflow = body.style.overflow === 'hidden' ? '' : 'hidden';
});
// 点击导航链接时关闭菜单
const mobileNavLinks = document.querySelectorAll('.mobile-nav a');
mobileNavLinks.forEach(link => {
link.addEventListener('click', () => {
menuBtn?.classList.remove('active');
mobileNav?.classList.remove('active');
body.style.overflow = '';
});
});
// 点击页面其他区域关闭菜单
document.addEventListener('click', (e) => {
if (mobileNav?.classList.contains('active') &&
!e.target.closest('.mobile-nav') &&
!e.target.closest('.mobile-menu-btn')) {
menuBtn?.classList.remove('active');
mobileNav?.classList.remove('active');
body.style.overflow = '';
}
});
</script>

506
src/pages/about.astro Normal file
View File

@ -0,0 +1,506 @@
---
import Layout from '../layouts/Layout.astro';
import { APP_NAME, APP_COMPANY } from '../config/app';
import { formatDateTime } from '../../utils/date';
// export const prerender = true;
// SEO meta tags
const title = `${APP_NAME} - 关于我们`;
const description = '新疆阅快阅好信息技术有限公司是一家专注于移动互联网应用开发的高新技术企业,致力于为用户提供优质的阅读和学习体验。';
const keywords = '知识回声,关于我们,公司介绍,发展历程,企业文化,团队介绍,新疆阅快阅好';
const LDJSON = {
context: "https://ziyuan.baidu.com/contexts/cambrian.jsonld",
id: "https://www.zhishihuisheng.com/about",
appid: "",
title: title,
image: "https://www.zhishihuisheng.com/app-showcase.png",
pubDate: "2025-06-09T11:20:04",
updateDate: formatDateTime(),
description: description,
};
---
<Layout title={title} description={description} keywords={keywords}>
<main>
<section class="about-hero" aria-label="公司简介">
<div class="container">
<h1>关于我们</h1>
<p class="subtitle">专注移动互联网应用开发,打造优质用户体验</p>
</div>
</section>
<section class="company-intro" aria-label="公司介绍">
<div class="container">
<h2>公司介绍</h2>
<p>新疆阅快阅好信息技术有限公司是一家专注于移动互联网应用开发的高新技术企业。我们致力于为用户提供优质的阅读和学习体验,打造"便捷、安全可靠"的移动互联生态。</p>
</div>
</section>
<section class="certificates-showcase" aria-label="企业证书">
<div class="container">
<h2>企业资质</h2>
<div class="certificates-grid">
<article class="certificate-card">
<div class="certificate-image">
<img src="/enterprise1.jpg" alt="数据安全能力认证证书" width="400" height="300" loading="lazy" />
</div>
<div class="certificate-content">
<h3>数据安全能力认证证书</h3>
<p>数据安全能力认证,保障用户信息安全</p>
</div>
</article>
<article class="certificate-card">
<div class="certificate-image">
<img src="/enterprise2.png" alt="系统信息安全等级保护证书" width="400" height="300" loading="lazy" />
</div>
<div class="certificate-content">
<h3>系统信息安全等级保护证书</h3>
<p>系统安全等级保护认证,确保系统安全可靠</p>
</div>
</article>
<article class="certificate-card">
<div class="certificate-image">
<img src="/enterprise3.png" alt="新疆互联网协会会员证书" width="400" height="300" loading="lazy" />
</div>
<div class="certificate-content">
<h3>新疆互联网协会会员证书</h3>
<p>互联网协会会员单位,推动行业发展</p>
</div>
</article>
</div>
</div>
</section>
<section class="history" aria-label="发展历程">
<div class="container">
<h2>发展历程</h2>
<div class="timeline">
<article class="timeline-item">
<div class="timeline-date">2024年</div>
<div class="timeline-content">
<h3>获得VIVO·星途未来奖</h3>
<p>凭借创新能力和优质服务获得VIVO颁发的星途未来奖</p>
</div>
</article>
<article class="timeline-item">
<div class="timeline-date">2023年</div>
<div class="timeline-content">
<h3>成为华为优质流量合作伙伴</h3>
<p>获得华为颁发的优质流量合作伙伴认证</p>
</div>
</article>
<article class="timeline-item">
<div class="timeline-date">2022年</div>
<div class="timeline-content">
<h3>产品全面升级</h3>
<p>推出全新版本的知识回声,优化用户体验</p>
</div>
</article>
<article class="timeline-item">
<div class="timeline-date">2021年</div>
<div class="timeline-content">
<h3>公司成立</h3>
<p>新疆阅快阅好信息技术有限公司正式成立</p>
</div>
</article>
</div>
</div>
</section>
<section class="culture" aria-label="企业文化">
<div class="container">
<h2>企业文化</h2>
<div class="culture-grid">
<article class="culture-item">
<div class="culture-icon">🎯</div>
<h3>使命</h3>
<p>为用户提供优质的阅读和学习体验,让知识触手可及</p>
</article>
<article class="culture-item">
<div class="culture-icon">👀</div>
<h3>愿景</h3>
<p>成为移动互联网领域最受信赖的内容服务提供商</p>
</article>
<article class="culture-item">
<div class="culture-icon">💡</div>
<h3>价值观</h3>
<p>创新、专业、诚信、共赢</p>
</article>
</div>
</div>
</section>
</main>
<!-- 百度结构化数据 -->
<script type="application/ld+json" set:html={JSON.stringify({
"@context": LDJSON.context,
"@id": LDJSON.id,
"appid": LDJSON.appid,
"title": LDJSON.title,
"images": [LDJSON.image],
"pubDate": LDJSON.pubDate,
"Update": LDJSON.updateDate,
"description": LDJSON.description,
})}/>
</Layout>
<style>
.about-hero {
background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
color: white;
padding: 6rem 2rem;
text-align: center;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
}
.about-hero h1 {
font-size: 3rem;
margin-bottom: 1rem;
-webkit-text-fill-color: white;
}
.subtitle {
font-size: 1.5rem;
opacity: 0.9;
}
.company-intro {
padding: 6rem 0;
background: var(--background-light);
}
.intro-content {
max-width: 800px;
margin: 0 auto 4rem;
text-align: center;
}
.intro-content h2 {
font-size: 2.5rem;
margin-bottom: 2rem;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.intro-content p {
font-size: 1.1rem;
line-height: 1.8;
color: var(--text-secondary);
margin-bottom: 1.5rem;
}
.company-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
text-align: center;
}
.stat-item {
padding: 2rem;
background: white;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.stat-number {
display: block;
font-size: 2.5rem;
font-weight: 700;
color: var(--primary-color);
margin-bottom: 0.5rem;
}
.stat-label {
color: var(--text-secondary);
font-size: 1.1rem;
}
.history {
padding: 6rem 0;
background: var(--background-off-white);
}
.history h2 {
text-align: center;
font-size: 2.5rem;
margin-bottom: 4rem;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.timeline {
max-width: 800px;
margin: 0 auto;
position: relative;
}
.timeline::before {
content: '';
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 2px;
height: 100%;
background: linear-gradient(to bottom, var(--primary-color), var(--accent-color));
}
.timeline-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4rem;
position: relative;
}
.timeline-date {
width: 120px;
text-align: right;
font-weight: 600;
color: var(--primary-color);
}
.timeline-content {
width: calc(100% - 160px);
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.timeline-content h3 {
color: var(--text-primary);
margin-bottom: 1rem;
}
.timeline-content p {
color: var(--text-secondary);
line-height: 1.6;
}
.culture {
padding: 6rem 0;
background: var(--background-light);
}
.culture h2 {
text-align: center;
font-size: 2.5rem;
margin-bottom: 4rem;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.culture-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.culture-item {
background: white;
padding: 3rem 2rem;
border-radius: 16px;
text-align: center;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
transition: transform 0.3s ease;
}
.culture-item:hover {
transform: translateY(-10px);
}
.culture-icon {
font-size: 3rem;
margin-bottom: 1.5rem;
}
.culture-item h3 {
color: var(--text-primary);
margin-bottom: 1rem;
font-size: 1.5rem;
}
.culture-item p {
color: var(--text-secondary);
line-height: 1.6;
}
.certificates-showcase {
padding: 6rem 0;
background: linear-gradient(135deg, var(--background-light), var(--background-off-white));
}
.certificates-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin-top: 3rem;
}
.certificate-card {
background: white;
border-radius: 16px;
overflow: hidden;
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
border: 1px solid rgba(0, 0, 0, 0.05);
position: relative;
}
.certificate-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 4px;
height: 100%;
background: linear-gradient(to bottom, var(--primary-color), var(--accent-color));
opacity: 0;
transition: opacity 0.3s ease;
}
.certificate-card:hover {
transform: translateY(-10px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1);
}
.certificate-card:hover::before {
opacity: 1;
}
.certificate-image {
position: relative;
width: 100%;
height: 300px;
overflow: hidden;
background: var(--background-off-white);
display: flex;
align-items: center;
justify-content: center;
padding: 1rem;
}
.certificate-image img {
width: 100%;
height: 100%;
object-fit: contain;
transition: transform 0.3s ease;
}
.certificate-card:hover .certificate-image img {
transform: scale(1.05);
}
.certificate-content {
padding: 1.5rem;
text-align: center;
}
.certificate-content h3 {
color: var(--text-primary);
font-size: 1.5rem;
margin-bottom: 0.5rem;
}
.certificate-content p {
color: var(--text-secondary);
line-height: 1.6;
margin: 0;
}
@media (max-width: 768px) {
.about-hero {
padding: 4rem 1rem;
}
.about-hero h1 {
font-size: 2.5rem;
}
.subtitle {
font-size: 1.2rem;
}
.timeline::before {
left: 0;
}
.timeline-item {
flex-direction: column;
align-items: flex-start;
}
.timeline-date {
width: 100%;
text-align: left;
margin-bottom: 1rem;
}
.timeline-content {
width: 100%;
}
.culture-grid {
grid-template-columns: 1fr;
}
.certificates-grid {
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.certificate-image {
height: 250px;
}
.certificate-content {
padding: 1rem;
}
.certificate-content h3 {
font-size: 1.2rem;
}
}
@media (max-width: 480px) {
.certificates-grid {
grid-template-columns: 1fr;
}
.certificate-image {
height: 220px;
}
.certificate-card {
max-width: 400px;
margin: 0 auto;
}
}
/* 触摸设备优化 */
@media (hover: none) {
.certificate-card:hover {
transform: none;
}
.certificate-card:hover::before {
opacity: 0;
}
.certificate-card:active {
transform: scale(0.98);
}
}
</style>

273
src/pages/contact.astro Normal file
View File

@ -0,0 +1,273 @@
---
import Layout from '../layouts/Layout.astro';
import { APP_NAME, APP_COMPANY } from '../config/app';
import { formatDateTime } from '../../utils/date';
import { CONTACT_PHONE } from '../config/app';
// export const prerender = true;
// SEO meta tags
const title = `${APP_NAME} - 联系我们`;
const description = '知识回声客服7*24小时服务热线为您提供专业的技术支持和客户服务随时解答您的问题。';
const keywords = '知识回声客服,知识回声客服电话,知识回声联系方式,知识回声退款热线,知识回声技术支持,知识回声客户服务,知识回声在线客服,知识回声服务热线,知识回声400电话';
const LDJSON = {
context: "https://ziyuan.baidu.com/contexts/cambrian.jsonld",
id: "https://www.zhishihuisheng.com/contact",
appid: "",
title: title,
image: "https://www.zhishihuisheng.com/app-showcase.png",
pubDate: "2025-06-09T11:20:04",
updateDate: formatDateTime(),
description: description,
};
---
<Layout title={title} description={description} keywords={keywords}>
<main>
<div class="breadcrumb">
<a href="/">首页</a>
<span class="separator">/</span>
<span>联系我们</span>
</div>
<section class="service-hero" aria-label="客服热线">
<div class="container">
<h1>与我们联系</h1>
<p>以便我们为你提供正确的帮助和支持</p>
<div class="phone-number">
<h2>联系电话</h2>
<a title="联系电话" href={`tel:${CONTACT_PHONE}`}>{CONTACT_PHONE}</a>
</div>
</div>
</section>
</main>
<!-- 百度结构化数据 -->
<script type="application/ld+json" set:html={JSON.stringify({
"@context": LDJSON.context,
"@id": LDJSON.id,
"appid": LDJSON.appid,
"title": LDJSON.title,
"images": [LDJSON.image],
"pubDate": LDJSON.pubDate,
"Update": LDJSON.updateDate,
"description": LDJSON.description,
})}/>
</Layout>
<style>
.phone-number a{
color: #ffffff;
text-decoration: none;
font-size: 2rem;
font-weight: bold;
}
.breadcrumb {
margin-left: 1rem;
margin-bottom: 1rem;
font-size: 0.9rem;
}
.breadcrumb a {
color: #000000;
text-decoration: none;
transition: color 0.3s ease;
}
.service-hero {
background: #ff6e42;
color: white;
padding: 4rem 0;
text-align: center;
}
.service-hero h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.service-hero p {
font-size: 1.2rem;
opacity: 0.9;
}
.service-section {
padding: 4rem 0;
background: var(--background-off-white);
}
.service-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin-bottom: 4rem;
}
.service-card {
background: white;
padding: 2rem;
border-radius: 16px;
text-align: center;
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.service-card:hover {
transform: translateY(-10px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.service-icon {
font-size: 3rem;
margin-bottom: 1.5rem;
}
.service-card h2 {
font-size: 1.5rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.service-time {
color: var(--accent-color);
font-weight: 500;
margin-bottom: 1rem;
}
.service-desc {
color: var(--text-secondary);
line-height: 1.6;
}
.service-info {
margin-bottom: 4rem;
}
.service-info h2 {
text-align: center;
font-size: 2rem;
margin-bottom: 2rem;
color: var(--text-primary);
}
.info-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
.info-item {
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.info-item h3 {
font-size: 1.3rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.info-item ul {
list-style: none;
padding: 0;
margin: 0;
}
.info-item li {
color: var(--text-secondary);
padding: 0.5rem 0;
position: relative;
padding-left: 1.5rem;
}
.info-item li::before {
content: "•";
color: var(--primary-color);
position: absolute;
left: 0;
}
.faq-section {
margin-top: 4rem;
}
.faq-section h2 {
text-align: center;
font-size: 2rem;
margin-bottom: 2rem;
color: var(--text-primary);
}
.faq-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
.faq-item {
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.faq-item h3 {
font-size: 1.2rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.faq-item p {
color: var(--text-secondary);
line-height: 1.6;
}
@media (max-width: 768px) {
.service-hero h1 {
font-size: 2rem;
}
.service-hero p {
font-size: 1.1rem;
}
.service-grid {
grid-template-columns: 1fr;
}
.info-grid {
grid-template-columns: 1fr;
}
.faq-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.service-hero {
padding: 3rem 0;
}
.service-hero h1 {
font-size: 1.8rem;
}
.service-hero p {
font-size: 1rem;
}
.service-section {
padding: 2rem 0;
}
.service-card {
padding: 1.5rem;
}
.info-item, .faq-item {
padding: 1.5rem;
}
}
</style>

261
src/pages/faq.astro Normal file
View File

@ -0,0 +1,261 @@
---
import Layout from '../layouts/Layout.astro';
import { APP_NAME } from '../config/app';
import { formatDateTime } from '../../utils/date';
import Breadcrumb from '../components/Breadcrumb.astro';
// export const prerender = true;
// SEO meta tags
const title = `${APP_NAME} - 常见问题`;
const description = `${APP_NAME}常见问题解答,提供会员服务、账号安全等详细解答。让您轻松掌握产品使用技巧,享受更好的阅读体验。`;
const keywords = '知识回声常见问题,知识回声FAQ,知识回声售后问题,知识回声取消续费,知识回声费用返还,知识回声会员服务';
// FAQ categories and questions
const faqCategories = [
{
service: [
{
id: 'cancel-member',
title: '#开通会员自动续费服务后如何关闭?',
slug: 'cancel-member'
}, {
id: 'how-to-refund',
title: '#如何申请退费?',
slug: 'how-to-refund'
}, {
id: 'not-arrived',
title: '#申请售后服务没有到账?',
slug: 'not-arrived'
}
]
}
];
---
<Layout title={title} description={description} keywords={keywords}>
<section class="faq-section">
<div class="container">
<Breadcrumb data={[{ title: '常见问题', link: '/faq' }]} />
<header class="faq-header">
<h1>售后问题</h1>
<p class="faq-description">为您解答关于{APP_NAME}常见售后问题</p>
</header>
<div class="category-grid">
{faqCategories.map(category => (
<article class="category-card">
<div class="faq-list">
{category.service.map(question => (
<div class="faq-item">
<a href={`/faq/${question.slug}`} class="faq-link">
<h3>{question.title}</h3>
<span class="arrow" aria-hidden="true">→</span>
</a>
</div>
))}
</div>
</article>
))}
</div>
</div>
</section>
<section class="contact-section" aria-label="联系客服">
<div class="container">
<h2>需要更多帮助?</h2>
<p>我们的客服团队随时为您服务</p>
<div class="contact-buttons">
<a href="/contact" class="contact-button primary">联系客服</a>
</div>
</div>
</section>
</Layout>
<style>
.faq-section {
padding: 2rem 0;
background: white;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 1rem;
}
.breadcrumb {
margin: 1rem 0;
}
.breadcrumb ol {
list-style: none;
padding: 0;
margin: 0;
display: flex;
align-items: center;
}
.breadcrumb li {
display: flex;
align-items: center;
}
.breadcrumb li:not(:last-child)::after {
content: '/';
margin: 0 0.5rem;
color: var(--text-light);
}
.breadcrumb a {
color: var(--text-color);
text-decoration: none;
transition: color 0.3s ease;
}
.breadcrumb a:hover {
color: var(--hover-color);
}
.faq-header {
text-align: center;
margin-bottom: 3rem;
}
.faq-header h1 {
font-size: 2.5rem;
color: var(--text-color);
margin-bottom: 1rem;
}
.faq-description {
font-size: 1.1rem;
color: var(--text-light);
max-width: 600px;
margin: 0 auto;
}
.category-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 2rem;
}
.category-card {
background: white;
border-radius: 16px;
padding: 1rem;
border: 1px solid var(--black-color);
transition: all 0.3s ease;
}
.faq-list {
display: flex;
flex-direction: column;
/* gap: 1rem; */
}
.faq-item {
border-bottom: 1px solid var(--border-color);
}
.faq-item:last-child {
border-bottom: none;
}
.faq-link {
display: flex;
justify-content: space-between;
align-items: center;
text-decoration: none;
color: var(--text-color);
transition: all 0.3s ease;
padding: 0.8rem;
border-radius: 8px;
}
.faq-link:hover {
background: var(--bg-light);
color: var(--hover-color);
}
.faq-link h3 {
font-size: 1.1rem;
margin: 0;
font-weight: 500;
}
.arrow {
font-size: 1.2rem;
opacity: 0;
transform: translateX(-10px);
transition: all 0.3s ease;
}
.faq-link:hover .arrow {
opacity: 1;
transform: translateX(0);
}
@media (max-width: 768px) {
.faq-header h1 {
font-size: 2rem;
}
.category-grid {
grid-template-columns: 1fr;
}
.category-card {
padding: 1rem;
}
}
.contact-section {
padding: 2rem 0;
text-align: center;
background: white;
}
.contact-section h2 {
font-size: 2.5rem;
margin-bottom: 1rem;
color: var(--text-color);
}
.contact-section p {
font-size: 1.2rem;
color: var(--text-light);
margin-bottom: 2rem;
}
.contact-buttons {
display: flex;
gap: 1rem;
justify-content: center;
}
.contact-button {
padding: 1rem 2rem;
border-radius: 50px;
font-size: 1.1rem;
text-decoration: none;
transition: all 0.3s ease;
}
.contact-button.primary {
background: var(--hover-color);
color: white;
}
.contact-button:hover {
transform: translateY(-2px);
box-shadow: var(--hover-shadow);
}
.contact-button.primary:hover {
background: var(--hover-color);
}
</style>

View File

View File

@ -0,0 +1,282 @@
---
import Layout from '../../layouts/Layout.astro';
import Breadcrumb from '../../components/Breadcrumb.astro';
import { APP_NAME } from '../../config/app';
import { Image } from 'astro:assets';
import way1 from '../../../public/faq/cancel-member/way-1.png';
import way2 from '../../../public/faq/cancel-member/way-2.png';
import way3 from '../../../public/faq/cancel-member/way-3.png';
const title = `${APP_NAME} - ${APP_NAME}`;
const description = `了解如何成为${APP_NAME}会员,解锁专属学习特权,享受海量优质内容。`;
const keywords = `${APP_NAME},会员开通,会员权益,知识学习,会员服务`;
---
<Layout title={title} description={description} keywords={keywords}>
<Breadcrumb data={[{ title: '常见问题', link: '/faq' }, { title: '如何成为会员', link: '#' }]} />
<article class="faq-content">
<header class="faq-header">
<h1>如何关闭自动续费服务?</h1>
<!-- <p>关闭自动续费服务后,将不会产生后续扣款。如有任何问题,请联系《知识回声》人工客服为您处理。</p> -->
</header>
<div class="content">
<p>本文将详细介绍如何关闭《知识回声》会员自动续费服务。</p>
<section class="section">
<h2>一、一键关闭(推荐)</h2>
<p>在《知识回声》App 中点击【我的】→【服务中心】→【取消订阅】即可完成取消。</p>
<Image src={way1} alt="一键关闭" loading="lazy" />
</section>
<section class="section">
<h2>二、华为支付用户</h2>
<ul class="feature-list">
<li>打开手机【设置】</li>
<li>点击【华为账号】→【付款与账单】→【自动续费/免密支付】</li>
<li>选择要取消的项目,点击关闭自动续费</li>
</ul>
<Image src={way2} alt="华为支付用户" loading="lazy" />
</section>
<section class="section">
<h2>三、支付宝用户</h2>
<ul class="feature-list">
<li>打开支付宝 App</li>
<li>进入【我的】→【设置】→【支付设置】→【免密支付/自动扣款】</li>
<li>找到相关项目,点击取消服务</li>
</ul>
<Image src={way3} alt="支付宝用户" loading="lazy" />
</section>
<section class="section">
<h2>四、会员常见问题解答FAQ</h2>
<div class="faq-list">
<div class="faq-item">
<h3><a href="/faq/how-to-cancel-member">如何取消会员?</a></h3>
</div>
</div>
</section>
<div class="cta">
<a rel="nofollow" title="立即下载" href="https://appgallery.huawei.com/app/C113905377" target="_blank" class="download-button">立即下载《知识回声》App</a>
</div>
</div>
</article>
</Layout>
<style>
.faq-detail {
background: #f8f9fa;
min-height: 100vh;
padding: 2rem 0;
}
.container {
/* max-width: 800px; */
margin: 0 auto;
padding: 0 1rem;
}
.faq-content {
background: white;
border-radius: 16px;
padding: 2rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.faq-header {
margin-bottom: 2rem;
text-align: center;
}
.faq-header h1 {
font-size: 2rem;
color: #1a1a1a;
margin-bottom: 1rem;
line-height: 1.4;
}
.lead {
font-size: 1.1rem;
color: #4a4a4a;
line-height: 1.6;
margin-bottom: 2rem;
}
.section {
margin-bottom: 3rem;
}
.section h2 {
font-size: 1.5rem;
color: #1a1a1a;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f0f0;
}
.section h3 {
font-size: 1.2rem;
color: #333;
margin: 1.5rem 0 1rem;
}
.feature-list {
list-style: none;
padding: 0;
margin: 1.5rem 0;
}
.feature-list li {
padding: 0.8rem 1rem;
margin-bottom: 0.5rem;
background: #f8f9fa;
border-radius: 8px;
font-size: 1.1rem;
}
.benefits-table {
margin: 1.5rem 0;
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
}
th, td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #f0f0f0;
}
th {
background: #f8f9fa;
font-weight: 600;
color: #333;
}
tr:last-child td {
border-bottom: none;
}
.steps {
display: grid;
gap: 1.5rem;
margin: 1.5rem 0;
}
.step {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 12px;
border-left: 4px solid #007bff;
}
.step h3 {
margin-top: 0;
/* color: #007bff; */
}
.step ul {
margin: 1rem 0 0;
padding-left: 1.5rem;
}
.step li {
margin-bottom: 0.5rem;
color: #4a4a4a;
}
.success-message {
text-align: center;
font-size: 1.2rem;
color: #28a745;
margin: 2rem 0;
padding: 1rem;
background: #e8f5e9;
border-radius: 8px;
}
.faq-list {
margin: 1.5rem 0;
}
.faq-item {
margin-bottom: 1.5rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
}
.faq-item h3 {
color: #007bff;
margin: 0 0 0.5rem;
}
.faq-item p {
margin: 0;
color: #4a4a4a;
}
.cta {
text-align: center;
margin: 3rem 0 1rem;
}
.download-button {
display: inline-block;
padding: 1rem 2rem;
background: #007bff;
color: white;
text-decoration: none;
border-radius: 8px;
font-weight: 500;
transition: all 0.3s ease;
}
.download-button:hover {
background: #0056b3;
transform: translateY(-2px);
}
img {
max-width: 50%;
height: auto;
}
@media (max-width: 768px) {
img {
max-width: 100%;
height: auto;
}
.faq-content {
padding: 1.5rem;
}
.faq-header h1 {
font-size: 1.75rem;
}
.lead {
font-size: 1rem;
}
.section h2 {
font-size: 1.3rem;
}
.step {
padding: 1.25rem;
}
}
</style>

View File

@ -0,0 +1,326 @@
---
import Layout from '../../layouts/Layout.astro';
import Breadcrumb from '../../components/Breadcrumb.astro';
import { APP_NAME } from '../../config/app';
import { Image } from 'astro:assets';
import step1 from '../../../public/faq/how-to-become-member/step-1.png';
import step2 from '../../../public/faq/how-to-become-member/step-2.png';
const title = `${APP_NAME} - ${APP_NAME}`;
const description = `了解如何成为${APP_NAME}会员,解锁专属学习特权,享受海量优质内容。`;
const keywords = `${APP_NAME},会员开通,会员权益,知识学习,会员服务`;
---
<Layout title={title} description={description} keywords={keywords}>
<Breadcrumb data={[{ title: '常见问题', link: '/faq' }, { title: '如何成为会员', link: '#' }]} />
<article class="faq-content">
<header class="faq-header">
<h1>如何成为《知识回声》会员?</h1>
</header>
<div class="content">
<p>本文将详细介绍如何成为《知识回声》会员、会员能享有哪些专属权益,以及注册开通的步骤指南。</p>
<section class="section">
<h2>一、《知识回声》是什么?</h2>
<p>《知识回声》是一款聚焦<strong>阅读 + 讲堂</strong>双核心板块的学习类 App网罗海量优质书籍内容和专家讲解课程覆盖</p>
<ul class="feature-list">
<li>📚 文学、历史、科技、艺术等图书</li>
<li>🎁 专家讲堂、深度解读、知识速听</li>
<li>🧠 个性推荐、精读精讲、高效成长</li>
</ul>
</section>
<section class="section">
<h2>二、为什么要成为会员?</h2>
<p>会员用户将获得超越普通用户的<strong>学习自由度与使用特权</strong>,核心优势包括:</p>
<div class="benefits-table">
<table>
<thead>
<tr>
<th>权益类别</th>
<th>会员专属内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>📖 精品课程深度学习</td>
<td>名师授课,系统梳理文化与历史脉络,启迪思考,丰富视野。</td>
</tr>
<tr>
<td>🏷️ 超多经典图书阅读</td>
<td>百余本人文历史景点。精选好书,内容权威,涵盖多个历史时代与文化主图。</td>
</tr>
<tr>
<td>🎙️ 专业有声书随心听</td>
<td>优质配音,沉浸式体验,解放双眼,随时随地汲取知识。</td>
</tr>
</tbody>
</table>
</div>
</section>
<section class="section">
<h2>三、如何成为《知识回声》会员?只需三步!</h2>
<div class="steps">
<div class="step">
<h3>1⃣ 步骤一:下载并登录 App</h3>
<ul>
<li>在应用商店搜索"知识回声",下载并安装</li>
<li>注册并登录你的账号(支持手机号)</li>
</ul>
<Image src={step1} alt="步骤一" loading="lazy" />
</div>
<div class="step">
<h3>2⃣ 步骤二:进入会员中心</h3>
<ul>
<li>打开 App 首页,点击右下角"我的"</li>
<li>进入<strong>会员中心</strong>,了解各项权益</li>
</ul>
<Image src={step2} alt="步骤二" loading="lazy" />
</div>
<div class="step">
<h3>3⃣ 步骤三:选择会员方案并开通</h3>
<ul>
<li>选择月度 / 季度 / 年度会员</li>
<li>支持支付宝、微信等多种支付方式</li>
<li>支付成功后,系统自动为你激活会员身份</li>
</ul>
</div>
</div>
</section>
<section class="section">
<h2>四、会员常见问题解答FAQ</h2>
<div class="faq-list">
<div class="faq-item">
<h3><a href="/faq/how-to-cancel-member">如何取消会员?</a></h3>
</div>
</div>
</section>
<div class="cta">
<a rel="nofollow" title="立即下载" href="https://appgallery.huawei.com/app/C113905377" target="_blank" class="download-button">立即下载《知识回声》App</a>
</div>
</div>
</article>
</Layout>
<style>
.faq-detail {
background: #f8f9fa;
min-height: 100vh;
padding: 2rem 0;
}
.container {
/* max-width: 800px; */
margin: 0 auto;
padding: 0 1rem;
}
.faq-content {
background: white;
border-radius: 16px;
padding: 2rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.faq-header {
margin-bottom: 2rem;
text-align: center;
}
.faq-header h1 {
font-size: 2rem;
color: #1a1a1a;
margin-bottom: 1rem;
line-height: 1.4;
}
.lead {
font-size: 1.1rem;
color: #4a4a4a;
line-height: 1.6;
margin-bottom: 2rem;
}
.section {
margin-bottom: 3rem;
}
.section h2 {
font-size: 1.5rem;
color: #1a1a1a;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f0f0;
}
.section h3 {
font-size: 1.2rem;
color: #333;
margin: 1.5rem 0 1rem;
}
.feature-list {
list-style: none;
padding: 0;
margin: 1.5rem 0;
}
.feature-list li {
padding: 0.8rem 1rem;
margin-bottom: 0.5rem;
background: #f8f9fa;
border-radius: 8px;
font-size: 1.1rem;
}
.benefits-table {
margin: 1.5rem 0;
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
}
th, td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #f0f0f0;
}
th {
background: #f8f9fa;
font-weight: 600;
color: #333;
}
tr:last-child td {
border-bottom: none;
}
.steps {
display: grid;
gap: 1.5rem;
margin: 1.5rem 0;
}
.step {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 12px;
border-left: 4px solid #007bff;
}
.step h3 {
margin-top: 0;
/* color: #007bff; */
}
.step ul {
margin: 1rem 0 0;
padding-left: 1.5rem;
}
.step li {
margin-bottom: 0.5rem;
color: #4a4a4a;
}
.success-message {
text-align: center;
font-size: 1.2rem;
color: #28a745;
margin: 2rem 0;
padding: 1rem;
background: #e8f5e9;
border-radius: 8px;
}
.faq-list {
margin: 1.5rem 0;
}
.faq-item {
margin-bottom: 1.5rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
}
.faq-item h3 {
color: #007bff;
margin: 0 0 0.5rem;
}
.faq-item p {
margin: 0;
color: #4a4a4a;
}
.cta {
text-align: center;
margin: 3rem 0 1rem;
}
.download-button {
display: inline-block;
padding: 1rem 2rem;
background: #007bff;
color: white;
text-decoration: none;
border-radius: 8px;
font-weight: 500;
transition: all 0.3s ease;
}
.download-button:hover {
background: #0056b3;
transform: translateY(-2px);
}
img {
max-width: 50%;
height: auto;
}
@media (max-width: 768px) {
img {
max-width: 100%;
height: auto;
}
.faq-content {
padding: 1.5rem;
}
.faq-header h1 {
font-size: 1.75rem;
}
.lead {
font-size: 1rem;
}
.section h2 {
font-size: 1.3rem;
}
.step {
padding: 1.25rem;
}
}
</style>

View File

@ -0,0 +1,261 @@
---
import Layout from '../../layouts/Layout.astro';
import Breadcrumb from '../../components/Breadcrumb.astro';
import { APP_NAME } from '../../config/app';
import { Image } from 'astro:assets';
import serviceHotline from '../../../public/faq/how-to-refund/service-hotline.png';
const title = `${APP_NAME} - 如何返还会员费用?`;
const description = `了解如何成为${APP_NAME}会员,解锁专属学习特权,享受海量优质内容。`;
const keywords = `${APP_NAME},会员开通,会员权益,退款,会员退款`;
---
<Layout title={title} description={description} keywords={keywords}>
<Breadcrumb data={[{ title: '常见问题', link: '/faq' }, { title: '如何返还会员费用?', link: '#' }]} />
<article class="faq-content">
<header class="faq-header">
<h1>如何申请退费?</h1>
</header>
<div class="content">
<p>本文将详细介绍如何关闭《知识回声》会员自动续费服务。</p>
<section class="section">
<p>若您对我们的产品或服务有任何不满意,我们可以为您办理退费。</p>
<p>请拨打App提供的<a href="/contact">客服热线</a>,向客服人员说明您的退费需求。</p>
<p>我们将核实相关信息,并根据平台政策为您提供相应的退费服务,竭诚为您解决问题。</p>
<Image src={serviceHotline} alt="服务热线" loading="lazy" />
</section>
<section class="section">
<h2>四、会员常见问题解答FAQ</h2>
<div class="faq-list">
<div class="faq-item">
<h3><a href="/faq/how-to-cancel-member">如何取消会员?</a></h3>
</div>
</div>
</section>
<div class="cta">
<a rel="nofollow" title="立即下载" href="https://appgallery.huawei.com/app/C113905377" target="_blank" class="download-button">立即下载《知识回声》App</a>
</div>
</div>
</article>
</Layout>
<style>
.faq-detail {
background: #f8f9fa;
min-height: 100vh;
padding: 2rem 0;
}
.container {
/* max-width: 800px; */
margin: 0 auto;
padding: 0 1rem;
}
.faq-content {
background: white;
border-radius: 16px;
padding: 2rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.faq-header {
margin-bottom: 2rem;
text-align: center;
}
.faq-header h1 {
font-size: 2rem;
color: #1a1a1a;
margin-bottom: 1rem;
line-height: 1.4;
}
.lead {
font-size: 1.1rem;
color: #4a4a4a;
line-height: 1.6;
margin-bottom: 2rem;
}
.section {
margin-bottom: 3rem;
}
.section h2 {
font-size: 1.5rem;
color: #1a1a1a;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f0f0;
}
.section h3 {
font-size: 1.2rem;
color: #333;
margin: 1.5rem 0 1rem;
}
.feature-list {
list-style: none;
padding: 0;
margin: 1.5rem 0;
}
.feature-list li {
padding: 0.8rem 1rem;
margin-bottom: 0.5rem;
background: #f8f9fa;
border-radius: 8px;
font-size: 1.1rem;
}
.benefits-table {
margin: 1.5rem 0;
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
}
th, td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #f0f0f0;
}
th {
background: #f8f9fa;
font-weight: 600;
color: #333;
}
tr:last-child td {
border-bottom: none;
}
.steps {
display: grid;
gap: 1.5rem;
margin: 1.5rem 0;
}
.step {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 12px;
border-left: 4px solid #007bff;
}
.step h3 {
margin-top: 0;
/* color: #007bff; */
}
.step ul {
margin: 1rem 0 0;
padding-left: 1.5rem;
}
.step li {
margin-bottom: 0.5rem;
color: #4a4a4a;
}
.success-message {
text-align: center;
font-size: 1.2rem;
color: #28a745;
margin: 2rem 0;
padding: 1rem;
background: #e8f5e9;
border-radius: 8px;
}
.faq-list {
margin: 1.5rem 0;
}
.faq-item {
margin-bottom: 1.5rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
}
.faq-item h3 {
color: #007bff;
margin: 0 0 0.5rem;
}
.faq-item p {
margin: 0;
color: #4a4a4a;
}
.cta {
text-align: center;
margin: 3rem 0 1rem;
}
.download-button {
display: inline-block;
padding: 1rem 2rem;
background: #007bff;
color: white;
text-decoration: none;
border-radius: 8px;
font-weight: 500;
transition: all 0.3s ease;
}
.download-button:hover {
background: #0056b3;
transform: translateY(-2px);
}
img {
max-width: 50%;
height: auto;
}
@media (max-width: 768px) {
img {
max-width: 100%;
height: auto;
}
.faq-content {
padding: 1.5rem;
}
.faq-header h1 {
font-size: 1.75rem;
}
.lead {
font-size: 1rem;
}
.section h2 {
font-size: 1.3rem;
}
.step {
padding: 1.25rem;
}
}
</style>

View File

@ -0,0 +1,260 @@
---
import Layout from '../../layouts/Layout.astro';
import Breadcrumb from '../../components/Breadcrumb.astro';
import { APP_NAME } from '../../config/app';
const title = `${APP_NAME} - 如何返还会员费用?`;
const description = `了解如何成为${APP_NAME}会员,解锁专属学习特权,享受海量优质内容。`;
const keywords = `${APP_NAME},会员开通,会员权益,退款,会员退款`;
---
<Layout title={title} description={description} keywords={keywords}>
<Breadcrumb data={[{ title: '常见问题', link: '/faq' }, { title: '如何返还会员费用?', link: '#' }]} />
<article class="faq-content">
<header class="faq-header">
<h1>申请售后服务没有到账?</h1>
</header>
<div class="content">
<p>本文将详细介绍《知识回声》申请售后服务没有到账的该怎么办。</p>
<section class="section">
<p>一般情况下,您申请退费成功后,<strong>退款将实时原路退回</strong>至您的支付宝余额或银行卡账户。</p>
<p>您可以打开支付宝,在【我的】→【账单】中查看退款明细。</p>
<p>若退款在<strong>超过1个工作日</strong>仍未到账,我公司将先行垫付该笔退款,确保您的权益不受影响。</p>
<p>如有任何疑问,欢迎拨打我们的<a href="/contact">客服热线</a>进一步咨询。</p>
</section>
<section class="section">
<h2>四、会员常见问题解答FAQ</h2>
<div class="faq-list">
<div class="faq-item">
<h3><a href="/faq/how-to-cancel-member">如何取消会员?</a></h3>
</div>
</div>
</section>
<div class="cta">
<a rel="nofollow" title="立即下载" href="https://appgallery.huawei.com/app/C113905377" target="_blank" class="download-button">立即下载《知识回声》App</a>
</div>
</div>
</article>
</Layout>
<style>
.faq-detail {
background: #f8f9fa;
min-height: 100vh;
padding: 2rem 0;
}
.container {
/* max-width: 800px; */
margin: 0 auto;
padding: 0 1rem;
}
.faq-content {
background: white;
border-radius: 16px;
padding: 2rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.faq-header {
margin-bottom: 2rem;
text-align: center;
}
.faq-header h1 {
font-size: 2rem;
color: #1a1a1a;
margin-bottom: 1rem;
line-height: 1.4;
}
.lead {
font-size: 1.1rem;
color: #4a4a4a;
line-height: 1.6;
margin-bottom: 2rem;
}
.section {
margin-bottom: 3rem;
}
.section h2 {
font-size: 1.5rem;
color: #1a1a1a;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 2px solid #f0f0f0;
}
.section h3 {
font-size: 1.2rem;
color: #333;
margin: 1.5rem 0 1rem;
}
.feature-list {
list-style: none;
padding: 0;
margin: 1.5rem 0;
}
.feature-list li {
padding: 0.8rem 1rem;
margin-bottom: 0.5rem;
background: #f8f9fa;
border-radius: 8px;
font-size: 1.1rem;
}
.benefits-table {
margin: 1.5rem 0;
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
background: white;
border-radius: 8px;
overflow: hidden;
}
th, td {
padding: 1rem;
text-align: left;
border-bottom: 1px solid #f0f0f0;
}
th {
background: #f8f9fa;
font-weight: 600;
color: #333;
}
tr:last-child td {
border-bottom: none;
}
.steps {
display: grid;
gap: 1.5rem;
margin: 1.5rem 0;
}
.step {
background: #f8f9fa;
padding: 1.5rem;
border-radius: 12px;
border-left: 4px solid #007bff;
}
.step h3 {
margin-top: 0;
/* color: #007bff; */
}
.step ul {
margin: 1rem 0 0;
padding-left: 1.5rem;
}
.step li {
margin-bottom: 0.5rem;
color: #4a4a4a;
}
.success-message {
text-align: center;
font-size: 1.2rem;
color: #28a745;
margin: 2rem 0;
padding: 1rem;
background: #e8f5e9;
border-radius: 8px;
}
.faq-list {
margin: 1.5rem 0;
}
.faq-item {
margin-bottom: 1.5rem;
padding: 1.5rem;
background: #f8f9fa;
border-radius: 8px;
}
.faq-item h3 {
color: #007bff;
margin: 0 0 0.5rem;
}
.faq-item p {
margin: 0;
color: #4a4a4a;
}
.cta {
text-align: center;
margin: 3rem 0 1rem;
}
.download-button {
display: inline-block;
padding: 1rem 2rem;
background: #007bff;
color: white;
text-decoration: none;
border-radius: 8px;
font-weight: 500;
transition: all 0.3s ease;
}
.download-button:hover {
background: #0056b3;
transform: translateY(-2px);
}
img {
max-width: 50%;
height: auto;
}
@media (max-width: 768px) {
img {
max-width: 100%;
height: auto;
}
.faq-content {
padding: 1.5rem;
}
.faq-header h1 {
font-size: 1.75rem;
}
.lead {
font-size: 1rem;
}
.section h2 {
font-size: 1.3rem;
}
.step {
padding: 1.25rem;
}
}
</style>

953
src/pages/index.astro Normal file
View File

@ -0,0 +1,953 @@
---
// 图片
import logo from '../../public/logo.png';
import avatar_1 from '../../public/avatar_1.jpg';
import avatar_2 from '../../public/avatar_2.jpg';
import avatar_3 from '../../public/avatar_3.jpg';
import huaweiLogo from '../../public/huawei-logo.png';
import vivoLogo from '../../public/vivo-logo.png';
import oppoLogo from '../../public/oppo-logo.png';
import xiaomiLogo from '../../public/xiaomi-logo.png';
import honorLogo from '../../public/honor-logo.png';
import oneplusLogo from '../../public/oneplus-logo.png';
import logoAll from '../../public/logoAll.png';
import bg from '../../public/bg.png';
import page_1 from '../../public/page_1.webp';
import page_2 from '../../public/page_2.webp';
import page_3 from '../../public/page_3.webp';
import page_4 from '../../public/page_4.webp';
import Layout from '../layouts/Layout.astro';
import { Image } from 'astro:assets';
import { APP_NAME, BASE_URL } from '../config/app';
import { formatDateTime } from '../../utils/date';
const title = `${APP_NAME} - 开启有声阅读新方式`;
const description = '知识回声是一款超实用学习应用,涵盖海量读物,热门有声书籍,让知识触手可及';
const keywords = '知识回声,知识回声官网,知识回声下载,知识回声官方,知识回声软件,知识回声下载,知识回声app';
const LDJSON = {
context: "https://ziyuan.baidu.com/contexts/cambrian.jsonld",
id: BASE_URL,
appid: "",
title: title,
image: BASE_URL + "/app-showcase.png",
pubDate: "2025-06-09T11:20:04",
updateDate: formatDateTime(),
description: description,
};
---
<Layout title={title} description={description} keywords={keywords}>
<section class="hero">
<div class="partner-bg">
<Image src={bg} alt="背景" class="bg-image" loading="eager" />
</div>
<div class="hero-content">
<h1>视听阅读,尽在这端</h1>
<p>一款超实用学习应用,涵盖海量读物,热门有声书籍,让知识触手可及。</p>
<div class="cta-buttons">
<button class="cta-primary">
<a rel="nofollow" title="立即下载" href="https://appgallery.huawei.com/app/C113905377" target="_blank">立即下载</a>
</button>
</div>
</div>
</section>
<section class="app-showcase" aria-label="应用界面展示">
<h2>我们能为你提供什么</h2>
<div class="app-intro">
<p>知识回声平台将图书与有声书两大板块有机结合,形成了独特的学习生态。用户可以根据自己的实际情况,灵活选择阅读图书或收听有声书。在拥有完整学习时间时,通过图书板块进行系统深入的学习;在时间零散时,借助有声书板块实现知识的碎片化吸收。这种不受时空限制的学习方式,让用户真正成为学习的主人,自由掌控学习的节奏与进度。知识回声平台正以其独特的魅力,引领用户进入一个全新的学习时代,让随时随地学习成为现实。</p>
</div>
<div class="app-showcase-grid">
<article class="app-showcase-item">
<div class="app-image">
<Image src={page_1} alt="优质课程界面展示" width="280" height="500" loading="lazy" />
</div>
<div class="app-overlay">
<h3>精品课程</h3>
<p>专业讲师精心打造的优质课程</p>
</div>
</article>
<article class="app-showcase-item">
<div class="app-image">
<Image src={page_2} alt="内容推荐界面展示" width="280" height="500" loading="lazy" />
</div>
<div class="app-overlay">
<h3>优质好书</h3>
<p>基于用户兴趣的智能内容推荐</p>
</div>
</article>
<article class="app-showcase-item">
<div class="app-image">
<Image src={page_3} alt="精美页面界面展示" width="280" height="500" loading="lazy" />
</div>
<div class="app-overlay">
<h3>精美页面</h3>
<p>沉浸式的阅读环境</p>
</div>
</article>
<article class="app-showcase-item">
<div class="app-image">
<Image src={page_4} alt="有声阅读界面展示" width="280" height="500" loading="lazy" />
</div>
<div class="app-overlay">
<h3>有声阅读</h3>
<p>方便快捷</p>
</div>
</article>
</div>
</section>
<section class="features" aria-label="产品特点">
<h2>为什么选择 { APP_NAME }</h2>
<div class="feature-grid">
<article class="feature-card">
<div class="feature-content">
<div class="feature-icon" aria-hidden="true">📚</div>
<div class="feature-text">
<h3>海量内容</h3>
<p>汇聚图书与讲堂两大核心板块。图书板块网罗海量精品,满足多样阅读偏好。无论是经典名著还是最新畅销书,都能在此找到您的阅读之选。</p>
</div>
</div>
</article>
<article class="feature-card">
<div class="feature-content">
<div class="feature-icon" aria-hidden="true">🔍</div>
<div class="feature-text">
<h3>智能推荐</h3>
<p>基于您的兴趣和学习习惯,提供个性化内容推荐。通过先进的算法,为您精选最适合的阅读内容,让每一次阅读都充满惊喜。</p>
</div>
</div>
</article>
<article class="feature-card">
<div class="feature-content">
<div class="feature-icon" aria-hidden="true">💻</div>
<div class="feature-text">
<h3>精品课程</h3>
<p>精选优质课程内容,涵盖多个领域。名师授课,系统学习,让您随时随地提升自我。课程内容持续更新,满足您的学习需求。</p>
</div>
</div>
</article>
<article class="feature-card">
<div class="feature-content">
<div class="feature-icon" aria-hidden="true">🚀</div>
<div class="feature-text">
<h3>界面简洁</h3>
<p>精心设计的用户界面,简洁而不简单。流畅的操作体验,让您专注于内容本身。支持多种阅读模式,打造舒适的阅读环境。</p>
</div>
</div>
</article>
</div>
</section>
<section class="content-preview partner-section" aria-label="合作伙伴">
<div class="partner-bg">
<Image src={logoAll} alt="背景" class="bg-image" />
</div>
<h2>合作伙伴</h2>
<div class="partner-intro">
<p>我们为华为、vivo和OPPO定制开发"厂商满意、用户喜欢"的软件,共同构建"便捷、安全可靠"的移动互联生态。</p>
</div>
<div class="partner-logos">
<article class="partner-logo huawei">
<div class="partner-icon">
<Image src={huaweiLogo} alt="华为公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>华为</h3>
<p>战略合作伙伴</p>
</div>
</article>
<article class="partner-logo vivo">
<div class="partner-icon">
<Image src={vivoLogo} alt="vivo公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>vivo</h3>
<p>核心合作伙伴</p>
</div>
</article>
<article class="partner-logo oppo">
<div class="partner-icon">
<Image src={oppoLogo} alt="OPPO公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>OPPO</h3>
<p>战略合作伙伴</p>
</div>
</article>
<article class="partner-logo xiaomi">
<div class="partner-icon">
<Image src={xiaomiLogo} alt="小米公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>小米</h3>
<p>重要合作伙伴</p>
</div>
</article>
<article class="partner-logo honor">
<div class="partner-icon">
<Image src={honorLogo} alt="荣耀公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>荣耀</h3>
<p>战略合作伙伴</p>
</div>
</article>
<article class="partner-logo oneplus">
<div class="partner-icon">
<Image src={oneplusLogo} alt="一加公司logo" width="80" height="80" loading="lazy" />
</div>
<div class="partner-info">
<h3>一加</h3>
<p>重要合作伙伴</p>
</div>
</article>
</div>
</section>
<section class="user-experience" aria-label="用户体验">
<h2>用户真实体验</h2>
<div class="experience-grid">
<article class="experience-card">
<div class="user-info">
<Image src={avatar_1} alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>李女士</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"界面设计非常简洁,操作很流畅。内容质量很高,每天都能学到新知识。"</p>
</article>
<article class="experience-card">
<div class="user-info">
<Image src={avatar_2} alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>张先生</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"推荐的内容很符合我的兴趣,学习效率提高了很多。客服响应也很及时。"</p>
</article>
<article class="experience-card">
<div class="user-info">
<Image src={avatar_3} alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>王同学</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"课程内容很专业,老师讲解很清晰。功能很实用。"</p>
</article>
</div>
</section>
</Layout>
<!-- 百度结构化数据 -->
<script type="application/ld+json" set:html={JSON.stringify({
"@context": LDJSON.context,
"@id": LDJSON.id,
"appid": LDJSON.appid,
"title": LDJSON.title,
"images": [LDJSON.image],
"pubDate": LDJSON.pubDate,
"Update": LDJSON.updateDate,
"description": LDJSON.description,
})}/>
<style>
.experience-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.experience-card {
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.user-info {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1.5rem;
}
.user-info img {
width: 50px;
height: 50px;
border-radius: 50%;
object-fit: cover;
}
.user-details h3 {
font-size: 1.2rem;
color: var(--text-primary);
margin-bottom: 0.25rem;
}
.rating {
color: #fbbf24;
}
.experience-card p {
color: var(--text-secondary);
line-height: 1.6;
}
.cta-buttons {
a {
text-decoration: none;
color: inherit;
}
}
.hero {
/* position: relative; */
height: 60vh;
min-height: 600px;
display: flex;
align-items: center;
overflow: hidden;
/* background: linear-gradient(135deg, var(--background-light), var(--background-off-white)); */
}
@keyframes pulse {
0% {
opacity: 0.5;
}
50% {
opacity: 0.8;
}
100% {
opacity: 0.5;
}
}
.hero-content {
max-width: 800px;
margin: 0 auto;
padding: 0 2rem;
text-align: center;
z-index: 1;
}
h1 {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 1rem;
/* background: linear-gradient(90deg, var(--primary-color), var(--accent-color)); */
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-content p {
font-size: 1.2rem;
margin-bottom: 2rem;
color: var(--text-secondary);
}
.cta-buttons {
display: flex;
justify-content: center;
gap: 1rem;
}
.cta-primary {
background: black;
color: white;
border: none;
padding: 0.75rem 1.5rem;
border-radius: 8px;
font-weight: 600;
font-size: 1rem;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(79, 70, 229, 0.1);
}
.cta-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(79, 70, 229, 0.2);
}
section {
/* padding: 2rem 2rem; */
max-width: 1200px;
margin: 0 auto;
}
h2 {
font-size: 2.5rem;
text-align: center;
margin-bottom: 3rem;
color: var(--text-primary);
/* background: linear-gradient(90deg, var(--primary-color), var(--accent-color)); */
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.features {
padding: 4rem 0;
position: relative;
overflow: hidden;
}
.features-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
opacity: 0.05;
pointer-events: none;
}
.bg-image {
width: 100%;
height: 100%;
object-fit: cover;
/* transform: scale(1.2); */
}
.features h2 {
text-align: center;
font-size: 2.5rem;
margin-bottom: 3rem;
/* background: linear-gradient(135deg, var(--primary-color), var(--accent-color)); */
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
position: relative;
z-index: 1;
}
.feature-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
padding: 0 1rem;
position: relative;
z-index: 1;
}
.feature-card {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 16px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease, box-shadow 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.feature-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);
}
.feature-content {
display: flex;
gap: 2rem;
padding: 2.5rem;
align-items: flex-start;
}
.feature-icon {
font-size: 3rem;
flex-shrink: 0;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, var(--primary-light), var(--accent-light));
border-radius: 50%;
color: white;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
.feature-text {
flex: 1;
}
.feature-text h3 {
font-size: 1.5rem;
margin: 0 0 1rem;
color: var(--text-primary);
}
.feature-text p {
font-size: 1.1rem;
line-height: 1.6;
color: var(--text-secondary);
margin: 0;
}
@media (max-width: 1024px) {
.feature-grid {
grid-template-columns: 1fr;
max-width: 800px;
}
}
@media (max-width: 768px) {
.features {
padding: 3rem 0;
}
.features h2 {
font-size: 2rem;
margin-bottom: 2rem;
}
.feature-content {
flex-direction: column;
text-align: center;
padding: 2rem;
}
.feature-icon {
margin: 0 auto;
}
.feature-text h3 {
font-size: 1.3rem;
}
.feature-text p {
font-size: 1rem;
}
}
@media (max-width: 480px) {
.features {
padding: 2rem 0;
}
.features h2 {
font-size: 1.8rem;
margin-bottom: 1.5rem;
}
.feature-content {
padding: 1.5rem;
}
.feature-icon {
width: 60px;
height: 60px;
font-size: 2rem;
}
.feature-text h3 {
font-size: 1.2rem;
}
}
.partner-section {
padding: 2rem 0;
position: relative;
overflow: hidden;
background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.05), rgba(var(--accent-rgb), 0.05));
}
.partner-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
opacity: 0.03;
pointer-events: none;
}
.partner-section h2 {
text-align: center;
font-size: 2.5rem;
margin-bottom: 2rem;
background: black;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
position: relative;
z-index: 1;
}
.partner-intro, .app-intro {
max-width: 800px;
margin: 0 auto 3rem;
text-align: center;
padding: 0 1rem;
position: relative;
z-index: 1;
}
.partner-intro p, .app-intro p {
font-size: 0.8rem;
line-height: 1.8;
color: var(--text-secondary);
}
.partner-logos {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
padding: 0 1rem;
position: relative;
z-index: 1;
}
.partner-logo {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 16px;
padding: 2rem;
display: flex;
align-items: center;
gap: 1.5rem;
transition: all 0.3s ease;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
border: 1px solid rgba(var(--primary-rgb), 0.1);
}
.partner-icon {
flex-shrink: 0;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
background: white;
border-radius: 12px;
box-shadow: 0 4px 15px rgba(var(--primary-rgb), 0.1);
transition: transform 0.3s ease;
}
.partner-logo:hover .partner-icon {
transform: scale(1.1);
}
.partner-icon img {
width: 60px;
height: 60px;
object-fit: contain;
}
.partner-info {
flex: 1;
}
.partner-info h3 {
font-size: 1.3rem;
margin: 0 0 0.5rem;
color: var(--text-primary);
transition: color 0.3s ease;
}
.partner-logo:hover .partner-info h3 {
color: var(--primary-color);
}
.partner-info p {
font-size: 0.9rem;
color: var(--text-secondary);
margin: 0;
}
@media (max-width: 768px) {
.partner-section {
padding: 3rem 0;
}
.partner-section h2 {
font-size: 2rem;
margin-bottom: 1rem;
}
.partner-intro {
margin-bottom: 2rem;
}
.partner-intro p {
font-size: 1rem;
}
.partner-logos {
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1.5rem;
}
.partner-logo {
padding: 1.5rem;
}
.partner-icon {
width: 60px;
height: 60px;
}
.partner-icon img {
width: 45px;
height: 45px;
}
.partner-info h3 {
font-size: 1.2rem;
}
}
@media (max-width: 480px) {
.partner-section {
padding: 2rem 0;
}
.partner-section h2 {
font-size: 1.8rem;
}
.partner-logos {
grid-template-columns: 1fr;
}
.partner-logo {
padding: 1.25rem;
}
}
.app-showcase {
border-radius: 16px;
padding: 2rem 2rem;
margin: 2rem auto;
}
.app-showcase-desc {
font-size: 0.8rem;
line-height: 1.8;
color: var(--text-secondary);
}
.app-showcase-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.app-showcase-item {
position: relative;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
aspect-ratio: 9/16;
}
.app-showcase-item:hover {
transform: translateY(-10px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
}
.app-image {
width: 100%;
height: 100%;
position: relative;
}
.app-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.app-showcase-item:hover .app-image img {
transform: scale(1.05);
}
.app-overlay {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 1.5rem;
background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
color: white;
transform: translateY(100%);
transition: transform 0.3s ease;
}
.app-showcase-item:hover .app-overlay {
transform: translateY(0);
}
.app-overlay h3 {
font-size: 1.25rem;
margin-bottom: 0.5rem;
color: white;
}
.app-overlay p {
font-size: 0.9rem;
opacity: 0.9;
margin: 0;
}
@media (max-width: 768px) {
.app-showcase-grid {
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.app-overlay {
transform: translateY(0);
background: linear-gradient(to top, rgba(0, 0, 0, 0.9), rgba(0, 0, 0, 0.6));
padding: 1rem;
}
.app-overlay h3 {
font-size: 1rem;
}
.app-overlay p {
font-size: 0.8rem;
}
}
@media (max-width: 480px) {
.app-showcase-grid {
grid-template-columns: 1fr;
}
}
.enterprise-section {
background: linear-gradient(135deg, var(--background-light), var(--background-off-white));
border-radius: 24px;
padding: 4rem 2rem;
margin: 2rem auto;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
position: relative;
overflow: hidden;
}
.enterprise-section::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: black;
}
.enterprise-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.enterprise-card {
background: white;
border-radius: 16px;
overflow: hidden;
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
border: 1px solid rgba(0, 0, 0, 0.05);
}
.enterprise-card:hover {
transform: translateY(-10px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1);
}
.enterprise-image {
position: relative;
width: 100%;
height: 250px;
overflow: hidden;
}
.enterprise-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.enterprise-card:hover .enterprise-image img {
transform: scale(1.05);
}
.enterprise-content {
padding: 1.5rem;
}
.enterprise-content h3 {
color: var(--text-primary);
font-size: 1.5rem;
margin-bottom: 0.5rem;
}
.enterprise-content p {
color: var(--text-secondary);
line-height: 1.6;
margin: 0;
}
@media (max-width: 768px) {
.enterprise-grid {
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.enterprise-image {
height: 200px;
}
.enterprise-content {
padding: 1rem;
}
.enterprise-content h3 {
font-size: 1.2rem;
}
}
@media (max-width: 480px) {
.enterprise-grid {
grid-template-columns: 1fr;
}
.enterprise-image {
height: 180px;
}
.enterprise-card {
max-width: 400px;
margin: 0 auto;
}
}
</style>

109
src/pages/news.astro Normal file
View File

@ -0,0 +1,109 @@
---
import Layout from '../layouts/Layout.astro';
import { APP_NAME } from '../config/app';
import { newsIndex } from '../../utils/rpc';
import Breadcrumb from '../components/Breadcrumb.astro';
const {code, data} = await newsIndex();
const title = `${APP_NAME} - 新闻专栏`;
const description = '知识回声最新新闻动态、行业资讯、合作信息。';
const keywords = '知识回声,知识回声新闻,知识回声动态,知识回声合作';
---
<Layout title={title} description={description} keywords={keywords}>
<Breadcrumb data={[{ title: '新闻专栏', link: 'javascript;' }]} />
<div class="news-container">
<section class="news-content">
<div class="news-list">
<!-- <h3>最新动态</h3> -->
<ul>
{
data.map(news => (
<li>
<a href={`/news/${news.id}`} title={news.title}>
<span class="news-title">{news.title}</span>
<span class="news-date">{news.created_at}</span>
</a>
</li>
))
}
</ul>
</div>
</section>
</div>
<style>
.news-container{
padding: 1rem;
}
.news-content a {
text-decoration: none;
}
.news-list {
margin-bottom: 2rem;
/* background: var(--bg-secondary); */
/* border-radius: var(--radius-lg); */
overflow: hidden;
}
.news-list h3 {
padding: 1rem;
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 1rem;
/* color: var(--text-primary); */
}
.news-list ul {
list-style: none;
padding: 0;
margin: 0;
}
.news-list li {
margin-bottom: 0.8rem;
}
.news-list li:last-child {
margin-bottom: 0;
}
.news-list a {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.5rem;
border-radius: var(--radius-md);
transition: all 0.2s;
}
.news-list a:hover {
background: var(--bg-tertiary);
}
.news-list .news-title {
flex: 1;
margin-right: 1rem;
font-size: 0.95rem;
color: black;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.news-list .news-date {
font-size: 0.85rem;
color: var(--text-primary);
white-space: nowrap;
}
@media (max-width: 768px) {
.news-list a {
flex-direction: column;
}
}
</style>
</Layout>

View File

@ -0,0 +1,294 @@
---
import Layout from '../../layouts/Layout.astro';
import { newsDetail } from '../../../utils/rpc';
import { APP_NAME } from '../../config/app';
const { slug } = Astro.params;
if (!slug) {
return Astro.redirect('/404');
}
const {code, data} = await newsDetail(slug);
if (!data || code !== 0) {
return Astro.redirect('/404');
}
console.log(data)
---
<Layout title={APP_NAME + data.title} description={data.description} keywords={data.keywords}>
<main class="news-main">
<div class="news-container">
<article class="news-detail-content">
<h1 class="title" title="标题">{data.title}</h1>
<div class="news-meta">
<span class="news-date">发布日期: {data.created_at}</span>
<span class="news-author"><a href="/">作者: {APP_NAME}官方</a></span>
</div>
<div class="news-content" set:html={data.content}>
</div>
<div class="news-navigation">
{
data.prevNews && (
<div>
<span>上一篇: </span>
<a class="news-prev news-link" title={data.prevNews.title} href={`/news/${data.prevNews.id}`}>{data.prevNews.title}</a>
</div>
)
}
{
data.nextNews && (
<div>
<span>下一篇: </span>
<a class="news-next news-link" title={data.nextNews.title} href={`/news/${data.nextNews.id}`}>{data.nextNews.title}</a>
</div>
)
}
</div>
</article>
<aside class="news-sidebar">
<div class="related-news">
<h3>相关新闻</h3>
<ul>
{data.about.map(item => (
<li>
<a class="news-link" title={item.title} href={`/news/${item.id}`}>
<span class="related-title">{item.title}</span>
{/* <span class="related-date">{item.date}</span> */}
</a>
</li>
))}
</ul>
</div>
</aside>
</div>
</main>
<style is:inline>
.news-content img {
max-width: 100%;
height: auto;
}
</style>
<style>
.news-meta {
border-bottom: 1px solid var(--text-primary);
color: black;
padding-bottom: 1rem;
margin-bottom: 1rem;
}
.title {
font-size: 2.5rem;
text-align: center;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 1.5rem;
line-height: 1.4;
}
.news-meta {
display: flex;
justify-content: center;
gap: 2rem;
margin-bottom: 1.5rem;
}
.news-meta span{
color: var(--text-primary);
}
.news-date, .news-author {
color: rgba(255, 255, 255, 0.9);
font-size: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.news-author a {
color: black;
text-decoration: none;
}
/*
.news-date::before {
content: '📅';
}
.news-author::before {
content: '👤';
} */
.news-tags {
display: flex;
justify-content: center;
gap: 1rem;
flex-wrap: wrap;
}
.news-tag {
background: rgba(255, 255, 255, 0.15);
color: white;
padding: 0.3rem 1rem;
border-radius: var(--radius-md);
font-size: 0.9rem;
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
}
.news-tag:hover {
background: rgba(255, 255, 255, 0.25);
transform: translateY(-1px);
}
.news-container {
max-width: 1200px;
margin: -2rem auto 0;
/* padding: 0 1.5rem 3rem; */
display: grid;
grid-template-columns: 1fr 320px;
/* gap: 2.5rem; */
position: relative;
}
.news-detail-content {
border-right: 1px solid var(--text-primary);
padding: 3rem;
position: relative;
overflow: hidden;
}
.news-content {
font-size: 1.1rem;
line-height: 1.3;
}
.news-images {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.news-images img {
width: 100%;
height: auto;
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
transition: transform 0.3s ease;
}
.news-images img:hover {
transform: scale(1.02);
}
.news-content p {
margin-bottom: 1.8rem;
}
.news-content p:last-child {
margin-bottom: 0;
}
.news-navigation {
margin-top: 1rem;
padding-top: 2rem;
border-top: 1px solid var(--divider-color);
}
.news-sidebar {
position: sticky;
top: 2rem;
height: fit-content;
}
.related-news {
padding: 1rem;
/* box-shadow: var(--shadow-lg); */
}
.related-news h3 {
font-size: 1.2rem;
color: var(--text-primary);
margin-bottom: 1.5rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--text-primary);
}
.related-news ul {
list-style: none;
padding: 0;
margin: 0;
}
.related-news li {
/* margin-bottom: 1.2rem;
padding-bottom: 1.2rem; */
border-bottom: 1px solid var(--divider-color);
}
.related-news li:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
.related-news a {
display: flex;
flex-direction: column;
gap: 0.5rem;
text-decoration: none;
/* color: var(--text-secondary); */
/* color: black; */
transition: all 0.3s ease;
padding: 0.4rem;
border-radius: var(--radius-md);
}
.related-news a:hover {
transform: translateX(5px);
}
.related-title {
font-size: 1rem;
line-height: 1.5;
}
.related-date {
font-size: 0.9rem;
color: var(--text-tertiary);
}
@media (max-width: 1024px) {
.news-container {
grid-template-columns: 1fr;
margin-top: -1rem;
}
.news-sidebar {
position: static;
}
}
@media (max-width: 480px) {
.news-detail-content {
padding: 1.5rem;
border: none;
}
.news-share {
flex-wrap: wrap;
gap: 0.8rem;
}
.share-btn {
width: 100%;
text-align: center;
}
}
</style>
</Layout>

414
src/pages/product.astro Normal file
View File

@ -0,0 +1,414 @@
---
import Layout from '../layouts/Layout.astro';
import { APP_NAME } from '../config/app';
import { baiduLdjson } from '../../utils/ldjson';
import { formatDateTime } from '../../utils/date';
export const prerender = true;
// SEO meta tags
const title = `${APP_NAME} - 产品介绍`;
const description = '知识回声是一款专业的有声阅读学习应用,提供海量图书与精品课程,简洁界面与便捷操作,随时随地开启充实知识旅程,助您轻松成长与学习。';
const keywords = '知识回声介绍,知识回声是什么,知识回声的特点,知识回声平台';
const LDJSON = {
context: "https://ziyuan.baidu.com/contexts/cambrian.jsonld",
id: "https://www.zhishihuisheng.com/product",
appid: "",
title: title,
image: "https://www.zhishihuisheng.com/app-showcase.png",
pubDate: "2025-06-09T11:20:04",
updateDate: formatDateTime(),
description: description,
};
---
<Layout title={title} description={description} keywords={keywords}>
<main>
<section class="product-hero" aria-label="产品介绍">
<div class="container">
<h1>知识回声 - 您的知识成长伙伴</h1>
<p>随时随地,开启充实知识旅程</p>
<div class="cta-buttons">
<button class="cta-primary">
<a rel="nofollow" title="立即下载" href="https://sj.qq.com/appdetail/com.xjyk.balegjh" target="_blank">立即下载</a>
</button>
</div>
</div>
</section>
<section class="product-intro" aria-label="产品简介">
<div class="container">
<h2>什么是知识回声?</h2>
<div class="intro-content">
<div class="intro-text">
<p>知识回声是一款专业的阅读学习应用,致力于为用户提供优质的学习内容和便捷的阅读体验。我们汇聚了海量图书资源和精品课程,让您随时随地都能开启充实知识旅程。</p>
<p>为国内外用户提供免费正版小说、免费实用工具等。无需安装,一点即用,即用即走,给予用户最贴心周到的服务和最舒适的产品体验。</p>
<p>作为华为、vivo、OPPO等知名厂商的战略合作伙伴我们始终坚持"厂商满意、用户喜欢"的产品理念,为用户打造"便捷、安全可靠"的移动互联生态。</p>
</div>
<div class="intro-image">
<img src="/app-showcase.png" alt="知识回声海报" width="400" height="600" loading="lazy" />
</div>
</div>
</div>
</section>
<section class="user-experience" aria-label="用户体验">
<div class="container">
<h2>用户真实体验</h2>
<div class="experience-grid">
<article class="experience-card">
<div class="user-info">
<img src="/avatar_1.jpg" alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>李女士</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"界面设计非常简洁,操作很流畅。内容质量很高,每天都能学到新知识。"</p>
</article>
<article class="experience-card">
<div class="user-info">
<img src="/avatar_2.jpg" alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>张先生</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"推荐的内容很符合我的兴趣,学习效率提高了很多。客服响应也很及时。"</p>
</article>
<article class="experience-card">
<div class="user-info">
<img src="/avatar_3.jpg" alt="用户头像" width="50" height="50" loading="lazy" />
<div class="user-details">
<h3>王同学</h3>
<div class="rating">⭐⭐⭐⭐⭐</div>
</div>
</div>
<p>"课程内容很专业,老师讲解很清晰。功能很实用。"</p>
</article>
</div>
</div>
</section>
<section class="download-section" aria-label="下载体验">
<div class="container">
<h2>立即体验</h2>
<p>加入百万用户的学习之旅</p>
<div class="cta-buttons">
<button class="cta-primary">
<a rel="nofollow" title="立即下载" href="https://sj.qq.com/appdetail/com.xjyk.balegjh" target="_blank">立即下载</a>
</button>
</div>
</div>
</section>
</main>
<!-- 百度结构化数据 -->
<script type="application/ld+json" set:html={JSON.stringify({
"@context": LDJSON.context,
"@id": LDJSON.id,
"appid": LDJSON.appid,
"title": LDJSON.title,
"images": [LDJSON.image],
"pubDate": LDJSON.pubDate,
"Update": LDJSON.updateDate,
"description": LDJSON.description,
})}/>
</Layout>
<style>
.container h2 {
margin-left: 1.5rem;
}
.product-hero {
background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
color: white;
padding: 6rem 0;
text-align: center;
}
.product-hero h1 {
font-size: 3rem;
margin-bottom: 1.5rem;
}
.product-hero p {
font-size: 1.5rem;
opacity: 0.9;
margin-bottom: 2rem;
}
.cta-buttons {
display: flex;
justify-content: center;
gap: 1rem;
}
.cta-primary {
background: white;
color: var(--primary-color);
border: none;
padding: 1rem 2rem;
border-radius: 8px;
font-weight: 600;
font-size: 1.1rem;
cursor: pointer;
transition: all 0.3s ease;
}
.cta-primary:hover {
transform: translateY(-2px);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.cta-primary a {
text-decoration: none;
color: inherit;
}
.product-intro {
padding: 6rem 0;
/* background: var(--background-off-white); */
}
.intro-content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
max-width: 1200px;
margin: 0 auto;
}
.intro-text p {
font-size: 1.2rem;
line-height: 1.8;
color: var(--text-secondary);
margin-bottom: 1.5rem;
padding: 1rem 1.5rem 1rem 1.5rem;
}
.intro-image img {
width: 100%;
height: auto;
border-radius: 16px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.features-section {
padding: 6rem 0;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.feature-card {
background: white;
padding: 2rem;
border-radius: 16px;
text-align: center;
transition: all 0.3s ease;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.feature-card:hover {
transform: translateY(-10px);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
}
.feature-icon {
font-size: 3rem;
margin-bottom: 1.5rem;
}
.feature-card h3 {
font-size: 1.5rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.feature-card p {
color: var(--text-secondary);
line-height: 1.6;
}
.user-experience {
padding: 6rem 0;
}
.experience-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.experience-card {
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.user-info {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 1.5rem;
}
.user-info img {
width: 50px;
height: 50px;
border-radius: 50%;
object-fit: cover;
}
.user-details h3 {
font-size: 1.2rem;
color: var(--text-primary);
margin-bottom: 0.25rem;
}
.rating {
color: #fbbf24;
}
.experience-card p {
color: var(--text-secondary);
line-height: 1.6;
}
.faq-section {
padding: 6rem 0;
}
.faq-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
}
.faq-item {
background: white;
padding: 2rem;
border-radius: 16px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
}
.faq-item h3 {
font-size: 1.3rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.faq-item p {
color: var(--text-secondary);
line-height: 1.6;
}
.download-section {
padding: 6rem 0;
background: linear-gradient(135deg, var(--primary-color), var(--accent-color));
color: white;
text-align: center;
}
.download-section h2 {
font-size: 2.5rem;
margin-bottom: 1rem;
}
.download-section p {
font-size: 1.2rem;
opacity: 0.9;
margin-bottom: 2rem;
}
@media (max-width: 768px) {
.product-hero {
padding: 4rem 0;
}
.product-hero h1 {
font-size: 2.5rem;
}
.product-hero p {
font-size: 1.2rem;
}
.intro-content {
grid-template-columns: 1fr;
gap: 2rem;
}
.intro-text p {
font-size: 1.1rem;
}
.features-grid,
.experience-grid,
.faq-grid {
grid-template-columns: 1fr;
}
.download-section h2 {
font-size: 2rem;
}
}
@media (max-width: 480px) {
.product-hero {
padding: 3rem 0;
}
.product-hero h1 {
font-size: 2rem;
}
.product-hero p {
font-size: 1.1rem;
}
.cta-primary {
padding: 0.8rem 1.5rem;
font-size: 1rem;
}
.feature-card,
.experience-card,
.faq-item {
padding: 1.5rem;
}
.feature-icon {
font-size: 2.5rem;
}
.feature-card h3 {
font-size: 1.3rem;
}
.download-section {
padding: 4rem 0;
}
.download-section h2 {
font-size: 1.8rem;
}
.download-section p {
font-size: 1.1rem;
}
}
</style>

12
src/styles/global.css Normal file
View File

@ -0,0 +1,12 @@
.container {
padding: 0 1.5rem;
}
.news-link {
color: black;
text-decoration: none;
}
.news-link:hover {
color: var(--hover-color);
}

45
src/styles/theme.css Normal file
View File

@ -0,0 +1,45 @@
:root {
/* 主色调 */
--primary-color: #2563eb;
--primary-light: #3b82f6;
--primary-dark: #1d4ed8;
/* 背景色 */
--bg-primary: #ffffff;
--bg-secondary: #f8fafc;
--bg-tertiary: #f1f5f9;
/* 文字颜色 */
--text-primary: #1e293b;
--text-secondary: #475569;
--text-tertiary: #64748b;
/* 边框和分割线 */
--border-color: #e2e8f0;
--divider-color: #f1f5f9;
/* 状态颜色 */
--success-color: #10b981;
--warning-color: #f59e0b;
--error-color: #ef4444;
/* 渐变 */
--gradient-primary: linear-gradient(120deg, #3b82f6 0%, #2563eb 100%);
--gradient-light: linear-gradient(120deg, #f0f9ff 0%, #e0f2fe 100%);
/* 阴影 */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
/* 圆角 */
--radius-sm: 0.375rem;
--radius-md: 0.5rem;
--radius-lg: 0.75rem;
--radius-xl: 1rem;
--black-color: #000000;
--hover-color: #e63939;
}

5
tsconfig.json Normal file
View File

@ -0,0 +1,5 @@
{
"extends": "astro/tsconfigs/strict",
"include": [".astro/types.d.ts", "**/*"],
"exclude": ["dist"]
}

16
utils/date.ts Normal file
View File

@ -0,0 +1,16 @@
export function formatDateTime() {
const now = new Date();
// 获取年份、月份、日期、小时、分钟、秒数
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始需要加1
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
// 拼接成需要的格式
const formattedDateTime = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}`;
return formattedDateTime;
}

7
utils/ldjson.ts Normal file
View File

@ -0,0 +1,7 @@
export function baiduLdjson(json: any) {
return `
<script type="application/ld+json">
${JSON.stringify(json)}
</script>
`
}

76
utils/rpc-client.ts Normal file
View File

@ -0,0 +1,76 @@
import net from 'net'
interface JsonRpcRequest {
jsonrpc: '2.0'
method: string
params?: any
id: number
}
interface JsonRpcResponse {
jsonrpc: '2.0'
id: number
result?: any
error?: { code: number; message: string; data?: any }
context?: any
}
export class JsonRpcClient {
private host: string
private port: number
private timeout: number
constructor(host: string = '127.0.0.1', port: number = 9504, timeout = 1000) {
this.host = host
this.port = port
this.timeout = timeout
}
async call(method: string, params?: any): Promise<any> {
const req: JsonRpcRequest = {
jsonrpc: '2.0',
method,
params,
id: Date.now(),
}
const message = JSON.stringify(req) + '\n'
return new Promise((resolve, reject) => {
const client = new net.Socket()
let response = ''
client.setEncoding('utf-8')
const timer = setTimeout(() => {
client.destroy()
reject(new Error('RPC call timed out'))
}, this.timeout)
client.connect(this.port, this.host, () => {
client.write(message)
})
client.on('data', (data) => {
response += data.toString()
try {
const res: JsonRpcResponse = JSON.parse(response)
clearTimeout(timer)
client.end()
if (res.error) {
reject(new Error(res.error.message))
} else {
resolve(res.result)
}
} catch (e) {
// wait for more data
}
})
client.on('error', (err) => {
clearTimeout(timer)
reject(err)
})
})
}
}

69
utils/rpc.ts Normal file
View File

@ -0,0 +1,69 @@
import { JsonRpcClient } from './rpc-client.ts'
interface images {
src:string
}
interface result<T> {
code : number
message : string
data : T
}
interface data<T> {
page_title: string
page_module: T
}
function getRpcClient() {
return new JsonRpcClient('127.0.0.1', 9504)
}
// 新闻列表
export interface InewsIndex {
id: number
title: string
cover: string
keywords: string
description: string
content: string
created_at: string
updated_at: string
}
export async function newsIndex():Promise<result<InewsIndex[]>>{
const client = getRpcClient()
const result = await client.call('news/index', {})
return result
}
// 新闻详情
export interface InewsDetail {
title: string
keywords: string
description: string
content: string
created_at: string
updated_at: string
about: {
id: number
title: string
}[]
prevNews: {
id: number
title: string
}
nextNews: {
id: number
title: string
}
}
export async function newsDetail(id:string):Promise<result<InewsDetail>>{
const client = getRpcClient()
const result = await client.call('news/view', {
id:id
})
return result
}