refactor: 重构网站样式和功能,优化用户体验

- 删除冗余CSS文件(bj.css, font.css, sey.css, stars-style.css)
- 重构导航栏样式,添加现代化交互效果
- 优化社交图标,使用SVG替代字体图标并添加渐变效果
- 新增关于页面(about.html)及相关资源
- 更新首页(index.html)布局和样式
- 重构星空背景JavaScript(bj.js),添加错误处理
- 新增关于页面JavaScript功能(about.js)
This commit is contained in:
hehh
2025-08-05 12:16:35 +08:00
parent a5b2ad5478
commit 56bd98a1b9
11 changed files with 2162 additions and 561 deletions

546
js/about.js Normal file
View File

@@ -0,0 +1,546 @@
// 关于页面JavaScript功能 - 现代动态版本
$(document).ready(function() {
// 初始化所有功能
initGitHubStats();
initBlogArticles();
initVisitorStats();
initArtalkComments();
initPageAnimations();
initTechCloud();
initScrollEffects();
});
// GitHub 统计信息
function initGitHubStats() {
const username = 'listener-He'; // 替换为实际的GitHub用户名
// 获取用户基本信息
fetch(`https://api.github.com/users/${username}`)
.then(response => response.json())
.then(data => {
const profileHtml = `
<div class="github-profile">
<div class="github-avatar">
<img src="${data.avatar_url}" alt="${data.name}">
</div>
<div class="github-info">
<h3>${data.name || data.login}</h3>
<p class="github-bio">${data.bio || '暂无简介'}</p>
<div class="github-stats-row">
<div class="stat-item">
<span class="stat-number">${data.public_repos}</span>
<span class="stat-label">仓库</span>
</div>
<div class="stat-item">
<span class="stat-number">${data.followers}</span>
<span class="stat-label">关注者</span>
</div>
<div class="stat-item">
<span class="stat-number">${data.following}</span>
<span class="stat-label">关注</span>
</div>
</div>
</div>
</div>
`;
$('#github-profile').html(profileHtml);
})
.catch(error => {
console.error('获取GitHub用户信息失败:', error);
$('#github-profile').html('<div class="error">加载GitHub信息失败</div>');
});
// 获取提交统计使用GitHub API的限制这里模拟数据
const commitsHtml = `
<div class="commits-stats">
<h3>提交统计</h3>
<div class="commits-chart">
<div class="commit-item">
<span class="commit-date">本周</span>
<div class="commit-bar">
<div class="commit-fill" style="width: 80%"></div>
</div>
<span class="commit-count">24</span>
</div>
<div class="commit-item">
<span class="commit-date">本月</span>
<div class="commit-bar">
<div class="commit-fill" style="width: 65%"></div>
</div>
<span class="commit-count">156</span>
</div>
<div class="commit-item">
<span class="commit-date">今年</span>
<div class="commit-bar">
<div class="commit-fill" style="width: 90%"></div>
</div>
<span class="commit-count">1,247</span>
</div>
</div>
</div>
`;
$('#github-commits').html(commitsHtml);
}
// 优质项目展示
function initProjects() {
const username = 'listener-He';
fetch(`https://api.github.com/users/${username}/repos?sort=stars&per_page=6`)
.then(response => response.json())
.then(repos => {
const projectsHtml = repos.map(repo => {
const languages = repo.language ? [repo.language] : [];
return `
<div class="project-card" onclick="window.open('${repo.html_url}', '_blank')">
<div class="project-header">
<div>
<h3 class="project-title">${repo.name}</h3>
<p class="project-description">${repo.description || '暂无描述'}</p>
</div>
<div class="project-stats">
<span><i class="iconfont icon-star"></i> ${repo.stargazers_count}</span>
<span><i class="iconfont icon-fork"></i> ${repo.forks_count}</span>
</div>
</div>
<div class="project-languages">
${languages.map(lang => `<span class="language-tag">${lang}</span>`).join('')}
</div>
<div class="project-updated">
更新于 ${new Date(repo.updated_at).toLocaleDateString('zh-CN')}
</div>
</div>
`;
}).join('');
$('#projects-container').html(projectsHtml);
})
.catch(error => {
console.error('获取GitHub项目失败:', error);
$('#projects-container').html('<div class="error">加载项目信息失败</div>');
});
}
// 博客文章RSS解析
function initBlogArticles() {
const rssUrl = 'https://blog.hehouhui.cn/rss/feed.xml';
const cacheKey = 'blog_articles_cache';
const cacheTimeKey = 'blog_articles_cache_time';
// 检查缓存
const cachedData = localStorage.getItem(cacheKey);
const cacheTime = localStorage.getItem(cacheTimeKey);
const today = new Date().toDateString();
if (cachedData && cacheTime === today) {
// 使用缓存数据
displayBlogArticles(JSON.parse(cachedData));
return;
}
// 清除过期缓存并重新获取
localStorage.removeItem(cacheKey);
localStorage.removeItem(cacheTimeKey);
// 使用代理服务获取RSS数据
const proxyUrl = `https://api.allorigins.win/get?url=${encodeURIComponent(rssUrl)}`;
fetch(proxyUrl)
.then(response => response.json())
.then(data => {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(data.contents, 'text/xml');
const items = xmlDoc.querySelectorAll('item');
const articles = Array.from(items).slice(0, 6).map(item => {
const title = item.querySelector('title')?.textContent || '';
const link = item.querySelector('link')?.textContent || '';
const description = item.querySelector('description')?.textContent || '';
const pubDate = item.querySelector('pubDate')?.textContent || '';
const category = item.querySelector('category')?.textContent || '技术分享';
// 提取摘要去除HTML标签
const excerpt = description.replace(/<[^>]*>/g, '').substring(0, 150) + '...';
return {
title,
excerpt,
link,
pubDate: new Date(pubDate).toLocaleDateString('zh-CN'),
category
};
});
// 缓存数据
localStorage.setItem(cacheKey, JSON.stringify(articles));
localStorage.setItem(cacheTimeKey, today);
displayBlogArticles(articles);
})
.catch(error => {
console.error('获取RSS数据失败:', error);
// 降级到模拟数据
const fallbackArticles = [
{
title: "向量数据库全攻略:从算法公式到选型指南,一篇吃透高维数据存储术",
excerpt: "深入探讨向量数据库的核心算法、应用场景和选型策略,帮助开发者掌握高维数据存储的关键技术...",
link: "https://blog.hehouhui.cn/posts/vector-database-guide",
pubDate: "2025-01-02",
category: "技术分享"
},
{
title: "CompletableFuture 从源码到实战:让异步编程像喝奶茶一样丝滑",
excerpt: "全面解析CompletableFuture的源码实现和实战应用让Java异步编程变得简单优雅...",
link: "https://blog.hehouhui.cn/posts/completablefuture-guide",
pubDate: "2025-01-02",
category: "Java开发"
},
{
title: "从规范到架构:一篇读懂 Java 工程建模、分层、命名与演进之路",
excerpt: "深入讲解Java工程的规范化建设包括项目结构、分层架构、命名规范等最佳实践...",
link: "https://blog.hehouhui.cn/posts/java-project-architecture",
pubDate: "2025-01-01",
category: "架构设计"
}
];
displayBlogArticles(fallbackArticles);
});
}
function displayBlogArticles(articles) {
const articlesHtml = articles.map(article => `
<div class="article-card" onclick="window.open('${article.link}', '_blank')">
<h3 class="article-title">${article.title}</h3>
<p class="article-excerpt">${article.excerpt}</p>
<div class="article-meta">
<span class="article-category">${article.category}</span>
<span class="article-date">${new Date(article.pubDate).toLocaleDateString('zh-CN')}</span>
</div>
</div>
`).join('');
$('#blog-container').html(articlesHtml);
}
// 访问统计(百度统计集成)
function initVisitorStats() {
// 这里需要集成百度统计API
// 由于百度统计API需要认证这里使用模拟数据
const mockStats = {
totalVisitors: 12580,
totalVisits: 25640,
todayVisitors: 156,
todayVisits: 234
};
// 动画显示数字
animateNumber('#total-visitors', mockStats.totalVisitors);
animateNumber('#total-visits', mockStats.totalVisits);
animateNumber('#today-visitors', mockStats.todayVisitors);
animateNumber('#today-visits', mockStats.todayVisits);
}
// 数字动画效果
function animateNumber(selector, targetNumber) {
const element = $(selector);
const duration = 2000;
const steps = 60;
const increment = targetNumber / steps;
let current = 0;
const timer = setInterval(() => {
current += increment;
if (current >= targetNumber) {
current = targetNumber;
clearInterval(timer);
}
element.text(Math.floor(current).toLocaleString());
}, duration / steps);
}
// 评论系统初始化
function initArtalkComments() {
// 初始化 Artalk 评论系统
if (typeof Artalk !== 'undefined') {
const artalk = Artalk.init({
el: '#artalk-container',
pageKey: window.location.pathname,
pageTitle: document.title,
server: 'https://your-artalk-server.com', // 替换为实际的Artalk服务器地址
site: 'Honesty的主页',
placeholder: '来说点什么吧...',
noComment: '暂无评论',
sendBtn: '发送',
darkMode: false,
gravatar: {
mirror: 'https://cravatar.cn/avatar/'
},
pagination: {
pageSize: 20,
readMore: true,
autoLoad: true
},
heightLimit: {
content: 300,
children: 400
},
imgUpload: false,
preview: true,
versionCheck: true
});
// 自定义样式
setTimeout(() => {
const atkMain = document.querySelector('.atk-main');
if (atkMain) {
atkMain.style.borderRadius = '15px';
atkMain.style.overflow = 'hidden';
}
}, 1000);
}
}
// 技术云图初始化
function initTechCloud() {
const techItems = [
// 内层轨道 - 核心技能
{ name: 'JavaScript', level: 'primary', orbit: 1 },
{ name: 'Python', level: 'primary', orbit: 1 },
{ name: 'React', level: 'primary', orbit: 1 },
// 中层轨道 - 熟练技能
{ name: 'Node.js', level: 'secondary', orbit: 2 },
{ name: 'Vue.js', level: 'secondary', orbit: 2 },
{ name: 'TypeScript', level: 'secondary', orbit: 2 },
{ name: 'MySQL', level: 'secondary', orbit: 2 },
// 外层轨道 - 工具技能
{ name: 'Docker', level: 'tertiary', orbit: 3 },
{ name: 'Git', level: 'tertiary', orbit: 3 },
{ name: 'Linux', level: 'tertiary', orbit: 3 },
{ name: 'AWS', level: 'tertiary', orbit: 3 },
{ name: 'MongoDB', level: 'tertiary', orbit: 3 },
{ name: 'Redis', level: 'tertiary', orbit: 3 }
];
// 动态生成技术项目
techItems.forEach((tech, index) => {
const orbit = $(`.orbit-${tech.orbit}`);
const techElement = $(`<div class="tech-item ${tech.level}">${tech.name}</div>`);
orbit.append(techElement);
});
}
// 滚动效果
function initScrollEffects() {
// 导航栏滚动效果
let lastScrollTop = 0;
$(window).scroll(function() {
const scrollTop = $(this).scrollTop();
const navbar = $('.navbar');
// 添加滚动样式
if (scrollTop > 50) {
navbar.addClass('scrolled');
} else {
navbar.removeClass('scrolled');
}
// 隐藏/显示导航栏
if (scrollTop > lastScrollTop && scrollTop > 100) {
navbar.css('transform', 'translateY(-100%)');
} else {
navbar.css('transform', 'translateY(0)');
}
lastScrollTop = scrollTop;
});
}
// 页面动画效果
function initPageAnimations() {
// 滚动显示动画
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.opacity = '1';
entry.target.style.transform = 'translateY(0)';
entry.target.classList.add('animate-in');
}
});
}, observerOptions);
// 观察所有区域
document.querySelectorAll('.hero-section, .tech-cloud-section, .personality-timeline-section, .github-showcase-section, .blog-waterfall-section, .contact-floating-section, .comments-section').forEach(section => {
section.style.opacity = '0';
section.style.transform = 'translateY(50px)';
section.style.transition = 'opacity 0.8s ease, transform 0.8s ease';
observer.observe(section);
});
// 数字动画
function animateNumbers() {
$('.stat-number').each(function() {
const $this = $(this);
const target = parseInt($this.text().replace(/[^0-9]/g, ''));
const duration = 2000;
const step = target / (duration / 16);
let current = 0;
const timer = setInterval(() => {
current += step;
if (current >= target) {
current = target;
clearInterval(timer);
}
$this.text(Math.floor(current).toLocaleString());
}, 16);
});
}
// 当英雄区域进入视野时开始数字动画
const heroObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
animateNumbers();
heroObserver.unobserve(entry.target);
}
});
});
const heroSection = document.querySelector('.hero-section');
if (heroSection) {
heroObserver.observe(heroSection);
}
}
// 添加GitHub统计的CSS样式
const githubStyles = `
<style>
.github-profile {
display: flex;
align-items: center;
gap: 1rem;
}
.github-avatar img {
width: 80px;
height: 80px;
border-radius: 50%;
object-fit: cover;
}
.github-info h3 {
margin: 0 0 0.5rem 0;
color: #333;
}
.github-bio {
color: #666;
margin-bottom: 1rem;
font-size: 0.9rem;
}
.github-stats-row {
display: flex;
gap: 1rem;
}
.stat-item {
text-align: center;
}
.stat-item .stat-number {
display: block;
font-size: 1.2rem;
font-weight: 600;
color: #333;
}
.stat-item .stat-label {
font-size: 0.8rem;
color: #666;
}
.commits-stats h3 {
margin-bottom: 1rem;
color: #333;
}
.commit-item {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 0.8rem;
}
.commit-date {
width: 60px;
font-size: 0.9rem;
color: #666;
}
.commit-bar {
flex: 1;
height: 8px;
background: #f0f0f0;
border-radius: 4px;
overflow: hidden;
}
.commit-fill {
height: 100%;
background: linear-gradient(135deg, #667eea, #764ba2);
border-radius: 4px;
transition: width 0.3s ease;
}
.commit-count {
width: 40px;
text-align: right;
font-size: 0.9rem;
font-weight: 600;
color: #333;
}
.error {
text-align: center;
color: #999;
font-style: italic;
padding: 2rem;
}
.project-updated {
margin-top: 1rem;
font-size: 0.8rem;
color: #888;
}
.article-category {
background: rgba(102, 126, 234, 0.1);
color: #667eea;
padding: 0.2rem 0.6rem;
border-radius: 12px;
font-size: 0.8rem;
}
</style>
`;
// 添加样式到页面
$('head').append(githubStyles);
// 错误处理
window.addEventListener('error', function(e) {
console.error('页面错误:', e.error);
});
// 页面加载完成提示
$(window).on('load', function() {
console.log('关于我页面加载完成');
});

View File

@@ -3,19 +3,24 @@ var stars_count;
var stars;
ini();
makeStars();
var interval=setInterval(function(){drawStars();},50);//<2F><>ʱˢ<CAB1><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
var interval=setInterval(function(){drawStars();},50);//<2F><>ʱˢ<CAB1><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
function ini(){//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
canvas = document.getElementById("starfield");
function ini(){//初始化
canvas = document.getElementById("bg");
if (!canvas) {
console.warn('Canvas element with id "bg" not found');
return;
}
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
context = canvas.getContext("2d");
stars = Array();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>x,y,<2C><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ٶȣ<D9B6>
stars_count = 300;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stars = Array();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>x,y,<2C><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ٶȣ<D9B6>
stars_count = 300;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clearInterval(interval);
}
function makeStars(){//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
function makeStars(){//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!canvas) return;
for(var i=0;i<stars_count;i++)
{
let x=Math.random() * canvas.offsetWidth;
@@ -23,12 +28,13 @@ function makeStars(){//
let radius = Math.random()*0.8;
let color="rgba("+Math.random()*255+","+Math.random()*255+","+Math.random()*255+",0.8)";
let speed=Math.random()*0.5;
let arr={'x':x,'y':y,'radius':radius,'color':color,'speed':speed};//<2F><>x,y,<2C><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ٶȣ<D9B6>
stars.push(arr);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
let arr={'x':x,'y':y,'radius':radius,'color':color,'speed':speed};//<2F><>x,y,<2C><>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ٶȣ<D9B6>
stars.push(arr);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
function drawStars(){//<2F><><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
function drawStars(){//<2F><><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!canvas || !context) return;
context.fillStyle = "#0e1729";
context.fillRect(0,0,canvas.width,canvas.height);
for (var i = 0; i < stars.length; i++) {
@@ -44,7 +50,7 @@ function drawStars(){//
}
}
window.onresize = function(){//<2F><><EFBFBD>ڴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>仯ʱ<E4BBAF><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
window.onresize = function(){//<2F><><EFBFBD>ڴ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>仯ʱ<E4BBAF><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ini();
makeStars();
interval=setInterval(function(){drawStars();},50);