Skip to content

Commit 352dbee

Browse files
committed
docs: update projects
1 parent f8cf5da commit 352dbee

21 files changed

Lines changed: 525 additions & 233 deletions
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
import SectionIntro from "./SectionIntro.astro";
3+
import { withBase } from "../utils/base";
4+
5+
interface ExploreCard {
6+
tag: string;
7+
title: string;
8+
description: string;
9+
meta: string;
10+
href: string;
11+
}
12+
13+
interface Intro {
14+
eyebrow: string;
15+
title: string;
16+
description: string;
17+
className?: string;
18+
}
19+
20+
interface Props {
21+
intro: Intro;
22+
cards: ExploreCard[];
23+
blogCount: number;
24+
}
25+
26+
const { intro, cards, blogCount } = Astro.props;
27+
---
28+
29+
<section class="content-section">
30+
<SectionIntro
31+
eyebrow={intro.eyebrow}
32+
title={intro.title}
33+
description={intro.description}
34+
className={intro.className}
35+
/>
36+
<div class="card-grid explore-grid">
37+
{
38+
cards.map((card) => (
39+
<article class="card">
40+
<span class="card-tag">{card.tag}</span>
41+
<h3>{card.title}</h3>
42+
<p>{card.description}</p>
43+
<div class="card-meta">
44+
<span>{card.meta === "blog_count" ? `${blogCount} 篇内容` : card.meta}</span>
45+
<a class="card-link" href={withBase(card.href)}>打开</a>
46+
</div>
47+
</article>
48+
))
49+
}
50+
</div>
51+
</section>

src/components/PageHero.astro

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
interface HeroPanel {
3+
tag: string;
4+
title: string;
5+
description: string;
6+
}
7+
8+
interface Props {
9+
eyebrow: string;
10+
title: string;
11+
description: string;
12+
themeClass?: string;
13+
panel?: HeroPanel;
14+
}
15+
16+
const { eyebrow, title, description, themeClass = "", panel } = Astro.props;
17+
const panelClass = themeClass ? `page-hero-panel-${themeClass.replace("page-hero-", "")}` : "";
18+
---
19+
20+
<section class:list={["page-hero", themeClass, !panel && "page-hero-single"]}>
21+
<div>
22+
<p class="eyebrow">{eyebrow}</p>
23+
<h1>{title}</h1>
24+
<p>{description}</p>
25+
</div>
26+
{
27+
panel && (
28+
<div class:list={["page-hero-panel", panelClass]}>
29+
<span>{panel.tag}</span>
30+
<strong>{panel.title}</strong>
31+
<p>{panel.description}</p>
32+
</div>
33+
)
34+
}
35+
</section>
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
import DynamicProjectsGrid from "./DynamicProjectsGrid.astro";
3+
import SectionIntro from "./SectionIntro.astro";
4+
import { withBase } from "../utils/base";
5+
6+
interface Project {
7+
name: string;
8+
stars: string;
9+
repo: string;
10+
category: string;
11+
summary: string;
12+
href: string;
13+
}
14+
15+
interface ActionLink {
16+
label: string;
17+
href: string;
18+
external?: boolean;
19+
}
20+
21+
interface Props {
22+
projects: Project[];
23+
limit: number;
24+
eyebrow: string;
25+
title: string;
26+
description: string;
27+
actions?: ActionLink[];
28+
}
29+
30+
const { projects, limit, eyebrow, title, description, actions = [] } = Astro.props;
31+
---
32+
33+
<section class="content-section">
34+
<SectionIntro eyebrow={eyebrow} title={title} description={description} />
35+
{
36+
actions.length > 0 && (
37+
<div class:list={["section-actions", actions.length > 1 && "section-actions-dual"]}>
38+
{actions.map((action) => (
39+
<a
40+
class="button button-secondary"
41+
href={action.external ? action.href : withBase(action.href)}
42+
target={action.external ? "_blank" : undefined}
43+
rel={action.external ? "noreferrer" : undefined}
44+
>
45+
{action.label}
46+
</a>
47+
))}
48+
</div>
49+
)
50+
}
51+
<DynamicProjectsGrid projects={projects} limit={limit} />
52+
</section>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
interface SignalItem {
3+
tag: string;
4+
description: string;
5+
accent?: boolean;
6+
}
7+
8+
interface Copy {
9+
eyebrow: string;
10+
title: string;
11+
description: string;
12+
}
13+
14+
interface Props {
15+
copy: Copy;
16+
items: SignalItem[];
17+
}
18+
19+
const { copy, items } = Astro.props;
20+
---
21+
22+
<section class="content-section content-band">
23+
<div class="home-signal">
24+
<div class="signal-copy">
25+
<p class="eyebrow">{copy.eyebrow}</p>
26+
<h2>{copy.title}</h2>
27+
<p>{copy.description}</p>
28+
</div>
29+
<div class="signal-grid">
30+
{
31+
items.map((item) => (
32+
<article class:list={["signal-card", item.accent && "signal-card-accent"]}>
33+
<span>{item.tag}</span>
34+
<p>{item.description}</p>
35+
</article>
36+
))
37+
}
38+
</div>
39+
</div>
40+
</section>

src/components/StatsSection.astro

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
---
2+
import SectionIntro from "./SectionIntro.astro";
3+
4+
interface StatItem {
5+
label: string;
6+
value: string;
7+
description: string;
8+
}
9+
10+
interface Intro {
11+
eyebrow: string;
12+
title: string;
13+
description: string;
14+
}
15+
16+
interface Props {
17+
intro: Intro;
18+
items: StatItem[];
19+
}
20+
21+
const { intro, items } = Astro.props;
22+
---
23+
24+
<section class="content-section">
25+
<SectionIntro eyebrow={intro.eyebrow} title={intro.title} description={intro.description} />
26+
<div class="stats-grid">
27+
{
28+
items.map((item) => (
29+
<article class="stat-card">
30+
<span class="stat-label">{item.label}</span>
31+
<strong>{item.value}</strong>
32+
<p>{item.description}</p>
33+
</article>
34+
))
35+
}
36+
</div>
37+
</section>

src/data/blog.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
export const blogPageHero = {
2+
eyebrow: "社区博客",
3+
title: "记录开源协作,也记录工程落地。",
4+
description:
5+
"这里汇集 RapidAI 的公告、经验文章与社区内容,保持中文表达与清晰的信息层次。",
6+
panel: {
7+
tag: "内容方向",
8+
title: "公告、经验与协作内容统一归档",
9+
description:
10+
"博客承担官网内容中枢,首页只做入口预览,列表页和分页页共用同一套说明与结构。"
11+
}
12+
};
13+
14+
export const blogSections = {
15+
latest: {
16+
eyebrow: "近期文章",
17+
title: "近期文章",
18+
description: "现有内容来自原始文档仓库,已经整理成官网中的独立文章入口。"
19+
},
20+
paged: {
21+
eyebrow: "近期文章",
22+
title: "近期文章",
23+
description: "文章列表支持分页展示,后续内容增多时无需调整页面结构。"
24+
}
25+
};

src/data/community.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1+
export const membersPageHero = {
2+
eyebrow: "成员与加入",
3+
title: "把认同工程价值的人聚在一起。",
4+
description:
5+
"RapidAI 欢迎愿意长期投入开源、工程与社区建设的伙伴。不局限于 AI 研发,也包括前端、后端、设计与运营。",
6+
panel: {
7+
tag: "社区信号",
8+
title: "公开成员与加入方式统一展示",
9+
description:
10+
"成员结构、角色分组和加入入口现在都在同一页维护,帮助新协作者快速判断是否匹配 RapidAI 的协作节奏。"
11+
}
12+
};
13+
14+
export const membersSections = {
15+
directory: {
16+
eyebrow: "公开成员",
17+
title: "社区成员",
18+
description:
19+
"这里直接读取本地成员配置,并按角色分组展示。后续成员数量增加后,页面结构仍然保持稳定。"
20+
},
21+
join: {
22+
eyebrow: "加入方式",
23+
title: "加入我们,需要什么能力?",
24+
description: "原始文档中的加入要求、申请方式和社区入口已经整理为统一卡片。"
25+
}
26+
};
27+
128
export const joinCards = [
229
{
330
tag: "要求",

src/data/home.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,38 @@ export const homeHero = {
3131
panelFoot: "围绕 OCR、ASR、文档智能与知识问答持续建设可复用的工程资产。"
3232
};
3333

34+
export const homeSections = {
35+
positioning: {
36+
eyebrow: "组织定位",
37+
title: "做最后一公里,而不是停在演示。",
38+
description:
39+
"我们希望搭建 AI 模型从学术界到工程界之间的桥梁。重点不是重复训练模型,而是让模型在真实系统里被部署、被维护、被持续使用。"
40+
},
41+
signal: {
42+
eyebrow: "为什么是 RapidAI",
43+
title: "不是再造一个模型,而是把能力接进系统。",
44+
description:
45+
"RapidAI 关注推理、部署、接口封装、跨平台兼容和持续维护。我们希望每一个项目都能从实验结果变成可以复用的工程资产。"
46+
},
47+
research: {
48+
eyebrow: "研究院",
49+
title: "研究院负责承接学术协作与论文训练。",
50+
description:
51+
"如果项目页强调工程落地,那么研究院页面承担的是研究训练、论文合作、访问学生招募、长期学术交流与成果展示。",
52+
action: {
53+
label: "查看研究院",
54+
href: "/research"
55+
}
56+
},
57+
explore: {
58+
eyebrow: "站点结构",
59+
title: "五个栏目,分别承接研究、项目、内容与社区。",
60+
description:
61+
"每个栏目都拥有独立页面,用于展示 RapidAI 的项目矩阵、博客文章、成员协作与近期动态。",
62+
className: "section-intro-wide"
63+
}
64+
};
65+
3466
export const homeStats = [
3567
{
3668
label: "方向",
@@ -50,7 +82,7 @@ export const homeStats = [
5082
{
5183
label: "方法",
5284
value: "交付",
53-
description: "追求简洁有效、开箱即用、面向业务而非仅面向演示。"
85+
description: "追求简洁有效、开箱即用、面向业务而非只面向演示。"
5486
}
5587
];
5688

@@ -102,7 +134,7 @@ export const homeExploreCards = [
102134
{
103135
tag: "研究院",
104136
title: "研究院与论文",
105-
description: "查看研究院概述、访问学生招募、团队信息,以及研究成果与论文列表。",
137+
description: "查看研究院概览、访问学生招募、团队信息,以及研究成果与论文列表。",
106138
meta: "独立页面",
107139
href: "/research"
108140
}

src/data/projects.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,37 @@ export interface ProjectConfig {
77
href: string;
88
}
99

10+
export const projectsPageHero = {
11+
eyebrow: "项目矩阵",
12+
title: "一组真正能被拿去落地的 AI 工具。",
13+
description:
14+
"RapidAI 的项目覆盖 OCR、ASR、文档理解、知识问答与数据处理。重点始终不是“功能很多”,而是“接起来就能用”。",
15+
panelTag: "维护方式",
16+
panelTitle: "首页精选与项目页列表已统一",
17+
panelDescription:
18+
"项目卡片、排序逻辑和说明文案都集中在同一套配置里维护。首页只做精选预览,项目页负责完整展开。"
19+
};
20+
21+
export const projectsSectionIntro = {
22+
eyebrow: "项目列表",
23+
title: "项目矩阵",
24+
description:
25+
"这里动态展示 RapidAI 当前公开仓库中按收藏数排序的项目。首页与项目页现在共用同一套项目入口,只是展示数量不同。"
26+
};
27+
28+
export const projectsSectionActions = {
29+
browseAll: {
30+
label: "查看全部项目",
31+
href: "https://github.com/orgs/RapidAI/repositories",
32+
external: true
33+
},
34+
openProjectsPage: {
35+
label: "打开项目页",
36+
href: "/projects",
37+
external: false
38+
}
39+
};
40+
1041
export const projectCards: ProjectConfig[] = [
1142
{
1243
name: "RapidOCR",

src/data/publications.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const publications: PublicationItem[] = [
2828
year: "2026",
2929
type: "占位条目",
3030
summary:
31-
"当前仓库还没有正式的论文数据源,这里先把论文卡片结构搭好。后续新增论文时,直接在 src/data/publications.ts 中追加一个对象即可。",
31+
"当前仓库还没有正式的论文数据源,这里先把论文卡片结构搭好。后续新增论文时,直接在 src/data/publications.ts 中追加对象即可。",
3232
links: [
3333
{
3434
label: "研究院总览",
@@ -37,3 +37,11 @@ export const publications: PublicationItem[] = [
3737
]
3838
}
3939
];
40+
41+
export const publicationsRedirectPage = {
42+
eyebrow: "论文与成果",
43+
title: "论文展示已并入研究院页面。",
44+
description:
45+
"研究论文、预印本和技术成果已经统一归档到研究院页面。如果浏览器没有自动跳转,可以使用下面的入口手动打开。",
46+
actionLabel: "打开研究院论文部分"
47+
};

0 commit comments

Comments
 (0)