a3eb5c7b2d
从百度网盘 /apps/bypy/dofile/ 下载的完整项目结构,包含: - dofile/: Flask 后端(端口 5000)+ 静态前端(端口 6002) - officefile/: 项目相关文档 - .gitignore: Python venv / 日志 / 缓存 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
145 lines
4.5 KiB
JavaScript
145 lines
4.5 KiB
JavaScript
// 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);
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|