Skip to content

Commit b627dba

Browse files
committed
update
1 parent 760ad13 commit b627dba

4 files changed

Lines changed: 63 additions & 79 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
.DS_Store
1+
.DS_Store
2+
.claude/

assets/js/i18n.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// 首页 Hero
1515
'hero.title': 'OpenMOSS 团队',
1616
'hero.p1': 'OpenMOSS 团队由上海创智学院与复旦大学自然语言处理实验室、模思智能联合共建,探索以"产学研深度融合"为核心的创新发展模式。团队围绕大语言模型与智能体开展前沿研究,重点布局模型架构、评测体系与应用场景等方向,致力于打造开放协作、面向现实需求、具有持续影响力的AI创新成果。',
17-
'hero.p2': '团队在人工智能领域长期积累深厚,培养的学生先后赴 MIT、Harvard University、UW、UC Berkeley、CMU等世界顶尖高校深造,或加入SII、FDU、SJTU等高校任职,或加入 ByteDance、Alibaba、Tencent、AWS、Google、Microsoft、Optiver 等企业任职,亦有成员投身创新创业,累计孵化公司总估值已超过 50 亿元,形成了兼具学术活力与产业动能的创新生态。',
17+
'hero.p2': '团队在人工智能领域长期积累深厚,培养的学生先后赴 MIT、Harvard University、UW、UC Berkeley、CMU等世界顶尖高校深造,或加入SII、FDU、SJTU等高校任职,或加入 ByteDance、Alibaba、Tencent、AWS、Google、Microsoft、Optiver 等企业任职,亦有成员投身创新创业,累计孵化公司总估值已超过 100 亿元,形成了兼具学术活力与产业动能的创新生态。',
1818
'hero.btn.highlights': '最新亮点',
1919
'hero.btn.join': '加入我们',
2020

@@ -156,7 +156,7 @@
156156
// Hero
157157
'hero.title': 'OpenMOSS Team',
158158
'hero.p1': 'OpenMOSS Team is jointly established by Shanghai Innovation Institution (SII), Fudan University NLP Lab, and MOSI Intelligence, exploring an innovative development model centered on deep integration of industry, academia, and research. The team conducts cutting-edge research on large language models and AI agents, focusing on model architecture, evaluation systems, and application scenarios, committed to creating open, collaborative, and impactful AI innovations that address real-world needs.',
159-
'hero.p2': 'The team has accumulated extensive expertise in artificial intelligence. Our students have pursued advanced studies at world-renowned institutions such as MIT, Harvard University, UW, UC Berkeley, and CMU, joined universities including SII, FDU, and SJTU as faculty members, or work at leading companies like ByteDance, Alibaba, Tencent, AWS, Google, Microsoft, and Optiver. Some members have also embarked on entrepreneurial ventures, with incubated companies reaching a cumulative valuation of over 5 billion RMB, forming an innovative ecosystem that combines academic vitality with industrial momentum.',
159+
'hero.p2': 'The team has accumulated extensive expertise in artificial intelligence. Our students have pursued advanced studies at world-renowned institutions such as MIT, Harvard University, UW, UC Berkeley, and CMU, joined universities including SII, FDU, and SJTU as faculty members, or work at leading companies like ByteDance, Alibaba, Tencent, AWS, Google, Microsoft, and Optiver. Some members have also embarked on entrepreneurial ventures, with incubated companies reaching a cumulative valuation of over 10 billion RMB, forming an innovative ecosystem that combines academic vitality with industrial momentum.',
160160
'hero.btn.highlights': 'Highlights',
161161
'hero.btn.join': 'Join Us',
162162

assets/js/spa.js

Lines changed: 56 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111

1212
let currentLang = 'zh';
1313

14+
// 研究方向支柱(首页与研究页共用)
15+
const PILLARS = [
16+
{ key: 'reasoning', titleKey: 'pillar.reasoning.title', descKey: 'pillar.reasoning.desc' },
17+
{ key: 'multimodal', titleKey: 'pillar.multimodal.title', descKey: 'pillar.multimodal.desc' },
18+
{ key: 'embodied', titleKey: 'pillar.embodied.title', descKey: 'pillar.embodied.desc' },
19+
{ key: 'infra', titleKey: 'pillar.infra.title', descKey: 'pillar.infra.desc' },
20+
{ key: 'arch', titleKey: 'pillar.arch.title', descKey: 'pillar.arch.desc' },
21+
{ key: 'safety', titleKey: 'pillar.safety.title', descKey: 'pillar.safety.desc' }
22+
];
23+
1424
// 翻译辅助函数
1525
function t(key) {
1626
return window.t ? window.t(key, currentLang) : key;
@@ -174,49 +184,37 @@
174184

175185
// 处理特定页面的锚点跳转
176186
if (route === 'positions' && params.section) {
177-
setTimeout(() => {
178-
const target = document.getElementById(params.section);
179-
if (target) {
180-
const offset = 120; // 导航栏高度 + 额外间距
181-
const bodyRect = document.body.getBoundingClientRect().top;
182-
const elementRect = target.getBoundingClientRect().top;
183-
const elementPosition = elementRect - bodyRect;
184-
const offsetPosition = elementPosition - offset;
185-
window.scrollTo({ top: offsetPosition, behavior: 'smooth' });
186-
}
187-
}, 50);
187+
setTimeout(() => scrollToId(params.section, 120), 50);
188188
}
189189

190190
// 处理研究方向页面的滚动到最新亮点
191191
if (route === 'research' && params.scroll === 'highlights') {
192-
setTimeout(() => {
193-
const target = document.getElementById('research-highlights');
194-
if (target) {
195-
const offset = 100; // 导航栏高度 + 额外间距
196-
const bodyRect = document.body.getBoundingClientRect().top;
197-
const elementRect = target.getBoundingClientRect().top;
198-
const elementPosition = elementRect - bodyRect;
199-
const offsetPosition = elementPosition - offset;
200-
window.scrollTo({ top: offsetPosition, behavior: 'smooth' });
201-
}
202-
}, 50);
192+
setTimeout(() => scrollToId('research-highlights', 100), 50);
203193
}
204194
}
205195

206-
// 滚动到指定区域的函数(用于按钮点击)
207-
function scrollToSection(sectionId) {
208-
const target = document.getElementById(sectionId);
209-
if (target) {
210-
const offset = 120; // 导航栏高度 + 额外间距
211-
const bodyRect = document.body.getBoundingClientRect().top;
212-
const elementRect = target.getBoundingClientRect().top;
213-
const elementPosition = elementRect - bodyRect;
214-
const offsetPosition = elementPosition - offset;
215-
window.scrollTo({ top: offsetPosition, behavior: 'smooth' });
216-
}
196+
// 平滑滚动到指定元素(统一处理导航栏偏移,默认 100)
197+
function scrollToId(id, offset = 100) {
198+
const el = document.getElementById(id);
199+
if (!el) return;
200+
const top = el.getBoundingClientRect().top - document.body.getBoundingClientRect().top - offset;
201+
window.scrollTo({ top, behavior: 'smooth' });
202+
}
203+
204+
// 先切换路由,再滚动到目标元素(用于跨页跳转)
205+
function navigateAndScroll(route, id, offset = 100, delay = 100) {
206+
window.location.hash = route;
207+
setTimeout(() => scrollToId(id, offset), delay);
217208
}
218209

219-
// 将滚动函数暴露到全局作用域
210+
// 兼容按钮点击的滚动(导航栏偏移 120)
211+
function scrollToSection(id) {
212+
scrollToId(id, 120);
213+
}
214+
215+
// 将滚动函数暴露到全局作用域(供内联 onclick 调用)
216+
window.scrollToId = scrollToId;
217+
window.navigateAndScroll = navigateAndScroll;
220218
window.scrollToSection = scrollToSection;
221219

222220
function parseHash() {
@@ -260,28 +258,29 @@
260258
`;
261259
}
262260

263-
function renderHome() {
264-
const pillars = [
265-
{ key: 'reasoning', titleKey: 'pillar.reasoning.title', descKey: 'pillar.reasoning.desc' },
266-
{ key: 'multimodal', titleKey: 'pillar.multimodal.title', descKey: 'pillar.multimodal.desc' },
267-
{ key: 'embodied', titleKey: 'pillar.embodied.title', descKey: 'pillar.embodied.desc' },
268-
{ key: 'infra', titleKey: 'pillar.infra.title', descKey: 'pillar.infra.desc' },
269-
{ key: 'arch', titleKey: 'pillar.arch.title', descKey: 'pillar.arch.desc' },
270-
{ key: 'safety', titleKey: 'pillar.safety.title', descKey: 'pillar.safety.desc' }
271-
];
261+
// 渲染研究方向卡片网格;navigate=true 时先跳转到研究页再滚动到对应论文区块
262+
function renderPillarsGrid(navigate) {
263+
return `
264+
<div class="pillars-grid">
265+
${PILLARS.map(p => {
266+
const onclick = navigate
267+
? `navigateAndScroll('research', 'pub-${p.key}')`
268+
: `scrollToId('pub-${p.key}')`;
269+
return `
270+
<article class="pillar-card pillar-card-clickable" onclick="${onclick}">
271+
<h3>${t(p.titleKey)}</h3>
272+
<p>${t(p.descKey)}</p>
273+
</article>`;
274+
}).join('')}
275+
</div>`;
276+
}
272277

278+
function renderHome() {
273279
return `
274280
${renderHero()}
275281
<section class="container sec">
276282
<h2>${t('research.title')}</h2>
277-
<div class="pillars-grid">
278-
${pillars.map(p => `
279-
<article class="pillar-card pillar-card-clickable" onclick="window.location.hash = 'research'; setTimeout(() => { const el = document.getElementById('pub-${p.key}'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } }, 100);">
280-
<h3>${t(p.titleKey)}</h3>
281-
<p>${t(p.descKey)}</p>
282-
</article>
283-
`).join('')}
284-
</div>
283+
${renderPillarsGrid(true)}
285284
</section>
286285
<section class="container sec">
287286
<h2>${t('people.title')}</h2>
@@ -312,14 +311,14 @@
312311
<p>${t('resources.highlight.tools.desc')}</p>
313312
<div class="hero-actions" style="margin-top: auto; width: 100%;">
314313
<a class="btn btn-outline" href="https://github.com/OpenMOSS" target="_blank">${t('resources.highlight.tools.btn1')}</a>
315-
<a class="btn btn-outline" href="javascript:void(0)" onclick="window.location.hash='resources'; setTimeout(() => { const el = document.getElementById('projects'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } }, 200);">${t('resources.highlight.tools.btn2')}</a>
314+
<a class="btn btn-outline" href="javascript:void(0)" onclick="navigateAndScroll('resources', 'projects', 100, 200)">${t('resources.highlight.tools.btn2')}</a>
316315
</div>
317316
</article>
318317
<article class="people-card">
319318
<h3>${t('resources.highlight.courses.title')}</h3>
320319
<p>${t('resources.highlight.courses.desc')}</p>
321320
<div class="hero-actions" style="margin-top: auto; width: 100%;">
322-
<a class="btn btn-outline" href="javascript:void(0)" onclick="window.location.hash='resources'; setTimeout(() => { const el = document.getElementById('courses'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } }, 200);">${t('resources.highlight.courses.btn')}</a>
321+
<a class="btn btn-outline" href="javascript:void(0)" onclick="navigateAndScroll('resources', 'courses', 100, 200)">${t('resources.highlight.courses.btn')}</a>
323322
</div>
324323
</article>
325324
</div>
@@ -338,7 +337,7 @@
338337
];
339338

340339
const tocLinks = sections.map(sec =>
341-
`<a href="javascript:void(0)" onclick="const el = document.getElementById('${sec.id}'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } return false;">${t(sec.titleKey)}</a>`
340+
`<a href="javascript:void(0)" onclick="scrollToId('${sec.id}'); return false;">${t(sec.titleKey)}</a>`
342341
).join('');
343342

344343
return `
@@ -410,7 +409,7 @@
410409
];
411410

412411
const tocLinks = categories.map(cat =>
413-
`<a href="javascript:void(0)" onclick="const el = document.getElementById('${cat.id}'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } return false;">${t(cat.titleKey)}</a>`
412+
`<a href="javascript:void(0)" onclick="scrollToId('${cat.id}'); return false;">${t(cat.titleKey)}</a>`
414413
).join('');
415414

416415
return `
@@ -459,15 +458,6 @@
459458
}
460459

461460
function renderResearch() {
462-
const pillars = [
463-
{ key: 'reasoning', titleKey: 'pillar.reasoning.title', descKey: 'pillar.reasoning.desc' },
464-
{ key: 'multimodal', titleKey: 'pillar.multimodal.title', descKey: 'pillar.multimodal.desc' },
465-
{ key: 'embodied', titleKey: 'pillar.embodied.title', descKey: 'pillar.embodied.desc' },
466-
{ key: 'infra', titleKey: 'pillar.infra.title', descKey: 'pillar.infra.desc' },
467-
{ key: 'arch', titleKey: 'pillar.arch.title', descKey: 'pillar.arch.desc' },
468-
{ key: 'safety', titleKey: 'pillar.safety.title', descKey: 'pillar.safety.desc' }
469-
];
470-
471461
// 从 SPA_DATA 获取最新亮点内容,并处理多语言
472462
const highlights = (SPA_DATA.highlights || []).map(h => ({
473463
title: typeof h.title === 'object' ? (h.title[currentLang] || h.title.zh) : h.title,
@@ -482,14 +472,7 @@
482472
<h1>${t('research.title')}</h1>
483473
<p>${t('research.intro')}</p>
484474
</div>
485-
<div class="pillars-grid">
486-
${pillars.map(p => `
487-
<article class="pillar-card pillar-card-clickable" onclick="const el = document.getElementById('pub-${p.key}'); if(el) { const offset = 100; const bodyRect = document.body.getBoundingClientRect().top; const elementRect = el.getBoundingClientRect().top; const elementPosition = elementRect - bodyRect; const offsetPosition = elementPosition - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); }">
488-
<h3>${t(p.titleKey)}</h3>
489-
<p>${t(p.descKey)}</p>
490-
</article>
491-
`).join('')}
492-
</div>
475+
${renderPillarsGrid(false)}
493476
</section>
494477
495478
<section class="container sec" id="research-highlights">
@@ -509,7 +492,7 @@
509492
510493
<section class="container sec">
511494
<h2>${t('research.publications.title')}</h2>
512-
${pillars.map(p => {
495+
${PILLARS.map(p => {
513496
const pubs = SPA_DATA.publications[p.key] || [];
514497
return `
515498
<div id="pub-${p.key}" class="publication-section">

index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
<body>
1717
<div id="app"></div>
1818

19-
<script src="/assets/js/i18n.js?v=20260603b"></script>
20-
<script src="/assets/js/content-data.js?v=20260603b"></script>
21-
<script src="/assets/js/team-data.js?v=20260603b"></script> <script src="/assets/js/spa.js?v=20260603b"></script>
19+
<script src="/assets/js/i18n.js?v=20260603c"></script>
20+
<script src="/assets/js/content-data.js?v=20260603c"></script>
21+
<script src="/assets/js/team-data.js?v=20260603c"></script> <script src="/assets/js/spa.js?v=20260603c"></script>
2222
</body>
2323
</html>

0 commit comments

Comments
 (0)