init: TEALab 2025 实验室网站项目
从百度网盘 /apps/bypy/dofile/ 下载的完整项目结构,包含: - dofile/: Flask 后端(端口 5000)+ 静态前端(端口 6002) - officefile/: 项目相关文档 - .gitignore: Python venv / 日志 / 缓存 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
// Search Functionality
|
||||
|
||||
// Search data structure (in production, this would come from a server)
|
||||
const searchData = {
|
||||
pages: [
|
||||
{ title: '关于实验室', url: 'website.html#about', content: 'DAEL Design AI Ecology Lab 跨学科研究平台' },
|
||||
{ title: '研究方向', url: 'website.html#research', content: '生成式生态学 生物启发式智能 数字可持续性' },
|
||||
{ title: '研究团队', url: 'website.html#team', content: 'Dr. Lin Chen Sarah Wu James Zhao Yu Zhang' },
|
||||
{ title: '新闻资讯', url: 'news.html', content: '最新资讯 最新文章 热点文章' },
|
||||
{ title: '成果展示', url: 'publications.html', content: '专著教材 文章目录 软件开发 学位论文' },
|
||||
{ title: '资源下载', url: 'resources.html', content: '软件下载 资料下载 开源代码' },
|
||||
{ title: '学术资料', url: 'academic.html', content: '软件使用 教程 文档' }
|
||||
],
|
||||
news: [],
|
||||
publications: [],
|
||||
resources: []
|
||||
};
|
||||
|
||||
// Simple search function
|
||||
function performSearch(query) {
|
||||
if (!query || query.trim().length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const lowerQuery = query.toLowerCase().trim();
|
||||
const results = [];
|
||||
|
||||
// Search in pages
|
||||
searchData.pages.forEach(page => {
|
||||
const titleMatch = page.title.toLowerCase().includes(lowerQuery);
|
||||
const contentMatch = page.content.toLowerCase().includes(lowerQuery);
|
||||
|
||||
if (titleMatch || contentMatch) {
|
||||
results.push({
|
||||
type: 'page',
|
||||
title: page.title,
|
||||
url: page.url,
|
||||
snippet: page.content.substring(0, 100) + '...'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
// Initialize search
|
||||
function initSearch() {
|
||||
const searchInput = document.getElementById('search-input');
|
||||
const searchResults = document.getElementById('search-results');
|
||||
const searchForm = document.getElementById('search-form');
|
||||
|
||||
if (!searchInput || !searchResults) return;
|
||||
|
||||
// Real-time search
|
||||
let searchTimeout;
|
||||
searchInput.addEventListener('input', (e) => {
|
||||
clearTimeout(searchTimeout);
|
||||
const query = e.target.value.trim();
|
||||
|
||||
if (query.length === 0) {
|
||||
searchResults.classList.remove('active');
|
||||
searchResults.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
searchTimeout = setTimeout(() => {
|
||||
const results = performSearch(query);
|
||||
displaySearchResults(results, searchResults);
|
||||
}, 300);
|
||||
});
|
||||
|
||||
// Handle form submission
|
||||
if (searchForm) {
|
||||
searchForm.addEventListener('submit', (e) => {
|
||||
e.preventDefault();
|
||||
const query = searchInput.value.trim();
|
||||
if (query) {
|
||||
window.location.href = `search.html?q=${encodeURIComponent(query)}`;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Close search results when clicking outside
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!searchInput.contains(e.target) && !searchResults.contains(e.target)) {
|
||||
searchResults.classList.remove('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Display search results
|
||||
function displaySearchResults(results, container) {
|
||||
if (results.length === 0) {
|
||||
container.innerHTML = '<div class="search-result-item text-gray-500 text-center py-4">未找到相关结果</div>';
|
||||
container.classList.add('active');
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = results.map(result => `
|
||||
<a href="${result.url}" class="search-result-item block">
|
||||
<div class="font-semibold text-sm mb-1">${result.title}</div>
|
||||
<div class="text-xs text-gray-500">${result.snippet}</div>
|
||||
</a>
|
||||
`).join('');
|
||||
|
||||
container.classList.add('active');
|
||||
}
|
||||
|
||||
// Get search query from URL
|
||||
function getSearchQuery() {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
return params.get('q') || '';
|
||||
}
|
||||
|
||||
// Initialize on page load
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
initSearch();
|
||||
|
||||
// If on search page, perform search
|
||||
if (window.location.pathname.includes('search.html')) {
|
||||
const query = getSearchQuery();
|
||||
const searchInput = document.getElementById('search-input');
|
||||
const resultsContainer = document.getElementById('search-results-container');
|
||||
|
||||
if (query && searchInput) {
|
||||
searchInput.value = query;
|
||||
}
|
||||
|
||||
if (query && resultsContainer) {
|
||||
const results = performSearch(query);
|
||||
displaySearchResults(results, resultsContainer);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user