普通视图

发现新文章,点击刷新页面。
昨天 — 2025年1月30日游钓四方的博客
  • ✇游钓四方的博客
  • Blog Function Update 2025 (1)游钓四方的博客
    由于郑州最近的雨夹雪天气,已经一周没有骑行了,实在憋得不行,给自己找点事做,今天中午下班时更新了一下博客 Update details 修复了柱形图显示错位 移除了骑行页面的活动天数 新增了全年骑行总时长、全年骑行总公里数 柱形图的宽度不再由骑行时长来计算,而是由骑行公里数来计算显示 新增春节快乐红灯笼(移动端不支持) 移除 node-sass 包,由 sass 代替 Fix Bugs:柱形图显示错位 当前的柱形图仅为有骑行数据的周生成柱形图,导致柱形图与日历中的周对齐错位,所以即某周没有骑行数据时,柱形图也要生成一根柱子 function generateBarChart() { const barChartElement = document.getElementById('barChart'); // 清空柱形图内容 barChartElement.innerHTML = ''; const today = getChinaTime(); const startDate = getStartDate(
     

Blog Function Update 2025 (1)

2025年1月26日 00:10

由于郑州最近的雨夹雪天气,已经一周没有骑行了,实在憋得不行,给自己找点事做,今天中午下班时更新了一下博客

Update details

  • 修复了柱形图显示错位
  • 移除了骑行页面的活动天数
  • 新增了全年骑行总时长、全年骑行总公里数
  • 柱形图的宽度不再由骑行时长来计算,而是由骑行公里数来计算显示
  • 新增春节快乐红灯笼(移动端不支持)
  • 移除 node-sass 包,由 sass 代替

Fix Bugs:柱形图显示错位

当前的柱形图仅为有骑行数据的周生成柱形图,导致柱形图与日历中的周对齐错位,所以即某周没有骑行数据时,柱形图也要生成一根柱子

function generateBarChart() {
    const barChartElement = document.getElementById('barChart');
    // 清空柱形图内容
    barChartElement.innerHTML = '';

    const today = getChinaTime();
    const startDate = getStartDate(today, 21);

    // 创建所有周的时间范围
    const weeklyData = {};
    let currentWeekStart = new Date(startDate);
    currentWeekStart.setUTCHours(0, 0, 0, 0);

    // 按周计算未来 4 周的日期范围
    for (let i = 0; i < 4; i++) {
        const weekStart = new Date(currentWeekStart);
        const weekEnd = new Date(weekStart);
        // 一周结束日期为开始日期 +6 天
        weekEnd.setUTCDate(weekStart.getUTCDate() + 6);
        const weekKey = `${weekStart.toISOString().split('T')[0]} - ${weekEnd.toISOString().split('T')[0]}`;

        // 初始化每周骑行数据为 0
        weeklyData[weekKey] = 0;
        // 移动到下一周
        currentWeekStart.setUTCDate(currentWeekStart.getUTCDate() + 7);
    }

    // 累加每周的骑行距离
    processedActivities.forEach(activity => {
        const activityDate = new Date(activity.activity_time);
        // 活动所在周的开始日期
        const weekStart = getWeekStartDate(activityDate);
        const weekEnd = new Date(weekStart);
        weekEnd.setUTCDate(weekStart.getUTCDate() + 6);

        const weekKey = `${weekStart.toISOString().split('T')[0]} - ${weekEnd.toISOString().split('T')[0]}`;
        if (weeklyData[weekKey] !== undefined) {
            weeklyData[weekKey] += parseFloat(activity.riding_distance);
        }
    });

    // 获取最大骑行距离(用于柱形图比例)
    const maxDistance = Math.max(...Object.values(weeklyData), 0);

    // 创建并显示每周的柱形图
    Object.keys(weeklyData).forEach(week => {
        // 当前周的骑行距离
        const distance = weeklyData[week];
        const barContainer = document.createElement('div');
        barContainer.className = 'bar-container';

        const bar = document.createElement('div');
        bar.className = 'bar';

        // 计算柱形图的宽度
        const width = maxDistance > 0 ? (distance / maxDistance) * 190 : 0;
        bar.style.setProperty('--bar-width', `${width}px`);

        const distanceText = document.createElement('div');
        distanceText.className = 'cycling-kilometer';
        distanceText.innerText = '0 km';

        const messageBox = createMessageBox();
        const clickMessageBox = createMessageBox();

        barContainer.style.position = 'relative';
        bar.appendChild(distanceText);
        barContainer.appendChild(bar);
        barContainer.appendChild(messageBox);
        barContainer.appendChild(clickMessageBox);
        barChartElement.appendChild(barContainer);

        // 动画效果:逐渐显示柱形图宽度
        bar.style.width = '0';
        bar.offsetHeight;
        bar.style.transition = 'width 1s ease-out';
        bar.style.width = `${width}px`;

        distanceText.style.opacity = '1';
        // 动态更新柱形图的数值
        animateText(distanceText, 0, distance, 1000, true);
        setupBarInteractions(bar, messageBox, clickMessageBox, distance);
    });
}

// 动态文本显示
function animateText(element, startValue, endValue, duration, isDistance = false) {
    const startTime = performance.now();
    function update() {
        const elapsed = performance.now() - startTime;
        const progress = Math.min(elapsed / duration, 1);
        const currentValue = (progress * endValue).toFixed(2);
        element.innerText = isDistance ? `${currentValue} km` : `${currentValue}h`;
        if (progress < 1) {
            requestAnimationFrame(update);
        } else {
            element.innerText = isDistance ? `${endValue.toFixed(2)} km` : `${endValue.toFixed(2)}h`;
        }
    }
    update();
}

New:全年骑行总时长、全年骑行总公里数

// 显示总活动数和总公里数
function displayTotalActivities(activities) {
    // 全年骑行时长
    const ridingTimeThisYear = document.getElementById('totalCount');
    // 全年骑行公里数
    const milesRiddenThisYear = document.getElementById('milesRiddenThisYear');
    // 动态年标题《2025 骑行总时长》
    const totalTitleElement = document.getElementById('totalTitle');

    if (!ridingTimeThisYear || !milesRiddenThisYear || !totalTitleElement) return;

    const ridingTimeThisYearValue = ridingTimeThisYear.querySelector('#ridingTimeThisYearValue');
    const milesRiddenThisYearValue = milesRiddenThisYear.querySelector('#milesRiddenThisYearValue');

    const totalCountSpinner = ridingTimeThisYear.querySelector('.loading-spinner');
    const milesRiddenThisYearSpinner = milesRiddenThisYear.querySelector('.loading-spinner');

    totalCountSpinner.classList.add('active');
    milesRiddenThisYearSpinner.classList.add('active');

    const currentYear = new Date().getFullYear();
    totalTitleElement.textContent = `${currentYear} 骑行总时长`;

    // 筛选全年活动数据
    const filteredActivities = activities.filter(activity => {
        const activityYear = new Date(activity.activity_time).getFullYear();
        return activityYear === currentYear;
    });

    // 计算全年活动时间的总和(单位:小时)
    const totalMovingTime = filteredActivities.reduce((total, activity) => {
        return total + parseFloat(activity.moving_time) || 0;
    }, 0);

    // 计算全年总公里数
    const totalKilometers = calculateTotalKilometers(filteredActivities);

    // 动画效果
    animateCount(ridingTimeThisYearValue, totalMovingTime, 1000, 50, false);
    animateCount(milesRiddenThisYearValue, totalKilometers, 1000, 50, true);

    setTimeout(() => {
        console.log(totalKilometers.toFixed(2));
        ridingTimeThisYearValue.textContent = `${totalMovingTime.toFixed(2)} h`;
        milesRiddenThisYearValue.textContent = `${totalKilometers.toFixed(2)} km`;
        totalCountSpinner.classList.remove('active');
        milesRiddenThisYearSpinner.classList.remove('active');
    }, 1000);
}

// 加载数据并生成日历
(async function() {
    const today = getChinaTime();
    const startDate = getStartDate(today, 21);

    const activities = await loadActivityData();
    // 显示4周的日历
    generateCalendar(activities, startDate, 4);

    // 显示全年骑行时长和公里数
    displayTotalActivities(activities);
})();

New:春节快乐红灯笼

两年前在冲浪时下载的,已经是第二次用了:

// default.html
include lantern.html

// main.scss
@use 'lantern'

Fix Bugs:移除 node-sass 包

node-sass 是基于 LibSass 库构建的,而 LibSass 从 2019 年就停止了更新。所以,Sass 团队放弃了这个项目,重构了 sass(Dart 编写)

sass 相对 node-sass 的优点

  1. 原生支持 Dart

    sass 是由 Dart 编写,它不再依赖 C++ 编译器,安装和构建速度更快

  2. 不再依赖编译

    node-sass 需要本地编译,会遇到编译问题,尤其是 Windows 系统上。而 sass 是纯 JavaScript 实现,跨平台时不会有编译问题

{
    "devDependencies": {
        "sass": "^1.83.4",
    }
}

Show

昨天以前游钓四方的博客
  • ✇游钓四方的博客
  • 骑行 桃花峪、黄河文化公园游钓四方的博客
    周末假期被骑行占有,那种满足是一切都比不过 公园内设有多条越野骑行路线,坡度和难度多样,我这光胎的公路车进去根本生存不了。总的来说是一个不错的地方,集挑战、风景与文化于一体,是体验黄河沿岸自然与文化魅力的不二之选 这条路很窄,一次只能过一辆汽车,有上有下,而且路面陡峭,路非常烂很危险,目测坡度15° 去窗口交费取票,姓名都不需要留 黄河流域地势平坦,水资源丰富,土壤肥沃,非常适宜农业发展。古人利用黄河水系灌溉农田,使中原成为中国古代经济、人口最为集中的地区,为中华民族的形成和壮大提供了物质基础,所以把黄河称呼为母亲河、民族摇篮也不足为过 日晷是一种古老的计时器,利用太阳的影子来确定时间。它的起源可以追溯到公元前4000年的古埃及,后来广泛传播到世界各地。在中国,日晷被称为“圭表”,早在周朝时期便已使用,用于确定二十四节气和天文观测 终于到达了心心念念的黄河岸边,此处跨越黄河的建筑就是大名鼎鼎的京广铁路,它是一条纵贯中国南北的交通大动脉,途经黄河流域、长江流域和南岭山脉。旁边的郑太高铁则是中国“八纵八横”高速铁路网的重要主通道之一,大大
     

骑行 桃花峪、黄河文化公园

2025年1月19日 03:57

周末假期被骑行占有,那种满足是一切都比不过

刚吃完饭准备出发

公园内设有多条越野骑行路线,坡度和难度多样,我这光胎的公路车进去根本生存不了。总的来说是一个不错的地方,集挑战、风景与文化于一体,是体验黄河沿岸自然与文化魅力的不二之选

到达桃花峪-炎黄越野公园

这条路很窄,一次只能过一辆汽车,有上有下,而且路面陡峭,路非常烂很危险,目测坡度15°

桃花峪最陡最烂的坡路

去窗口交费取票,姓名都不需要留

到达黄河文化公园 检票口

黄河流域地势平坦,水资源丰富,土壤肥沃,非常适宜农业发展。古人利用黄河水系灌溉农田,使中原成为中国古代经济、人口最为集中的地区,为中华民族的形成和壮大提供了物质基础,所以把黄河称呼为母亲河、民族摇篮也不足为过

民族摇篮牌坊

炎黄二帝塑像

日晷是一种古老的计时器,利用太阳的影子来确定时间。它的起源可以追溯到公元前4000年的古埃及,后来广泛传播到世界各地。在中国,日晷被称为“圭表”,早在周朝时期便已使用,用于确定二十四节气和天文观测

日晷

遇到一位好大哥帮我拍的照片

鼎

广场的某个角落

终于到达了心心念念的黄河岸边,此处跨越黄河的建筑就是大名鼎鼎的京广铁路,它是一条纵贯中国南北的交通大动脉,途经黄河流域、长江流域和南岭山脉。旁边的郑太高铁则是中国“八纵八横”高速铁路网的重要主通道之一,大大缩短了晋东南、蒙西等地与中东部地区的时空距离

到达黄河岸边

湖水清澈见底,微风拂过时,水面波光粼粼,宛如点点繁星洒在湖面上,因此得名“星海湖”

星海湖 原相机没有P图 水质水太好了

黄河缆车门口 鸿运当头

这辆车是我穿着锁鞋背上山的,如果没有体验过锁鞋的朋友,可以想象一下穿高跟鞋走山路,不过这里的高跟得反过来 —— 脚掌部分垫高,脚跟贴地

五龙峰 其中一个山峰顶

五龙峰 黄河少年雕像

中午时在超市吃了一碗凉皮,和老板沟通一番后把车子暂存于此,爬楼梯的路上三步一回头

毛主席视察黄河纪念地下方的超市

强烈推荐“浮天阁”,登顶后俯瞰整个黄河流域,东西南北尽收眼底

浮天阁

倒泻银河事有无,掀天浊浪只须臾

人间更有风涛险,翻说黄河是畏途

东

西

南

北

东南

对于喜欢骑行、越野和民族文化的朋友来说,桃花峪和黄河文化公园很适合,两个地方紧挨着,要场地有场地,要难度有难度,完事后紧挨着黄河散散步,傍晚时登顶浮天阁看日落,想想都美哦

结束

  • ✇游钓四方的博客
  • 骑行郑州三环游钓四方的博客
    上次我打算一天骑完郑州的三四环线,预计160km,没想到下午摔的手梆硬,昨天六号上午一雪前耻了 路过龙湖公园被吸引了,多了10km+里程 这里的天鹅挺不少,小百只了,小鸭子不计其数。岸边挤满了摄影发烧友,到处是大炮 到这里,骑行三环算是告一段落了,它比四环线少40km,难度低了几个档,三环红路灯非常多,而骑行四环时刹车都很少碰。三环道路也比较好,不像四环压根就没有路,什么路都没有。只能走菜地、翻墙、最后走高速绿化带,我提着车爬上机场高架,是用手爬,不是骑车爬…最后为了安全从高架上下来,走下水道过去了… 上午去了一次龙湖公园,但是中间的金融岛一直找不到地方上去,下午又去了一次,逛了 Specialized、colnago 沪上有明珠,中原有福塔 下午回了家,借同事电脑把博客整了下,前俩月博客处于失联状态,证书都过期了,开往都把我踢了,现在OK了,只是骑行页面每天要手动每天上传一下,Strava接口暂时没有精力搞了
     

骑行郑州三环

2025年1月7日 20:39

上次我打算一天骑完郑州的三四环线,预计160km,没想到下午摔的手梆硬,昨天六号上午一雪前耻了

郑州龙湖公园

路过龙湖公园被吸引了,多了10km+里程

公园放养的白天鹅

这里的天鹅挺不少,小百只了,小鸭子不计其数。岸边挤满了摄影发烧友,到处是大炮

人工沙滩

郑州龙湖公园

骑行郑州三环 结束

到这里,骑行三环算是告一段落了,它比四环线少40km,难度低了几个档,三环红路灯非常多,而骑行四环时刹车都很少碰。三环道路也比较好,不像四环压根就没有路,什么路都没有。只能走菜地、翻墙、最后走高速绿化带,我提着车爬上机场高架,是用手爬,不是骑车爬…最后为了安全从高架上下来,走下水道过去了…

骑行 金融岛

上午去了一次龙湖公园,但是中间的金融岛一直找不到地方上去,下午又去了一次,逛了 Specialized、colnago

骑行 中原福塔

沪上有明珠,中原有福塔

回家

下午回了家,借同事电脑把博客整了下,前俩月博客处于失联状态,证书都过期了,开往都把我踢了,现在OK了,只是骑行页面每天要手动每天上传一下,Strava接口暂时没有精力搞了

  • ✇游钓四方的博客
  • 郑州骑行记录游钓四方的博客
    探金水河,溪流钓的天堂,台钓的地狱 郑州的面积比我预计小不少 明天准备绕圈 ,骑行四环(97km)和三环(57km) 在地图上画两个正方形,好事成双 14点饭后出发骑三环,没一会儿出事了,太遗憾了 总而言之,郑州的西北南四环路况一般,且由北四环入东四环后非常拉跨,你除了走机场高架外没有选择,当时为了安全避免走机场高架,过草地和下水道硬控了我大半个小时
     

郑州骑行记录

2025年1月7日 19:10

骑行西流湖

骑行西流湖

骑行西流湖

骑行西流湖

探金水河

探金水河,溪流钓的天堂,台钓的地狱

骑行桃花峪

郑州的面积比我预计小不少 明天准备绕圈 ,骑行四环(97km)和三环(57km) 在地图上画两个正方形,好事成双

骑行桃花峪

骑行桃花峪

骑行桃花峪

骑行桃花峪

骑行桃花峪 结束

这里是:郑州 四环 非机动车道

14点饭后出发骑三环,没一会儿出事了,太遗憾了 总而言之,郑州的西北南四环路况一般,且由北四环入东四环后非常拉跨,你除了走机场高架外没有选择,当时为了安全避免走机场高架,过草地和下水道硬控了我大半个小时

骑行郑州四环

骑行郑州四环

骑行玩手机的下场

骑行郑州四环 结束

❌
❌